[Numpy-discussion] Code generator bug and fix?
Charles R Harris
charlesr.harris at gmail.com
Tue Apr 22 00:01:38 EDT 2008
On Mon, Apr 21, 2008 at 9:09 PM, Travis E. Oliphant <oliphant at enthought.com>
wrote:
> Charles R Harris wrote:
> >
> >
> > On Mon, Apr 21, 2008 at 8:53 PM, Charles R Harris
> > <charlesr.harris at gmail.com <mailto:charlesr.harris at gmail.com>> wrote:
> >
> >
> >
> > On Mon, Apr 21, 2008 at 8:28 PM, Travis E. Oliphant
> > <oliphant at enthought.com <mailto:oliphant at enthought.com>> wrote:
> >
> > Charles R Harris wrote:
> > > I've gotten my own python class with a logical_not method to
> > work
> > > correctly if I goto
> > numpy/core/code_generators/generate_umath.py and
> > > change
> > I need more context for this. Why does the umath generator
> > matter for
> > your python class?
> > >
> > > 'logical_not' :
> > > Ufunc(1, 1, None,
> > > 'returns not x elementwise.',
> > > TD(noobj, out='?'),
> > > TD(M, f='logical_not', out='?'),
> > > ),
> > >
> > > to
> > >
> > > 'logical_not' :
> > > Ufunc(1, 1, None,
> > > 'returns not x elementwise.',
> > > TD(noobj, out='?'),
> > > TD(M, f='logical_not'),
> > > ),
> > >
> > Why is this an error? Is the difference only removing the out
> > variable? It's been a while since I reviewed this code, so
> > what does
> > removing the out variable do functionally (What is the
> > difference in the
> > ufunc that is generated)?
> >
> >
> > The way it is, it passes a boolean array to the PyUFunc_O_O_method
> > loop where the loop is expecting an object array. I checked the
> > step size to see this, and that's also how the generated signature
> > reads. Consequently, when the reference count is decremented bad
> > things happen. I suspect this hasn't been seen before because it
> > hadn't been tried. I wrote loop tests before cleaning up the loop
> > code and the bug turned up then.
> >
> > My guess is that here M means object called through non-Python
> > method (logical_not), and omitting out means the output type is
> > the same as the input. I suspect that '?' should do the same thing
> > and that there might be a bug in the function dispatcher or the
> > signature generator, but I'm not clear on that yet.
> >
> >
> > If out is omitted, the output types matches the input types. Here's
> > where the output types are generated:
> >
> > def finish_signature(self, nin, nout):
> > if self.in_ is None:
> > self.in_ = self.type * nin
> > assert len(self.in_) == nin
> > if self.out is None:
> > self.out = self.type * nout
> > assert len(self.out) == nout
> >
> > So that seems like the right thing to do. I still don't know what '?'
> > means, though.
>
> Thanks Chuck,
>
> I get it now (I should have spent a minute looking at the code). The
> '?' is the character code for "boolean"
>
> So, I think you are right about the bug.
>
I note that other logical operators, <, ==, do in fact return booleans when
operating on objects. So another fix is to write special case loops for
logical_{not, or, and, xor} that do the same. Perhaps a ticket for an
enhancement should be opened.
Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20080421/31710836/attachment.html>
More information about the NumPy-Discussion
mailing list