Révision 85 pobysoPythonSage/src/pobyso.py

pobyso.py (revision 85)
85 85

  
86 86
pobyso_max_arity = 9
87 87

  
88
def pobyso_absolute_so_so():
89
    return(sollya_lib_absolute(None))
90

  
88 91
def pobyso_autoprint(arg):
89 92
    sollya_lib_autoprint(arg,None)
90 93

  
91 94
def pobyso_autoprint_so_so(arg):
92 95
    sollya_lib_autoprint(arg,None)
93 96
    
94
def pobyso_absolute_so_so():
95
    return(sollya_lib_absolute(None))
96

  
97 97
def pobyso_bounds_to_range_sa_so(rnLowerBoundSa, rnUpperBoundSa, \
98 98
                                 precisionSa=None):
99 99
    """
......
104 104
    # Sanity check.
105 105
    if rnLowerBoundSa > rnUpperBoundSa:
106 106
        return None
107
    if precision is None:
107
    if precisionSa is None:
108 108
        # Check for the largest precision.
109 109
        lbPrecSa = rnLowerBoundSa.parent().precision()
110 110
        ubPrecSa = rnLowerBoundSa.parent().precision()
......
132 132
def pobyso_build_function_sub_so_so(exp1So, exp2So):
133 133
    return(sollya_lib_build_function_sub(exp1So, exp2So))
134 134

  
135
def pobyso_cmp(rnArg, soCte):
135
def pobyso_change_var_in_function_so_so(funcSo, chvarExpSo):
136 136
    """
137
    Variable change in a function.
138
    """
139
    return(sollya_lib_evaluate(funcSo,chvarExpSo))
140
# End pobyso_change_var_in_function_so_so     
141

  
142
def pobyso_chebyshevform_so_so(functionSo, degreeSo, intervalSo):
143
    resultSo = sollya_lib_chebyshevform(functionSo, degreeSo, intervalSo)
144
    return(resultSo)
145
# End pobyso_chebyshevform_so_so.
146

  
147
def pobyso_cmp(rnArgSa, cteSo):
148
    """
137 149
    Compare the MPFR value a RealNumber with that of a Sollya constant.
138 150
    
139 151
    Get the value of the Sollya constant into a RealNumber and compare
......
142 154
    """
143 155
    precisionOfCte = c_int(0)
144 156
    # From the Sollya constant, create a local Sage RealNumber.
145
    sollya_lib_get_prec_of_constant(precisionOfCte, soCte) 
157
    sollya_lib_get_prec_of_constant(precisionOfCte, cteSo) 
146 158
    #print "Precision of constant: ", precisionOfCte
147 159
    RRRR = RealField(precisionOfCte.value)
148
    rnLocal = RRRR(0)
149
    sollya_lib_get_constant(get_rn_value(rnLocal), soCte)
150
    #print "rnDummy: ", rnDummy
160
    rnLocalSa = RRRR(0)
161
    sollya_lib_get_constant(get_rn_value(rnLocalSa), cteSo)
151 162
    # Compare the local Sage RealNumber with rnArg.
152
    return(cmp_rn_value(rnArg, rnLocal))
163
    return(cmp_rn_value(rnArgSa, rnLocal))
153 164
# End pobyso_smp
154 165

  
155
def pobyso_change_var_in_function_so_so(funcSo, chvarExpSo):
156
    """
157
    Variable change in a function.
158
    """
159
    return(sollya_lib_evaluate(funcSo,chvarExpSo))
160
# End pobyso_change_var_in_function_so_so     
161

  
162
def pobyso_chebyshevform_so_so(functionSo, degreeSo, intervalSo):
163
    resultSo = sollya_lib_chebyshevform(functionSo, degreeSo, intervalSo)
164
    return(resultSo)
165
# End pobyso_chebyshevform_so_so.
166

  
167 166
def pobyso_compute_pos_function_abs_val_bounds_sa_sa(funcSa, lowerBoundSa, \
168 167
                                                     upperBoundSa):
169 168
    """
170
    TODO: set the variable name in Sollya.
169
    TODO: completely rework and test.
