I see.

One problem here is that I don't know in advance the size of the returned 
list, so the allocation should happen in the c++ library side. So I am 
guessing the way around it is to return a pointer to the mpfr_ptr. Right?

El domingo, 5 de febrero de 2017, 11:43:54 (UTC+1), vdelecroix escribió:
>
> If you want to be complient with GMP/MPFR/FLINT you should change the 
> signature of 
>
>      mpfr_t* my_function (mpfr_t *_coef) 
>
> to 
>
>      void my_function(mfpr_ptr result, mpfr_ptr input, slong len) 
>
> And such function should not do any allocation at all. 
>
> Le 05/02/2017 à 11:40, Vincent Delecroix a écrit : 
> > If you had a look at the code I provided you can check that what you did 
> > is very wrong. 
> > 
> > mpfr_t is already an array. The type "mpfr_t * x" make no sense at all. 
> > 
> > Le 05/02/2017 à 11:38, mmarco a écrit : 
> >> I am afraid I didn't explain my problem well enough. 
> >> 
> >> My problem is not to write c++ code with mpfr. That is solved 
> >> It is also not to call c++ libraries from cython code that involves 
> plain 
> >> mpfr numbers. That is also solved. 
> >> My problem is to do so with functions that involve *arrays *(or lists, 
> or 
> >> vectors) of mpfr numbers. 
> >> 
> >> In particular, assume that i have writen a c++ library that provides a 
> >> function my_function that takes an array of mpfr numbers and returns 
> >> another array of mpfr numbers. So I try to write some cython code to 
> >> interface in from sage: 
> >> 
> >> #clang C++ 
> >> #clib my_library 
> >> 
> >> 
> >> include 'cysignals/signals.pxi' 
> >> 
> >> 
> >> from sage.libs.mpfr cimport * 
> >> from sage.rings.real_mpfr cimport RealNumber 
> >> from sage.rings.real_mpfr import RealField 
> >> 
> >> 
> >> cdef extern from "my_library.h": 
> >>     mpfr_t* my_function (mpfr_t *_coef) 
> >> 
> >> 
> >> def my_cython_function(values): 
> >>     cdef mpfr_t* cvalues = <mpfr_t*> 
> >> sage_malloc(sizeof(mpfr_t)*len(values)) 
> >>     cdef mpfr_t tempnum 
> >>     cdef mpfr_t* rop 
> >>     for i,v in enumerate(values): 
> >>         tempnum = values[i].value 
> >>         mpfr_init(cvalues[i]) 
> >>         mpfr_set(cvalues[i], tempnum, MPFR_RNDN) 
> >>     sig_on 
> >>     rop = my_function(cvalues) 
> >>     sig_off 
> >> 
> >> 
> >> This code is suppopsed to just create an array of mpfr objects to be 
> >> passed 
> >> to my_function, and another array to get the result of that function. 
> >> When 
> >> I try to compile it I get the following error: 
> >> 
> >> 
> >> 
> --------------------------------------------------------------------------- 
> >> 
> >> UnicodeDecodeError                        Traceback (most recent call 
> >> last) 
> >> /home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ 
> >> interactiveshell.pyc in run_code(self, code_obj, result) 
> >>    2896             if result is not None: 
> >>    2897                 result.error_in_exec = sys.exc_info()[1] 
> >> -> 2898             self.showtraceback() 
> >>    2899         else: 
> >>    2900             outflag = 0 
> >> 
> >> /home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ 
> >> interactiveshell.pyc in showtraceback(self, exc_tuple, filename, 
> >> tb_offset, 
> >> exception_only) 
> >>    1822                     except Exception: 
> >>    1823                         stb = self.InteractiveTB. 
> >> structured_traceback(etype, 
> >> -> 1824                                             value, tb, 
> tb_offset= 
> >> tb_offset) 
> >>    1825 
> >> 
> >> 
> >>    1826                     self._showtraceback(etype, value, stb) 
> >> 
> >> 
> /home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc 
>
> >> 
> >> in structured_traceback(self, etype, value, tb, tb_offset, 
> >> number_of_lines_of_context) 
> >>    1404         self.tb = tb 
> >>    1405         return FormattedTB.structured_traceback( 
> >> -> 1406             self, etype, value, tb, tb_offset, 
> >> number_of_lines_of_context) 
> >>    1407 
> >> 
> >> 
> >>    1408 
> >> 
> >> 
> /home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc 
>
> >> 
> >> in structured_traceback(self, etype, value, tb, tb_offset, 
> >> number_of_lines_of_context) 
> >>    1312             # Verbose modes need a full traceback 
> >>    1313             return VerboseTB.structured_traceback( 
> >> -> 1314                 self, etype, value, tb, tb_offset, 
> >> number_of_lines_of_context 
> >>    1315             ) 
> >>    1316         else: 
> >> 
> >> 
> /home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc 
>
> >> 
> >> in structured_traceback(self, etype, evalue, etb, tb_offset, 
> >> number_of_lines_of_context) 
> >>    1162 
> >>    1163         formatted_exception = 
> >> self.format_exception_as_a_whole(etype 
> >> , evalue, etb, number_of_lines_of_context, 
> >> -> 1164 
> >>  tb_offset) 
> >>    1165 
> >> 
> >> 
> >>    1166         colors = self.Colors  # just a shorthand + quicker name 
> >> lookup 
> >> 
> >> 
> /home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc 
>
> >> 
> >> in format_exception_as_a_whole(self, etype, evalue, etb, 
> >> number_of_lines_of_context, tb_offset) 
> >>    1111             return "" 
> >>    1112 
> >> -> 1113         last_unique, recursion_repeat = 
> >> find_recursion(orig_etype, 
> >> evalue, records) 
> >>    1114 
> >>    1115         frames = self.format_records(records, last_unique, 
> >> recursion_repeat) 
> >> 
> >> 
> /home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc 
>
> >> 
> >> in find_recursion(etype, value, records) 
> >>     453     # quarter of the traceback (250 frames by default) is 
> >> repeats, 
> >> and find the 
> >>     454     # first frame (from in to out) that looks different. 
> >> --> 455     if not is_recursion_error(etype, value, records): 
> >>     456         return len(records), 0 
> >>     457 
> >> 
> >> 
> /home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc 
>
> >> 
> >> in is_recursion_error(etype, value, records) 
> >>     439     # a recursion error. 
> >>     440     return (etype is recursion_error_type) \ 
> >> --> 441            and "recursion" in str(value).lower() \ 
> >>     442            and len(records) > 500 
> >>     443 
> >> 
> >> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 
> >> 1158: 
> >> ordinal not in range(128) 
> >> 
> >> 
> >> 
> >> 
> >> I tried to circunvent  this problem by using c++ vectors instead of 
> >> malloc'ed arrays, but then it is the c++ compilet which complains abput 
> >> creating vectors of mpfr_t objects. 
> >> 
> >> Thoughts? 
> >> 
>

-- 
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 https://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to