Statistiques
| Révision :

root / pobysoPythonSage / src / pobyso.py @ 117

Historique | Voir | Annoter | Télécharger (46,09 ko)

1 5 storres
"""
2 5 storres
Actual functions to use in Sage
3 5 storres
ST 2012-11-13
4 5 storres

5 5 storres
Command line syntax:
6 5 storres
  use from Sage (via the "load" or the "attach" commands)
7 5 storres

8 38 storres
pobyso functions come in five flavors:
9 57 storres
- the _so_so (arguments and returned objects are pointers to Sollya objects,
10 57 storres
  includes the void function and the no arguments function that return a
11 57 storres
  pointer to a Sollya object);
12 38 storres
- the _so_sa (argument are pointers to Sollya objects, returned objects are
13 57 storres
  Sage/Python objects or, more generally, information is transfered from the
14 57 storres
  Sollya world to Sage/Python world; e.g. functions without arguments that
15 57 storres
  return a Sage/Python object);
16 38 storres
- the _sa_so (arguments are Sage/Python objects, returned objects are
17 38 storres
  pointers to Sollya objects);
18 38 storres
- the sa_sa (arguments and returned objects are all Sage/Python objects);
19 51 storres
- a catch all flavor, without any suffix, (e. g. functions that have no argument
20 51 storres
  nor return value).
21 57 storres
This classification is not always very strict. Conversion functions from Sollya
22 57 storres
to Sage/Python are sometimes decorated with Sage/Python arguments to set
23 57 storres
the precision. These functions remain in the so_sa category.
24 5 storres
NOTES:
25 5 storres
Reported errors in Eclipse come from the calls to
26 5 storres
the Sollya library
27 5 storres

28 10 storres
ToDo (among other things):
29 10 storres
 -memory management.
30 5 storres
"""
31 5 storres
from ctypes import *
32 37 storres
import re
33 37 storres
from sage.symbolic.expression_conversions import polynomial
34 59 storres
from sage.symbolic.expression_conversions import PolynomialConverter
35 38 storres
"""
36 38 storres
Create the equivalent to an enum for the Sollya function types.
37 38 storres
"""
38 5 storres
(SOLLYA_BASE_FUNC_ABS,
39 5 storres
SOLLYA_BASE_FUNC_ACOS,
40 5 storres
    SOLLYA_BASE_FUNC_ACOSH,
41 5 storres
    SOLLYA_BASE_FUNC_ADD,
42 5 storres
    SOLLYA_BASE_FUNC_ASIN,
43 5 storres
    SOLLYA_BASE_FUNC_ASINH,
44 5 storres
    SOLLYA_BASE_FUNC_ATAN,
45 5 storres
    SOLLYA_BASE_FUNC_ATANH,
46 5 storres
    SOLLYA_BASE_FUNC_CEIL,
47 5 storres
    SOLLYA_BASE_FUNC_CONSTANT,
48 5 storres
    SOLLYA_BASE_FUNC_COS,
49 5 storres
    SOLLYA_BASE_FUNC_COSH,
50 5 storres
    SOLLYA_BASE_FUNC_DIV,
51 5 storres
    SOLLYA_BASE_FUNC_DOUBLE,
52 5 storres
    SOLLYA_BASE_FUNC_DOUBLEDOUBLE,
53 5 storres
    SOLLYA_BASE_FUNC_DOUBLEEXTENDED,
54 5 storres
    SOLLYA_BASE_FUNC_ERF,
55 5 storres
    SOLLYA_BASE_FUNC_ERFC,
56 5 storres
    SOLLYA_BASE_FUNC_EXP,
57 5 storres
    SOLLYA_BASE_FUNC_EXP_M1,
58 5 storres
    SOLLYA_BASE_FUNC_FLOOR,
59 5 storres
    SOLLYA_BASE_FUNC_FREE_VARIABLE,
60 5 storres
    SOLLYA_BASE_FUNC_HALFPRECISION,
61 5 storres
    SOLLYA_BASE_FUNC_LIBRARYCONSTANT,
62 5 storres
    SOLLYA_BASE_FUNC_LIBRARYFUNCTION,
63 5 storres
    SOLLYA_BASE_FUNC_LOG,
64 5 storres
    SOLLYA_BASE_FUNC_LOG_10,
65 5 storres
    SOLLYA_BASE_FUNC_LOG_1P,
66 5 storres
    SOLLYA_BASE_FUNC_LOG_2,
67 5 storres
    SOLLYA_BASE_FUNC_MUL,
68 5 storres
    SOLLYA_BASE_FUNC_NEARESTINT,
69 5 storres
    SOLLYA_BASE_FUNC_NEG,
70 5 storres
    SOLLYA_BASE_FUNC_PI,
71 5 storres
    SOLLYA_BASE_FUNC_POW,
72 5 storres
    SOLLYA_BASE_FUNC_PROCEDUREFUNCTION,
73 5 storres
    SOLLYA_BASE_FUNC_QUAD,
74 5 storres
    SOLLYA_BASE_FUNC_SIN,
75 5 storres
    SOLLYA_BASE_FUNC_SINGLE,
76 5 storres
    SOLLYA_BASE_FUNC_SINH,
77 5 storres
    SOLLYA_BASE_FUNC_SQRT,
78 5 storres
    SOLLYA_BASE_FUNC_SUB,
79 5 storres
    SOLLYA_BASE_FUNC_TAN,
80 5 storres
    SOLLYA_BASE_FUNC_TANH,
81 5 storres
SOLLYA_BASE_FUNC_TRIPLEDOUBLE) = map(int,xrange(44))
82 56 storres
print "\nSuperficial pobyso check..."
83 5 storres
print "First constant - SOLLYA_BASE_FUNC_ABS: ", SOLLYA_BASE_FUNC_ABS
84 5 storres
print "Last constant  - SOLLYA_BASE_FUNC_TRIPLEDOUBLE: ", SOLLYA_BASE_FUNC_TRIPLEDOUBLE
85 5 storres
86 5 storres
pobyso_max_arity = 9
87 5 storres
88 85 storres
def pobyso_absolute_so_so():
89 85 storres
    return(sollya_lib_absolute(None))
90 85 storres
91 5 storres
def pobyso_autoprint(arg):
92 5 storres
    sollya_lib_autoprint(arg,None)
93 5 storres
94 38 storres
def pobyso_autoprint_so_so(arg):
95 38 storres
    sollya_lib_autoprint(arg,None)
96 54 storres
97 84 storres
def pobyso_bounds_to_range_sa_so(rnLowerBoundSa, rnUpperBoundSa, \
98 84 storres
                                 precisionSa=None):
99 84 storres
    """
100 84 storres
    Return a Sollya range from to 2 RealField Sage elements.
101 84 storres
    The Sollya range element has a sufficient precision to hold all
102 84 storres
    the digits of the Sage bounds.
103 84 storres
    """
104 84 storres
    # Sanity check.
105 84 storres
    if rnLowerBoundSa > rnUpperBoundSa:
106 84 storres
        return None
107 115 storres
    # Precision stuff.
108 85 storres
    if precisionSa is None:
109 84 storres
        # Check for the largest precision.
110 84 storres
        lbPrecSa = rnLowerBoundSa.parent().precision()
111 84 storres
        ubPrecSa = rnLowerBoundSa.parent().precision()
112 84 storres
        maxPrecSa = max(lbPrecSa, ubPrecSa)
113 84 storres
    else:
114 84 storres
        maxPrecSa = precisionSa
115 84 storres
    sollyaCurrentPrecSo = pobyso_get_prec_so()
116 84 storres
    sollyaCurrentPrecSa = pobyso_constant_from_int_so_sa(sollyaCurrentPrecSo)
117 84 storres
    # Change the current Sollya precision only if necessary.
118 84 storres
    if maxPrecSa > sollyaCurrentPrecSa:
119 84 storres
        pobyso_set_prec_sa_so(maxPrecSa)
120 115 storres
    # From Sage to Sollya bounds.
121 84 storres
    lowerBoundSo = sollya_lib_constant(get_rn_value(rnLowerBoundSa))
122 84 storres
    upperBoundSo = sollya_lib_constant(get_rn_value(rnUpperBoundSa))
123 115 storres
    # From Sollya bounds to range.
124 84 storres
    rangeSo = sollya_lib_range(lowerBoundSo, upperBoundSo)
125 84 storres
    # Back to original precision.
126 84 storres
    if maxPrecSa > sollyaCurrentPrecSa:
127 84 storres
        sollya_lib_set_prec(sollyaCurrentPrecSo)
128 84 storres
    # Clean up
129 84 storres
    sollya_lib_clear_obj(sollyaCurrentPrecSo)
130 84 storres
    sollya_lib_clear_obj(lowerBoundSo)
131 84 storres
    sollya_lib_clear_obj(upperBoundSo)
132 84 storres
    return(rangeSo)
133 84 storres
# End pobyso_bounds_to_range_sa_so
134 84 storres
135 54 storres
def pobyso_build_function_sub_so_so(exp1So, exp2So):
136 54 storres
    return(sollya_lib_build_function_sub(exp1So, exp2So))
137 54 storres
138 85 storres
def pobyso_change_var_in_function_so_so(funcSo, chvarExpSo):
139 54 storres
    """
140 85 storres
    Variable change in a function.
141 85 storres
    """
