By the way:
- I used Burcin's patch, somehow I could not use Florent's one
- The patch is based on pynac-0.2.2, but applies on 0.2.3
Here is the output of the patch version
sage: class bla(SageObject):
....:     def __add__(self, other):
....:         print "Add"
....:
sage: m1 = bla()
sage: m2 = bla()
sage: a = x.ind[m1]
sage: b = x.ind[m2]
sage: a+b
x.<class '__main__.bla'> + x.<class '__main__.bla'>
sage: a+a
2*x.<class '__main__.bla'>

On 26 nov, 22:03, Jean-Pierre Flori <jpfl...@gmail.com> wrote:
> On 26 nov, 21:01, Jean-Pierre Flori <jpfl...@gmail.com> wrote:
>
>
>
>
>
>
>
> > On 25 nov, 09:34, Florent Hivert <florent.hiv...@lri.fr> wrote:
>
> > >       Hi Burcin,
>
> > > > Your example was trying to multiply two instances of the class bla.
> > > > Here is what I guess you meant to write:
>
> > > > sage: m1 = bla()
> > > > sage: m2 = bla()
> > > > sage: a, b = x.ind[m1],2*x.ind[m2]
> > > > Traceback (most recent call last)
> > > > <snip>
> > > > in sage.symbolic.expression.Expression._add_
> > > > (sage/symbolic/expression.cpp:11082)()
>
> > > > TypeError: unsupported operand type(s) for -: 'bla' and 'bla'
>
> > > > Note that it is trying to subtract the objects. Probably trying to
> > > > check equality. :)
>
> > > Of course ! I should had figured out it !
>
> > > > > WTF ! Why is it adding or multiplying my indices for nothing ! It is
> > > > > a problem of Ginac ? of the wrapper ? or behind the chair and the
> > > > > screen ?
>
> > > > Here is the backtrace:
>
> > > > Breakpoint 2, GiNaC::numeric::sub (this=0x7fffffffb4a0, other=...)
> > > >     at numeric.cpp:1745
> > > > 1745      {
> > > > (gdb) call this->dbgprint()
> > > > <class '__main__.bla'>
> > > > (gdb) call other.dbgprint()
> > > > <class '__main__.bla'>
> > > > (gdb) bt
> > > > #0  GiNaC::numeric::sub (this=0x7fffffffb4a0, other=...) at 
> > > > numeric.cpp:1745
> > > > #1  0x00007fffd687c599 in GiNaC::operator- (lh=<value optimized out>,
> > > >     rh=<value optimized out>) at operators.cpp:97
> > > > #2  0x00007fffd6879226 in GiNaC::numeric::compare_same_type 
> > > > (this=0x4796060,
> > > >     other=...) at numeric.cpp:1700
> > > > #3  0x00007fffd67ca25a in compare (this=0x3d9cd10, other=...) at 
> > > > ex.h:339
> > > > #4  GiNaC::idx::compare_same_type (this=0x3d9cd10, other=...) at 
> > > > idx.cpp:278
> > > > #5  0x00007fffd6ce0aad in compare (this=<value optimized out>,
> > > >     other=<value optimized out>)
> > > >     at /home/burcin/sage/sage-4.7.2/local/include/pynac/ex.h:339
> > > > #6  GiNaC::container<std::vector>::compare_same_type (
> > > >     this=<value optimized out>, other=<value optimized out>)
> > > >     at /home/burcin/sage/sage-4.7.2/local/include/pynac/container.h:625
> > > > #7  0x00007fffd67b5f5e in compare (this=0x45508e0, lh=<value optimized 
> > > > out>,
> > > >     rh=...) at ex.h:339
> > > > #8  GiNaC::expairseq::construct_from_2_ex (this=0x45508e0,
> > > >     lh=<value optimized out>, rh=...) at expairseq.cpp:887
> > > > #9  0x00007fffd6771beb in GiNaC::add::add (this=0x45508e0, lh=..., 
> > > > rh=...)
> > > >     at add.cpp:70
> > > > #10 0x00007fffd687c46c in exadd (lh=..., rh=...) at operators.cpp:42
> > > > #11 GiNaC::operator+ (lh=..., rh=...) at operators.cpp:69
> > > > #12 0x00007fffd644e489 in
> > > > __pyx_f_4sage_8symbolic_10expression_10Expression__add_
> > > > (__pyx_v_left=0x4757050, __pyx_v_right=0x4757d40,
>
> > > I should really learn how to debug those. Is
> > >    http://wiki.cython.org/DebuggingTechniques
> > > the best starting point. Any suggestions ?
>
> > > > In English: it tries to normalize the resulting expression in 
> > > > construct_from_2_ex(). This means checking if the two arguments are 
> > > > equal. Going through idx::compare_same type(), it ends up in 
> > > > numeric::compare_same_type(). Here is the code for that function:
>
> > > >   int numeric::compare_same_type(const basic &other) const
> > > >   {
> > > >     GINAC_ASSERT(is_exactly_a<numeric>(other));
> > > >     const numeric &o = static_cast<const numeric &>(other);
> > > >     int cmpval = (real() - o.real()).csgn();
> > > >     if (cmpval != 0)
> > > >        return cmpval;
> > > >     return (imag() - o.imag()).csgn();
> > > >   }
>
> > > > We should change this somehow. Maybe we could try PyObject_Compare and 
> > > > fall back to this if it fails.
>
> > > Looks to me like a solution. Does it mean patch GiNaC at sage level or at
> > > PyNaC level ?
>
> > > > Comments?
>
> > > Is there a way to tell, at the Ginac/C++ level, if an object is a standard
> > > GiNaC one or an abject wrapping a Python object ?
>
> > If I understand correctly, the numeric class is more or less a wrapper
> > for the Number_t class.
> > In the Number_T class there are a Value var and a Type var you could
> > use to make such a decision.
>
> > For the original problem, I guess it's up to Burcin to make the
> > decision.
> > I guess we should modify numeric::compare_same_type to call a
> > corresponding method in the Number_T.
> > This could call PyObject_Compare as Burcin suggest or one of the
> > operator<=.
>
> I implemented a small Number_T::compare_same_type function which seems
> to fix the above situation (you can add things indexed by bla
> objects), but it could also have broke everything else.
> A patch to apply agains pynac is available 
> athttp://www.infres.enst.fr/~flori/sage/cst.patch.
> It touches numeric.cpp and numeric.h
>
>
>
>
>
>
>
>
>
> > > Florent

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to