Wow, that is a fantastic example of how the threading engine, and dataflow, and probably affine slices, can lead to unexpected behavior. This is a good candidate for the discussion in the PDL Book, I would think. :-)
David On Sat, Jan 5, 2013 at 12:28 AM, Craig DeForest <[email protected]>wrote: > The threading engine subtracts the zeroth element from all the values in > order. First it subtracts from the zeroth element of $t. On all > subsequent iterations the zeroth element is zero and the subtraction is a > no-op. > > > (mobile) > > > On Jan 4, 2013, at 9:48 PM, Derek Lamb <[email protected]> wrote: > > > I had a 1D piddle of time values, and was trying to compute the time > offset relative to the initial values. I got some unexpected results when > trying to perform an action like '$t-=$t((0));' This is with perl 5.14.2, > and the (more or less) current PDL git, but holds all the way back to > PDL-2.4.7. I run the following script (for clarity, not in the PDL shell, > but it happens there too): > > > > ************** > > $ cat testme.pl > > use PDL; > > use PDL::NiceSlice; > > > > print "PDL::VERSION $PDL::VERSION\n"; > > $t_orig = pdl(12..16); > > print "orig:\t$t_orig\n\n"; > > > > for $i(0..4){ > > $t = $t_orig->copy; > > $t-=$t(($i)); > > print "nslice\t$t\n"; > > > > $t = $t_orig->copy; > > $t-=$t->slice("($i)"); > > print "slice\t$t\n"; > > > > $t = $t_orig->copy; > > $t-=$t->at($i); > > print "at($i)\t$t\n"; > > > > $t = $t_orig->copy; > > $t-=pdl($t_orig->at($i)); > > print "pdl\t$t\n"; > > > > $t = $t_orig->copy; > > $t = $t - $t(($i)); > > print "exp.nsl\t$t\n\n"; > > } > > > > 1; > > ************* > > > > The script just defines a piddle [12 13 14 15 16] and subtracts off the > 0th element in 5 different ways, then the 1st element, etc. The first four > ways (niceslice, slice, at, and pdl) all use the -= operator, and the last > one does the explicit assignment via subtraction of a niceslice. And I get > the following output: > > > > ************* > > $ perl testme.pl > > PDL::VERSION 2.4.11_001 > > orig: [12 13 14 15 16] > > > > nslice [0 13 14 15 16] > > slice [0 13 14 15 16] > > at(0) [0 1 2 3 4] > > pdl [0 1 2 3 4] > > exp.slc [0 1 2 3 4] > > > > nslice [-1 0 14 15 16] > > slice [-1 0 14 15 16] > > at(1) [-1 0 1 2 3] > > pdl [-1 0 1 2 3] > > exp.slc [-1 0 1 2 3] > > > > nslice [-2 -1 0 15 16] > > slice [-2 -1 0 15 16] > > at(2) [-2 -1 0 1 2] > > pdl [-2 -1 0 1 2] > > exp.slc [-2 -1 0 1 2] > > > > nslice [-3 -2 -1 0 16] > > slice [-3 -2 -1 0 16] > > at(3) [-3 -2 -1 0 1] > > pdl [-3 -2 -1 0 1] > > exp.slc [-3 -2 -1 0 1] > > > > nslice [-4 -3 -2 -1 0] > > slice [-4 -3 -2 -1 0] > > at(4) [-4 -3 -2 -1 0] > > pdl [-4 -3 -2 -1 0] > > exp.slc [-4 -3 -2 -1 0] > > > > ************* > > > > For each group of 5 methods, I was expecting the output to be what is > shown in the 'at', 'pdl', and 'exp.slc' lines. Obviously something is not > quite correct with the 'nslice', and 'slice' lines. > > > > So, two questions: 1) why do the nslice and slice lines act on just part > of the $t piddle, and not the whole thing? 2) why does the explicit > assignment w/ nslice not produce the same output as the -= operation with > slice? I thought they were exactly equivalent, that $a-=$b was just > syntactic sugar for $a = $a-$b. > > > > cheers, > > Derek > > _______________________________________________ > > Perldl mailing list > > [email protected] > > http://mailman.jach.hawaii.edu/mailman/listinfo/perldl > > > > _______________________________________________ > Perldl mailing list > [email protected] > http://mailman.jach.hawaii.edu/mailman/listinfo/perldl > -- "Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." -- Brian Kernighan
_______________________________________________ Perldl mailing list [email protected] http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