142 85 storres
    return(sollya_lib_evaluate(funcSo,chvarExpSo))
143 85 storres
# End pobyso_change_var_in_function_so_so
144 85 storres
145 85 storres
def pobyso_chebyshevform_so_so(functionSo, degreeSo, intervalSo):
146 85 storres
    resultSo = sollya_lib_chebyshevform(functionSo, degreeSo, intervalSo)
147 85 storres
    return(resultSo)
148 85 storres
# End pobyso_chebyshevform_so_so.
149 85 storres
150 117 storres
def pobyso_clear_taylorform_sa_so(taylorFormSaSo):
151 117 storres
    """
152 117 storres
    This method is necessary to correctly clean up the memory from Taylor forms.
153 117 storres
    These are made of a Sollya object, a Sollya object list, a Sollya object.
154 117 storres
    For no clearly understood reason, sollya_lib_clear_object_list crashed
155 117 storres
    when applied to the object list.
156 117 storres
    Here, we decompose it into Sage list of Sollya objects references and we
157 117 storres
     clear them one by one.
158 117 storres
    """
159 117 storres
    sollya_lib_clear_obj(taylorFormSaSo[0])
160 117 storres
    (coefficientsErrorsListSaSo, numElementsSa, isEndEllipticSa) = \
161 117 storres
        pobyso_get_list_elements_so_so(taylorFormSaSo[1])
162 117 storres
    for element in coefficientsErrorsListSaSo:
163 117 storres
        sollya_lib_clear_obj(element)
164 117 storres
    sollya_lib_clear_obj(taylorFormSaSo[1])
165 117 storres
    sollya_lib_clear_obj(taylorFormSaSo[2])
166 117 storres
# End pobyso_clear_taylorform_sa_so
167 117 storres
168 85 storres
def pobyso_cmp(rnArgSa, cteSo):
169 85 storres
    """
170 54 storres
    Compare the MPFR value a RealNumber with that of a Sollya constant.
171 54 storres

172 54 storres
    Get the value of the Sollya constant into a RealNumber and compare
173 54 storres
    using MPFR. Could be optimized by working directly with a mpfr_t
174 54 storres
    for the intermediate number.
175 54 storres
    """
176 115 storres
    # Get the precision of the Sollya constant to build a Sage RealNumber
177 115 storres
    # with enough precision.to hold it.
178 5 storres
    precisionOfCte = c_int(0)
179 5 storres
    # From the Sollya constant, create a local Sage RealNumber.
180 85 storres
    sollya_lib_get_prec_of_constant(precisionOfCte, cteSo)
181 5 storres
    #print "Precision of constant: ", precisionOfCte
182 5 storres
    RRRR = RealField(precisionOfCte.value)
183 85 storres
    rnLocalSa = RRRR(0)
184 85 storres
    sollya_lib_get_constant(get_rn_value(rnLocalSa), cteSo)
185 115 storres
    #
186 115 storres
    ## Compare the Sage RealNumber version of the Sollya constant with rnArg.
187 85 storres
    return(cmp_rn_value(rnArgSa, rnLocal))
188 83 storres
# End pobyso_smp
189 5 storres
190 54 storres
def pobyso_compute_pos_function_abs_val_bounds_sa_sa(funcSa, lowerBoundSa, \
191 54 storres
                                                     upperBoundSa):
192 54 storres
    """
193 85 storres
    TODO: completely rework and test.
194 54 storres
    """
195 85 storres
    pobyso = pobyso_name_free_variable_sa_so(funcSa.variables()[0])
196 54 storres
    funcSo = pobyso_parse_string(funcSa._assume_str())
197 54 storres
    rangeSo = pobyso_range_sa_so(lowerBoundSa, upperBoundSa)
198 54 storres
    infnormSo = pobyso_infnorm_so_so(funcSo,rangeSo)
199 83 storres
    # Sollya return the infnorm as an interval.
200 54 storres
    fMaxSa = pobyso_get_interval_from_range_so_sa(infnormSo)
201 54 storres
    # Get the top bound and compute the binade top limit.
202 54 storres
    fMaxUpperBoundSa = fMaxSa.upper()
203 54 storres
    binadeTopLimitSa = 2**ceil(fMaxUpperBoundSa.log2())
204 54 storres
    # Put up together the function to use to compute the lower bound.
205 54 storres
    funcAuxSo = pobyso_parse_string(str(binadeTopLimitSa) +  \
206 54 storres
                                    '-(' + f._assume_str() + ')')
207 54 storres
    pobyso_autoprint(funcAuxSo)
208 83 storres
    # Clear the Sollya range before a new call to infnorm and issue the call.
209 54 storres
    sollya_lib_clear_obj(infnormSo)
210 54 storres
    infnormSo = pobyso_infnorm_so_so(funcAuxSo,rangeSo)
211 54 storres
    fMinSa = pobyso_get_interval_from_range_so_sa(infnormSo)
212 54 storres
    sollya_lib_clear_obj(infnormSo)
213 85 storres
    fMinLowerBoundSa = binadeTopLimitSa - fMinSa.lower()
214 54 storres
    # Compute the maximum of the precisions of the different bounds.
215 54 storres
    maxPrecSa = max([fMinLowerBoundSa.parent().precision(), \
216 54 storres
                     fMaxUpperBoundSa.parent().precision()])
217 54 storres
    # Create a RealIntervalField and create an interval with the "good" bounds.
218 54 storres
    RRRI = RealIntervalField(maxPrecSa)
219 54 storres
    imageIntervalSa = RRRI(fMinLowerBoundSa, fMaxUpperBoundSa)
220 83 storres
    # Free the unneeded Sollya objects
221 54 storres
    sollya_lib_clear_obj(funcSo)
222 54 storres
    sollya_lib_clear_obj(funcAuxSo)
223 54 storres
    sollya_lib_clear_obj(rangeSo)
224 54 storres
    return(imageIntervalSa)
225 83 storres
# End pobyso_compute_pos_function_abs_val_bounds_sa_sa
226 54 storres
227 5 storres
def pobyso_constant(rnArg):
228 38 storres
    """ Legacy function. See pobyso_constant_sa_so. """
229 38 storres
    return(pobyso_constant_sa_so(rnArg))
230 5 storres
231 84 storres
def pobyso_constant_sa_so(rnArgSa, precisionSa=None):
232 52 storres
    """
233 115 storres
    Create a Sollya constant from a Sage RealNumber.
234 52 storres
    """
235 84 storres
    # Precision stuff
236 84 storres
    if precisionSa is None:
237 84 storres
        precisionSa = rnArgSa.parent().precision()
238 85 storres
    currentSollyaPrecisionSo = sollya_lib_get_prec()
239 85 storres
    currentSollyaPrecisionSa = \
240 85 storres
        pobyso_constant_from_int(currentSollyaPrecisionSo)
241 115 storres
    # Sollya constant creation takes place here.
242 84 storres
    if precisionSa > currentSollyaPrecisionSa:
243 84 storres
        pobyso_set_prec_sa_so(precisionSa)
244 84 storres
        constantSo = sollya_lib_constant(get_rn_value(rnArgSa))
245 84 storres
        pobyso_set_prec_sa_so(currentSollyaPrecision)
246 84 storres
    else:
247 84 storres
        constantSo = sollya_lib_constant(get_rn_value(rnArgSa))
248 85 storres
    sollya_lib_clear_obj(currentSollyaPrecisionSo)
249 84 storres
    return(constantSo)
250 115 storres
# End pobyso_constant_sa_so
251 115 storres
252 55 storres
def pobyso_constant_0_sa_so():
253 115 storres
    """
254 115 storres
    Obvious.
255 115 storres
    """
256 55 storres
    return(pobyso_constant_from_int_sa_so(0))
257 55 storres
258 5 storres
def pobyso_constant_1():
259 115 storres
    """
260 115 storres
    Obvious.
261 115 storres
    Legacy function. See pobyso_constant_so_so.
262 115 storres
    """
263 52 storres
    return(pobyso_constant_1_sa_so())
264 5 storres
265 52 storres
def pobyso_constant_1_sa_so():
266 115 storres
    """
267 115 storres
    Obvious.
268 115 storres
    """
269 38 storres
    return(pobyso_constant_from_int_sa_so(1))
270 38 storres
271 5 storres
def pobyso_constant_from_int(anInt):
272 38 storres
    """ Legacy function. See pobyso_constant_from_int_sa_so. """
273 38 storres
    return(pobyso_constant_from_int_sa_so(anInt))
274 38 storres
275 38 storres
def pobyso_constant_from_int_sa_so(anInt):
276 115 storres
    """
277 115 storres
    Get a Sollya constant from a Sage int.
278 115 storres
    """
279 5 storres
    return(sollya_lib_constant_from_int(int(anInt)))
280 5 storres
281 84 storres
def pobyso_constant_from_int_so_sa(constSo):
282 84 storres
    """
283 117 storres
    Get a Sage int from a Sollya int constant.
284 115 storres
    Usefull for precision or powers in polynomials.
285 84 storres
    """
286 84 storres
    constSa = c_int(0)
287 84 storres
    sollya_lib_get_constant_as_int(byref(constSa), constSo)
