102 |
102 |
sollya_lib_autoprint(arg, None)
|
103 |
103 |
|
104 |
104 |
def pobyso_autoprint_so_so(arg):
|
105 |
|
sollya_lib_autoprint(arg,None)
|
|
105 |
sollya_lib_autoprint(arg, None)
|
106 |
106 |
|
107 |
107 |
def pobyso_bounds_to_interval_sa_sa(lowerBound, upperBound):
|
108 |
108 |
"""
|
... | ... | |
121 |
121 |
prec = 53
|
122 |
122 |
# Create the RealIntervalField and the interval (if possible).
|
123 |
123 |
theRIF = RealIntervalField(prec)
|
|
124 |
theRR = RealField(prec)
|
|
125 |
# Try convert the lower bound to a RealField element or fail.
|
124 |
126 |
try:
|
125 |
|
interval = theRIF(lowerBound, upperBound)
|
|
127 |
lowerBoundRF = theRR(lowerBound)
|
126 |
128 |
except TypeError:
|
127 |
|
return None
|
128 |
|
else:
|
129 |
|
return interval
|
|
129 |
try:
|
|
130 |
lowerBoundRF = theRR(str(lowerBound))
|
|
131 |
except TypeError:
|
|
132 |
return None
|
|
133 |
# Try convert the upper bound to a RealField element or fail.
|
|
134 |
try:
|
|
135 |
upperBoundRF = theRR(upperBound)
|
|
136 |
except TypeError:
|
|
137 |
try:
|
|
138 |
upperBoundRF = theRR(str(upperBound))
|
|
139 |
except TypeError:
|
|
140 |
return None
|
|
141 |
return theRIF(lowerBoundRF, upperBoundRF)
|
130 |
142 |
# End pobyso_bounds_to_interval_sa_sa
|
131 |
143 |
|
132 |
144 |
def pobyso_bounds_to_range_sa_so(rnLowerBoundSa, rnUpperBoundSa, \
|
... | ... | |
232 |
244 |
return(sollya_lib_evaluate(funcSo,chvarExpSo))
|
233 |
245 |
# End pobyso_change_var_in_function_so_so
|
234 |
246 |
|
|
247 |
def pobyso_chebyshevform_sa_sa(funcSa, degreeSa, intervalSa):
|
|
248 |
"""
|
|
249 |
An chebyshevnorm call with Sage arguments that returns Sage objects.
|
|
250 |
To the moment only the polynomial and the delta are returned.
|
|
251 |
"""
|
|
252 |
# Check that funcSa is a function.
|
|
253 |
if not \
|
|
254 |
sage.symbolic.callable.is_CallableSymbolicExpressionRing(parent(funcSa)):
|
|
255 |
return None
|
|
256 |
# Check that funcSa is an integer.
|
|
257 |
try:
|
|
258 |
if degreeSa != int(degreeSa):
|
|
259 |
print "degreeSa is not a valid integer."
|
|
260 |
return None
|
|
261 |
except ValueError:
|
|
262 |
print "degreeSa is not a number."
|
|
263 |
return None
|
|
264 |
# Create the Sollya degree...
|
|
265 |
degreeSo = pobyso_constant_from_int_sa_so(degreeSa)
|
|
266 |
# ...and check it.
|
|
267 |
if pobyso_is_error_so_sa(degreeSo):
|
|
268 |
print "Could not correctly convert degreeSa to Sollya."
|
|
269 |
return None
|
|
270 |
# Check that intervalSa is an interval.
|
|
271 |
try:
|
|
272 |
intervalSa.upper()
|
|
273 |
except AttributeError:
|
|
274 |
print "intervalSa is not an interval."
|
|
275 |
return None
|
|
276 |
# Convert the Sage polynomial into a Sollya polynomial.
|
|
277 |
# Convert the Sage function into a Sollya function.
|
|
278 |
funcAsStringSa = funcSa._assume_str().replace('_SAGE_VAR_', '')
|
|
279 |
funcSo = pobyso_parse_string_sa_so(funcAsStringSa)
|
|
280 |
if not pobyso_obj_is_function_so_sa(funcSo):
|
|
281 |
sollya_lib_clear_obj(funcSo)
|
|
282 |
print "The Sollya object created from the function is not a function."
|
|
283 |
return None
|
|
284 |
#pobyso_autoprint(funcSo)
|
|
285 |
# Convert the Sage interval into a Sollya range.
|
|
286 |
rangeSo = pobyso_interval_to_range_sa_so(intervalSa)
|
|
287 |
if not pobyso_is_range_so_sa(rangeSo):
|
|
288 |
sollya_lib_clear_obj(funcSo)
|
|
289 |
sollya_lib_clear_obj(rangeSo)
|
|
290 |
print "The Sollya object created from the interval is not a range."
|
|
291 |
return None
|
|
292 |
#pobyso_autoprint(rangeSo)
|
|
293 |
retValSo = sollya_lib_chebyshevform(funcSo,
|
|
294 |
degreeSo,
|
|
295 |
rangeSo,
|
|
296 |
None)
|
|
297 |
sollya_lib_clear_obj(funcSo)
|
|
298 |
sollya_lib_clear_obj(degreeSo)
|
|
299 |
sollya_lib_clear_obj(rangeSo)
|
|
300 |
if pobyso_is_error_so_sa(retValSo):
|
|
301 |
sollya_lib_clear_obj(retValSo)
|
|
302 |
print "Could not compute the Chebyshev form."
|
|
303 |
return None
|
|
304 |
#pobyso_autoprint(retValSo)
|
|
305 |
## Get the list of Sollya objects returned by sollya_lib_chebyshevform
|
|
306 |
retValSa = pobyso_get_list_elements_so_so(retValSo)
|
|
307 |
if retValSa[1] != 4:
|
|
308 |
print "Invalid number of elements in the Chebyshev form."
|
|
309 |
sollya_lib_clear_obj(retValSo)
|
|
310 |
return None
|
|
311 |
## Convert all the element of the retValSa[0] array of Sollya objects
|
|
312 |
# into their Sage counterparts.
|
|
313 |
polySa = pobyso_float_poly_so_sa(retValSa[0][0])
|
|
314 |
if not pobyso_is_poly_sa_sa(polySa):
|
|
315 |
print "Conversion of the polynomial of the Chebyshev form failed."
|
|
316 |
sollya_lib_clear_obj(retValSo)
|
|
317 |
return None
|
|
318 |
deltaSa = pobyso_get_interval_from_range_so_sa(retValSa[0][2])
|
|
319 |
if not pobyso_is_interval_sa_sa(deltaSa):
|
|
320 |
print "Conversion of the delta interval of the Chebyshev form failed."
|
|
321 |
sollya_lib_clear_obj(retValSo)
|
|
322 |
return None
|
|
323 |
sollya_lib_clear_obj(retValSo)
|
|
324 |
return(polySa,deltaSa)
|
|
325 |
# End pobyso_chebyshevform_sa_sa.
|
|
326 |
|
235 |
327 |
def pobyso_chebyshevform_so_so(functionSo, degreeSo, intervalSo):
|
236 |
328 |
resultSo = sollya_lib_chebyshevform(functionSo, degreeSo, intervalSo)
|
237 |
329 |
return(resultSo)
|
... | ... | |
270 |
362 |
|
271 |
363 |
def pobyso_clear_taylorform_sa_so(taylorFormSaSo):
|
272 |
364 |
"""
|
273 |
|
This method is rapper around pobyso_clear_list_elements_sa_so.
|
|
365 |
This method is wrapper around pobyso_clear_list_elements_sa_so.
|
274 |
366 |
It is a legacy method left here since it may be used in existing code
|
275 |
367 |
where Taylor forms are used as Sage lists obtained by converting
|
276 |
368 |
Sollya Taylor forms (a list made of:
|
... | ... | |
650 |
742 |
#print polyRingSa
|
651 |
743 |
# Do not use the polynomial(expressionSa, ring=polyRingSa) form!
|
652 |
744 |
polynomialSa = polyRingSa(expressionSa)
|
653 |
|
polyCoeffsListSa = polynomialSa.coefficients()
|
|
745 |
#polyCoeffsListSa = polynomialSa.coefficients()
|
654 |
746 |
#for coeff in polyCoeffsListSa:
|
655 |
747 |
# print coeff.abs().n()
|
656 |
748 |
return polynomialSa
|
... | ... | |
988 |
1080 |
"""
|
989 |
1081 |
Convert a Sollya polynomial into a Sage polynomial.
|
990 |
1082 |
Legacy function. Use pobyso_float_poly_so_sa() instead.
|
991 |
|
"""
|
|
1083 |
"""
|
|
1084 |
print "Deprecated: use pobyso_float_poly_so_sa() instead."
|
992 |
1085 |
return pobyso_float_poly_so_sa(polySo,realFieldSa)
|
993 |
1086 |
# End pobyso_get_poly_so_sa
|
994 |
1087 |
|
... | ... | |
1347 |
1440 |
return False
|
1348 |
1441 |
# End pobyso_is_floating_piont_number_sa_sa
|
1349 |
1442 |
|
|
1443 |
def pobyso_is_interval_sa_sa(objectSa):
|
|
1444 |
"""
|
|
1445 |
Check that objectSa is an interval.
|
|
1446 |
"""
|
|
1447 |
try:
|
|
1448 |
objectSa.upper()
|
|
1449 |
except AttributeError:
|
|
1450 |
return False
|
|
1451 |
return True
|
|
1452 |
|
|
1453 |
def pobyso_is_poly_sa_sa(objectSa):
|
|
1454 |
"""
|
|
1455 |
Check if an object is a polynomial.
|
|
1456 |
"""
|
|
1457 |
try:
|
|
1458 |
coefficientsListSa = objectSa
|
|
1459 |
if len(objectSa.coefficients()) < 0:
|
|
1460 |
return False
|
|
1461 |
except AttributeError:
|
|
1462 |
return False
|
|
1463 |
return True
|
|
1464 |
# End pobyso_is_poly_sa_sa
|
|
1465 |
|
1350 |
1466 |
def pobyso_is_range_so_sa(rangeCandidateSo):
|
1351 |
1467 |
"""
|
1352 |
1468 |
Thin wrapper over sollya_lib_is_range.
|
... | ... | |
2110 |
2226 |
funcSa,
|
2111 |
2227 |
intervalSa,
|
2112 |
2228 |
errorTypeSa=SOLLYA_ABSOLUTE,
|
2113 |
|
accuracySa=RR(2^-40)):
|
|
2229 |
accuracySa=RR(2**-40)):
|
2114 |
2230 |
"""
|
2115 |
2231 |
An supnorm call with Sage arguments.
|
2116 |
2232 |
"""
|