// Generated by CoffeeScript 1.10.0 (function() { var EUCLIDEAN, MANHATTAN, MAX_DISTANCE, SIZE, compare_obj, height, make_change, matrix, redraw, sort_object_keys, svg, 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, 4]).on('zoom', function() { return zoomable_layer.attr({ transform: "translate(" + (zoom.translate()) + ")scale(" + (zoom.scale()) + ")" }); }); svg.call(zoom); matrix = zoomable_layer.append('g').attr('transform', 'translate(125,170)scale(0.4)'); SIZE = 13; compare_obj = function(a, b) { if (a.amount > b.amount) { return -1; } if (a.amount < b.amount) { return 1; } return 0; }; sort_object_keys = function(obj) { var k, keys, v; keys = []; for (k in obj) { v = obj[k]; keys.push({ key: k, amount: v }); } return keys.sort(compare_obj); }; EUCLIDEAN = function(a, b) { var i, l, ref, total; total = 0; for (i = l = 0, ref = a.vector.length; 0 <= ref ? l < ref : l > ref; i = 0 <= ref ? ++l : --l) { total += Math.pow(b.vector[i] - a.vector[i], 2); } return Math.sqrt(total); }; MANHATTAN = function(a, b) { var i, l, ref, total; total = 0; for (i = l = 0, ref = a.vector.length; 0 <= ref ? l < ref : l > ref; i = 0 <= ref ? ++l : --l) { total += Math.abs(b.vector[i] - a.vector[i]); } return total; }; MAX_DISTANCE = function(a, b) { var i, l, max, ref; max = 0; for (i = l = 0, ref = a.vector.length; 0 <= ref ? l < ref : l > ref; i = 0 <= ref ? ++l : --l) { 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 cells, clusters, clusters_t, color, column_mouseout, column_mouseover, columns, enter_cells, enter_columns, enter_hlabels, enter_vlabels, flat_clusters, hlabels, items, l, make_flat, matrix_data, predicates_data, ref, results, tree, vlabels; items = []; predicates_data = {}; 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.COMPLETE_LINKAGE, threshold); color = d3.scale.category20().domain((function() { results = []; for (var l = 0, ref = clusters_t.length; 0 <= ref ? l <= ref : l >= ref; 0 <= ref ? l++ : l--){ results.push(l); } return results; }).apply(this)); 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.COMPLETE_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; }); } }); matrix_data = tree_utils.get_leaves(tree).map(function(d) { return d.value; }); matrix_data = matrix_data.map(function(d, i) { var obj, v; obj = {}; obj.key = d.instance; v = d.vector.map(function(value, j) { var o; o = {}; o.value = value; o.key = Object.keys(predicates_data)[j]; o.amount = predicates_data[Object.keys(predicates_data)[j]]; o.parent = obj; return o; }); v.sort(compare_obj); obj.values = v; return obj; }); column_mouseover = function() { return d3.select(this).style({ opacity: 0.6 }); }; column_mouseout = function() { return d3.select(this).style({ opacity: 1 }); }; columns = matrix.selectAll('.column').data(matrix_data, function(d) { return filename + "_" + threshold + "_" + criterium + "_" + d.key; }); enter_columns = columns.enter().append('g').attr({ "class": 'column' }).on('mouseover', column_mouseover).on('mouseout', column_mouseout); columns.attr({ transform: function(d, i) { return "translate(" + (SIZE * i) + ",0)"; } }); columns.exit().remove(); cells = columns.selectAll('.cell').data(function(column) { return column.values; }); enter_cells = cells.enter().append('rect').attr('class', 'cell'); enter_cells.append('title'); cells.select('title').text(function(d) { return d.key + "\n" + d.parent.key + "\n" + flat_clusters[d.parent.key]; }); cells.attr({ width: SIZE, height: SIZE, transform: function(d, i) { return "translate(0," + (SIZE * i) + ")"; }, fill: function(d) { if (d.value === 0) { return '#e0e0e0'; } else { if (flat_clusters[d.parent.key] === 2) { console.log(d); } return color(flat_clusters[d.parent.key]); } } }); cells.exit().remove(); hlabels = matrix.selectAll('.hlabel').data(sort_object_keys(predicates_data).map(function(instance) { return instance.key; }), (function(instance) { return filename + "_" + instance; })); enter_hlabels = hlabels.enter().append('a').attr({ "class": 'hlabel', 'xlink:href': function(d) { return d; } }); enter_hlabels.append('text').text(function(d) { return d; }).attr({ dy: '1em', dx: -6 }); hlabels.select('text').attr('transform', function(d, i) { return "translate(0," + (SIZE * i) + ")"; }); hlabels.exit().remove(); vlabels = matrix.selectAll('.vlabel').data(matrix_data.map(function(instance) { return instance.key; }), (function(instance) { return filename + "_" + instance; })); enter_vlabels = vlabels.enter().append('a').attr({ "class": 'vlabel', 'xlink:href': function(d) { return d; } }); enter_vlabels.append('text').text(function(d) { return d.replace('http://dbpedia.org/resource/', ''); }).attr({ dy: '1em', dx: 6 }); vlabels.select('text').attr('transform', function(d, i) { return "translate(" + (SIZE * i) + ",0) rotate(-90)"; }); return vlabels.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);