288 84 storres
    return(constSa.value)
289 84 storres
# End pobyso_constant_from_int_so_sa
290 84 storres
291 5 storres
def pobyso_function_type_as_string(funcType):
292 38 storres
    """ Legacy function. See pobyso_function_type_as_string_so_sa. """
293 38 storres
    return(pobyso_function_type_as_string_so_sa(funcType))
294 38 storres
295 38 storres
def pobyso_function_type_as_string_so_sa(funcType):
296 38 storres
    """
297 38 storres
    Numeric Sollya function codes -> Sage mathematical function names.
298 38 storres
    Notice that pow -> ^ (a la Sage, not a la Python).
299 38 storres
    """
300 5 storres
    if funcType == SOLLYA_BASE_FUNC_ABS:
301 5 storres
        return "abs"
302 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ACOS:
303 5 storres
        return "arccos"
304 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ACOSH:
305 5 storres
        return "arccosh"
306 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ADD:
307 5 storres
        return "+"
308 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ASIN:
309 5 storres
        return "arcsin"
310 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ASINH:
311 5 storres
        return "arcsinh"
312 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ATAN:
313 5 storres
        return "arctan"
314 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ATANH:
315 5 storres
        return "arctanh"
316 5 storres
    elif funcType == SOLLYA_BASE_FUNC_CEIL:
317 5 storres
        return "ceil"
318 5 storres
    elif funcType == SOLLYA_BASE_FUNC_CONSTANT:
319 5 storres
        return "cte"
320 5 storres
    elif funcType == SOLLYA_BASE_FUNC_COS:
321 5 storres
        return "cos"
322 5 storres
    elif funcType == SOLLYA_BASE_FUNC_COSH:
323 5 storres
        return "cosh"
324 5 storres
    elif funcType == SOLLYA_BASE_FUNC_DIV:
325 5 storres
        return "/"
326 5 storres
    elif funcType == SOLLYA_BASE_FUNC_DOUBLE:
327 5 storres
        return "double"
328 5 storres
    elif funcType == SOLLYA_BASE_FUNC_DOUBLEDOUBLE:
329 5 storres
        return "doubleDouble"
330 5 storres
    elif funcType == SOLLYA_BASE_FUNC_DOUBLEEXTENDED:
331 5 storres
        return "doubleDxtended"
332 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ERF:
333 5 storres
        return "erf"
334 5 storres
    elif funcType == SOLLYA_BASE_FUNC_ERFC:
335 5 storres
        return "erfc"
336 5 storres
    elif funcType == SOLLYA_BASE_FUNC_EXP:
337 5 storres
        return "exp"
338 5 storres
    elif funcType == SOLLYA_BASE_FUNC_EXP_M1:
339 5 storres
        return "expm1"
340 5 storres
    elif funcType == SOLLYA_BASE_FUNC_FLOOR:
341 5 storres
        return "floor"
342 5 storres
    elif funcType == SOLLYA_BASE_FUNC_FREE_VARIABLE:
343 5 storres
        return "freeVariable"
344 5 storres
    elif funcType == SOLLYA_BASE_FUNC_HALFPRECISION:
345 5 storres
        return "halfPrecision"
346 5 storres
    elif funcType == SOLLYA_BASE_FUNC_LIBRARYCONSTANT:
347 5 storres
        return "libraryConstant"
348 5 storres
    elif funcType == SOLLYA_BASE_FUNC_LIBRARYFUNCTION:
349 5 storres
        return "libraryFunction"
350 5 storres
    elif funcType == SOLLYA_BASE_FUNC_LOG:
351 5 storres
        return "log"
352 5 storres
    elif funcType == SOLLYA_BASE_FUNC_LOG_10:
353 5 storres
        return "log10"
354 5 storres
    elif funcType == SOLLYA_BASE_FUNC_LOG_1P:
355 5 storres
        return "log1p"
356 5 storres
    elif funcType == SOLLYA_BASE_FUNC_LOG_2:
357 5 storres
        return "log2"
358 5 storres
    elif funcType == SOLLYA_BASE_FUNC_MUL:
359 5 storres
        return "*"
360 5 storres
    elif funcType == SOLLYA_BASE_FUNC_NEARESTINT:
361 5 storres
        return "round"
362 5 storres
    elif funcType == SOLLYA_BASE_FUNC_NEG:
363 5 storres
        return "__neg__"
364 5 storres
    elif funcType == SOLLYA_BASE_FUNC_PI:
365 5 storres
        return "pi"
366 5 storres
    elif funcType == SOLLYA_BASE_FUNC_POW:
367 5 storres
        return "^"
368 5 storres
    elif funcType == SOLLYA_BASE_FUNC_PROCEDUREFUNCTION:
369 5 storres
        return "procedureFunction"
370 5 storres
    elif funcType == SOLLYA_BASE_FUNC_QUAD:
371 5 storres
        return "quad"
372 5 storres
    elif funcType == SOLLYA_BASE_FUNC_SIN:
373 5 storres
        return "sin"
374 5 storres
    elif funcType == SOLLYA_BASE_FUNC_SINGLE:
375 5 storres
        return "single"
376 5 storres
    elif funcType == SOLLYA_BASE_FUNC_SINH:
377 5 storres
        return "sinh"
378 5 storres
    elif funcType == SOLLYA_BASE_FUNC_SQRT:
379 5 storres
        return "sqrt"
380 5 storres
    elif funcType == SOLLYA_BASE_FUNC_SUB:
381 5 storres
        return "-"
382 5 storres
    elif funcType == SOLLYA_BASE_FUNC_TAN:
383 5 storres
        return "tan"
384 5 storres
    elif funcType == SOLLYA_BASE_FUNC_TANH:
385 5 storres
        return "tanh"
386 5 storres
    elif funcType == SOLLYA_BASE_FUNC_TRIPLEDOUBLE:
387 5 storres
        return "tripleDouble"
388 5 storres
    else:
389 5 storres
        return None
390 5 storres
391 85 storres
def pobyso_get_constant(rnArgSa, constSo):
392 38 storres
    """ Legacy function. See pobyso_get_constant_so_sa. """
393 85 storres
    return(pobyso_get_constant_so_sa(rnArgSa, constSo))
394 38 storres
395 84 storres
def pobyso_get_constant_so_sa(rnArgSa, constSo):
396 52 storres
    """
397 85 storres
    Set the value of rnArgSo to the value of constSo in MPFR_RNDN mode.
398 52 storres
    rnArg must already exist and belong to some RealField.
399 85 storres
    We assume that constSo points to a Sollya constant.
400 52 storres
    """
401 84 storres
    return(sollya_lib_get_constant(get_rn_value(rnArgSa), constSo))
402 5 storres
403 57 storres
def pobyso_get_constant_as_rn(ctExpSo):
404 83 storres
    """
405 83 storres
    Legacy function. See pobyso_get_constant_as_rn_so_sa.
406 83 storres
    """
407 57 storres
    return(pobyso_get_constant_as_rn_so_sa(ctExpSo))
408 38 storres
409 56 storres
def pobyso_get_constant_as_rn_so_sa(constExpSo):
410 83 storres
    """
411 83 storres
    Get a Sollya constant as a Sage "real number".
412 83 storres
    The precision of the floating-point number returned is that of the Sollya
413 83 storres
    constant.
414 83 storres
    """
415 57 storres
    precisionSa  = pobyso_get_prec_of_constant_so_sa(constExpSo)
416 56 storres
    RRRR = RealField(precisionSa)
417 56 storres
    rnSa = RRRR(0)
418 56 storres
    sollya_lib_get_constant(get_rn_value(rnSa), constExpSo)
419 56 storres
    return(rnSa)
420 83 storres
# End pobyso_get_constant_as_rn_so_sa
421 38 storres
422 38 storres
def pobyso_get_constant_as_rn_with_rf(ctExp, realField):
423 83 storres
    """
424 83 storres
    Legacy function. See pobyso_get_constant_as_rn_with_rf_so_sa.
425 83 storres
    """
426 38 storres
    return(pobyso_get_constant_as_rn_with_rf_so_sa(ctExp, realField))
427 5 storres
428 56 storres
def pobyso_get_constant_as_rn_with_rf_so_sa(ctExpSo, realFieldSa = None):
429 83 storres
    """
430 83 storres
    Get a Sollya constant as a Sage "real number".
431 83 storres
    If no real field is specified, the precision of the floating-point number
432 85 storres
    returned is that of the Sollya constant.
433 83 storres
    Otherwise is is that of the real field. Hence rounding may happen.
434 83 storres
    """
435 56 storres
    if realFieldSa is None:
436 85 storres
        sollyaPrecSa = pobyso_get_prec_of_constant_so_sa(ctExpSo)
437 56 storres
        realFieldSa = RealField(sollyaPrecSa)
438 56 storres
    rnSa = realFieldSa(0)
439 56 storres
    sollya_lib_get_constant(get_rn_value(rnSa), ctExpSo)
440 56 storres
    return(rnSa)
441 83 storres
# End pobyso_get_constant_as_rn_with_rf_so_sa
442 38 storres
443 5 storres
def pobyso_get_free_variable_name():
444 83 storres
    """
445 83 storres
    Legacy function. See pobyso_get_free_variable_name_so_sa.
446 83 storres
    """
