File Coverage

blib/lib/Statistics/Basic/Variance.pm
Criterion Covered Total %
statement 45 46 97.8
branch 10 18 55.5
condition n/a
subroutine 8 8 100.0
pod 2 2 100.0
total 65 74 87.8


line stmt bran cond sub pod time code
1             package Statistics::Basic::Variance;
2              
3 33     33   155 use strict;
  33         48  
  33         1249  
4 33     33   149 use warnings;
  33         45  
  33         794  
5 33     33   158 use Carp;
  33         42  
  33         2570  
6              
7 33     33   188 use base 'Statistics::Basic::_OneVectorBase';
  33         42  
  33         12197  
8              
9             sub new {
10 45     45 1 435 my $class = shift;
11              
12 45 50       118 warn "[new $class]\n" if $Statistics::Basic::DEBUG >= 2;
13              
14 45         111 my $this = bless {}, $class;
15 45 50       75 my $vector = eval { Statistics::Basic::Vector->new(@_) } or croak $@;
  45         264  
16 45 100       144 my $c = $vector->_get_computer("variance"); return $c if defined $c;
  45         202  
17              
18 44         1069 $this->{v} = $vector;
19 44 50       62 $this->{m} = eval { Statistics::Basic::Mean->new($vector) } or croak $@;
  44         197  
20              
21 44         124 $vector->_set_computer( variance => $this );
22              
23 44         814 return $this;
24             }
25              
26             sub _recalc {
27 64     64   72 my $this = shift;
28 64         70 my $first = shift;
29              
30 64         103 delete $this->{recalc_needed};
31 64         85 delete $this->{_value};
32              
33 64         198 my $mean = $this->{m}->query;
34 64 50       157 return unless defined $mean;
35              
36 64         94 my $v = $this->{v};
37 64         171 my $cardinality = $v->query_size;
38 64 50       156 $cardinality -- if $Statistics::Basic::UNBIAS;
39 64 50       142 return unless $cardinality > 0;
40              
41 64 50       134 if( $Statistics::Basic::DEBUG >= 2 ) {
42 0         0 warn "[recalc " . ref($this) . "] ( $_ - $mean ) ** 2\n" for $v->query;
43             }
44              
45 33     33   193 my $sum = 0; { no warnings 'uninitialized'; ## no critic
  33         60  
  33         5467  
  64         72  
  64         66  
46 64         146 $sum += ( $_ - $mean ) ** 2 for $v->query;
47             }
48              
49 64         25796 $this->{_value} = ($sum / $cardinality);
50              
51 64 50       2221 warn "[recalc " . ref($this) . "] ($sum/$cardinality) = $this->{_value}\n" if $Statistics::Basic::DEBUG;
52              
53 64         140 return;
54             }
55              
56 1     1 1 3 sub query_mean { return $_[0]->{m} }
57              
58             1;