Statistiques
| Révision :

root / pobysoPythonSage / src / pobyso.py @ 84

Historique | Voir | Annoter | Télécharger (41,52 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 5 storres
def pobyso_autoprint(arg):
89 5 storres
    sollya_lib_autoprint(arg,None)
90 5 storres
91 38 storres
def pobyso_autoprint_so_so(arg):
92 38 storres
    sollya_lib_autoprint(arg,None)
93 54 storres
94 54 storres
def pobyso_absolute_so_so():
95 54 storres
    return(sollya_lib_absolute(None))
96 38 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 84 storres
    if precision is None:
108 84 storres
        # Check for the largest precision.
109 84 storres
        lbPrecSa = rnLowerBoundSa.parent().precision()
110 84 storres
        ubPrecSa = rnLowerBoundSa.parent().precision()
111 84 storres
        maxPrecSa = max(lbPrecSa, ubPrecSa)
112 84 storres
    else:
113 84 storres
        maxPrecSa = precisionSa
114 84 storres
    sollyaCurrentPrecSo = pobyso_get_prec_so()
115 84 storres
    sollyaCurrentPrecSa = pobyso_constant_from_int_so_sa(sollyaCurrentPrecSo)
116 84 storres
    # Change the current Sollya precision only if necessary.
117 84 storres
    if maxPrecSa > sollyaCurrentPrecSa:
118 84 storres
        pobyso_set_prec_sa_so(maxPrecSa)
119 84 storres
    lowerBoundSo = sollya_lib_constant(get_rn_value(rnLowerBoundSa))
120 84 storres
    upperBoundSo = sollya_lib_constant(get_rn_value(rnUpperBoundSa))
121 84 storres
    rangeSo = sollya_lib_range(lowerBoundSo, upperBoundSo)
122 84 storres
    # Back to original precision.
123 84 storres
    if maxPrecSa > sollyaCurrentPrecSa:
124 84 storres
        sollya_lib_set_prec(sollyaCurrentPrecSo)
125 84 storres
    # Clean up
126 84 storres
    sollya_lib_clear_obj(sollyaCurrentPrecSo)
127 84 storres
    sollya_lib_clear_obj(lowerBoundSo)
128 84 storres
    sollya_lib_clear_obj(upperBoundSo)
129 84 storres
    return(rangeSo)
130 84 storres
# End pobyso_bounds_to_range_sa_so
131 84 storres
132 54 storres
def pobyso_build_function_sub_so_so(exp1So, exp2So):
133 54 storres
    return(sollya_lib_build_function_sub(exp1So, exp2So))
134 54 storres
135 5 storres
def pobyso_cmp(rnArg, soCte):
136 54 storres
    """
137 54 storres
    Compare the MPFR value a RealNumber with that of a Sollya constant.
138 54 storres

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

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