Révision 37 pobysoPythonSage/src/pobyso.py

pobyso.py (revision 37)
13 13
 -memory management.
14 14
"""
15 15
from ctypes import *
16
import re
17
from sage.symbolic.expression_conversions import polynomial
16 18

  
17 19
(SOLLYA_BASE_FUNC_ABS,
18 20
SOLLYA_BASE_FUNC_ACOS,
......
332 334
    retc = sollya_lib_get_prec_of_constant(byref(prec), ctExp, None)
333 335
    return(int(prec.value))
334 336

  
337
def pobyso_lib_init():
338
    sollya_lib_init(None)
339
    
340
def pobyso_name_free_variable(freeVariableName):
341
    sollya_lib_name_free_variable(freeVariableName)
342

  
335 343
def pobyso_parse_string(string):
336 344
    return(sollya_lib_parse_string(string))
337 345

  
338
def pobyso_univar_polynomial_print_reverse(polySa):
339
    """
340
    Return the string representation of a univariate polynomial with
341
    monomial ordered in the x^0..x^n order of the monomials.
342
    Remember: Sage
343
    """
344
    polynomialRing = polySa.base_ring()
345
    # A very expensive solution:
346
    # -create a fake multivariate polynomial field with only one variable,
347
    #   specifying a negative lexicographical order;
348
    mpolynomialRing = PolynomialRing(polynomialRing.base(), \
349
                                     polynomialRing.variable_name(), \
350
                                     1, order='neglex')
351
    # - convert the univariate argument polynomial into a multivariate
352
    #   version;
353
    p = mpolynomialRing(polySa)
354
    # - return the string representation of the converted form.
355
    # There is no simple str() method defined for p's class.
356
    return(p.__str__())
357
    
358 346
def pobyso_range(rnLowerBound, rnUpperBound):
359 347
    lowerBoundSo = sollya_lib_constant(get_rn_value(rnLowerBound))
360 348
    upperBoundSo = sollya_lib_constant(get_rn_value(rnUpperBound))
......
391 379
def pobyso_taylor(function, degree, point):
392 380
    return(sollya_lib_taylor(function, degree, point))
393 381
    
382
# TODO: take care of the interval and of point when it is an interval;
383
#       when errorType is not None;
384
#       take care of the other elements of the Taylor form (coefficients errors and
385
#       delta.
394 386
def pobyso_taylorform(function, degree, point = None, interval = None, errorType=None):
387
    """
388
    Compute the Taylor form of 'degre' for 'function' at 'point' 
389
    for 'interval' with 'errorType'. 
390
    point: must be a Real or a Real interval.
391
    return the Taylor form as an array
392
    """
393
    # Absolute as the default error.
395 394
    if errorType is None:
396
        errorType = sollya_lib_absolute()
397
    return(sollya_lib_taylorform(function, degree, point, errorType, None))
395
        errorTypeSo = sollya_lib_absolute()
396
    else:
397
        #TODO: deal with the other case.
398
        pass
399
    varSa = function.variables()[0]
400
    pointBaseRingString = str(point.base_ring())
401
    if not re.search('Real', pointBaseRingString):
402
        return None
403
    # Call Sollya but first "sollyafy" the arguments.
404
    sollya_lib_init(None)
405
    pobyso_name_free_variable(str(varSa))
406
    # Sollyafy the function.
407
    functionSo = pobyso_parse_string(function._assume_str())
408
    if sollya_lib_obj_is_error(functionSo):
409
        print "pobyso_tailorform: function string can't be parsed!"
410
        return None
411
    # Sollyafy the degree
412
    degreeSo = sollya_lib_constant_from_int(int(degree))
413
    # Sollyafy the point
414
    if not re.search('Interval', pointBaseRingString):
415
        pointSo  = pobyso_constant(point)
416
    else:
417
        # TODO: deal with the interval case.
418
        pass
419
    # Call Sollya
420
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo, pointSo, errorTypeSo,\
421
                                         None)
422
    (tfsAsList, numElements, isEndElliptic) = pobyso_get_list_elements(taylorFormSo)
423
    polySo = tfsAsList[0]
424
    maxPrecision = pobyso_get_max_prec_of_exp(polySo)
425
    polyRealField = RealField(maxPrecision)
426
    expSa = pobyso_get_sage_exp_from_sollya_exp(polySo, polyRealField)
427
    sollya_lib_close()
428
    polynomialRing = polyRealField[str(varSa)]
429
    polySa = polynomial(expSa, polynomialRing)
430
    taylorFormSa = [polySa]
431
    return(taylorFormSa)                    
432

  
433
def pobyso_univar_polynomial_print_reverse(polySa):
434
    """
435
    Return the string representation of a univariate polynomial with
436
    monomial ordered in the x^0..x^n order of the monomials.
437
    Remember: Sage
438
    """
439
    polynomialRing = polySa.base_ring()
440
    # A very expensive solution:
441
    # -create a fake multivariate polynomial field with only one variable,
442
    #   specifying a negative lexicographical order;
443
    mpolynomialRing = PolynomialRing(polynomialRing.base(), \
444
                                     polynomialRing.variable_name(), \
445
                                     1, order='neglex')
446
    # - convert the univariate argument polynomial into a multivariate
447
    #   version;
448
    p = mpolynomialRing(polySa)
449
    # - return the string representation of the converted form.
450
    # There is no simple str() method defined for p's class.
451
    return(p.__str__())
398 452
#
399 453
print "Superficial test of pobyso:"    
400 454
print pobyso_get_prec()  

Formats disponibles : Unified diff