171 170
    """
171
    pobyso = pobyso_name_free_variable_sa_so(funcSa.variables()[0])
172 172
    funcSo = pobyso_parse_string(funcSa._assume_str())
173 173
    rangeSo = pobyso_range_sa_so(lowerBoundSa, upperBoundSa)
174 174
    infnormSo = pobyso_infnorm_so_so(funcSo,rangeSo)
......
186 186
    infnormSo = pobyso_infnorm_so_so(funcAuxSo,rangeSo)
187 187
    fMinSa = pobyso_get_interval_from_range_so_sa(infnormSo)
188 188
    sollya_lib_clear_obj(infnormSo)
189
    fMinLowerBoundSa = topBinadeLimit - fMinSa.lower()
189
    fMinLowerBoundSa = binadeTopLimitSa - fMinSa.lower()
190 190
    # Compute the maximum of the precisions of the different bounds.
191 191
    maxPrecSa = max([fMinLowerBoundSa.parent().precision(), \
192 192
                     fMaxUpperBoundSa.parent().precision()])
......
211 211
    # Precision stuff
212 212
    if precisionSa is None:
213 213
        precisionSa = rnArgSa.parent().precision()
214
    currentSollyaPrecisionSo = pobyso_get_prec_so()
215
    currentSollyaPrecisionSa = pobyso_get
214
    currentSollyaPrecisionSo = sollya_lib_get_prec()
215
    currentSollyaPrecisionSa = \
216
        pobyso_constant_from_int(currentSollyaPrecisionSo)
216 217
    if precisionSa > currentSollyaPrecisionSa:
217 218
        pobyso_set_prec_sa_so(precisionSa)
218 219
        constantSo = sollya_lib_constant(get_rn_value(rnArgSa))
219 220
        pobyso_set_prec_sa_so(currentSollyaPrecision)
220 221
    else:
221 222
        constantSo = sollya_lib_constant(get_rn_value(rnArgSa))
223
    sollya_lib_clear_obj(currentSollyaPrecisionSo)
222 224
    return(constantSo)
223 225
    
224 226
def pobyso_constant_0_sa_so():
......
348 350
    else:
349 351
        return None
350 352

  
351
def pobyso_get_constant(rnArg, soConst):
353
def pobyso_get_constant(rnArgSa, constSo):
352 354
    """ Legacy function. See pobyso_get_constant_so_sa. """
353
    return(pobyso_get_constant_so_sa(rnArg, soConst))
355
    return(pobyso_get_constant_so_sa(rnArgSa, constSo))
354 356

  
355 357
def pobyso_get_constant_so_sa(rnArgSa, constSo):
356 358
    """
357
    Set the value of rnArg to the value of soConst in MPFR_RNDN mode.
359
    Set the value of rnArgSo to the value of constSo in MPFR_RNDN mode.
358 360
    rnArg must already exist and belong to some RealField.
359
    We assume that soConst points to a Sollya constant.
361
    We assume that constSo points to a Sollya constant.
360 362
    """
361 363
    return(sollya_lib_get_constant(get_rn_value(rnArgSa), constSo))
362 364
    
......
389 391
    """
390 392
    Get a Sollya constant as a Sage "real number".
391 393
    If no real field is specified, the precision of the floating-point number 
392
    returned is that of the Solly constant.
394
    returned is that of the Sollya constant.
393 395
    Otherwise is is that of the real field. Hence rounding may happen.
394 396
    """
395 397
    if realFieldSa is None:
396
        sollyaPrecSa = pobyso_get_prec_so_sa()
398
        sollyaPrecSa = pobyso_get_prec_of_constant_so_sa(ctExpSo)
397 399
        realFieldSa = RealField(sollyaPrecSa)
398 400
    rnSa = realFieldSa(0)
399 401
    sollya_lib_get_constant(get_rn_value(rnSa), ctExpSo)
......
457 459
    """ Legacy function. See pobyso_get_list_elements_so_so. """
458 460
    return(pobyso_get_list_elements_so_so(soObj))
459 461
 
460
def pobyso_get_list_elements_so_so(soObj):
462
def pobyso_get_list_elements_so_so(objSo):
461 463
    """