447 38 storres
    return(pobyso_get_free_variable_name_so_sa())
448 38 storres
449 38 storres
def pobyso_get_free_variable_name_so_sa():
450 5 storres
    return(sollya_lib_get_free_variable_name())
451 5 storres
452 38 storres
def pobyso_get_function_arity(expressionSo):
453 83 storres
    """
454 83 storres
    Legacy function. See pobyso_get_function_arity_so_sa.
455 83 storres
    """
456 38 storres
    return(pobyso_get_function_arity_so_sa(expressionSo))
457 38 storres
458 38 storres
def pobyso_get_function_arity_so_sa(expressionSo):
459 5 storres
    arity = c_int(0)
460 38 storres
    sollya_lib_get_function_arity(byref(arity),expressionSo)
461 5 storres
    return(int(arity.value))
462 5 storres
463 38 storres
def pobyso_get_head_function(expressionSo):
464 83 storres
    """
465 83 storres
    Legacy function. See pobyso_get_head_function_so_sa.
466 83 storres
    """
467 38 storres
    return(pobyso_get_head_function_so_sa(expressionSo))
468 38 storres
469 38 storres
def pobyso_get_head_function_so_sa(expressionSo):
470 5 storres
    functionType = c_int(0)
471 38 storres
    sollya_lib_get_head_function(byref(functionType), expressionSo, None)
472 5 storres
    return(int(functionType.value))
473 5 storres
474 56 storres
def pobyso_get_interval_from_range_so_sa(soRange, realIntervalFieldSa = None ):
475 53 storres
    """
476 53 storres
    Return the Sage interval corresponding to the Sollya range argument.
477 83 storres
    If no reaIntervalField is passed as an argument, the interval bounds are not
478 56 storres
    rounded: they are elements of RealIntervalField of the "right" precision
479 56 storres
    to hold all the digits.
480 53 storres
    """
481 53 storres
    prec = c_int(0)
482 56 storres
    if realIntervalFieldSa is None:
483 56 storres
        retval = sollya_lib_get_prec_of_range(byref(prec), soRange, None)
484 56 storres
        if retval == 0:
485 56 storres
            return(None)
486 56 storres
        realIntervalFieldSa = RealIntervalField(prec.value)
487 56 storres
    intervalSa = realIntervalFieldSa(0,0)
488 53 storres
    retval = \
489 53 storres
        sollya_lib_get_interval_from_range(get_interval_value(intervalSa),\
490 53 storres
                                           soRange)
491 53 storres
    if retval == 0:
492 53 storres
        return(None)
493 53 storres
    return(intervalSa)
494 56 storres
# End pobyso_get_interval_from_range_so_sa
495 56 storres
496 5 storres
def pobyso_get_list_elements(soObj):
497 38 storres
    """ Legacy function. See pobyso_get_list_elements_so_so. """
498 38 storres
    return(pobyso_get_list_elements_so_so(soObj))
499 38 storres
500 117 storres
def pobyso_get_list_elements_so_so(objectListSo):
501 51 storres
    """
502 51 storres
    Get the list elements as a Sage/Python array of Sollya objects.
503 85 storres
    The other data returned are Sage/Python objects.
504 51 storres
    """
505 5 storres
    listAddress = POINTER(c_longlong)()
506 5 storres
    numElements = c_int(0)
507 5 storres
    isEndElliptic = c_int(0)
508 117 storres
    listAsSageList = []
509 5 storres
    result = sollya_lib_get_list_elements(byref(listAddress),\
510 54 storres
                                          byref(numElements),\
511 54 storres
                                          byref(isEndElliptic),\
512 117 storres
                                          objectListSo)
513 5 storres
    if result == 0 :
514 5 storres
        return None
515 5 storres
    for i in xrange(0, numElements.value, 1):
516 117 storres
       listAsSageList.append(sollya_lib_copy_obj(listAddress[i]))
517 117 storres
       # Clear each of the elements returned by Sollya.
518 117 storres
       sollya_lib_clear_obj(listAddress[i])
519 117 storres
    # Free the list itself.
520 117 storres
    sollya_lib_free(listAddress)
521 117 storres
    return(listAsSageList, numElements.value, isEndElliptic.value)
522 5 storres
523 38 storres
def pobyso_get_max_prec_of_exp(soExp):
524 38 storres
    """ Legacy function. See pobyso_get_max_prec_of_exp_so_sa. """
525 38 storres
    return(pobyso_get_max_prec_of_exp_so_sa(soExp))
526 5 storres
527 85 storres
def pobyso_get_max_prec_of_exp_so_sa(expSo):
528 38 storres
    """
529 38 storres
    Get the maximum precision used for the numbers in a Sollya expression.
530 52 storres

531 52 storres
    Arguments:
532 52 storres
    soExp -- a Sollya expression pointer
533 52 storres
    Return value:
534 52 storres
    A Python integer
535 38 storres
    TODO:
536 38 storres
    - error management;
537 38 storres
    - correctly deal with numerical type such as DOUBLEEXTENDED.
538 38 storres
    """
539 5 storres
    maxPrecision = 0
540 52 storres
    minConstPrec = 0
541 52 storres
    currentConstPrec = 0
542 85 storres
    operator = pobyso_get_head_function_so_sa(expSo)
543 5 storres
    if (operator != SOLLYA_BASE_FUNC_CONSTANT) and \
544 5 storres
    (operator != SOLLYA_BASE_FUNC_FREE_VARIABLE):
545 85 storres
        (arity, subexpressions) = pobyso_get_subfunctions_so_sa(expSo)
546 5 storres
        for i in xrange(arity):
547 5 storres
            maxPrecisionCandidate = \
548 38 storres
                pobyso_get_max_prec_of_exp_so_sa(subexpressions[i])
549 5 storres
            if maxPrecisionCandidate > maxPrecision:
550 5 storres
                maxPrecision = maxPrecisionCandidate
551 5 storres
        return(maxPrecision)
552 5 storres
    elif operator == SOLLYA_BASE_FUNC_CONSTANT:
553 85 storres
        #minConstPrec = pobyso_get_min_prec_of_constant_so_sa(expSo)
554 52 storres
        #currentConstPrec = pobyso_get_min_prec_of_constant_so_sa(soExp)
555 52 storres
        #print minConstPrec, " - ", currentConstPrec
556 85 storres
        return(pobyso_get_min_prec_of_constant_so_sa(expSo))
557 52 storres
558 5 storres
    elif operator == SOLLYA_BASE_FUNC_FREE_VARIABLE:
559 5 storres
        return(0)
560 5 storres
    else:
561 38 storres
        print "pobyso_get_max_prec_of_exp_so_sa: unexepected operator."
562 5 storres
        return(0)
563 5 storres
564 85 storres
def pobyso_get_min_prec_of_constant_so_sa(constExpSo):
565 52 storres
    """
566 52 storres
    Get the minimum precision necessary to represent the value of a Sollya
567 52 storres
    constant.
568 52 storres
    MPFR_MIN_PREC and powers of 2 are taken into account.
569 85 storres
    We assume that constExpSo is a point
570 52 storres
    """
571 85 storres
    constExpAsRnSa = pobyso_get_constant_as_rn_so_sa(constExpSo)
572 85 storres
    return(min_mpfr_size(get_rn_value(constExpAsRnSa)))
573 52 storres
574 85 storres
def pobyso_get_sage_exp_from_sollya_exp(sollyaExpSo, realField = RR):
575 38 storres
    """ Legacy function. See pobyso_get_sage_exp_from_sollya_exp_so_sa. """
576 85 storres
    return(pobyso_get_sage_exp_from_sollya_exp_so_sa(sollyaExpSo, \
577 85 storres
                                                     realField = RR))
578 38 storres
579 85 storres
def pobyso_get_sage_exp_from_sollya_exp_so_sa(sollyaExpSo, realFieldSa = RR):
580 5 storres
    """
581 38 storres
    Get a Sage expression from a Sollya expression.
582 38 storres
    Currently only tested with polynomials with floating-point coefficients.
583 5 storres
    Notice that, in the returned polynomial, the exponents are RealNumbers.
584 5 storres
    """
585 5 storres
    #pobyso_autoprint(sollyaExp)
586 85 storres
    operatorSa = pobyso_get_head_function_so_sa(sollyaExpSo)
587 83 storres
    sollyaLibFreeVariableName = sollya_lib_get_free_variable_name()
588 5 storres
    # Constants and the free variable are special cases.
589 5 storres
    # All other operator are dealt with in the same way.
590 85 storres
    if (operatorSa != SOLLYA_BASE_FUNC_CONSTANT) and \
591 85 storres
       (operatorSa != SOLLYA_BASE_FUNC_FREE_VARIABLE):
592 85 storres
        (aritySa, subexpressionsSa) = pobyso_get_subfunctions_so_sa(sollyaExpSo)
593 85 storres
        if aritySa == 1:
594 85 storres
            sageExpSa = eval(pobyso_function_type_as_string_so_sa(operatorSa) + \
595 85 storres
            "(" + pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressionsSa[0], \
596 85 storres
            realFieldSa) + ")")
597 85 storres
        elif aritySa == 2:
598 63 storres
            # We do not get through the preprocessor.
599 63 storres
            # The "^" operator is then a special case.
