Ok, Craig.  I'll plan on a CPAN Developers release of PDL-2.4.9_993
for Saturday morning (or sooner if you are ready) and that will be the
branch point for the final PDL-2.4.10 countdown.  At that point, only
docs or strict bug fixes will be allowed in the branch and the PDL
master branch will resume for general development.

--Chris

On Tue, Jan 3, 2012 at 4:08 PM, Craig DeForest
<[email protected]> wrote:
>
> Sorry for the slow response here.
>
> I inserted the offending fixes over the summer, which patched up a few 
> consistency problems that arose because empty and null piddles were both 
> implemented in an ad hoc manner.  In particular, there was never any 
> documentation for how the empty set should be recognized, and the most 
> natural way got adopted by default -- just use any old PDL with zero elements 
> in it.  The scalar case for whichND used that technique -- just returned a 
> PDL with the same dimensions it would return anyway, but with 0 for one of 
> the dimensions.  If I recall right, that led to problems because sometimes 
> the data pointer was allocated and sometimes it wasn't in the returned PDL 
> (which is why it caused crashes occasionally).
>
> Anyway, I regularized the empty PDL case to use a 1-D PDL with size 0, which 
> is what index() was returning in the empty case.  That cleared up the bugs 
> since everything could look for a specific case in the dimensions.  Little 
> did I know that it would botch up someone else (of course -- without explicit 
> documentation the code becomes the spec...)
>
> Anyway, I'm open to moving back to a more general empty-PDL case that allows 
> structured emptines -- though if we do that we should really do it right: 
> regularize new_from_specification to accept specs for empty PDLs, and also 
> make the empty stringifier return a dimension list as well as "Empty", as in 
> "Empty(2x0)".
>
> Given that we appear to have a use case now, I'd be willing to edit (by 
> Friday):
>        * whichND()
>        * range()
>        * new_from_specification()
>        * the stringifier()
> to use arbitrarily-dimensioned empty PDLs.  The most straightforward hack to 
> avoid further crashes is to make sure that the data pointer is always valid 
> even if there's nothing in particular for it to point at.
>
> The threading engine needs to be thought about if full support is implemented 
> for generic empty PDLs.  In particular, I believe empty dimensions should 
> fail to match anything other than empty dimensions -- so, e.g., if $a is 2x0 
> and $b is 2x1, then "$a*$b" should throw an error, which it doesn't currently:
>
>        $a = whichND(pdl(0))->(*2);
>        $b = sequence(2,1);
>        sub PDL::xdims { join("x",$_[0]->dims) }
>        printf "%s * %s ==> %s\n", map { xdims $_ } ($a,$b,$a*$b);
>
> yields
>        2x0 * 2x1 ==> 2x0
>
> rather than (more correctly) something like:
>        PDL: PDL::Ops::mult(a,b,c): Parameter 'b':
>        Mismatched implicit thread dimension 1: should be 0, is 1
>
> Anyway, Chris, if you give the go-ahead I'll restore the fuller structured 
> Empty behavior in those routines and put appropriate tests in place.  I'll 
> dive into the threading engine to see just how simple it is to throw a 
> mismatch error in the described case.  Otherwise I'll wait and update those 
> routines later.
>
>
>
>
> On Jan 3, 2012, at 12:45 PM, Chris Marshall wrote:
>
>> Looking at the definition of whichND(), it seems like having
>> it return a shape [nfound,0] piddle would be more consistent
>> w.r.t. the principle of least surprise.  However, the question
>> is whether it can be made to work with the range() and pdl
>> constructor code and whether there are any other snags
>> from that implementation.
>>
>> Cheers,
>> Chris
>>
>> On Mon, Jan 2, 2012 at 4:06 AM, Bryan Jurish
>> <[email protected]> wrote:
>>> On 2011-12-30 13:53, chm wrote:
>>>> On 12/27/2011 3:29 PM, Bryan Jurish wrote:
>>>>>
>>>>>> From a more principled (as opposed to purely pragmatic) standpoint, I
>>>>> think there are good reasons to allow size-0 dimensions across the
>>>>> board
>>> ...
>>>>> to provide identity elements for glue().
>>>>
>>>> The identity element argument seems like a plausible
>>>> justification/motivation for the existence and meaning of
>>>> such piddle shapes with 0-length dimensions.
>>>
>>> ... just a note after the fact: it seems that the return value of
>>> whichND(zeroes(4,3)) has changed in the 2.4.10 release candidate as
>>> well. With $,=' '; I get:
>>>
>>>  ##-- v2.4.7_001 (debian squeeze)
>>>  print whichND(  ones(4,3))->dims; ##-- "2 12"
>>>  print whichND(zeroes(4,3))->dims; ##-- "2 0"
>>>
>>>  ##-- v2.4.9_015
>>>  print whichND(  ones(4,3))->dims; ##-- "2 12"
>>>  print whichND(zeroes(4,3))->dims; ##-- "0"
>>
>

_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to