Python/Cython classes are not C++ classes, so you can't call Py/Cy methods from C++ code directly. It can of course be done using the CPython C API or Boost.Python, but a Python object is never a straight C++ object. For starters it doesn't have a C++ vtable, methods can be added dynamically in Python...
The two basic patterns for Cython code are A) Write your implementation in Python first. Then switch py->pyx Cython. Then identify the slow parts and cdef variables & methods as appropriate, so that Cython can generate fast C code instead of having to call the CPython API always. B) Write your implementation in C++ first, or use an existing code. Wrap the C++ objects in Cython objects (http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html). In this case you'd want to pass the raw matrix data as a pointer. On Wednesday, July 9, 2014 8:28:41 AM UTC-4, David Mödinger wrote: > > Hello everyone, > (see end for questions only) > > I am currently writing a sampling of functions as c++ mini library I want > to be able to use in sage. > The target is a (preferable fast) implementation of mulders-storjohann to > compute the weak-popov-form of a matrix over a polynomial ring over a > finite (extension) field. > > So far I made: > - a prototype in sage that seems to work > - an implementation in c++ using templates > the interface looks like this: > Matrix& WeakPopovFormDomain<Ring>::weak_popov_form_inp<Matrix>(Matrix& A > ) > and I tested it using a custom matrix class (because the class only > needet to support .coldim() .rowdim() and [][] operation) and NTL::ZZ_pEX, > which seems to work as well. > > After this I added a .pxd file containing: > cdef extern from "hiwi/algorithms/weak-popov-form.h" namespace > "hiwi_ms::WeakPopovFormDomain<NTL::ZZ_pEX>": > Matrix_generic_dense& weak_popov_form_inp(Matrix_generic_dense& A) > (and I added a corresponding .pyx with a wrapped function call because it > was in one of the cython examples.) > (withi "hiwi" being a temporary module and namespace name since I am > contracted as a so called hiwi to do this) > Unfortunately I found it really hard to find out what kind of object would > be used and how to use them. > > A simplistic sage example of what I want to do would be: > F.<a> = GF(2^8,'a') > PF.<x> = F[] > type(PF.random_element()) > <type 'sage.rings.polynomial.polynomial_zz_pex.Polynomial_ZZ_pEX'> > A= matrix([[PF.random.element()]],ring=PF) > type(A) > <type 'sage.matrix.matrix_generic_dense.Matrix_generic_dense'> > > two of the things I tried are: > from sage.matrix.matrix_generic_dense cimport Matrix_generic_dense > > cdef extern from "NTL/ZZ_pEX.h" namespace "NTL": > cdef cppclass ZZ_pEX "NTL::ZZ_pEX" > > Unfortunately it seems I cant use Matrix_generic_dense like this > ("Reference base type cannot be a Python object") and I'am not sure I can > use ZZ_pEX like this, but it stopped throwing errors when I used a forward > declaration instead of a from sage. ... .polynomial_zz_pex cimport > Polynomial_ZZ_pEX > > The code in the sage/src/sage/ modules wasn't helpful either (it is not > designed to learn from it, and I only work with cython a little for a month > now), naming and structure was inspired by LinBox, because it was used in a > similar fashion. > > > > *My questions therefore are:How do I find the correct objects to be used, > how do I import them correctly and most importantly:How can I correctly use > them as parameters for my functions?* > > I probably missed something important, please let me know. > > Regards > David > -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at http://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.