600 85 storres
            if operatorSa == SOLLYA_BASE_FUNC_POW:
601 85 storres
                operatorAsStringSa = "**"
602 5 storres
            else:
603 85 storres
                operatorAsStringSa = \
604 85 storres
                    pobyso_function_type_as_string_so_sa(operatorSa)
605 85 storres
            sageExpSa = \
606 85 storres
              eval("pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressionsSa[0], realFieldSa)"\
607 85 storres
              + " " + operatorAsStringSa + " " + \
608 85 storres
                   "pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressionsSa[1], realFieldSa)")
609 63 storres
        # We do not know yet how to deal with arity >= 3
610 63 storres
        # (is there any in Sollya anyway?).
611 5 storres
        else:
612 85 storres
            sageExpSa = eval('None')
613 85 storres
        return(sageExpSa)
614 85 storres
    elif operatorSa == SOLLYA_BASE_FUNC_CONSTANT:
615 5 storres
        #print "This is a constant"
616 85 storres
        return pobyso_get_constant_as_rn_with_rf_so_sa(sollyaExpSo, realFieldSa)
617 85 storres
    elif operatorSa == SOLLYA_BASE_FUNC_FREE_VARIABLE:
618 5 storres
        #print "This is free variable"
619 83 storres
        return(eval(sollyaLibFreeVariableName))
620 5 storres
    else:
621 5 storres
        print "Unexpected"
622 5 storres
        return eval('None')
623 5 storres
# End pobyso_get_sage_poly_from_sollya_poly
624 73 storres
625 73 storres
def pobyso_get_poly_sa_so(polySo, realFieldSa=None):
626 83 storres
    """
627 83 storres
    Create a Sollya polynomial from a Sage polynomial.
628 83 storres
    """
629 73 storres
    pass
630 73 storres
# pobyso_get_poly_sa_so
631 73 storres
632 62 storres
def pobyso_get_poly_so_sa(polySo, realFieldSa=None):
633 57 storres
    """
634 57 storres
    Convert a Sollya polynomial into a Sage polynomial.
635 62 storres
    We assume that the polynomial is in canonical form.
636 57 storres
    If no realField is given, a RealField corresponding to the maximum precision
637 57 storres
    of the coefficients is internally computed.
638 57 storres
    It is not returned but can be easily retrieved from the polynomial itself.
639 57 storres
    Main steps:
640 57 storres
    - (optional) compute the RealField of the coefficients;
641 57 storres
    - convert the Sollya expression into a Sage expression;
642 57 storres
    - convert the Sage expression into a Sage polynomial
643 59 storres
    TODO: the canonical thing for the polynomial.
644 57 storres
    """
645 57 storres
    if realFieldSa is None:
646 57 storres
        expressionPrecSa = pobyso_get_max_prec_of_exp_so_sa(polySo)
647 57 storres
        realFieldSa = RealField(expressionPrecSa)
648 63 storres
    #print "Sollya expression before...",
649 63 storres
    #pobyso_autoprint(polySo)
650 63 storres
651 57 storres
    expressionSa = pobyso_get_sage_exp_from_sollya_exp_so_sa(polySo, \
652 57 storres
                                                             realFieldSa)
653 63 storres
    #print "...Sollya expression after.",
654 63 storres
    #pobyso_autoprint(polySo)
655 57 storres
    polyVariableSa = expressionSa.variables()[0]
656 59 storres
    polyRingSa = realFieldSa[str(polyVariableSa)]
657 81 storres
    #print polyRingSa
658 62 storres
    # Do not use the polynomial(expressionSa, ring=polyRingSa) form!
659 62 storres
    polynomialSa = polyRingSa(expressionSa)
660 57 storres
    return(polynomialSa)
661 57 storres
# End pobyso_get_sage_poly_from_sollya_poly
662 57 storres
663 38 storres
def pobyso_get_subfunctions(expressionSo):
664 38 storres
    """ Legacy function. See pobyso_get_subfunctions_so_sa. """
665 38 storres
    return(pobyso_get_subfunctions_so_sa(expressionSo))
666 38 storres
667 38 storres
def pobyso_get_subfunctions_so_sa(expressionSo):
668 38 storres
    """
669 38 storres
    Get the subfunctions of an expression.
670 38 storres
    Return the number of subfunctions and the list of subfunctions addresses.
671 55 storres
    S.T.: Could not figure out another way than that ugly list of declarations
672 83 storres
    to recover the addresses of the subfunctions.
673 83 storres
    We limit ourselves to arity 8 functions.
674 38 storres
    """
675 5 storres
    subf0 = c_int(0)
676 5 storres
    subf1 = c_int(0)
677 5 storres
    subf2 = c_int(0)
678 5 storres
    subf3 = c_int(0)
679 5 storres
    subf4 = c_int(0)
680 5 storres
    subf5 = c_int(0)
681 5 storres
    subf6 = c_int(0)
682 5 storres
    subf7 = c_int(0)
683 5 storres
    subf8 = c_int(0)
684 5 storres
    arity = c_int(0)
685 5 storres
    nullPtr = POINTER(c_int)()
686 38 storres
    sollya_lib_get_subfunctions(expressionSo, byref(arity), \
687 83 storres
      byref(subf0), byref(subf1), byref(subf2), byref(subf3), \
688 83 storres
      byref(subf4), byref(subf5),\
689 83 storres
      byref(subf6), byref(subf7), byref(subf8), nullPtr, None)
690 83 storres
#    byref(cast(subfunctions[0], POINTER(c_int))), \
691 83 storres
#    byref(cast(subfunctions[0], POINTER(c_int))), \
692 83 storres
#    byref(cast(subfunctions[2], POINTER(c_int))), \
693 83 storres
#    byref(cast(subfunctions[3], POINTER(c_int))), \
694 83 storres
#    byref(cast(subfunctions[4], POINTER(c_int))), \
695 83 storres
#    byref(cast(subfunctions[5], POINTER(c_int))), \
696 83 storres
#    byref(cast(subfunctions[6], POINTER(c_int))), \
697 83 storres
#    byref(cast(subfunctions[7], POINTER(c_int))), \
698 5 storres
#    byref(cast(subfunctions[8], POINTER(c_int))), nullPtr)
699 83 storres
    subfunctions = [subf0, subf1, subf2, subf3, subf4, subf5, subf6, subf7, \
700 83 storres
                    subf8]
701 5 storres
    subs = []
702 5 storres
    if arity.value > pobyso_max_arity:
703 38 storres
        return(0,[])
704 5 storres
    for i in xrange(arity.value):
705 5 storres
        subs.append(int(subfunctions[i].value))
706 5 storres
        #print subs[i]
707 5 storres
    return(int(arity.value), subs)
708 5 storres
709 5 storres
def pobyso_get_prec():
710 38 storres
    """ Legacy function. See pobyso_get_prec_so_sa(). """
711 38 storres
    return(pobyso_get_prec_so_sa())
712 38 storres
713 84 storres
def pobyso_get_prec_so():
714 84 storres
    """
715 84 storres
    Get the current default precision in Sollya.
716 84 storres
    The return value is a Sollya object.
717 84 storres
    Usefull when modifying the precision back and forth by avoiding
718 84 storres
    extra conversions.
719 84 storres
    """
720 84 storres
    return(sollya_lib_get_prec(None))
721 84 storres
722 38 storres
def pobyso_get_prec_so_sa():
723 38 storres
    """
724 38 storres
    Get the current default precision in Sollya.
725 38 storres
    The return value is Sage/Python int.
726 38 storres
    """
727 56 storres
    precSo = sollya_lib_get_prec(None)
728 56 storres
    precSa = c_int(0)
729 56 storres
    sollya_lib_get_constant_as_int(byref(precSa), precSo)
730 56 storres
    sollya_lib_clear_obj(precSo)
731 56 storres
    return(int(precSa.value))
732 83 storres
# End pobyso_get_prec_so_sa.
733 5 storres
734 38 storres
def pobyso_get_prec_of_constant(ctExpSo):
735 38 storres
    """ Legacy function. See pobyso_get_prec_of_constant_so_sa. """
736 38 storres
    return(pobyso_get_prec_of_constant_so_sa(ctExpSo))
737 38 storres
738 56 storres
def pobyso_get_prec_of_constant_so_sa(ctExpSo):
739 56 storres
    prec = c_int(0)
740 56 storres
    retc = sollya_lib_get_prec_of_constant(byref(prec), ctExpSo, None)
741 56 storres
    if retc == 0:
742 56 storres
        return(None)
743 56 storres
    return(int(prec.value))
744 56 storres
745 53 storres
def pobyso_get_prec_of_range_so_sa(rangeSo):
746 5 storres
    prec = c_int(0)
747 53 storres
    retc = sollya_lib_get_prec_of_range(byref(prec), rangeSo, None)
748 56 storres
    if retc == 0:
749 56 storres
        return(None)
750 5 storres
    return(int(prec.value))
751 5 storres
752 53 storres
def pobyso_infnorm_so_so(func, interval, file = None, intervalList = None):
753 54 storres
    print "Do not use this function. User pobyso_supnorm_so_so instead."
754 54 storres
    return(None)
755 53 storres
756 84 storres
def pobyso_interval_to_range_sa_so(intervalSa, precisionSa=None):
757 84 storres
    if precisionSa is None:
