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.

Reply via email to