File Coverage

blib/lib/Parallel/Simple/Dynamic.pm
Criterion Covered Total %
statement 21 52 40.3
branch 0 16 0.0
condition n/a
subroutine 7 11 63.6
pod 3 4 75.0
total 31 83 37.3


line stmt bran cond sub pod time code
1             package Parallel::Simple::Dynamic;
2              
3 1     1   35854 use Class::Std;
  1         13542  
  1         5  
4 1     1   1243 use Class::Std::Utils;
  1         3554  
  1         7  
5 1     1   1032 use POSIX qw(ceil);
  1         7094  
  1         6  
6 1     1   2343 use Parallel::Simple qw( prun );
  1         1252  
  1         105  
7              
8 1     1   7 use version; our $VERSION = qv('0.0.4');
  1         2  
  1         8  
9              
10 1     1   87 use warnings;
  1         2  
  1         24  
11 1     1   5 use strict;
  1         2  
  1         572  
12              
13             {
14             my %list_of :ATTR( :get :set :default<[]> :init_arg );
15             my %call_back :ATTR( :get :set :default<''> :init_arg );
16             my %num_of_cores :ATTR( :get :set :default<''> :init_arg );
17              
18             sub START {
19 0     0 0   my ($self, $ident, $arg_ref) = @_;
20 0           return;
21             }
22            
23             sub drun {
24 0     0 1   my ( $self, $arg_ref ) = @_;
25            
26 0 0         my $parts = defined $arg_ref->{parts} ? $arg_ref->{parts} : 2;
27 0 0         my $list = defined $arg_ref->{list} ? $arg_ref->{list} :[];
28 0 0         my $call_back = defined $arg_ref->{call_back} ? $arg_ref->{call_back} :'';
29              
30 0           my @partitions = $self->partition( {parts => $parts, list => $list } );
31              
32 0           my ( $pindex, @prun );
33 0           foreach my $partition ( @partitions ) {
34 0           my $prun = [ $call_back, ++$pindex, @$partition ];
35 0           push @prun, $prun;
36             }
37 0 0         prun( @prun ) or die( Parallel::Simple::errplus() );
38             }
39            
40             sub partition {
41 0     0 1   my ( $self, $arg_ref ) = @_;
42            
43 0 0         my $parts = defined $arg_ref->{parts} ? $arg_ref->{parts} : 2;
44 0 0         my $list = defined $arg_ref->{list} ? $arg_ref->{list} : [];
45 0           my @results;
46 0           my @segments = $self->calc_segments( {parts => $parts, list_length => scalar( @$list )} );
47 0           for ( my $i = 1; $i <= $parts; $i++ ) {
48 0           my $start = $segments[$i-1];
49 0           my $end = $segments[$i] - 1;
50 0           my @segment = @$list[$start..$end];
51 0           push @results, \@segment;
52             }
53 0           return @results;
54             }
55            
56             sub calc_segments {
57 0     0 1   my ( $self, $arg_ref ) = @_;
58            
59 0 0         my $parts = defined $arg_ref->{parts} ? $arg_ref->{parts} : 2;
60 0 0         my $list_length = defined $arg_ref->{list_length} ? $arg_ref->{list_length} :'';
61 0           my @segments = (0);
62 0           my $width = $list_length / $parts;
63 0           for ( my $i = 1; $i <= $parts; $i++ ) {
64 0           $segments[$i] = ceil( ($i) * $width );
65             }
66 0           return @segments;
67             }
68             }
69             1; # End of Parallel::Simple::Dynamic
70             __END__