That definitely seems like a bug to me.  Thanks for the cross-check, Marek.
Devels, I see the same in the latest PDL release so it is not a PDL-2.007 only issue.

--Chris

On 6/16/2015 09:36, Marek Gierliński wrote:
OK, thank you for your explanations. I'm not sure if all of this makes sense. If you try

print $s > 5;

in the above example, you will get 'BAD'. 5 is just a scalar and not a bad value. And $s is a one-dimensional piddle with a value different from the bad value. Neither of the values in this conditional expression is bad. Why does it return a string 'BAD'?

Marek

On Tue, 16 Jun 2015 at 14:24 Chris Marshall <devel.chm...@gmail.com <mailto:devel.chm...@gmail.com>> wrote:

    This result seems to violate the principle of least surprise.
    On the LHS we have a PDL with badvalue(0) and on the RHS we
    have a perl scalar with value 0 (which happens to be the bad
    value for the PDL).

    It seems surprising that $pdl > 0 is actually $pdl >
    pdl(0)->badvalue(0)

    Thoughts?
    Chris


    -------- Forwarded Message --------
    Subject:    Re: [Pdl-general] Weird behaviour of stats with bad values
    Date:       Tue, 16 Jun 2015 09:18:29 -0400
    From:       Chris Marshall <devel.chm...@gmail.com>
    <mailto:devel.chm...@gmail.com>
    To:         Derek Lamb <de...@boulder.swri.edu>
    <mailto:de...@boulder.swri.edu>, Marek Gierliński
    <marek.gierlin...@gmail.com> <mailto:marek.gierlin...@gmail.com>
    CC:         pdl-gene...@lists.sourceforge.net
    <mailto:pdl-gene...@lists.sourceforge.net>



    I think the problem is that if $s is a badvalue piddle with the
    badvalue=0
    then $s>0 is $s>BAD which is BAD.  If you use a value for badvalue
    that is
    not in the comparison, you should be good.

    --Chris

    On 6/16/2015 09:11, Derek Lamb wrote:
    Thanks for the simple example.  That helps a lot.

    The actual problem is that piddles with the badflags set always
    evaluate to BAD when element-wise logical operations are
    performed on them.

    "print $s<0" prints BAD instead of 0 or 1.  "print $x>0" also
    prints [BAD BAD BAD BAD].

    $m and $s have their badflags set (as they should, since they
    were made from partially-bad data).  You can check if they can be
    safely cleared, and clear them if so, with $s->check_badflag,
    etc.  Since $m and $s are 1-element piddles, you can also just
    set them directly to their scalar values, for example

    map{$_=$_->sclr} ($m,$s)=stats($x); #if you know they are only
    going to be 1 element piddles
    OR
    map{$_=$_->((0))} ($m,$s)=stats($x); #if you just want the first
    value

    The fact that $m and $s are 1-element piddles is likely what is
    causing your problem.  My guess is that this behavior has changed
    (perhaps intentionally, perhaps not) between your old version and
    more recent versions, and if you were getting $m and $s as simple
    perl scalars before you would not have seen this problem.  I can
    verify that stats() has returned 1-piddles and not perl scalars
    at least as far back as PDL-2.4.11.

    cheers,
    Derek

    On Jun 16, 2015, at 6:29 AM, Marek Gierliński
    <marek.gierlin...@gmail.com <mailto:marek.gierlin...@gmail.com>>
    wrote:

    Oops, sorry, I missed a line when copying the text. Here is the
    code again.

    use PDL;
    use PDL::NiceSlice;


    my $x = pdl(1, 2, 3, 0);
    $x->badflag(1);
    $x->badvalue(0);

    print "x = $x\n";

    my ($m, $s) = stats($x);

    print "m = $m, s = $s\n";
    print "s greater than zero\n" if $s > 0;
    print "s less than zero\n" if $s < 0;
    print "s equals zero\n" if $s == 0;


    On Tue, 16 Jun 2015 at 12:20 Chris Marshall
    <devel.chm...@gmail.com <mailto:devel.chm...@gmail.com>> wrote:

        Hi Marek-

        Do you have a complete example showing the problem?
        You don't show where $m and $s are being set below.

        Thanks,
        Chris


        On 6/16/2015 07:04, Marek Gierliński wrote:
        I have recently encountered a weird problem with stats (or
        statsover) using bad values. The resulting numbers have a
        strange property, they always return true in comparisons.
        This code:

        use PDL;
        use PDL::NiceSlice;

        my $x = pdl(1, 2, 3, 0);
        $x->badflag(1); $x->badvalue(0);

        print "m = $m, s = $s\n";
        print "s greater than zero\n" if $s > 0;
        print "s less than zero\n" if $s < 0;
        print "s equals zero\n" if $s == 0;

        returns the following output:

        x = [1 2 3 BAD]
        m = 2, s = 1
        s greater than zero
        s less than zero
        s equals zero

        which doesn't make any sense. Can anyone explain this? I
        always assumed that 'stats' returned ordinary Perl scalars,
        but this must be something different.

        I'm using PDL version 2.007. We had an older version
        installed for a long time and I think this problem appeared
        when we upgraded to 2.007.

        Marek

    
------------------------------------------------------------------------------
    _______________________________________________
    pdl-devel mailing list
    pdl-devel@lists.sourceforge.net
    <mailto:pdl-devel@lists.sourceforge.net>
    https://lists.sourceforge.net/lists/listinfo/pdl-devel


------------------------------------------------------------------------------
_______________________________________________
pdl-devel mailing list
pdl-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pdl-devel

Reply via email to