462 464
    Get the list elements as a Sage/Python array of Sollya objects.
463
    The other data returned are also Sage/Python objects.
465
    The other data returned are Sage/Python objects.
464 466
    """
465 467
    listAddress = POINTER(c_longlong)()
466 468
    numElements = c_int(0)
......
469 471
    result = sollya_lib_get_list_elements(byref(listAddress),\
470 472
                                          byref(numElements),\
471 473
                                          byref(isEndElliptic),\
472
                                          soObj)
474
                                          objSo)
473 475
    if result == 0 :
474 476
        return None
475 477
    for i in xrange(0, numElements.value, 1):
476
        listAsList.append(listAddress[i])
478
       listAsList.append(sollya_lib_copy_obj(listAddress[i]))
477 479
    return(listAsList, numElements.value, isEndElliptic.value)
478 480

  
479 481
def pobyso_get_max_prec_of_exp(soExp):
480 482
    """ Legacy function. See pobyso_get_max_prec_of_exp_so_sa. """
481 483
    return(pobyso_get_max_prec_of_exp_so_sa(soExp))
482 484

  
483
def pobyso_get_max_prec_of_exp_so_sa(soExp):
485
def pobyso_get_max_prec_of_exp_so_sa(expSo):
484 486
    """
485 487
    Get the maximum precision used for the numbers in a Sollya expression.
486 488
    
......
495 497
    maxPrecision = 0
496 498
    minConstPrec = 0
497 499
    currentConstPrec = 0
498
    operator = pobyso_get_head_function_so_sa(soExp)
500
    operator = pobyso_get_head_function_so_sa(expSo)
499 501
    if (operator != SOLLYA_BASE_FUNC_CONSTANT) and \
500 502
    (operator != SOLLYA_BASE_FUNC_FREE_VARIABLE):
501
        (arity, subexpressions) = pobyso_get_subfunctions_so_sa(soExp)
503
        (arity, subexpressions) = pobyso_get_subfunctions_so_sa(expSo)
502 504
        for i in xrange(arity):
503 505
            maxPrecisionCandidate = \
504 506
                pobyso_get_max_prec_of_exp_so_sa(subexpressions[i])
......
506 508
                maxPrecision = maxPrecisionCandidate
507 509
        return(maxPrecision)
508 510
    elif operator == SOLLYA_BASE_FUNC_CONSTANT:
509
        minConstPrec = pobyso_get_min_prec_of_constant_so_sa(soExp)
511
        #minConstPrec = pobyso_get_min_prec_of_constant_so_sa(expSo)
510 512
        #currentConstPrec = pobyso_get_min_prec_of_constant_so_sa(soExp)
511 513
        #print minConstPrec, " - ", currentConstPrec 
512
        return(pobyso_get_min_prec_of_constant_so_sa(soExp))
514
        return(pobyso_get_min_prec_of_constant_so_sa(expSo))
513 515
    
514 516
    elif operator == SOLLYA_BASE_FUNC_FREE_VARIABLE:
515 517
        return(0)
......
517 519
        print "pobyso_get_max_prec_of_exp_so_sa: unexepected operator."
518 520
        return(0)
519 521

  
520
def pobyso_get_min_prec_of_constant_so_sa(soConstExp):
522
def pobyso_get_min_prec_of_constant_so_sa(constExpSo):
521 523
    """
522 524
    Get the minimum precision necessary to represent the value of a Sollya
523 525
    constant.
524 526
    MPFR_MIN_PREC and powers of 2 are taken into account.
525
    We assume that soCteExp is a point
527
    We assume that constExpSo is a point
526 528
    """
527
    constExpAsRn = pobyso_get_constant_as_rn_so_sa(soConstExp)
528
    return(min_mpfr_size(get_rn_value(constExpAsRn)))
529
    constExpAsRnSa = pobyso_get_constant_as_rn_so_sa(constExpSo)
530
    return(min_mpfr_size(get_rn_value(constExpAsRnSa)))
