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 )