File Coverage

blib/lib/PDL/NDBin/Iterator.pm
Criterion Covered Total %
statement 67 68 98.5
branch 7 8 87.5
condition n/a
subroutine 24 24 100.0
pod 13 13 100.0
total 111 113 98.2


line stmt bran cond sub pod time code
1             package PDL::NDBin::Iterator;
2             # ABSTRACT: Iterator object for PDL::NDBin
3             $PDL::NDBin::Iterator::VERSION = '0.020';
4 5     5   632863 use strict;
  5         19  
  5         152  
5 5     5   27 use warnings;
  5         10  
  5         173  
6 5     5   28 use Carp;
  5         9  
  5         267  
7 5     5   52 use List::Util qw( reduce );
  5         9  
  5         296  
8 5     5   1278 use List::MoreUtils qw( all );
  5         26327  
  5         32  
9 5     5   4311 use XSLoader;
  5         13  
  5         123  
10 5     5   2784 use Params::Validate qw( validate ARRAYREF );
  5         46610  
  5         3538  
11              
12              
13              
14             sub new
15             {
16 478     478 1 94832 my $class = shift;
17             my %params = validate( @_, {
18             bins => {
19             type => ARRAYREF,
20 478     478   913 callbacks => { 'have at least one bin along every dimension' => sub { my $bins = shift; all { $_ > 0 } @$bins } },
  478         1934  
  514         5388  
21             },
22             array => {
23             type => ARRAYREF,
24 478     478   947 callbacks => { 'have at least one element' => sub { my $array = shift; @$array } },
  478         4170  
25             },
26 478         11260 idx => { can => [ qw( eq which ) ] },
27             } );
28             my $self = {
29             bins => $params{bins},
30             array => $params{array},
31             idx => $params{idx},
32 478         1911 active => [ (1) x @{ $params{array} } ],
33             bin => 0,
34             var => -1,
35 36     36   80 nbins => (reduce { $a * $b } @{ $params{bins} }),
  478         2194  
36 478         4093 nvars => (scalar @{ $params{array} }),
  478         2265  
37             };
38 478         2693 return bless $self, $class;
39             }
40              
41              
42             # advance() is implemented in XS
43              
44              
45 300     300 1 4210 sub bin { $_[0]->{bin} }
46 557     557 1 1134 sub var { $_[0]->{var} }
47 8     8 1 702 sub done { $_[0]->{bin} >= $_[0]->{nbins} }
48 36     36 1 47 sub bins { @{ $_[0]->{bins} } }
  36         72  
49 97     97 1 705 sub nbins { $_[0]->{nbins} }
50 7     7 1 30 sub nvars { $_[0]->{nvars} }
51 719     719 1 2911 sub data { $_[0]->{array}->[ $_[0]->{var} ] }
52 592     592 1 7777 sub idx { $_[0]->{idx} }
53              
54              
55             sub var_active
56             {
57 515     515 1 942 my $self = shift;
58 515         793 my $i = $self->{var};
59 515 50       1073 if( @_ ) { $self->{active}->[ $i ] = shift }
  515         1063  
60 0         0 else { $self->{active}->[ $i ] }
61             }
62              
63              
64             sub want
65             {
66 225     225 1 866 my $self = shift;
67 225 100       470 unless( defined $self->{want} ) {
68 166         309 $self->{want} = PDL::which $self->idx == $self->{bin};
69             }
70 225         6413 return $self->{want};
71             }
72              
73              
74             sub selection
75             {
76 138     138 1 8145 my $self = shift;
77 138 100       318 unless( defined $self->{selection} ) {
78 106         197 $self->{selection} = $self->data->index( $self->want );
79             }
80 138         455 return $self->{selection};
81             }
82              
83              
84             sub unflatten
85             {
86 42     42 1 107 my $self = shift;
87 42 100       80 unless( defined $self->{unflattened} ) {
88 36         50 my $q = $self->{bin}; # quotient
89             $self->{unflattened} =
90             [ map {
91 5     5   2670 ( $q, my $r ) = do { use integer; ( $q / $_, $q % $_ ) };
  5         74  
  5         36  
  36         56  
  102         123  
  102         155  
92 102         163 $r
93             } $self->bins
94             ];
95             }
96 42         57 return @{ $self->{unflattened} };
  42         86  
97             }
98              
99             XSLoader::load( __PACKAGE__ );
100              
101             1;
102              
103             __END__