Révision 54 pobysoPythonSage/src/pobyso.py

pobyso.py (revision 54)
84 84

  
85 85
def pobyso_autoprint_so_so(arg):
86 86
    sollya_lib_autoprint(arg,None)
87
    
88
def pobyso_absolute_so_so():
89
    return(sollya_lib_absolute(None))
87 90

  
91
def pobyso_build_function_sub_so_so(exp1So, exp2So):
92
    return(sollya_lib_build_function_sub(exp1So, exp2So))
93

  
88 94
def pobyso_cmp(rnArg, soCte):
95
    """
96
    Compare the MPFR value a RealNumber with that of a Sollya constant.
97
    
98
    Get the value of the Sollya constant into a RealNumber and compare
99
    using MPFR. Could be optimized by working directly with a mpfr_t
100
    for the intermediate number. 
101
    """
89 102
    precisionOfCte = c_int(0)
90 103
    # From the Sollya constant, create a local Sage RealNumber.
91 104
    sollya_lib_get_prec_of_constant(precisionOfCte, soCte) 
......
97 110
    # Compare the local Sage RealNumber with rnArg.
98 111
    return(cmp_rn_value(rnArg, rnLocal))
99 112

  
113
def pobyso_compute_pos_function_abs_val_bounds_sa_sa(funcSa, lowerBoundSa, \
114
                                                     upperBoundSa):
115
    """
116
    TODO: set the variable name in Sollya.
117
    """
118
    funcSo = pobyso_parse_string(funcSa._assume_str())
119
    rangeSo = pobyso_range_sa_so(lowerBoundSa, upperBoundSa)
120
    infnormSo = pobyso_infnorm_so_so(funcSo,rangeSo)
121
    fMaxSa = pobyso_get_interval_from_range_so_sa(infnormSo)
122
    # Get the top bound and compute the binade top limit.
123
    fMaxUpperBoundSa = fMaxSa.upper()
124
    binadeTopLimitSa = 2**ceil(fMaxUpperBoundSa.log2())
125
    # Put up together the function to use to compute the lower bound.
126
    funcAuxSo = pobyso_parse_string(str(binadeTopLimitSa) +  \
127
                                    '-(' + f._assume_str() + ')')
128
    pobyso_autoprint(funcAuxSo)
129
    # Clear the Sollay range before a new call to infnorm and issue the call.
130
    sollya_lib_clear_obj(infnormSo)
131
    infnormSo = pobyso_infnorm_so_so(funcAuxSo,rangeSo)
132
    fMinSa = pobyso_get_interval_from_range_so_sa(infnormSo)
133
    sollya_lib_clear_obj(infnormSo)
134
    fMinLowerBoundSa = topBinadeLimit - fMinSa.lower()
135
    # Compute the maximum of the precisions of the different bounds.
136
    maxPrecSa = max([fMinLowerBoundSa.parent().precision(), \
137
                     fMaxUpperBoundSa.parent().precision()])
138
    # Create a RealIntervalField and create an interval with the "good" bounds.
139
    RRRI = RealIntervalField(maxPrecSa)
140
    imageIntervalSa = RRRI(fMinLowerBoundSa, fMaxUpperBoundSa)
141
    # Free the uneeded Sollya objects
142
    sollya_lib_clear_obj(funcSo)
143
    sollya_lib_clear_obj(funcAuxSo)
144
    sollya_lib_clear_obj(rangeSo)
145
    return(imageIntervalSa)
146
    # End pobyso_compute_function_abs_val_bounds_sa_sa
147

  
100 148
def pobyso_constant(rnArg):
101 149
    """ Legacy function. See pobyso_constant_sa_so. """
102 150
    return(pobyso_constant_sa_so(rnArg))
......
311 359
    isEndElliptic = c_int(0)
312 360
    listAsList = []
313 361
    result = sollya_lib_get_list_elements(byref(listAddress),\
314
                                        byref(numElements),\
315
                                        byref(isEndElliptic),\
316
                                        soObj)
362
                                          byref(numElements),\
363
                                          byref(isEndElliptic),\
364
                                          soObj)
317 365
    if result == 0 :
318 366
        return None
319 367
    for i in xrange(0, numElements.value, 1):
......
481 529
    return(int(prec.value))
482 530

  
483 531
def pobyso_infnorm_so_so(func, interval, file = None, intervalList = None):
484
    return(sollya_lib_infnorm(func, interval, file, intervalList, None))
532
    print "Do not use this function. User pobyso_supnorm_so_so instead."
533
    return(None)
485 534

  
486 535
def pobyso_lib_init():
487 536
    sollya_lib_init(None)
......
633 682
    precSo = c_void_p(sollya_lib_constant_from_int(a))
634 683
    sollya_lib_set_prec(precSo)
635 684

  
685
def pobyso_supnorm_so_so(polySo, funcSo, intervalSo, errorTypeSo, accuracySo):
686
    return(sollya_lib_supnorm(polySo, funcSo, intervalSo, errorTypeSo, \
687
                              accuracySo))
688

  
636 689
def pobyso_taylor(function, degree, point):
637 690
    """ Legacy function. See pobysoTaylor_so_so. """
638 691
    return(pobyso_taylor_so_so(function, degree, point))
......
647 700
                            degree, \
648 701
                            point, \
649 702
                            precision, \
650
                            interval = None, \
703
                            interval=None, \
651 704
                            errorType=None):
652 705
    """
653 706
    Compute the Taylor form of 'degree' for 'functionSa' at 'point' 
......
670 723
    if not re.search('Real', pointBaseRingString):
671 724
        return None
672 725
    # Call Sollya but first "sollyafy" the arguments.
673
    sollya_lib_init(None)
674 726
    pobyso_name_free_variable_sa_so(str(varSa))
675 727
    #pobyso_set_prec_sa_so(300)
676 728
    # Sollyafy the function.
......
701 753
    taylorFormSa = [polySa]
702 754
    return(taylorFormSa)
703 755
# End pobyso_taylor_form_sa_sa
704
def pobyso_taylorform_so_so(functionSo, degreeSo, pointSo, intervalSo=None, errorTypeSo=None):
756

  
757
def pobyso_taylorform_so_so(functionSo, degreeSo, pointSo, intervalSo=None, \
758
                            errorTypeSo=None):
759
    createdErrorType = False
705 760
    if errorTypeSo is None:
706 761
        errorTypeSo = sollya_lib_absolute()
762
        createdErrorType = True
707 763
    else:
708 764
        #TODO: deal with the other case.
709 765
        pass
710 766
    if intervalSo is None:
711
        resultSo = sollya_lib_taylorform(functionSo, degree, pointSo, errorTypeSo, None)
767
        resultSo = sollya_lib_taylorform(functionSo, degreeSo, pointSo, \
768
                                         errorTypeSo, None)
712 769
    else:
713
        resultSo = sollya_lib_taylorform(functionSo, degree, pointSo, intervalSo, errorTypeSo, None)
714
    sollya_lib_clear_obj(errorTypeSo)
770
        resultSo = sollya_lib_taylorform(functionSo, degreeSo, pointSo, \
771
                                         intervalSo, errorTypeSo, None)
772
    if createdErrorType:
773
        sollya_lib_clear_obj(errorTypeSo)
715 774
    return(resultSo)
716 775
        
717 776

  

Formats disponibles : Unified diff