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<=.
>
> 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