<?php

/*
In php.ini set memory_limit to 768MB and max_execution_time to 3000
*/

//Create and initialize vector v
$v=array();
$vnew=array();
$fd=fopen('nodes', 'r');
$lined=fgets($fd);
fclose($fd);
$numNodes=intval($lined);
//Initialize starting vector
for($k=0;$k<$numNodes;$k++)$v[$k]=1/$numNodes;
//Stocastic the matrix
$fs=fopen('adj_matrix','r');
$fp=fopen('stoc_matrix','w+');
$unomenoalfa=0.15*1/$numNodes;
$lwrite=array();
do{
	$tot=0;
	//$lwrite=NULL;
	$line=fgets($fs);
	if($line===FALSE)break;
	$exploded=explode(' ', $line);
	$tot=array_sum($exploded);
	switch($tot){
		case 0:{
			for($i=0;$i<$numNodes;$i++)$exploded[$i]=1/$numNodes;
			break;
		}
		case 1:{
			break;
		}
		default:{
			$keys=array_keys($exploded,1);
			foreach($keys as $k)$exploded[$k]=1/$tot;
			break;
		}	
	}
	//buffer each row to be later written as a column
	for($i=0;$i<$numNodes;$i++)$lwrite[$i].=($exploded[$i]*0.85+$unomenoalfa)." ";
}while(TRUE);
for($i=0;$i<$numNodes;$i++){
	//save each row as a column
	$lwrite[$i].="\n";
	fputs($fp, $lwrite[$i]);
}
fclose($fs);
fseek($fp,0,SEEK_SET);
//$fp=fopen('stoc_matrix','r');
//PageRank
for($j=0;$j<5;$j++){
	$index=0;
	//Initialize vnew
	for($k=0;$k<$numNodes;$k++)$vnew[$k]=0;
	//Compute v_m = A*v_m-1
	do{
		$line=fgets($fp);
		if($line===FALSE)break;
		$exploded=explode(' ', $line);
		for($i=0;$i<$numNodes;$i++)$vnew[$index]+=$exploded[$i]*$v[$i];
		$index++;		
	}while(TRUE);
	//Compute 2nd norm vnew to normalize
	/*for($z=0;$z<sizeof($vnew);$z++)$tmp+=pow($vnew[$z],2);
	$norm=sqrt($tmp);
	for($w=0;$w<sizeof($vnew);$w++)$vnew[$w]/=$norm;*/
	//Compute step increase
	$x=0;
	for($h=0;$h<sizeof($v);$h++)$x+=abs($vnew[$h]-$v[$h]);
	echo 'differenza tra i vettori al giro'.$j.': '.$x.'  <BR/>';
	$v=$vnew;
	$seek=fseek($fp,0,SEEK_SET);
	print_r($vnew);
	echo "<BR/><BR/>";
}
//echo 'final: ';
//print_r($vnew);
fclose($fp);
?>