diff --git a/Makefile b/Makefile index e68e7f7..ba78086 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,8 @@ reorder.v1.js: \ src/pca_order.js \ src/ca.js \ src/cuthill_mckee_order.js \ - src/condition.js + src/condition.js \ + src/pcp.js test: all @npm test diff --git a/examples/pcp/index.html b/examples/pcp/index.html index b55cb04..44f0427 100644 --- a/examples/pcp/index.html +++ b/examples/pcp/index.html @@ -1,8 +1,12 @@ + + +
+ diff --git a/reorder.v1.js b/reorder.v1.js index 63ba08c..755e2fe 100644 --- a/reorder.v1.js +++ b/reorder.v1.js @@ -2689,4 +2689,84 @@ reorder.condition = function(matrix) { } return ret; }; +function array_to_dicts(data, axes) { + if (arguments.length < 2) + axes = reorder.range(data[0].length); + var ret = [], row, dict, i, j; + for (i = 0; i < data.length; i++) { + row = data[i]; + dict = {}; + for (j = 0; j < row.length; j++) { + dict[axes[j]] = row[j]; + } + ret.push(dict); + } + return ret; +} + +reorder.array_to_dicts = array_to_dicts; + +function dicts_to_array(dicts, keys) { + if (arguments.length < 2) + keys = Object.keys(dicts[0]); + var n = keys.length, + m = dicts.length, + array = Array(m), i, j, row; + + for (i = 0; i < m; i++) { + row = Array(n); + array[i] = row; + for (j = 0; j < n; j++) + row[j] = dicts[i][keys[j]]; + } + return array; +} + +reorder.dicts_to_array = dicts_to_array; + +function abs_matrix(x) { + return x.map(function(y) { return y.map(Math.abs); }); +} + +function pcp(data, axes) { + if (arguments.length < 2) + axes = reorder.range(data[0].length); + var tdata = reorder.transpose(data), + pcor = reorder.correlation.pearsonMatrix(tdata), + abs_pcor = abs_matrix(pcor), + h1 = science.stats.hcluster() + .linkage("complete") + .distanceMatrix(abs_pcor)(tdata), + perm = reorder.optimal_leaf_order() + .distanceMatrix(abs_pcor)(tdata), + naxes = reorder.permute(axes, perm); + tdata = reorder.permute(tdata, perm); + + var i, c, sign = 1, signs = [], negs=0; + + console.log('Permutation is '+perm); + + for (i = 1; i < tdata.length; i++) { + c = pcor[perm[i-1]][perm[i]]; + if (c < 0) + sign = -sign; + if (sign < 0) { + signs.push(-1); + negs++; + } + else + signs.push(1); + } + sign = (negs > (tdata.length-negs)) ? -1 : 1; + for (i = 0; i < (tdata.length-1); i++) { + if (signs[i]*sign < 0) { + naxes[i] = '-'+naxes[i]; + tdata[i] = tdata[i].map(function(x) { return -x; }); + } + } + var ndata = reorder.transpose(tdata); + return [ndata, perm, naxes]; +} + +reorder.pcp = pcp; })(this); diff --git a/reorder.v1.min.js b/reorder.v1.min.js index 1f90d3f..d1d0f1c 100644 --- a/reorder.v1.min.js +++ b/reorder.v1.min.js @@ -1,3 +1,3 @@ (function(exports){reorder={version:"0.1.0"};reorder.cmp_number_asc=function(a,b){return a-b};reorder.cmp_number=reorder.cmp_number_asc;reorder.cmp_number_desc=function(a,b){return b-a};reorder.flatten=function(a,b){return a.concat(b)};reorder.infinities=function(n){var i=-1,a=[];if(arguments.length===1)while(++i0){for(l=0;l 0){for(l=0;l