758 84 storres
        precisionSa = intervalSa.parent().precision()
759 84 storres
    intervalSo = pobyso_bounds_to_range_sa_so(intervalSa.lower(),\
760 84 storres
                                              intervalSa.upper(),\
761 84 storres
                                              precisionSa)
762 84 storres
    return(intervalSo)
763 84 storres
# End pobyso_interval_to_range_sa_so
764 84 storres
765 37 storres
def pobyso_lib_init():
766 37 storres
    sollya_lib_init(None)
767 116 storres
768 116 storres
def pobyso_lib_close():
769 116 storres
    sollya_lib_close(None)
770 37 storres
771 85 storres
def pobyso_name_free_variable(freeVariableNameSa):
772 38 storres
    """ Legacy function. See pobyso_name_free_variable_sa_so. """
773 85 storres
    pobyso_name_free_variable_sa_so(freeVariableNameSa)
774 38 storres
775 85 storres
def pobyso_name_free_variable_sa_so(freeVariableNameSa):
776 83 storres
    """
777 83 storres
    Set the free variable name in Sollya from a Sage string.
778 83 storres
    """
779 85 storres
    sollya_lib_name_free_variable(freeVariableNameSa)
780 37 storres
781 5 storres
def pobyso_parse_string(string):
782 38 storres
    """ Legacy function. See pobyso_parse_string_sa_so. """
783 38 storres
    return(pobyso_parse_string_sa_so(string))
784 38 storres
785 38 storres
def pobyso_parse_string_sa_so(string):
786 83 storres
    """
787 83 storres
    Get the Sollya expression computed from a Sage string.
788 83 storres
    """
789 5 storres
    return(sollya_lib_parse_string(string))
790 5 storres
791 5 storres
def pobyso_range(rnLowerBound, rnUpperBound):
792 38 storres
    """ Legacy function. See pobyso_range_sa_so. """
793 51 storres
    return(pobyso_range_sa_so(rnLowerBound, rnUpperBound))
794 38 storres
795 5 storres
796 85 storres
def pobyso_range_to_interval_so_sa(rangeSo, realIntervalFieldSa = None):
797 83 storres
    """
798 83 storres
    Get a Sage interval from a Sollya range.
799 83 storres
    If no realIntervalField is given as a parameter, the Sage interval
800 83 storres
    precision is that of the Sollya range.
801 85 storres
    Otherwise, the precision is that of the realIntervalField. In this case
802 85 storres
    rounding may happen.
803 83 storres
    """
804 85 storres
    if realIntervalFieldSa is None:
805 56 storres
        precSa = pobyso_get_prec_of_range_so_sa(rangeSo)
806 85 storres
        realIntervalFieldSa = RealIntervalField(precSa)
807 56 storres
    intervalSa = \
808 85 storres
        pobyso_get_interval_from_range_so_sa(rangeSo, realIntervalFieldSa)
809 56 storres
    return(intervalSa)
810 56 storres
811 52 storres
def pobyso_remez_canonical_sa_sa(func, \
812 52 storres
                                 degree, \
813 52 storres
                                 lowerBound, \
814 52 storres
                                 upperBound, \
815 52 storres
                                 weight = None, \
816 52 storres
                                 quality = None):
817 52 storres
    """
818 52 storres
    All arguments are Sage/Python.
819 52 storres
    The functions (func and weight) must be passed as expressions or strings.
820 52 storres
    Otherwise the function fails.
821 83 storres
    The return value is a Sage polynomial.
822 52 storres
    """
823 83 storres
    var('zorglub')    # Dummy variable name for type check only. Type of
824 83 storres
    # zorglub is "symbolic expression".
825 52 storres
    polySo = pobyso_remez_canonical_sa_so(func, \
826 52 storres
                                 degree, \
827 52 storres
                                 lowerBound, \
828 52 storres
                                 upperBound, \
829 85 storres
                                 weight, \
830 85 storres
                                 quality)
831 83 storres
    # String test
832 52 storres
    if parent(func) == parent("string"):
833 52 storres
        functionSa = eval(func)
834 52 storres
    # Expression test.
835 52 storres
    elif type(func) == type(zorglub):
836 52 storres
        functionSa = func
837 83 storres
    else:
838 83 storres
        return None
839 83 storres
    #
840 52 storres
    maxPrecision = 0
841 52 storres
    if polySo is None:
842 52 storres
        return(None)
843 52 storres
    maxPrecision = pobyso_get_max_prec_of_exp_so_sa(polySo)
844 85 storres
    RRRRSa = RealField(maxPrecision)
845 85 storres
    polynomialRingSa = RRRRSa[functionSa.variables()[0]]
846 85 storres
    expSa = pobyso_get_sage_exp_from_sollya_exp_so_sa(polySo, RRRRSa)
847 85 storres
    polySa = polynomial(expSa, polynomialRingSa)
848 83 storres
    sollya_lib_clear_obj(polySo)
849 52 storres
    return(polySa)
850 85 storres
# End pobyso_remez_canonical_sa_sa
851 52 storres
852 38 storres
def pobyso_remez_canonical(func, \
853 5 storres
                           degree, \
854 5 storres
                           lowerBound, \
855 5 storres
                           upperBound, \
856 38 storres
                           weight = "1", \
857 5 storres
                           quality = None):
858 38 storres
    """ Legacy function. See pobyso_remez_canonical_sa_so. """
859 51 storres
    return(pobyso_remez_canonical_sa_so(func, \
860 51 storres
                                        degree, \
861 51 storres
                                        lowerBound, \
862 51 storres
                                        upperBound, \
863 51 storres
                                        weight, \
864 51 storres
                                        quality))
865 38 storres
def pobyso_remez_canonical_sa_so(func, \
866 38 storres
                                 degree, \
867 38 storres
                                 lowerBound, \
868 38 storres
                                 upperBound, \
869 52 storres
                                 weight = None, \
870 38 storres
                                 quality = None):
871 38 storres
    """
872 38 storres
    All arguments are Sage/Python.
873 51 storres
    The functions (func and weight) must be passed as expressions or strings.
874 51 storres
    Otherwise the function fails.
875 38 storres
    The return value is a pointer to a Sollya function.
876 38 storres
    """
877 83 storres
    var('zorglub')    # Dummy variable name for type check only. Type of
878 83 storres
    # zorglub is "symbolic expression".
879 85 storres
    currentVariableNameSa = None
880 52 storres
    # The func argument can be of different types (string,
881 52 storres
    # symbolic expression...)
882 38 storres
    if parent(func) == parent("string"):
883 85 storres
        localFuncSa = eval(func)
884 85 storres
        if len(localFuncSa.variables()) > 0:
885 85 storres
            currentVariableNameSa = localFuncSa.variables()[0]
886 85 storres
            sollya_lib_name_free_variable(str(currentVariableNameSa))
887 85 storres
            functionSo = sollya_lib_parse_string(localFuncSa._assume_str())
888 51 storres
    # Expression test.
889 52 storres
    elif type(func) == type(zorglub):
890 52 storres
        # Until we are able to translate Sage expressions into Sollya
891 52 storres
        # expressions : parse the string version.
892 85 storres
        if len(func.variables()) > 0:
893 85 storres
            currentVariableNameSa = func.variables()[0]
894 85 storres
            sollya_lib_name_free_variable(str(currentVariableNameSa))
895 85 storres
            functionSo = sollya_lib_parse_string(func._assume_str())
896 38 storres
    else:
897 38 storres
        return(None)
898 85 storres
    if weight is None: # No weight given -> 1.
899 52 storres
        weightSo = pobyso_constant_1_sa_so()
900 85 storres
    elif parent(weight) == parent("string"): # Weight given as string: parse it.
901 51 storres
        weightSo = sollya_lib_parse_string(func)
902 85 storres
    elif type(weight) == type(zorglub): # Weight given as symbolice expression.
903 51 storres
        functionSo = sollya_lib_parse_string_sa_so(weight._assume_str())
904 51 storres
    else:
905 51 storres
        return(None)
906 5 storres
    degreeSo = pobyso_constant_from_int(degree)
907 85 storres
    rangeSo = pobyso_bounds_to_range_sa_so(lowerBound, upperBound)
908 38 storres
    if not quality is None:
909 38 storres
        qualitySo= pobyso_constant_sa_so(quality)
910 52 storres
    else:
911 52 storres
        qualitySo = None
912 83 storres
913 83 storres
    remezPolySo = sollya_lib_remez(functionSo, \
914 83 storres
                                   degreeSo, \
915 83 storres
                                   rangeSo, \
916 83 storres
                                   weightSo, \
917 83 storres
                                   qualitySo, \
918 83 storres
                                   None)
919 83 storres
    sollya_lib_clear_obj(functionSo)
920 83 storres
    sollya_lib_clear_obj(degreeSo)
921 83 storres
    sollya_lib_clear_obj(rangeSo)
922 83 storres
    sollya_lib_clear_obj(weightSo)
923 83 storres
    if not qualitySo is None:
924 85 storres
        sollya_lib_clear_obj(qualitySo)
925 83 storres
    return(remezPolySo)