529 531

  
530
def pobyso_get_sage_exp_from_sollya_exp(sollyaExp, realField = RR):
532
def pobyso_get_sage_exp_from_sollya_exp(sollyaExpSo, realField = RR):
531 533
    """ Legacy function. See pobyso_get_sage_exp_from_sollya_exp_so_sa. """
532
    return(pobyso_get_sage_exp_from_sollya_exp_so_sa(sollyaExp, realField = RR))
534
    return(pobyso_get_sage_exp_from_sollya_exp_so_sa(sollyaExpSo, \
535
                                                     realField = RR))
533 536

  
534
def pobyso_get_sage_exp_from_sollya_exp_so_sa(sollyaExp, realField = RR):
537
def pobyso_get_sage_exp_from_sollya_exp_so_sa(sollyaExpSo, realFieldSa = RR):
535 538
    """
536 539
    Get a Sage expression from a Sollya expression. 
537 540
    Currently only tested with polynomials with floating-point coefficients.
538 541
    Notice that, in the returned polynomial, the exponents are RealNumbers.
539 542
    """
540 543
    #pobyso_autoprint(sollyaExp)
541
    operator = pobyso_get_head_function_so_sa(sollyaExp)
544
    operatorSa = pobyso_get_head_function_so_sa(sollyaExpSo)
542 545
    sollyaLibFreeVariableName = sollya_lib_get_free_variable_name()
543 546
    # Constants and the free variable are special cases.
544 547
    # All other operator are dealt with in the same way.
545
    if (operator != SOLLYA_BASE_FUNC_CONSTANT) and \
546
       (operator != SOLLYA_BASE_FUNC_FREE_VARIABLE):
547
        (arity, subexpressions) = pobyso_get_subfunctions_so_sa(sollyaExp)
548
        if arity == 1:
549
            sageExp = eval(pobyso_function_type_as_string_so_sa(operator) + \
550
            "(" + pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressions[0], \
551
            realField) + ")")
552
        elif arity == 2:
548
    if (operatorSa != SOLLYA_BASE_FUNC_CONSTANT) and \
549
       (operatorSa != SOLLYA_BASE_FUNC_FREE_VARIABLE):
550
        (aritySa, subexpressionsSa) = pobyso_get_subfunctions_so_sa(sollyaExpSo)
551
        if aritySa == 1:
552
            sageExpSa = eval(pobyso_function_type_as_string_so_sa(operatorSa) + \
553
            "(" + pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressionsSa[0], \
554
            realFieldSa) + ")")
555
        elif aritySa == 2:
553 556
            # We do not get through the preprocessor.
554 557
            # The "^" operator is then a special case.
555
            if operator == SOLLYA_BASE_FUNC_POW:
556
                operatorAsString = "**"
558
            if operatorSa == SOLLYA_BASE_FUNC_POW:
559
                operatorAsStringSa = "**"
557 560
            else:
558
                operatorAsString = \
559
                    pobyso_function_type_as_string_so_sa(operator)
560
            sageExp = \
561
              eval("pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressions[0], realField)"\
562
              + " " + operatorAsString + " " + \
563
                   "pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressions[1], realField)")
561
                operatorAsStringSa = \
562
                    pobyso_function_type_as_string_so_sa(operatorSa)
563
            sageExpSa = \
564
              eval("pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressionsSa[0], realFieldSa)"\
565
              + " " + operatorAsStringSa + " " + \
566
                   "pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressionsSa[1], realFieldSa)")
564 567
        # We do not know yet how to deal with arity >= 3 
565 568
        # (is there any in Sollya anyway?).
566 569
        else:
567
            sageExp = eval('None')
568
        return(sageExp)
569
    elif operator == SOLLYA_BASE_FUNC_CONSTANT:
570
            sageExpSa = eval('None')
571
        return(sageExpSa)
572
    elif operatorSa == SOLLYA_BASE_FUNC_CONSTANT:
570 573
        #print "This is a constant"
571
        return pobyso_get_constant_as_rn_with_rf_so_sa(sollyaExp, realField)
572
    elif operator == SOLLYA_BASE_FUNC_FREE_VARIABLE:
