File Coverage

blib/lib/Statistics/Basic/Covariance.pm
Criterion Covered Total %
statement 63 69 91.3
branch 15 28 53.5
condition 6 6 100.0
subroutine 9 11 81.8
pod 5 5 100.0
total 98 119 82.3


line stmt bran cond sub pod time code
1              
2             package Statistics::Basic::Covariance;
3              
4 33     33   165 use strict;
  33         49  
  33         1543  
5 33     33   155 use warnings;
  33         44  
  33         1134  
6 33     33   151 use Carp;
  33         37  
  33         2947  
7              
8 33     33   186 use base 'Statistics::Basic::_TwoVectorBase';
  33         42  
  33         16077  
9              
10             # new {{{
11             sub new {
12 18     18 1 1179 my $class = shift;
13 18   100     51 my @var1 = (shift || ());
14 18   100     45 my @var2 = (shift || ());
15 18 50       26 my $v1 = eval { Statistics::Basic::Vector->new( @var1 ) } or croak $@;
  18         189  
16 18 50       23 my $v2 = eval { Statistics::Basic::Vector->new( @var2 ) } or croak $@;
  18         53  
17              
18 18         57 my $c = $v1->_get_linked_computer( covariance => $v2 );
19 18 100       42 return $c if $c;
20              
21 17         83 my $this = bless({'v1'=>$v1, 'v2'=>$v2}, $class);
22 17 50       52 warn "[new " . ref($this) . " v1:$this->{v1} v2:$this->{v2}]\n" if $Statistics::Basic::DEBUG >= 2;
23              
24 17         597 $this->{_vectors} = [ $v1, $v2 ];
25              
26 17 50       27 $this->{m1} = eval { Statistics::Basic::Mean->new($v1) } or croak $@;
  17         66  
27 17 50       26 $this->{m2} = eval { Statistics::Basic::Mean->new($v2) } or croak $@;
  17         71  
28              
29 17         62 $v1->_set_linked_computer( covariance => $this, $v2 );
30 17         44 $v2->_set_linked_computer( covariance => $this, $v1 );
31              
32 17         88 return $this;
33             }
34             # }}}
35             # _recalc {{{
36             sub _recalc {
37 28     28   30 my $this = shift;
38 28         38 my $sum = 0;
39 28         35 my $v1 = $this->{v1};
40 28         41 my $v2 = $this->{v2};
41 28         76 my $c1 = $v1->query_size;
42 28         61 my $c2 = $v2->query_size;
43              
44 28 50       62 warn "[recalc " . ref($this) . "] (\$c1, \$c2) = ($c1, $c2)\n" if $Statistics::Basic::DEBUG;
45              
46 28 50       57 confess "the two vectors in a " . ref($this) . " object must be the same length ($c2!=$c1)" unless $c2 == $c1;
47              
48 28         34 my $cardinality = $c1;
49 28 50       59 $cardinality -- if $Statistics::Basic::UNBIAS;
50              
51 28         39 delete $this->{recalc_necessary};
52 28         74 delete $this->{_value};
53 28 50       70 return unless $cardinality > 0;
54 28 50       74 return unless $v1->query_filled;
55 28 50       62 return unless $v2->query_filled;
56              
57 28         88 $v1 = $v1->query;
58 28         58 $v2 = $v2->query;
59              
60 28         105 my $m1 = $this->{m1}->query;
61 28         72 my $m2 = $this->{m2}->query;
62              
63 28 50       67 if( $Statistics::Basic::DEBUG >= 2 ) {
64 0         0 for my $i (0 .. $#$v1) {
65 0         0 warn "[recalc " . ref($this) . "] ( $v1->[$i] - $m1 ) * ( $v2->[$i] - $m2 )\n";
66             }
67             }
68              
69 28         70 for my $i (0 .. $#$v1) {
70 33     33   249 no warnings 'uninitialized'; ## no critic
  33         127  
  33         8018  
71 172         10481 $sum += ( $v1->[$i] - $m1 ) * ( $v2->[$i] - $m2 );
72             }
73              
74 28         1170 $this->{_value} = ($sum / $cardinality);
75              
76 28 50       1089 warn "[recalc " . ref($this) . "] ($sum/$cardinality) = $this->{_value}\n" if $Statistics::Basic::DEBUG;
77              
78 28         61 return;
79             }
80             # }}}
81              
82             # query_vector1 {{{
83             sub query_vector1 {
84 7     7 1 64 my $this = shift;
85              
86 7         44 return $this->{v1};
87             }
88             # }}}
89             # query_vector2 {{{
90             sub query_vector2 {
91 6     6 1 8 my $this = shift;
92              
93 6         25 return $this->{v2};
94             }
95             # }}}
96             # query_mean1 {{{
97             sub query_mean1 {
98 0     0 1   my $this = shift;
99              
100 0           return $this->{m1};
101             }
102             # }}}
103             # query_mean2 {{{
104             sub query_mean2 {
105 0     0 1   my $this = shift;
106              
107 0           return $this->{m2};
108             }
109             # }}}
110              
111             1;