13. var sort_ctl_byName = new Array();
var cnt = 0;
for (var d in data) {
sort_ctl[d] = cnt;
sort_ctl_byName[cnt] = d;
cnt++;
}
//行列構築
var dim1_matrix = new Array();
for (var dim1 in data) {
var dim2_matrix = new Array();
for(var i = 0; i < cnt; i++) {
dim2_matrix[i] = 0;
}
var amount = (function() {
var amount_cnt = 0;
for (var i = 0; i < data[dim1].length; i++) {
amount_cnt += data[dim1][i].weight;
}
return amount_cnt;
}());
for (var i = 0; i < data[dim1].length; i++) {
var edge = data[dim1][i];
dim2_matrix[sort_ctl[edge.dest]] = edge.weight / amount;
}
dim1_matrix[sort_ctl[dim1]] = dim2_matrix;
}
//debug
//var foo = new Matrix(dim1_matrix);
//alert(foo.Print());
var PageRank = function(matrix, loop) {
var d = 0.85;
//行列の転置
var transposed_matrix = (function() {
var transposed = new Array();
for(var i = 0; i < matrix.length; i++) {
transposed[i] = new Array();
}
for (var i = 0; i < matrix.length; i++) {
for (var j = 0; j < matrix[i].length; j++) {
transposed[j][i] = matrix[i][j];
}
}
return transposed;
}());
//初回の各PageRankは1と置く
var pagerank = (function() {
var initial = new Array();
for (var i = 0; i < transposed_matrix.length; i++) {
initial[i] = 1;
}
return initial;
14. }());
var compute_pr = function() {
var new_pagerank = new Array();
for (var i = 0; i < transposed_matrix.length; i++) {
var cals = transposed_matrix[i];
var refs_pr = 0;
for (var j = 0; j < cals.length; j++) {
if (cals[j] > 0) {
refs_pr += pagerank[i] * cals[j];
}
}
new_pagerank[i] = (1 - d) + (d * refs_pr);
}
pagerank = new_pagerank;
}
return function() {
for (var i = 0; i < loop; i++) {
compute_pr();
}
return pagerank;
}
}
//PageRank計算
var pr_result = new PageRank(dim1_matrix, 15)();
//結果をalertで表示
var result = new Array();
for (var i = 0; i < pr_result.length; i++) {
result.push({"name" : sort_ctl_byName[i], "pagerank" : pr_result[i]});
}
result.sort(function(a, b) {
return (a.pagerank > b.pagerank ? 1 : -1);
}).reverse();
var log = "";
for (var i = 0; i < result.length; i++) {
log += result[i].name + ":" + result[i].pagerank + "n";
}