574
        return pobyso_get_constant_as_rn_with_rf_so_sa(sollyaExpSo, realFieldSa)
575
    elif operatorSa == SOLLYA_BASE_FUNC_FREE_VARIABLE:
573 576
        #print "This is free variable"
574 577
        return(eval(sollyaLibFreeVariableName))
575 578
    else:
......
720 723
def pobyso_lib_init():
721 724
    sollya_lib_init(None)
722 725
    
723
def pobyso_name_free_variable(freeVariableName):
726
def pobyso_name_free_variable(freeVariableNameSa):
724 727
    """ Legacy function. See pobyso_name_free_variable_sa_so. """
725
    pobyso_name_free_variable_sa_so(freeVariableName)
728
    pobyso_name_free_variable_sa_so(freeVariableNameSa)
726 729

  
727
def pobyso_name_free_variable_sa_so(freeVariableName):
730
def pobyso_name_free_variable_sa_so(freeVariableNameSa):
728 731
    """
729 732
    Set the free variable name in Sollya from a Sage string.
730 733
    """
731
    sollya_lib_name_free_variable(freeVariableName)
734
    sollya_lib_name_free_variable(freeVariableNameSa)
732 735

  
733 736
def pobyso_parse_string(string):
734 737
    """ Legacy function. See pobyso_parse_string_sa_so. """
......
745 748
    return(pobyso_range_sa_so(rnLowerBound, rnUpperBound)) 
746 749

  
747 750

  
748
def pobyso_range_to_interval_so_sa(rangeSo, realIntervalField = None):
751
def pobyso_range_to_interval_so_sa(rangeSo, realIntervalFieldSa = None):
749 752
    """
750 753
    Get a Sage interval from a Sollya range.
751 754
    If no realIntervalField is given as a parameter, the Sage interval
752 755
    precision is that of the Sollya range.
753
    Otherwise, the precision is that of the realIntervalField. Rounding
754
    may happen.
756
    Otherwise, the precision is that of the realIntervalField. In this case
757
    rounding may happen.
755 758
    """
756
    if realIntervalField is None:
759
    if realIntervalFieldSa is None:
757 760
        precSa = pobyso_get_prec_of_range_so_sa(rangeSo)
758
        realIntervalField = RealIntervalField(precSa)
761
        realIntervalFieldSa = RealIntervalField(precSa)
759 762
    intervalSa = \
760
        pobyso_get_interval_from_range_so_sa(rangeSo, realIntervalField) 
763
        pobyso_get_interval_from_range_so_sa(rangeSo, realIntervalFieldSa) 
761 764
    return(intervalSa)
762 765

  
763 766
def pobyso_remez_canonical_sa_sa(func, \
......
778 781
                                 degree, \
779 782
                                 lowerBound, \
780 783
                                 upperBound, \
781
                                 weight = None, \
782
                                 quality = None)
784
                                 weight, \
785
                                 quality)
783 786
    # String test
784 787
    if parent(func) == parent("string"):
785 788
        functionSa = eval(func)
......
793 796
    if polySo is None:
794 797
        return(None)
795 798
    maxPrecision = pobyso_get_max_prec_of_exp_so_sa(polySo)
796
    RRRR = RealField(maxPrecision)
797
    polynomialRing = RRRR[functionSa.variables()[0]]
798
    expSa = pobyso_get_sage_exp_from_sollya_exp_so_sa(polySo, RRRR)
799
    polySa = polynomial(expSa, polynomialRing)
799
    RRRRSa = RealField(maxPrecision)
800
    polynomialRingSa = RRRRSa[functionSa.variables()[0]]
801
    expSa = pobyso_get_sage_exp_from_sollya_exp_so_sa(polySo, RRRRSa)
802
    polySa = polynomial(expSa, polynomialRingSa)
800 803
    sollya_lib_clear_obj(polySo)
801 804
    return(polySa)
805
# End pobyso_remez_canonical_sa_sa
802 806
    
