File Coverage

blib/lib/Algorithm/HITS.pm
Criterion Covered Total %
statement 10 13 76.9
branch n/a
condition n/a
subroutine 4 5 80.0
pod n/a
total 14 18 77.7


line stmt bran cond sub pod time code
1             package Algorithm::HITS;
2              
3 1     1   29384 use strict;
  1         2  
  1         31  
4 1     1   5 use warnings;
  1         1  
  1         48  
5              
6             our $VERSION = '0.04';
7              
8 1     1   1002 use fields qw(graph graph_t size hub_v aut_v);
  1         1561  
  1         5  
9              
10 0     0     sub new { bless {}, $_[0] }
11              
12 1     1   2068 use PDL;
  0            
  0            
13             use List::Util;
14             #use Data::Dumper;
15             use PDL::IO::Dumper;
16              
17             sub graph {
18             my $self = shift;
19             my $graph = shift;
20              
21             die "Odd number of node numbers is not valid\n" if scalar(@$graph)%2;
22              
23             my $size = List::Util::max(@$graph)+1;
24             $self->{size} = $size;
25              
26             $self->{graph} = zeroes($size, $size);
27             for (my $i = 0 ; $i<@$graph ; $i+=2){
28             # print STDERR "$graph->[$i] ==> $graph->[$i+1]\n";
29             $self->{graph}->index2d(
30             $graph->[$i],
31             $graph->[$i+1],
32             ) .= 1;
33             }
34             $self->{graph_t} = transpose $self->{graph};
35              
36             $self->{hub_v} = norm (ones $size);
37             $self->{aut_v} = norm (ones $size);
38              
39             # print STDERR $self->{graph}->slice(':'), $self->{power_matrix_t}->slice(':'), $self->{power_matrix}->slice(':');
40              
41             # print STDERR $self->{aut_v}->slice(':'), $self->{hub_v}->slice(':');
42             }
43              
44             sub set_authority {
45             my $self = shift;
46             my $vect = shift;
47             foreach my $i (0..$#$vect){
48             $self->{aut_v}->index($i) .= $vect->[$i];
49             }
50             $self->{aut_v} = norm $self->{aut_v};
51             1;
52             }
53              
54             sub set_hub {
55             my $self = shift;
56             my $vect = shift;
57             foreach my $i (0..$#$vect){
58             $self->{hub_v}->index($i) .= $vect->[$i];
59             }
60             $self->{hub_v} = norm $self->{hub_v};
61             1;
62             }
63              
64             sub iterate {
65             my $self = shift;
66             my $iter = shift || 1;
67             foreach (1..$iter){
68             $self->{hub_v} = norm ($self->{aut_v} x $self->{graph});
69              
70             $self->{aut_v} = norm ($self->{hub_v} x $self->{graph_t});
71              
72             # print STDERR "Authority => ", $self->{aut_v}->slice(':'), "Hub => ", $self->{hub_v}->slice(':');
73             }
74             1;
75             }
76              
77             sub result {
78             my $self = shift;
79             # print STDERR sdump $self->{aut_v};
80             # print STDERR sdump $self->{hub_v};
81             +{
82             authority => $self->{aut_v},
83             hub => $self->{hub_v},
84             }
85             }
86              
87              
88             1;
89             __END__