mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-11-22 14:07:55 +00:00
parallel: :::: now does nesting/product/cartesian/multiply (--xapply missing)
This commit is contained in:
parent
7f731a54b7
commit
a560a74b8a
88
src/parallel
88
src/parallel
|
@ -3905,6 +3905,7 @@ sub new {
|
|||
|
||||
sub get {
|
||||
my $self = shift;
|
||||
return $self->nest_get();
|
||||
if(@{$self->{'unget'}}) {
|
||||
return shift @{$self->{'unget'}};
|
||||
}
|
||||
|
@ -3964,6 +3965,93 @@ sub get {
|
|||
}
|
||||
}
|
||||
|
||||
sub nest_get {
|
||||
my $self = shift;
|
||||
if(@{$self->{'unget'}}) {
|
||||
return shift @{$self->{'unget'}};
|
||||
}
|
||||
my @record = ();
|
||||
my $prepend = undef;
|
||||
my $empty = 1;
|
||||
my $no_of_inputs = $#{$self->{'fhs'}} + 1;
|
||||
if(not @::arg_matrix) {
|
||||
# Initialize @::arg_matrix with one arg from each file
|
||||
# read one line from each file
|
||||
my @first_arg_set;
|
||||
for (my $fhno = 0; $fhno < $no_of_inputs ; $fhno++) {
|
||||
my $fh = $self->{'fhs'}[$fhno];
|
||||
my $arg = <$fh>;
|
||||
# Remove delimiter
|
||||
$arg =~ s:$/$::;
|
||||
$::arg_matrix[$fhno][0]=Arg->new($arg);
|
||||
push @first_arg_set, $::arg_matrix[$fhno][0];
|
||||
}
|
||||
$self->unget([@first_arg_set]);
|
||||
}
|
||||
my @fh = @{$self->{'fhs'}};
|
||||
for (my $fhno = 0; $fhno < $no_of_inputs; $fhno++) {
|
||||
if(eof($fh[$fhno])) {
|
||||
next;
|
||||
} else {
|
||||
# read one
|
||||
my $f = $fh[$fhno];
|
||||
my $arg = <$f>;
|
||||
# Remove delimiter
|
||||
$arg =~ s:$/$::;
|
||||
my $len = $#{$::arg_matrix[$fhno]}+1;
|
||||
$::arg_matrix[$fhno][$len]=Arg->new($arg);
|
||||
# make all new combinations
|
||||
my @combarg = ();
|
||||
for (my $fhn = 0; $fhn < $no_of_inputs; $fhn++) {
|
||||
push @combarg, [0, $#{$::arg_matrix[$fhn]}];
|
||||
}
|
||||
$combarg[$fhno] = [$len,$len]; # Find only combinations with this new entry
|
||||
my @combinations = expand_combinations(@combarg);
|
||||
# map combinations
|
||||
# [ 1, 3, 7], [ 2, 4, 1 ]
|
||||
# =>
|
||||
# [ m[0][1], m[1][3], m[3][7]], [ m[0][2], m[1][4], m[2][1] ]
|
||||
my @mapped;
|
||||
for my $c (@combinations) {
|
||||
my @a;
|
||||
for my $n (0 .. $no_of_inputs - 1 ) {
|
||||
push @a, $::arg_matrix[$n][$$c[$n]];
|
||||
}
|
||||
push @mapped, [@a];
|
||||
}
|
||||
# unget the mapped
|
||||
push @{$self->{'unget'}}, @mapped;
|
||||
# get the first
|
||||
return shift @{$self->{'unget'}};
|
||||
}
|
||||
}
|
||||
# all are eof; return undef
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub expand_combinations {
|
||||
# Input:
|
||||
# ([xmin,xmax], [ymin,ymax], ...)
|
||||
# Returns ([x,y,...],[x,y,...])
|
||||
# where xmin <= x <= xmax and ymin <= y <= ymax
|
||||
my $minmax_ref = shift;
|
||||
my $xmin = $$minmax_ref[0];
|
||||
my $xmax = $$minmax_ref[1];
|
||||
my @p;
|
||||
if(@_) {
|
||||
# If there are more columns: Compute those recursively
|
||||
my @rest = expand_combinations(@_);
|
||||
for(my $x = $xmin; $x <= $xmax; $x++) {
|
||||
push @p, map { [$x, @$_] } @rest;
|
||||
}
|
||||
} else {
|
||||
for(my $x = $xmin; $x <= $xmax; $x++) {
|
||||
push @p, [$x];
|
||||
}
|
||||
}
|
||||
return @p;
|
||||
}
|
||||
|
||||
sub unget {
|
||||
my $self = shift;
|
||||
::debug("MultifileQueue-unget '@_'\n");
|
||||
|
|
Loading…
Reference in a new issue