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 )