Algorithm-PageRank

 view release on metacpan or  search on metacpan

PageRank.pm  view on Meta::CPAN

package Algorithm::PageRank;
$|++;
use strict;
use warnings;
our $VERSION = '0.08';

use fields qw(graph prvect size);

sub new { bless {}, shift }

use List::Util;
use PDL;
#use Data::Dumper;
#use PDL::IO::Dumper;

#*STDERR = \*STDOUT;

our $d_factor = 0.05; # dampening factor

sub graph {
    my $self = shift;
    my $graph = shift;

    die "Odd number of node numbers is not valid\n" if scalar(@$graph)%2;

    my $size = List::Util::max(@$graph)+1;
    $self->{size} = $size;

    $self->{graph} = zeroes($size, $size);
    for (my $i = 0 ; $i<@$graph ; $i+=2){
	$self->{graph}->index2d(
				$graph->[$i],
				$graph->[$i+1],
				) .= 1;
    }

    foreach my $i (0..$self->{size}-1){
	my $outdeg_sum = sum $self->{graph}->slice(join q/:/, $i, $i); 
	if($outdeg_sum){
	    $self->{graph}->slice(join q/:/, $i, $i) /=
		$outdeg_sum;
	}
    }

    $self->{graph} = transpose $self->{graph};
    $self->{prvect} = ones($size) / $size;    # the initial pagerank
#    print $self->{graph}->slice(":");
#    print sdump $self;
#    print $self->{prvect}->slice(":");
}

sub iterate {
    my $self = shift;
    my $iter = shift || 100;
    my $normal_factor = $d_factor/$self->{size};
    my $inv_d_factor = 1 - $d_factor;
#    print $self->{prvect}->slice(":");
#    print $self->{graph}->slice(":");
    foreach (1..$iter){
      $self->{prvect} =
	$inv_d_factor * $self->{prvect} x $self->{graph} + $normal_factor * $self->{prvect};
#      print $self->{prvect}->slice(":");
#      print sdump (($d_factor/$self->{size}) * $self->{prvect});
    }
}


sub result {
    my $self = shift;



( run in 0.702 second using v1.01-cache-2.11-cpan-df04353d9ac )