926 83 storres
# End pobyso_remez_canonical_sa_so
927 83 storres
928 38 storres
def pobyso_remez_canonical_so_so(funcSo, \
929 38 storres
                                 degreeSo, \
930 38 storres
                                 rangeSo, \
931 52 storres
                                 weightSo = pobyso_constant_1_sa_so(),\
932 38 storres
                                 qualitySo = None):
933 38 storres
    """
934 38 storres
    All arguments are pointers to Sollya objects.
935 38 storres
    The return value is a pointer to a Sollya function.
936 38 storres
    """
937 38 storres
    if not sollya_lib_obj_is_function(funcSo):
938 38 storres
        return(None)
939 38 storres
    return(sollya_lib_remez(funcSo, degreeSo, rangeSo, weightSo, qualitySo, None))
940 38 storres
941 5 storres
def pobyso_set_canonical_off():
942 5 storres
    sollya_lib_set_canonical(sollya_lib_off())
943 5 storres
944 5 storres
def pobyso_set_canonical_on():
945 5 storres
    sollya_lib_set_canonical(sollya_lib_on())
946 5 storres
947 5 storres
def pobyso_set_prec(p):
948 38 storres
    """ Legacy function. See pobyso_set_prec_sa_so. """
949 85 storres
    pobyso_set_prec_sa_so(p)
950 38 storres
951 38 storres
def pobyso_set_prec_sa_so(p):
952 5 storres
    a = c_int(p)
953 5 storres
    precSo = c_void_p(sollya_lib_constant_from_int(a))
954 85 storres
    sollya_lib_set_prec(precSo, None)
955 5 storres
956 85 storres
def pobyso_set_prec_so_so(newPrecSo):
957 85 storres
    sollya_lib_set_prec(newPrecSo, None)
958 54 storres
959 85 storres
def pobyso_supnorm_so_so(polySo, funcSo, intervalSo, errorTypeSo = None,\
960 85 storres
                         accuracySo = None):
961 58 storres
    """
962 85 storres
    Computes the supnorm of the approximation error between the given
963 85 storres
    polynomial and function.
964 85 storres
    errorTypeSo defaults to "absolute".
965 85 storres
    accuracySo defaults to 2^(-40).
966 85 storres
    """
967 85 storres
    if errorTypeSo is None:
968 85 storres
        errorTypeSo = sollya_lib_absolute(None)
969 85 storres
        errorTypeIsNone = True
970 85 storres
    else:
971 85 storres
        errorTypeIsNone = False
972 85 storres
    #
973 85 storres
    if accuracySo is None:
974 85 storres
        # Notice the **!
975 85 storres
        accuracySo = pobyso_constant_sa_so(RR(2**(-40)))
976 85 storres
        accuracyIsNone = True
977 85 storres
    else:
978 85 storres
        accuracyIsNone = False
979 85 storres
    pobyso_autoprint(accuracySo)
980 85 storres
    resultSo = \
981 85 storres
        sollya_lib_supnorm(polySo, funcSo, intervalSo, errorTypeSo, \
982 85 storres
                              accuracySo)
983 85 storres
    if errorTypeIsNone:
984 85 storres
        sollya_lib_clear_obj(errorTypeSo)
985 85 storres
    if accuracyIsNone:
986 85 storres
        sollya_lib_clear_obj(accuracySo)
987 85 storres
    return resultSo
988 85 storres
# End pobyso_supnorm_so_so
989 85 storres
990 85 storres
def pobyso_taylor_expansion_with_change_var_so_so(functionSo, degreeSo, \
991 85 storres
                                                  rangeSo, \
992 85 storres
                                                  errorTypeSo=None, \
993 85 storres
                                                  sollyaPrecSo=None):
994 85 storres
    """
995 58 storres
    Compute the Taylor expansion with the variable change
996 58 storres
    x -> (x-intervalCenter) included.
997 58 storres
    """
998 58 storres
    # No global change of the working precision.
999 58 storres
    if not sollyaPrecSo is None:
1000 58 storres
        initialPrecSo = sollya_lib_get_prec(None)
1001 58 storres
        sollya_lib_set_prec(sollyaPrecSo)
1002 58 storres
    #
1003 85 storres
    # Error type stuff: default to absolute.
1004 85 storres
    if errorTypeSo is None:
1005 85 storres
        errorTypeIsNone = True
1006 85 storres
        errorTypeSo = sollya_lib_absolute(None)
1007 85 storres
    else:
1008 85 storres
        errorTypeIsNone = False
1009 58 storres
    intervalCenterSo = sollya_lib_mid(rangeSo)
1010 58 storres
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo, \
1011 58 storres
                                         intervalCenterSo, \
1012 58 storres
                                         rangeSo, errorTypeSo, None)
1013 117 storres
    # taylorFormListSaSo is a Python list of Sollya objects references that
1014 117 storres
    # are copies of the elements of taylorFormSo.
1015 117 storres
    # pobyso_get_list_elements_so_so clears taylorFormSo.
1016 58 storres
    (taylorFormListSo, numElements, isEndElliptic) = \
1017 58 storres
        pobyso_get_list_elements_so_so(taylorFormSo)
1018 58 storres
    polySo = taylorFormListSo[0]
1019 58 storres
    errorRangeSo = taylorFormListSo[2]
1020 58 storres
    maxErrorSo = sollya_lib_sup(errorRangeSo)
1021 58 storres
    changeVarExpSo = sollya_lib_build_function_sub(\
1022 58 storres
                       sollya_lib_build_function_free_variable(),\
1023 58 storres
                       sollya_lib_copy_obj(intervalCenterSo))
1024 58 storres
    polyVarChangedSo = sollya_lib_evaluate(polySo, changeVarExpSo)
1025 115 storres
    sollya_lib_clear_obj(changeVarExpSo)
1026 58 storres
    # If changed, reset the Sollya working precision.
1027 58 storres
    if not sollyaPrecSo is None:
1028 58 storres
        sollya_lib_set_prec(initialPrecSo)
1029 83 storres
        sollya_lib_clear_obj(initialPrecSo)
1030 85 storres
    if errorTypeIsNone:
1031 85 storres
        sollya_lib_clear_obj(errorTypeSo)
1032 85 storres
    sollya_lib_clear_obj(taylorFormSo)
1033 85 storres
    # Do not clear maxErrorSo.
1034 63 storres
    return((polyVarChangedSo, intervalCenterSo, maxErrorSo))
1035 58 storres
# end pobyso_taylor_expansion_with_change_var_so_so
1036 58 storres
1037 117 storres
def pobyso_taylor_expansion_no_change_var_so_so(functionSo, degreeSo, rangeSo,
1038 117 storres
                                                errorTypeSo=None,
1039 56 storres
                                                sollyaPrecSo=None):
1040 58 storres
    """
1041 58 storres
    Compute the Taylor expansion without the variable change
1042 58 storres
    x -> x-intervalCenter.
1043 58 storres
    """
1044 56 storres
    # No global change of the working precision.
1045 56 storres
    if not sollyaPrecSo is None:
1046 56 storres
        initialPrecSo = sollya_lib_get_prec(None)
1047 56 storres
        sollya_lib_set_prec(sollyaPrecSo)
1048 85 storres
    # Error type stuff: default to absolute.
1049 85 storres
    if errorTypeSo is None:
1050 85 storres
        errorTypeIsNone = True
1051 85 storres
        errorTypeSo = sollya_lib_absolute(None)
1052 85 storres
    else:
1053 85 storres
        errorTypeIsNone = False
1054 117 storres
    intervalCenterSo = sollya_lib_mid(rangeSo, None)
1055 117 storres
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo,
1056 117 storres
                                         intervalCenterSo,
1057 56 storres
                                         rangeSo, errorTypeSo, None)
1058 116 storres
    # taylorFormListSaSo is a Python list of Sollya objects references that
1059 116 storres
    # are copies of the elements of taylorFormSo.
1060 116 storres
    # pobyso_get_list_elements_so_so clears taylorFormSo.
1061 116 storres
    (taylorFormListSaSo, numElementsSa, isEndEllipticSa) = \
1062 56 storres
        pobyso_get_list_elements_so_so(taylorFormSo)
1063 117 storres
    sollya_lib_clear_obj(taylorFormSo)
1064 116 storres
    polySo = sollya_lib_copy_obj(taylorFormListSaSo[0])
1065 117 storres
    #polySo = taylorFormListSaSo[0]
1066 116 storres
    #errorRangeSo = sollya_lib_copy_obj(taylorFormListSaSo[2])
1067 116 storres
    errorRangeSo = taylorFormListSaSo[2]
1068 103 storres
    # No copy_obj needed here: a new object is created.
1069 56 storres
    maxErrorSo = sollya_lib_sup(errorRangeSo)
1070 56 storres
    # If changed, reset the Sollya working precision.
1071 56 storres
    if not sollyaPrecSo is None:
1072 56 storres
        sollya_lib_set_prec(initialPrecSo)
1073 63 storres
        sollya_lib_clear_obj(initialPrecSo)
1074 85 storres
    if errorTypeIsNone:
1075 85 storres
        sollya_lib_clear_obj(errorTypeSo)
1076 117 storres
    pobyso_clear_taylorform_sa_so(taylorFormListSaSo)
1077 63 storres
    return((polySo, intervalCenterSo, maxErrorSo))
