Algorithm-HITS
view release on metacpan or search on metacpan
lib/Algorithm/HITS.pm view on Meta::CPAN
package Algorithm::HITS;
use strict;
use warnings;
our $VERSION = '0.04';
use fields qw(graph graph_t size hub_v aut_v);
sub new { bless {}, $_[0] }
use PDL;
use List::Util;
#use Data::Dumper;
use PDL::IO::Dumper;
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){
# print STDERR "$graph->[$i] ==> $graph->[$i+1]\n";
$self->{graph}->index2d(
$graph->[$i],
$graph->[$i+1],
) .= 1;
}
$self->{graph_t} = transpose $self->{graph};
$self->{hub_v} = norm (ones $size);
$self->{aut_v} = norm (ones $size);
# print STDERR $self->{graph}->slice(':'), $self->{power_matrix_t}->slice(':'), $self->{power_matrix}->slice(':');
# print STDERR $self->{aut_v}->slice(':'), $self->{hub_v}->slice(':');
}
sub set_authority {
my $self = shift;
my $vect = shift;
foreach my $i (0..$#$vect){
$self->{aut_v}->index($i) .= $vect->[$i];
}
$self->{aut_v} = norm $self->{aut_v};
1;
}
sub set_hub {
my $self = shift;
my $vect = shift;
foreach my $i (0..$#$vect){
$self->{hub_v}->index($i) .= $vect->[$i];
}
$self->{hub_v} = norm $self->{hub_v};
1;
}
sub iterate {
my $self = shift;
my $iter = shift || 1;
foreach (1..$iter){
$self->{hub_v} = norm ($self->{aut_v} x $self->{graph});
$self->{aut_v} = norm ($self->{hub_v} x $self->{graph_t});
( run in 1.362 second using v1.01-cache-2.11-cpan-97f6503c9c8 )