1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| use strict;
use List::Util;
use PDL;
my $VERSION = '1.0';
use fields qw(graph prvect size);
sub new
{
my $class = shift;
return bless {
},$class;
}
our $d_factor = undef; # dampening factor
my $b_factor = undef;
sub factor
{
$d_factor = $_[1]; # dampening factor
$b_factor = $_[2]; # back button 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;
# Create web graph
$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)
{
# Original pagerank
$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 _iterate
{
my $self = shift;
my $iter = shift || 100;
my $normal_factor = $d_factor/$self->{size};
my $inv_d_factor = 1 - ($d_factor + $b_factor);
print $self->{prvect}->slice(":");
print $self->{graph}->slice(":");
foreach (1..$iter)
{
# modif
$self->{prvect} = $inv_d_factor * $self->{prvect} x $self->{graph} + $normal_factor * $self->{prvect};
}
}
sub result
{
my $self = shift;
$self->{prvect};
}
1;
__END__ |
Partager