803 807
def pobyso_remez_canonical(func, \
804 808
                           degree, \
......
827 831
    """
828 832
    var('zorglub')    # Dummy variable name for type check only. Type of
829 833
    # zorglub is "symbolic expression".
830
    currentVariableName = None
834
    currentVariableNameSa = None
831 835
    # The func argument can be of different types (string, 
832 836
    # symbolic expression...)
833 837
    if parent(func) == parent("string"):
834
        functionSo = sollya_lib_parse_string(func)
838
        localFuncSa = eval(func)
839
        if len(localFuncSa.variables()) > 0:
840
            currentVariableNameSa = localFuncSa.variables()[0]
841
            sollya_lib_name_free_variable(str(currentVariableNameSa))
842
            functionSo = sollya_lib_parse_string(localFuncSa._assume_str())
835 843
    # Expression test.
836 844
    elif type(func) == type(zorglub):
837 845
        # Until we are able to translate Sage expressions into Sollya 
838 846
        # expressions : parse the string version.
839
        currentVariableName = func.variables()[0]
840
        sollya_lib_name_free_variable(str(currentVariableName))
841
        functionSo = sollya_lib_parse_string(func._assume_str())
847
        if len(func.variables()) > 0:
848
            currentVariableNameSa = func.variables()[0]
849
            sollya_lib_name_free_variable(str(currentVariableNameSa))
850
            functionSo = sollya_lib_parse_string(func._assume_str())
842 851
    else:
843 852
        return(None)
844
    if weight is None:
853
    if weight is None: # No weight given -> 1.
845 854
        weightSo = pobyso_constant_1_sa_so()
846
    elif parent(weight) == parent("string"):
855
    elif parent(weight) == parent("string"): # Weight given as string: parse it.
847 856
        weightSo = sollya_lib_parse_string(func)
848
    elif type(weight) == type(zorglub): 
857
    elif type(weight) == type(zorglub): # Weight given as symbolice expression.
849 858
        functionSo = sollya_lib_parse_string_sa_so(weight._assume_str())
850 859
    else:
851 860
        return(None)
852 861
    degreeSo = pobyso_constant_from_int(degree)
853
    rangeSo = pobyso_range_sa_so(lowerBound, upperBound)
862
    rangeSo = pobyso_bounds_to_range_sa_so(lowerBound, upperBound)
854 863
    if not quality is None:
855 864
        qualitySo= pobyso_constant_sa_so(quality)
856 865
    else:
......
867 876
    sollya_lib_clear_obj(rangeSo)
868 877
    sollya_lib_clear_obj(weightSo)
869 878
    if not qualitySo is None:
870
        sollya_lib_clear_obj(qualtiySo)
879
        sollya_lib_clear_obj(qualitySo)
871 880
    return(remezPolySo)
872 881
# End pobyso_remez_canonical_sa_so
873 882

  
......
892 901

  
893 902
def pobyso_set_prec(p):
894 903
    """ Legacy function. See pobyso_set_prec_sa_so. """
895
    return( pobyso_set_prec_sa_so(p))
904
    pobyso_set_prec_sa_so(p)
896 905

  
897 906
def pobyso_set_prec_sa_so(p):
898 907
    a = c_int(p)
899 908
    precSo = c_void_p(sollya_lib_constant_from_int(a))
900
    sollya_lib_set_prec(precSo)
909
    sollya_lib_set_prec(precSo, None)
901 910

  
902
def pobyso_supnorm_so_so(polySo, funcSo, intervalSo, errorTypeSo, accuracySo):
903
    return(sollya_lib_supnorm(polySo, funcSo, intervalSo, errorTypeSo, \
904
                              accuracySo))
911
def pobyso_set_prec_so_so(newPrecSo):
912
    sollya_lib_set_prec(newPrecSo, None)
905 913

  
906
def pobyso_taylor_expansion_with_change_var_so_so(functionSo, degreeSo, rangeSo, \
907
                                                errorTypeSo, \
908
                                                sollyaPrecSo=None):
914
def pobyso_supnorm_so_so(polySo, funcSo, intervalSo, errorTypeSo = None,\
915
                         accuracySo = None):
909 916
    """
917
    Computes the supnorm of the approximation error between the given 
918
    polynomial and function.
919
    errorTypeSo defaults to "absolute".
920
    accuracySo defaults to 2^(-40).
921
    """
922
    if errorTypeSo is None:
923
        errorTypeSo = sollya_lib_absolute(None)
924
        errorTypeIsNone = True
925
    else:
926
        errorTypeIsNone = False
927
    #
928
    if accuracySo is None:
929
        # Notice the **!
930
        accuracySo = pobyso_constant_sa_so(RR(2**(-40)))
931
        accuracyIsNone = True
932
    else:
933
        accuracyIsNone = False
934
    pobyso_autoprint(accuracySo)
935
    resultSo = \
936
        sollya_lib_supnorm(polySo, funcSo, intervalSo, errorTypeSo, \
937
                              accuracySo)
938
    if errorTypeIsNone:
939
        sollya_lib_clear_obj(errorTypeSo)
940
    if accuracyIsNone:
941
        sollya_lib_clear_obj(accuracySo)
942
    return resultSo
943
# End pobyso_supnorm_so_so
944

  
945
def pobyso_taylor_expansion_with_change_var_so_so(functionSo, degreeSo, \
946
                                                  rangeSo, \
947
                                                  errorTypeSo=None, \
948
                                                  sollyaPrecSo=None):
949
    """
910 950
    Compute the Taylor expansion with the variable change
911 951
    x -> (x-intervalCenter) included.
912 952
    """
......
915 955
        initialPrecSo = sollya_lib_get_prec(None)
916 956
        sollya_lib_set_prec(sollyaPrecSo)
917 957
    #
958
    # Error type stuff: default to absolute.
959
    if errorTypeSo is None:
960
        errorTypeIsNone = True
961
        errorTypeSo = sollya_lib_absolute(None)
962
    else:
963
        errorTypeIsNone = False
918 964
    intervalCenterSo = sollya_lib_mid(rangeSo)
919 965
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo, \
920 966
                                         intervalCenterSo, \
......
932 978
    if not sollyaPrecSo is None:
933 979
        sollya_lib_set_prec(initialPrecSo)
934 980
        sollya_lib_clear_obj(initialPrecSo)
981
    if errorTypeIsNone:
982
        sollya_lib_clear_obj(errorTypeSo)
983
    sollya_lib_clear_obj(taylorFormSo)
984
    # Do not clear maxErrorSo.
935 985
    return((polyVarChangedSo, intervalCenterSo, maxErrorSo))
936 986
# end pobyso_taylor_expansion_with_change_var_so_so
937 987

  
938 988
def pobyso_taylor_expansion_no_change_var_so_so(functionSo, degreeSo, rangeSo, \
939
                                                errorTypeSo, \
989
                                                errorTypeSo=None, \
940 990
                                                sollyaPrecSo=None):
941 991
    """
942 992
    Compute the Taylor expansion without the variable change
......
946 996
    if not sollyaPrecSo is None:
947 997
        initialPrecSo = sollya_lib_get_prec(None)
948 998
        sollya_lib_set_prec(sollyaPrecSo)
949
    #
999
    # Error type stuff: default to absolute.
1000
    if errorTypeSo is None:
1001
        errorTypeIsNone = True
1002
        errorTypeSo = sollya_lib_absolute(None)
1003
    else:
1004
        errorTypeIsNone = False
950 1005
    intervalCenterSo = sollya_lib_mid(rangeSo)
951 1006
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo, \
952 1007
                                         intervalCenterSo, \
953 1008
                                         rangeSo, errorTypeSo, None)
