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 ? Don't know that page, but any tuto on gdb should do. I guess yo have to start sage inside gdb with: "./sage -gdb" Then you add some breakpoints where you want: Press CTRL+C to get inside gdb and type "break [...]" where ... is typically GiNaC::numeric::add or ...::compare_same_type (you should get some completion in gdb anyway). bt or backtrace gives you the backtrace. > > > 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 ? I guess it would be at the pynac level. Have a look at the numeric.cpp file. > > > 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 ? I guess Burcin could answer that question :) By the way, this is kind of bad (even if you should not try that kind of things normally...): sage: x = polygen(RR) sage: y = SR._force_pyobject(x) sage: y._cmp_(3) BOUM! (i.e. SIGSEGV) This is on my 4.7.1.rc1 with plenty of patches, surely a custom pynac and so oon, but I guess a vanilla installation would do the same.
I'll try to have a look at this, but have to build Sage 4.7.2 on the machine I can access this week-end first and apply the patches. > > 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