<!DOCTYPE html>
<html>
  <head>
	  <title>DeReKo-Word-Vector-Distances: <%= $word %></title>
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
		<link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Condensed" rel="stylesheet">
    <script src="http://code.jquery.com/jquery-latest.min.js"></script>
		<script src = "https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
		<script src = "https://cdn.datatables.net/fixedcolumns/3.2.3/js/dataTables.fixedColumns.min.js"></script>
		<script src = "https://cdn.datatables.net/plug-ins/1.10.16/sorting/scientific.js"></script>
		<link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css">
    <script
			src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"
			integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU="
			crossorigin="anonymous"></script>
    <script>
		 var urlParams = new URLSearchParams(window.location.search);

     $('#firstable').hide();
		 $(document).ready(function() {

			 $("input").bind("keydown", function(event) {
				 // track enter key
				 var keycode = (event.keyCode ? event.keyCode : (event.which ? event.which : event.charCode));
				 if (keycode == 13) { // keycode for enter key
					 // force the 'Enter Key' to implicitly click the Update button
					 document.getElementById('SEARCH').click();
					 return false;
				 } else  {
					 return true;
				 }});

			 $(".selector").tabs({ active: 1 });

		   $(function(){
			   $("#SEARCH").click(function() {
				   window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
			   });
		   });

			 $('#firsttable').DataTable({
				 "sScrollY": "780px",
				 "bScrollCollapse": true,
				 "bPaginate": false,
				 "bJQueryUI": true,
				 "dom": '<"top">rt<"bottom"flp><"clear">',
				 "aoColumnDefs": [
					 { "sWidth": "10%", "aTargets": [ -1 ] }
				 ]
			 } );

       $( "#first" ).clone().prependTo( "#tabs-2" );

       function changeCharColor(txt, heat) {
         var newText = "";
         for (var i=0, l=txt.length; i<l; i++) {
           newText += (i == 5 ? txt.charAt(i) : '<span style="background-color:'+getHeatColor(heat[i]/maxHeat)+'">'+txt.charAt(i)+'</span>');
         }
         return newText;
       }

       function getHeatColor(value) {
         var hue=((1-value)*120).toString(10);
         return ["hsl(",hue,",90%,70%)"].join("");
       }

			 function bitvec2window(n, heat) {
				 var str = n.toString(2).padStart(10, "0")
										.replace(/^([0-9]{5})/, '$1x')
										.replace(/0/g, '·')
										.replace(/1/g, '+');
			   return changeCharColor(str, heat);
			 }

			 var collocatorData = <%= b(Mojo::JSON::to_json($collocators)) %>;
       var maxHeat; // = Math.max.apply(Math,collocatorData.map(function(o){return o.cprob;}))

			 if (collocatorData != null) {
         maxHeat = Math.max.apply(Math,collocatorData.map(function(o){return Math.max.apply(Math,o.heat);}))
				 var t = $('#secondtable').DataTable({
           data: collocatorData,
					 "sScrollY": "800px",
					 "bScrollCollapse": true,
					 "bPaginate": false,
					 "bJQueryUI": true,
					 "dom": '<"top">rt<"bottom"flp><"clear">',
					 "columns": [
						 { "data": "rank", type: "allnumeric" },
						 { "data": "pos", width: "7%", sClass: "dt-center mono compact", render: function ( data, type, row ) {return bitvec2window(data, row.heat) }},
						 { "data": "max",  render: function ( data, type, row ) {return data.toFixed(3) }},
						 { "data": "conorm", render: function ( data, type, row ) {return data.toFixed(3) }},
						 { "data": "prob", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) }  },
						 { "data": "cprob", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) }  },
						 { "data": "overall", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) } },
						 { "data": "word",  sClass: "collocator" }
					 ],
					 "columnDefs": [
						 { className: "dt-right", "targets": [0,2,3,4,5,6] },
						 { className: "dt-center", "targets": [ 1] },
						 { "searchable": false,
							 "orderable": false,
							 "targets": 0
						 },
						 { "type": "scientific", targets: [2,3,4,5,6] },
						 { "orderSequence": [ "desc" ], "targets": [ 2, 3, 4, 5, 6 ] },
						 { "orderSequence": [ "asc", "desc" ], "targets": [ 1, 7 ] },
					 ],
					 "order": [[ 4, 'desc' ]],
				 } );

				 t.on( 'order.dt search.dt', function () {
					 t.column(0, {order:'applied'}).nodes().each( function (cell, i) {
						 cell.innerHTML = i+1;
					 } );
				 } ).draw();
			 }
			 $("#tabs").css("visibility", "visible"); // now we can show the tabs

		 });

		 $(function(){
			 $("#dropdownoptions").dialog({
				 title: "Options",
				 autoOpen: false,
				 modal: false,
				 draggable: false,
				 height: "auto",
				 width: "auto",
				 resizable: false,
				 buttons: {
					 "Cancel": function() {
						 $( this ).dialog( "close" );
					 },
					 "Apply": function() {
						 window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
					 }
				 }
			 });
		 });

		 $(function(){
			 $("td.collocator").click(function(){
				 queryKorAPCII(this.textContent + " /w5 " + urlParams.get('word'));
			 });
		 });

		 $(function(){
			 $("#showoptions").click(function(){
				 $("#dropdownoptions").dialog("open");
				 var target = $(this);
				 $("#dropdownoptions").dialog("widget").position({
					 my: 'left bottom',
					 at: 'left bottom',
					 of: target
				 });
			 });
		 });

		 $( function() {
			 $( "#no_iterations" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 1000 ) {
						 $( this ).spinner( "value", 1000 );
						 return false;
					 } else if ( ui.value > 10000 ) {
						 $( this ).spinner( "value", 10000 );
						 return false;
					 }
				 }
			 });
		 } );

		 $( function() {
			 $( "#neighbours" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 0 ) {
						 $( this ).spinner( "value", 0 );
						 return false;
					 } else if ( ui.value > 200 ) {
						 $( this ).spinner( "value", 200 );
						 return false;
					 }
				 }
			 });
		 } );

		 $( function() {
			 $( "#cutoff" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 100000 ) {
						 $( this ).spinner( "value", 100000 );
						 return false;
					 } else if ( ui.value > 2000000 ) {
						 $( this ).spinner( "value", 2000000 );
						 return false;
					 }
				 }
			 });
		 } );

		 var tabactivated = {}
     $( function() {
			 $( "#tabs" ).tabs().addClass('tabs-min');
		 } );

		 $( function() {
			 $( ".controlgroup-vertical" ).controlgroup({
				 "direction": "vertical"
			 });
		 } );

		 $(function() {
			 $( document ).tooltip({
				 content: function() {
					 return $(this).attr('title');
				 }}
			 )
		 })

    </script>
	  <script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>
	  <script src="/derekovecs/js/tsne.js"></script>
	  <script src="/derekovecs/js/som.js"></script>
	  <script src="/derekovecs/js/labeler.js"></script>
    <style>
     body, input {
	     font-family: Lato, sans-serif;
	     font-size: 11pt;
     }

		 h1,  h2, h3 {
			 margin: 5px 10px 0 0;
			 color: rgb(246,168,0);
			 font-family: "Univers LT Std 47 Cn Lt", "Univers LT Std 67 Cn Lt", "Roboto Condensed", "Univers LT Std 67 Cn Bold", "UniversLTStd-BoldCn", "Times", 'League Gothic', Impact, sans-serif;
			 font-weight: bold;
			 line-height: 1.35;
			 letter-spacing: normal;
			 text-transform: uppercase;
			 text-shadow: none;
			 word-wrap: break-word;
		 }


		 showoptions, #SEARCH {
			 margin-left: 10px;
			 margin-right: 10px;
		 }

		 .tabs-left-vertical .ui-tabs-nav {
			 position: absolute;
			 width: 21em;
			 transform: translate(-100%,0%) rotate(-90deg);
			 transform-origin: 100% 0%;
		 }

		 .tabs-left-vertical .ui-tabs-nav li {
			 float: right;
		 }

		 .tabs-left-vertical .ui-tabs-panel {
			 padding-left: 3.5em;
		 }

		 .tabs-left-vertical .ui-tabs-panel {
			 height: 20em;
		 }

		 .mono {
			 font-family: "DejaVu Sans Mono", Inconsolata, SourceCodePro, Courier;
		 }

		 .ui-tooltip-content {
			 font-size: 9pt;
			 color: #222222;
		 }

		 svg > .ui-tooltip-content {
			 font-size: 8pt;
			 color: #222222;
		 }

		 a.merged {
			 color: green;
			 fill: green;
		 }

		 #first a {
			 text-decoration: none;
		 }

		 a.marked, #first a.marked {
			 text-decoration: underline;
		 }

		 a.target {
			 color: red;
			 fill: red;
		 }

		 table.display {
			 width: 40% important!;
			 margin: 1;  /* <- works for me this way ****/
		 }

		 table.dataTable thead th, table.dataTable thead td, table.dataTable tbody td {
			 padding: 2px 2px;
			 //  border-bottom: 1px solid #111;
		 }

		 #collocators {
			 margin-bottom: 15px;
		 }

		 #header {
			 width: 100%;
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #topwrapper {
			 width: 100%;
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #wrapper {
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #pagetitle {
			 max-width: 460px;
			 margin-right: 20px;
			 float: left;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
			 //    border: 1px solid green;
		 }

		 #options {
			 float: left;
			 width: 800px;
			 margin: 10px;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }

		 #word {
			 width: 50%;
		 }

		 #first {
			 margin-right: 20px;
			 float: left;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
			 //    border: 1px solid green;
		 }
		 #tabs {
			 margin-right: 20px;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }

		 .tabs-min {
			 background: transparent;
			 border: none;
		 }

		 .tabs-min .ui-widget-header {
			 background: transparent;
			 border: none;
			 border-bottom: 1px solid #c0c0c0;
			 -moz-border-radius: 0px;
			 -webkit-border-radius: 0px;
			 border-radius: 0px;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-default {
			 background: transparent;
			 border: none;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-active {
			 background: transparent url(img/uiTabsArrow.png) no-repeat bottom center;
			 border: none;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-default a {
			 color: #c0c0c0;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-active a {
			 color: rgb(246,168,0);
		 }

		 #embed {
			 max-width: 802px;
			 border: 1px solid #333;
		 }

		 #second {
			 min-width: 800px;
			 //       border: 1px solid #333;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }
		 #som2 svg {
			 border: 1px solid #333;
		 }

		 #cost {
			 font-size: 8pt;
			 color: #222222;
			 margin-top: 4px;
			 margin-bottom: 12px;
		 }

		 #sominfo1, #sominfo {
			 font-size: 8pt;
			 color: #222222;
			 margin-top: 0px;
		 }

		 #somcolor1, #somcolor2, #somcolor3 {
			 display: inline-block;
			 height: 10px;
			 width: 10px;
		 }

		 #third {
			 border: 1px solid #333;
		 }

    </style>
    <script>

     var opt = {epsilon: <%= $epsilon %>, perplexity: <%= $perplexity %>},
		     mapWidth = 800, // width map
		     mapHeight = 800,
		     jitterRadius = 7;

     var T = new tsnejs.tSNE(opt); // create a tSNE instance

     var Y;

     var data;
     var labeler;

     function applyJitter() {
			 svg.selectAll('.tsnet')
					.data(labels)
					.transition()
					.duration(50)
					.attr("transform", function(d, i) {
						T.Y[i][0] = (d.x - mapWidth/2 - tx)/ss/20;
						T.Y[i][1] = (d.y - mapHeight/2 - ty)/ss/20;
						return "translate(" +
											  (d.x) + "," +
											  (d.y) + ")";
					});
     }

     function updateEmbedding() {
			 var Y = T.getSolution();
			 svg.selectAll('.tsnet')
					.data(data.words)
					.attr("transform", function(d, i) {
						return "translate(" +
											   ((Y[i][0]*20*ss + tx) + mapWidth/2) + "," +
											   ((Y[i][1]*20*ss + ty) + mapHeight/2) + ")"; });
     }

     var svg;
     var labels = [];
     var anchor_array = [];
     var text;

     function drawEmbedding() {
			 $("#embed").empty();
			 var div = d3.select("#embed");

			 // get min and max in each column of Y
			 var Y = T.Y;

			 svg = div.append("svg") // svg is global
								.attr("width", mapWidth)
								.attr("height", mapHeight);

			 var g = svg.selectAll(".b")
									.data(data.words)
									.enter().append("g")
									.attr("class", "tsnet");

			 g.append("a")
				.attr("xlink:href", function(word) {
					return (data.urlprefix+word);})
				.attr("class", function(d, i) {
					var res="";
					if(data.marked[i]) {
						res="marked ";
					}
					if(data.target.indexOf(" "+d+" ") >= 0) {
						return res+"target";
					} else if(data.ranks[i] < data.mergedEnd) {
						return res+"merged";
					} else {
						return res;
					}
				})
				.attr("title", function(d, i) {
					if(data.mergedEnd > 0) {
						if(data.ranks[i] >= data.mergedEnd) {
         			return "rank: "+i +"  "+"freq. rank: "+(data.ranks[i]).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
						} else {
         			return "rank: "+i +"  "+"freq. rank: "+data.ranks[i].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " (merged vocab)";
						}
					} else {
						return "rank: "+i +"  "+"freq. rank: "+data.ranks[i].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
					}
				})
				.append("text")
				.attr("text-anchor", "top")
				.attr("font-size", 12)
				.text(function(d) { return d; });

			 var zoomListener = d3.behavior.zoom()
														.scaleExtent([0.1, 10])
														.center([0,0])
														.on("zoom", zoomHandler);
			 zoomListener(svg);
     }

     var tx=0, ty=0;
     var ss=1;
     var iter_id=-1;

     function zoomHandler() {
			 tx = d3.event.translate[0];
			 ty = d3.event.translate[1];
			 ss = d3.event.scale;
			 updateEmbedding();
     }

     var stepnum = 0;

     function stopStep() {
			 clearInterval(iter_id);
			 text = svg.selectAll("text");

			 // jitter function needs different data and co-ordinate representation
			 labels = d3.range(data.words.length).map(function(i) {
				 var x = (T.Y[i][0]*20*ss + tx) + mapWidth/2;
				 var y = (T.Y[i][1]*20*ss + ty) + mapHeight/2;
				 anchor_array.push({x: x, y: y, r: jitterRadius});
				 return {
					 x: x,
					 y: y,
					 name: data.words[i]
				 };
			 });

			 // get the actual label bounding boxes for the jitter function
			 var index = 0;
			 text.each(function() {
				 labels[index].width = this.getBBox().width;
				 labels[index].height = this.getBBox().height;
				 index += 1;
			 });


			 //	 setTimeout(updateEmbedding, 1);
			 //	 setTimeout(
					 labeler =	 d3.labeler()
												 .label(labels)
												 .anchor(anchor_array)
												 .width(mapWidth)
												 .height(mapHeight)
												 .update(applyJitter);
			 //         .start(1000);

			 iter_id = setInterval(jitterStep, 1);
     }

     var jitter_i=0;

     function jitterStep() {
			 if(jitter_i++ > 100) {
				 clearInterval(iter_id);
			 } else {
				 labeler.start2(10);
				 applyJitter();
			 }
     }

     var last_cost=1000;

     function step() {
			 var i = T.iter;

			 if(i > <%= $no_iterations %>) {
				 stopStep();
			 } else {
				 var cost = Math.round(T.step() * 100000) / 100000; // do a few steps
				 $("#cost").html("tsne iteration " + i + ", cost: " + cost.toFixed(5));
				 if(i % 250 == 0 && cost >= last_cost) {
					 stopStep();
				 } else {
					 last_cost = cost;
					 updateEmbedding();
				 }
			 }
     }

     function showMap(j) {
			 data=j;
			 T.iter=0;
			 T.initDataRaw(data.vecs); // init embedding
			 drawEmbedding(); // draw initial embedding

			 if(iter_id >= 0) {
				 clearInterval(iter_id);
			 }
			 //T.debugGrad();
			 iter_id = setInterval(step, 1);
			 if(true) { // (<%= $show_som %>) {
				 makeSOM(j, <%= $no_iterations %>);
			 }
     }
     var queryword;

     function onload() {
       queryword = document.getElementById('word');
     }

     function queryKorAP() {
       window.open('http://korap.ids-mannheim.de/kalamar/?q='+queryword.value, 'KorAP');
     }

     function queryKorAPCII(query) {
       window.open('http://korap.ids-mannheim.de/kalamar/?ql=cosmas2&q='+query, 'KorAP');
     }
    </script>
  </head>
  <body onload="onload()">
		<div id="header">
			<div id="pagetitle">
				<h1>DeReKo-Vectors</h1>
			</div>
			<div id="options"  class="widget">
				<form id="queryform">
					<input id="word" type="text" name="word"  placeholder="Word(s) to be searched" value="<%= $word %>"
								 title="When looking for multiple words use spaces as separators to search around the average vector and | as separator to get the neighbours for each word."/>
					<input id="SEARCH" type="button" value="SEARCH">
					<input type="button" id="showoptions" name="showoptions" value="Options" />
				</form>
				<div id="dropdownoptions" style="display: none">
					<form id="optionsform">
						<div class="controlgroup-vertical">
							<label for="cutoff">cut-off</label>
							<input id="cutoff" type="text" name="cutoff" size="10"  value="<%= $cutoff %>" title="Only consider the most frequent x word forms.">
							<label for="dedupe">dedupe</label>
							<input id="dedupe" type="checkbox" name="dedupe" value="1" <%= ($dedupe ? "checked" : "") %> title="radically filter out any near-duplicates">
							% if($mergedEnd > 0) {
								<label for="sbf">backw.</label>
								<input id="sbf" type="checkbox" name="sbf" value="1" <%= ($searchBaseVocabFirst ? "checked" : "") %> title="If checkecked base vocabulary will be searched first. Otherwise merged vocabulray will be searched first.">
							% }
							<label for="neighbours">max. neighbours:</label>
							<input id="neighbours" size="4" name="n" value="<%= $no_nbs %>">
							<label for="no_iterations">max. iterations</label>
							<input id="no_iterations" name="N" size="4" value="<%= $no_iterations %>">
							<!-- <label for="dosom">SOM</label>
									 <input id="dosom" type="checkbox" name="som" value="1" <%= ($show_som ? "checked" : "") %>> -->
							% if($collocators) {
								<label for="sortby">window/sort</label>
								<select id="sortby" name="sort">
									<option value="0"  <%= ($sort!=1 && $sort!=2? "selected":"") %>>auto focus</option>
									<!-- <option value="1"  <%= ($sort==1? "selected":"") %>>any single position</option>
											 <option value="2" <%= ($sort==2? "selected":"") %>>whole window</option> -->
								</select>
							% }
							<input type="button" value="→ KorAP" onclick="queryKorAP();" title="query word with KorAP"/>
						</div>
					</form>
				</div>
			</div>
		</div>
		<div id="topwrapper">
			<div style="visibility: hidden;" id="tabs">
				<ul>
					<li><a href="#tabs-1">Semantics (TSNE-map)</a></li>
					<li><a href="#tabs-2">Semantics (SOM)</a></li>
					<li><a href="#tabs-3">Syntagmatic (collocators)</a></li>
				</ul>
				<div id="tabs-1">
					% if($lists && (@$lists) > 0 && (@$lists)[0]) {
						<div id="wrapper">
							<div id="first" style="width: 320px">
								<table class="display compact nowrap" id="firsttable">
									<thead>
										<tr>
											<th align="right">#</th><th align="right">cos</th><th align="left">similars</th>
										</tr>
									</thead>
									<tbody>
										% my $j=0; my @words; my @vecs; my @ranks; my @marked;
										% for my $list (@$lists) {
											% my $i=0; while($list) {
												% my $item = (@$list)[$i];
												% my $c = ($collocators? (@$collocators)[$i] : 0);
												% last if(!$c && !$item);
												<tr>
													<td align="right">
  													<%= ++$i %>.
													</td>
													% if($item) {
														% if(!grep{$_ eq $item->{word}} @words) {
															%   push @vecs, $item->{vector};
															%   push @words, $item->{word};
															%   push @ranks, $item->{rank};
															%   push @marked, ($marked->{$item->{word}}? 1 : 0);
														% }
														<td align="right">
  														<%= sprintf("%.3f", $item->{dist}) %>
														</td>
														<td>
															% my $class = ($marked->{$item->{word}}? "marked " : "");
															% my $r = $item->{rank};
															% if($r < $mergedEnd) {
																%   $class .= "merged";
																%   $r .= " (merged vocab)";
															% } elsif($mergedEnd!=0 && $r > $mergedEnd) {
															%   $r -= $mergedEnd;
													% }
  												<a class="<%= $class =%>"
														 title="freq. rank: <%= $r =%>"
														 href="<%= url_with->query([word => $item->{word}]) =%>">
														<%= $item->{word} =%>
													</a>
														</td>
											% } else {
														<td colspan="2"/>
											% }
												</tr>
												% last if($i >= $no_nbs);
										% }
					% }
									</tbody>
								</table>
							</div>
							<script>
							 % use Mojo::ByteStream 'b';
							 % my $urlprefix = url_with->query([word=>'']);
							 $(window).load(function() {
								 var vecs = <%= b(Mojo::JSON::to_json($lists->[0])) %>;
								 showMap(<%= b(Mojo::JSON::to_json({target => " $word ", mergedEnd=> $mergedEnd, words => \@words, vecs => \@vecs, ranks => \@ranks, marked => \@marked, urlprefix => $urlprefix})); %>);
							 });
							</script>
						  <div id="second">
							  <div id="embed">
							  </div>
							  <div id="cost">
							  </div>
						  </div>
					  </div>
            % } elsif($word !~ /^\s*$/) {
						<div id="wrapper">
							<div id="not-found-dialog" title="Not found">
								<p>ERROR: "<%= $word %>" not found in vocabluary.</p>
								<p>If you are sure you have spelled the word as intended, you can try to increase the cutoff parameter in the options menu.</p>
							</div>
							<script>
							 $( function() {
								 $( "#not-found-dialog" ).dialog({
									 autoOpen: true,
									 modal: true,
									 draggable: false,
									 height: "auto",
									 width: "auto",
									 resizable: false,
									 buttons: {
										 "OK": function() {
											 $( this ).dialog( "close" );
										 },
										 "Apply": function() {
											 window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
										 }
									 }
								 });
							 });
							</script>
							</div>
						% }
				</div>
        <div id="tabs-2">
					<div id="som2" style="width: 800; height: 800px">
					</div>
					<div id="sominfo1"><span id="somcolor1">   </span> <span id="somword1"> </span> <span id="somcolor2">   </span> <span id="somword2"> </span> <span id="somcolor3">   </span></div>
					<div id="sominfo">SOM iteration <span id="iterations">0</span></div>
        </div>
				<div id="tabs-3">
					<div style="width: 800px" id="secondt">
						<table class="display compact nowrap" id="secondtable">
							<thead>
								<tr>
									% if($collocators) {
										<th>#</th>
										<th align="center" title="The columns (c) around the target are considered for summation are marked with *.">w'</th>
										<th align="right" title="Raw (max.) activation of the collocator in the output layers.">max(a)</th>
										<th title="Co-normalized raw activation sum of the collocator in the selected columns." align="right">⊥Σa</th>
										<th title="Sum of activations over the selected colunns normalized by the total activation sum of the selected columns." align="right">Σa/Σc</th>
										<th title="Sum of the column normalized activations over the selected colunns." align="right">Σ(a/c)</th>
										<th title="Sum of the activations over the whole window normalized by the total window sum (no auto-focus)." align="right">Σa/Σw</th>
										<th align="left">collocator</th>
									% }
								</tr>
							</thead>
							<tbody>
								<tr>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="left">
									</td>
								</tr>
							</tbody>
						</table>
					</div> <!-- - tab2 -->
			  </div> <!-- tabs -->
      </div>
		</div> <!-- topwrapper  -->
		<div style="clear: both;"></div>
		</div>
    % if($training_args) {
      <p>
        Word vector model trained with <a href="https://code.google.com/p/word2vec/">word2vec</a> using the following parameters: <pre><%= $training_args %></pre>
      </p>
    % }
	</body>
</html>