954
    (taylorFormListSo, numElements, isEndElliptic) = \
1009
    (taylorFormListSo, numElementsSo, isEndEllipticSo) = \
955 1010
        pobyso_get_list_elements_so_so(taylorFormSo)
956
    polySo = taylorFormListSo[0]
1011
    polySo = sollya_lib_copy_obj(taylorFormListSo[0])
957 1012
    errorRangeSo = taylorFormListSo[2]
958 1013
    maxErrorSo = sollya_lib_sup(errorRangeSo)
959 1014
    # If changed, reset the Sollya working precision.
960 1015
    if not sollyaPrecSo is None:
961 1016
        sollya_lib_set_prec(initialPrecSo)
962 1017
        sollya_lib_clear_obj(initialPrecSo)
1018
    if errorTypeIsNone:
1019
        sollya_lib_clear_obj(errorTypeSo)
1020
    sollya_lib_clear_obj(taylorFormSo)
1021
    # Do not clear maxErrorSo.
963 1022
    return((polySo, intervalCenterSo, maxErrorSo))
964 1023
# end pobyso_taylor_expansion_no_change_var_so_so
965 1024

  
......
970 1029
def pobyso_taylor_so_so(functionSo, degreeSo, pointSo):
971 1030
    return(sollya_lib_taylor(functionSo, degreeSo, pointSo))
