| 12
 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