Statistiques
| Révision :

root / pobysoPythonSage / src / pobyso.py @ 130

Historique | Voir | Annoter | Télécharger (46,78 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 118 storres
    Get the Sollya list elements as a Sage/Python array of Sollya objects.
503 118 storres

504 118 storres
    INPUT:
505 118 storres
    - objectListSo: a Sollya list of Sollya objects.
506 118 storres

507 118 storres
    OUTPUT:
508 118 storres
    - a Sage/Python tuple made of:
509 118 storres
      - a Sage/Python list of Sollya objects,
510 118 storres
      - a Sage/Python int holding the number of elements,
511 118 storres
      - a Sage/Python int stating (!= 0) that the list is end-elliptic.
512 118 storres
    NOTE::
513 118 storres
        We recover the addresses of the Sollya object from the list of pointers
514 118 storres
        returned by sollya_lib_get_list_elements. The list itself is freed.
515 118 storres
    TODO::
516 118 storres
        Figure out what to do with numElements since the number of elements
517 118 storres
        can easily be recovered from the list itself.
518 118 storres
        Ditto for isEndElliptic.
519 51 storres
    """
520 5 storres
    listAddress = POINTER(c_longlong)()
521 5 storres
    numElements = c_int(0)
522 5 storres
    isEndElliptic = c_int(0)
523 117 storres
    listAsSageList = []
524 5 storres
    result = sollya_lib_get_list_elements(byref(listAddress),\
525 54 storres
                                          byref(numElements),\
526 54 storres
                                          byref(isEndElliptic),\
527 117 storres
                                          objectListSo)
528 5 storres
    if result == 0 :
529 5 storres
        return None
530 5 storres
    for i in xrange(0, numElements.value, 1):
531 118 storres
       #listAsSageList.append(sollya_lib_copy_obj(listAddress[i]))
532 118 storres
       listAsSageList.append(listAddress[i])
533 117 storres
       # Clear each of the elements returned by Sollya.
534 118 storres
       #sollya_lib_clear_obj(listAddress[i])
535 117 storres
    # Free the list itself.
536 117 storres
    sollya_lib_free(listAddress)
537 117 storres
    return(listAsSageList, numElements.value, isEndElliptic.value)
538 5 storres
539 38 storres
def pobyso_get_max_prec_of_exp(soExp):
540 38 storres
    """ Legacy function. See pobyso_get_max_prec_of_exp_so_sa. """
541 38 storres
    return(pobyso_get_max_prec_of_exp_so_sa(soExp))
542 5 storres
543 85 storres
def pobyso_get_max_prec_of_exp_so_sa(expSo):
544 38 storres
    """
545 38 storres
    Get the maximum precision used for the numbers in a Sollya expression.
546 52 storres

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