972 1031
    
973
def pobyso_taylorform(function, degree, point = None, interval = None, errorType=None):
974
    """ Legacy function. See ;"""
1032
def pobyso_taylorform(function, degree, point = None, 
1033
                      interval = None, errorType=None):
1034
    """ Legacy function. See pobyso_taylorform_sa_sa;"""
975 1035
    
976 1036
def pobyso_taylorform_sa_sa(functionSa, \
977 1037
                            degreeSa, \
......
980 1040
                            errorTypeSa=None, \
981 1041
                            precisionSa=None):
982 1042
    """
983
    Compute the Taylor form of 'degree' for 'functionSa' at 'point' 
984
    for 'interval' with 'errorType' (a string). 
1043
    Compute the Taylor form of 'degreeSa' for 'functionSa' at 'pointSa' 
1044
    for 'intervalSa' with 'errorTypeSa' (a string) using 'precisionSa'. 
985 1045
    point: must be a Real or a Real interval.
986 1046
    return the Taylor form as an array
987 1047
    TODO: take care of the interval and of the point when it is an interval;
......
1008 1068
            pobyso_set_prec_sa_so(precisionSa)
1009 1069
            precisionChangedSa = True
1010 1070
            
1011
    varSa = functionSa.variables()[0]
1012
    pobyso_name_free_variable_sa_so(str(varSa))
1071
    if len(functionSa.variables()) > 0:
1072
        varSa = functionSa.variables()[0]
1073
        pobyso_name_free_variable_sa_so(str(varSa))
1013 1074
    # In any case (point or interval) the parent of pointSa has a precision
1014 1075
    # method.
1015 1076
    pointPrecSa = pointSa.parent().precision()
......
1033 1094
    taylorFormSo = \
1034 1095
        sollya_lib_taylorform(functionSo, degreeSo, pointSo, errorTypeSo,\
1035 1096
                                         None)
1097
    sollya_lib_clear_obj(functionSo)
1098
    sollya_lib_clear_obj(degreeSo)
1099
    sollya_lib_clear_obj(pointSo)
1100
    sollya_lib_clear_obj(errorTypeSo)
1036 1101
    (tfsAsList, numElements, isEndElliptic) = \
1037 1102
            pobyso_get_list_elements_so_so(taylorFormSo)
1038 1103
    polySo = tfsAsList[0]
......
1042 1107
    if precisionChangedSa:
1043 1108
        sollya_lib_set_prec(currentSollyaPrecSo)
1044 1109
        sollya_lib_clear_obj(currentSollyaPrecSo)
1045
    # Clean up.
1046
    sollya_lib_clear_obj(pointSo) # Works, whatever the type of pointSo is.
1047
    sollya_lib_clear_obj(errorTypeSo)
1048
    sollya_lib_clear_obj(degreeSo)
1049 1110
    polynomialRing = polyRealField[str(varSa)]
1050 1111
    polySa = polynomial(expSa, polynomialRing)
1051 1112
    taylorFormSa = [polySa]
1113
    # Final clean-up.
1114
    sollya_lib_clear_obj(taylorFormSo)
1052 1115
    return(taylorFormSa)
1053 1116
# End pobyso_taylor_form_sa_sa
1054 1117

  

Formats disponibles : Unified diff