1078 56 storres
# end pobyso_taylor_expansion_no_change_var_so_so
1079 56 storres
1080 5 storres
def pobyso_taylor(function, degree, point):
1081 38 storres
    """ Legacy function. See pobysoTaylor_so_so. """
1082 38 storres
    return(pobyso_taylor_so_so(function, degree, point))
1083 38 storres
1084 56 storres
def pobyso_taylor_so_so(functionSo, degreeSo, pointSo):
1085 56 storres
    return(sollya_lib_taylor(functionSo, degreeSo, pointSo))
1086 5 storres
1087 85 storres
def pobyso_taylorform(function, degree, point = None,
1088 85 storres
                      interval = None, errorType=None):
1089 85 storres
    """ Legacy function. See pobyso_taylorform_sa_sa;"""
1090 38 storres
1091 38 storres
def pobyso_taylorform_sa_sa(functionSa, \
1092 84 storres
                            degreeSa, \
1093 84 storres
                            pointSa, \
1094 84 storres
                            intervalSa=None, \
1095 84 storres
                            errorTypeSa=None, \
1096 84 storres
                            precisionSa=None):
1097 37 storres
    """
1098 85 storres
    Compute the Taylor form of 'degreeSa' for 'functionSa' at 'pointSa'
1099 85 storres
    for 'intervalSa' with 'errorTypeSa' (a string) using 'precisionSa'.
1100 37 storres
    point: must be a Real or a Real interval.
1101 37 storres
    return the Taylor form as an array
1102 83 storres
    TODO: take care of the interval and of the point when it is an interval;
1103 38 storres
          when errorType is not None;
1104 83 storres
          take care of the other elements of the Taylor form (coefficients
1105 83 storres
          errors and delta.
1106 37 storres
    """
1107 37 storres
    # Absolute as the default error.
1108 84 storres
    if errorTypeSa is None:
1109 37 storres
        errorTypeSo = sollya_lib_absolute()
1110 84 storres
    elif errorTypeSa == "relative":
1111 84 storres
        errorTypeSo = sollya_lib_relative()
1112 84 storres
    elif errortypeSa == "absolute":
1113 84 storres
        errorTypeSo = sollya_lib_absolute()
1114 37 storres
    else:
1115 84 storres
        # No clean up needed.
1116 84 storres
        return None
1117 84 storres
    # Global precision stuff
1118 84 storres
    precisionChangedSa = False
1119 84 storres
    currentSollyaPrecSo = pobyso_get_prec_so()
1120 84 storres
    currentSollyaPrecSa = pobyso_constant_from_int_so_sa(currentSollyaPrecSo)
1121 84 storres
    if not precisionSa is None:
1122 84 storres
        if precisionSa > currentSollyaPrecSa:
1123 84 storres
            pobyso_set_prec_sa_so(precisionSa)
1124 84 storres
            precisionChangedSa = True
1125 84 storres
1126 85 storres
    if len(functionSa.variables()) > 0:
1127 85 storres
        varSa = functionSa.variables()[0]
1128 85 storres
        pobyso_name_free_variable_sa_so(str(varSa))
1129 84 storres
    # In any case (point or interval) the parent of pointSa has a precision
1130 84 storres
    # method.
1131 84 storres
    pointPrecSa = pointSa.parent().precision()
1132 84 storres
    if precisionSa > pointPrecSa:
1133 84 storres
        pointPrecSa = precisionSa
1134 84 storres
    # In any case (point or interval) pointSa has a base_ring() method.
1135 84 storres
    pointBaseRingString = str(pointSa.base_ring())
1136 84 storres
    if re.search('Interval', pointBaseRingString) is None: # Point
1137 84 storres
        pointSo = pobyso_constant_sa_so(pointSa, pointPrecSa)
1138 84 storres
    else: # Interval.
1139 84 storres
        pointSo = pobyso_interval_to_range_sa_so(pointSa, pointPrecSa)
1140 37 storres
    # Sollyafy the function.
1141 38 storres
    functionSo = pobyso_parse_string_sa_so(functionSa._assume_str())
1142 37 storres
    if sollya_lib_obj_is_error(functionSo):
1143 37 storres
        print "pobyso_tailorform: function string can't be parsed!"
1144 37 storres
        return None
1145 37 storres
    # Sollyafy the degree
1146 84 storres
    degreeSo = sollya_lib_constant_from_int(int(degreeSa))
1147 37 storres
    # Sollyafy the point
1148 37 storres
    # Call Sollya
1149 83 storres
    taylorFormSo = \
1150 83 storres
        sollya_lib_taylorform(functionSo, degreeSo, pointSo, errorTypeSo,\
1151 37 storres
                                         None)
1152 85 storres
    sollya_lib_clear_obj(functionSo)
1153 85 storres
    sollya_lib_clear_obj(degreeSo)
1154 85 storres
    sollya_lib_clear_obj(pointSo)
1155 85 storres
    sollya_lib_clear_obj(errorTypeSo)
1156 38 storres
    (tfsAsList, numElements, isEndElliptic) = \
1157 38 storres
            pobyso_get_list_elements_so_so(taylorFormSo)
1158 37 storres
    polySo = tfsAsList[0]
1159 38 storres
    maxPrecision = pobyso_get_max_prec_of_exp_so_sa(polySo)
1160 37 storres
    polyRealField = RealField(maxPrecision)
1161 38 storres
    expSa = pobyso_get_sage_exp_from_sollya_exp_so_sa(polySo, polyRealField)
1162 84 storres
    if precisionChangedSa:
1163 84 storres
        sollya_lib_set_prec(currentSollyaPrecSo)
1164 84 storres
        sollya_lib_clear_obj(currentSollyaPrecSo)
1165 37 storres
    polynomialRing = polyRealField[str(varSa)]
1166 37 storres
    polySa = polynomial(expSa, polynomialRing)
1167 37 storres
    taylorFormSa = [polySa]
1168 85 storres
    # Final clean-up.
1169 85 storres
    sollya_lib_clear_obj(taylorFormSo)
1170 51 storres
    return(taylorFormSa)
1171 51 storres
# End pobyso_taylor_form_sa_sa
1172 54 storres
1173 54 storres
def pobyso_taylorform_so_so(functionSo, degreeSo, pointSo, intervalSo=None, \
1174 54 storres
                            errorTypeSo=None):
1175 54 storres
    createdErrorType = False
1176 51 storres
    if errorTypeSo is None:
1177 51 storres
        errorTypeSo = sollya_lib_absolute()
1178 54 storres
        createdErrorType = True
1179 51 storres
    else:
1180 51 storres
        #TODO: deal with the other case.
1181 51 storres
        pass
1182 51 storres
    if intervalSo is None:
1183 54 storres
        resultSo = sollya_lib_taylorform(functionSo, degreeSo, pointSo, \
1184 54 storres
                                         errorTypeSo, None)
1185 51 storres
    else:
1186 54 storres
        resultSo = sollya_lib_taylorform(functionSo, degreeSo, pointSo, \
1187 54 storres
                                         intervalSo, errorTypeSo, None)
1188 54 storres
    if createdErrorType:
1189 54 storres
        sollya_lib_clear_obj(errorTypeSo)
1190 51 storres
    return(resultSo)
1191 51 storres
1192 37 storres
1193 37 storres
def pobyso_univar_polynomial_print_reverse(polySa):
1194 51 storres
    """ Legacy function. See pobyso_univar_polynomial_print_reverse_sa_sa. """
1195 51 storres
    return(pobyso_univar_polynomial_print_reverse_sa_sa(polySa))
1196 38 storres
1197 51 storres
def pobyso_univar_polynomial_print_reverse_sa_sa(polySa):
1198 37 storres
    """
1199 37 storres
    Return the string representation of a univariate polynomial with
1200 38 storres
    monomials ordered in the x^0..x^n order of the monomials.
1201 37 storres
    Remember: Sage
1202 37 storres
    """
1203 37 storres
    polynomialRing = polySa.base_ring()
1204 37 storres
    # A very expensive solution:
1205 37 storres
    # -create a fake multivariate polynomial field with only one variable,
1206 37 storres
    #   specifying a negative lexicographical order;
1207 37 storres
    mpolynomialRing = PolynomialRing(polynomialRing.base(), \
1208 37 storres
                                     polynomialRing.variable_name(), \
1209 37 storres
                                     1, order='neglex')
1210 37 storres
    # - convert the univariate argument polynomial into a multivariate
1211 37 storres
    #   version;
1212 37 storres
    p = mpolynomialRing(polySa)
1213 37 storres
    # - return the string representation of the converted form.
1214 37 storres
    # There is no simple str() method defined for p's class.
1215 37 storres
    return(p.__str__())
1216 5 storres
#
1217 5 storres
print pobyso_get_prec()
1218 5 storres
pobyso_set_prec(165)
1219 5 storres
print pobyso_get_prec()
1220 5 storres
a=100
1221 5 storres
print type(a)
1222 5 storres
id(a)
1223 5 storres
print "Max arity: ", pobyso_max_arity
1224 5 storres
print "Function tripleDouble (43) as a string: ", pobyso_function_type_as_string(43)
1225 56 storres
print "Function None (44) as a string: ", pobyso_function_type_as_string(44)
1226 56 storres
print "...Pobyso check done"