// Generated by CoffeeScript 1.10.0 (function() { var EUCLIDEAN, MANHATTAN, MAX_DISTANCE, SIZE, height, make_change, map, redraw, svg, vis, width, zoom, zoomable_layer, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; svg = d3.select('svg'); width = svg.node().getBoundingClientRect().width; height = svg.node().getBoundingClientRect().height; zoomable_layer = svg.append('g'); zoom = d3.behavior.zoom().scaleExtent([0, 10]).on('zoom', function() { return zoomable_layer.attr({ transform: "translate(" + (zoom.translate()) + ")scale(" + (zoom.scale()) + ")" }); }); svg.call(zoom); map = zoomable_layer.append('g').attr('transform', "translate(0,0)"); vis = map.append('g').attr('transform', "translate(" + (width / 2) + "," + (height / 2) + ")"); SIZE = 13; EUCLIDEAN = function(a, b) { var i, j, ref, total; total = 0; for (i = j = 0, ref = a.vector.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { total += Math.pow(b.vector[i] - a.vector[i], 2); } return Math.sqrt(total); }; MANHATTAN = function(a, b) { var i, j, ref, total; total = 0; for (i = j = 0, ref = a.vector.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { total += Math.abs(b.vector[i] - a.vector[i]); } return total; }; MAX_DISTANCE = function(a, b) { var i, j, max, ref; max = 0; for (i = j = 0, ref = a.vector.length; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) { max = Math.max(max, Math.abs(b.vector[i] - a.vector[i])); } return max; }; redraw = function(filename, threshold, criterium) { return d3.json(filename, function(error, data) { var cell, clusters, clusters_t, color, enter_cell, flat_clusters, items, make_flat, predicates_data, scale, sequence, tree; items = []; predicates_data = {}; color = d3.scale.category20(); data.forEach(function(e1) { var vector; vector = []; e1.predicates.forEach(function(e2) { var ref; vector.push(e2.value); if (ref = e2.p, indexOf.call(Object.keys(predicates_data), ref) < 0) { predicates_data[e2.p] = 0; } return predicates_data[e2.p] += e2.value; }); return items.push({ instance: e1.i, vector: vector }); }); clusters_t = clusterfck.hcluster(items, criterium, clusterfck.SINGLE_LINKAGE, threshold); console.log(clusters_t); flat_clusters = {}; make_flat = function(node, index) { if (node.value == null) { make_flat(node.right, index); return make_flat(node.left, index); } else { return flat_clusters[node.value.instance] = index; } }; clusters_t.forEach(function(d, i) { return make_flat(d, i); }); console.log(flat_clusters); clusters = clusterfck.hcluster(items, criterium, clusterfck.SINGLE_LINKAGE); tree = tree_utils.binary_to_std(clusters); tree_utils.recursive_sort(tree, function(a, b) { return b.key - a.key; }, function(n) { if (n.children != null) { return n.key = d3.min(n.children, function(c) { return c.key; }); } else { return n.key = n.value.vector.reduce(function(t, s) { return t + s; }); } }); sequence = tree_utils.get_leaves(tree).map(function(d) { return d.value; }); scale = 30; sfc_layout.displace(sequence, sfc_layout.GOSPER_NODE, scale, scale, -2 * Math.PI / 6); cell = vis.selectAll('.cell').data(items, function(d) { return d.instance + "_" + criterium + "_" + threshold; }); enter_cell = cell.enter().append('path').attr({ "class": 'cell' }); enter_cell.append('title'); cell.select('title').text(function(d) { return d.instance.replace('http://dbpedia.org/resource/', '').replace(/_/g, ' ') + " " + flat_clusters[d.instance]; }); cell.attr({ d: jigsaw.hex_generate_svg_path(scale), fill: function(d) { return color(flat_clusters[d.instance]); }, stroke: function(d) { return color(flat_clusters[d.instance]); }, transform: function(d) { return "translate(" + d.x + "," + d.y + ") rotate(30)"; } }); return cell.exit().remove(); }); }; redraw('guitarist.json', 5, EUCLIDEAN); make_change = function(filename, threshold, criterium) { if (criterium === 'euclidean') { return redraw(filename, parseFloat(threshold), EUCLIDEAN); } else if (criterium === 'manhattan') { return redraw(filename, parseFloat(threshold), MANHATTAN); } else { return redraw(filename, parseFloat(threshold), MAX_DISTANCE); } }; d3.select('select#criterium').on('change', function() { return make_change(d3.select('select#file')[0][0].value, d3.select('input')[0][0].value, this.value); }); d3.select('select#file').on('change', function() { return make_change(this.value, d3.select('input')[0][0].value, d3.select('select#criterium')[0][0].value); }); d3.select('#threshold_slider').on('change', function() { d3.select('#threshold_val')[0][0].value = this.value; return make_change(d3.select('select#file')[0][0].value, this.value, d3.select('select#criterium')[0][0].value); }); }).call(this);