Marek-

I've opened a highest priority bug report based on your information:

  http://sourceforge.net/p/pdl/bugs/390

Could you add information on your system specifics to the ticket
for reference (the output of perldl -V has the main information)?
We'll be updating the ticket as information becomes available.

Thanks for reporting the problem!
Chris



On 6/16/2015 09:49, Marek Gierliński wrote:
This is very bad news for me. I just searched through my scripts and found 586 instances of 'stats'. If this is not corrected, I have to assume that all of them might potentially produce incorrect results, without even failing (like in the if($s > 0) example).

We've been using 2.007 for a couple of months now. I'm not even sure if my recent results are correct.

Marek

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

    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