Révision 52 pobysoPythonSage/src/pobyso.py

pobyso.py (revision 52)
102 102
    return(pobyso_constant_sa_so(rnArg))
103 103
    
104 104
def pobyso_constant_sa_so(rnArg):
105
    """
106
    Create a Sollya constant from a RealNumber.
107
    """
105 108
    return(sollya_lib_constant(get_rn_value(rnArg)))
106 109
    
107 110
def pobyso_constant_1():
108 111
    """ Legacy function. See pobyso_constant_so_so. """
109
    return(pobyso_constant_1_so_so())
112
    return(pobyso_constant_1_sa_so())
110 113

  
111
def pobyso_constant_1_so_so():
114
def pobyso_constant_1_sa_so():
112 115
    return(pobyso_constant_from_int_sa_so(1))
113 116

  
114 117
def pobyso_constant_from_int(anInt):
......
223 226
    pobyso_get_constant_so_sa(rnArg, soConst)
224 227

  
225 228
def pobyso_get_constant_so_sa(rnArg, soConst):
226
    set_rn_value(rnArg, soConst)
229
    """
230
    Set the value of rnArg to the value of soConst in MPFR_RNDN mode.
231
    rnArg must already exist and belong to some RealField.
232
    We assume that soConst points to a Sollya constant.
233
    """
234
    sollya_lib_get_constant(get_rn_value(rnArg), soConst)
227 235
    
228 236
def pobyso_get_constant_as_rn(ctExp):
229 237
    """ Legacy function. See pobyso_get_constant_as_rn_so_sa. """ 
230 238
    return(pobyso_get_constant_as_rn_so_sa(ctExp))
231 239
    
232
def pobyso_get_constant_as_rn_so_sa(ctExp):
233
    precision  = pobyso_get_prec_of_constant(ctExp) 
240
def pobyso_get_constant_as_rn_so_sa(constExp):
241
    precision  = pobyso_get_prec_of_constant(constExp) 
234 242
    RRRR = RealField(precision)
235 243
    rn = RRRR(0)
236
    sollya_lib_get_constant(get_rn_value(rn), ctExp)
244
    sollya_lib_get_constant(get_rn_value(rn), constExp)
237 245
    return(rn)
238 246

  
239 247
def pobyso_get_constant_as_rn_with_rf(ctExp, realField):
......
300 308
def pobyso_get_max_prec_of_exp_so_sa(soExp):
301 309
    """
302 310
    Get the maximum precision used for the numbers in a Sollya expression.
311
    
312
    Arguments:
313
    soExp -- a Sollya expression pointer
314
    Return value:
315
    A Python integer
303 316
    TODO: 
304 317
    - error management;
305 318
    - correctly deal with numerical type such as DOUBLEEXTENDED.
306 319
    """
307 320
    maxPrecision = 0
308
    currentPrecision = c_int(0)
321
    minConstPrec = 0
322
    currentConstPrec = 0
309 323
    operator = pobyso_get_head_function_so_sa(soExp)
310 324
    if (operator != SOLLYA_BASE_FUNC_CONSTANT) and \
311 325
    (operator != SOLLYA_BASE_FUNC_FREE_VARIABLE):
......
317 331
                maxPrecision = maxPrecisionCandidate
318 332
        return(maxPrecision)
319 333
    elif operator == SOLLYA_BASE_FUNC_CONSTANT:
320
        sollya_lib_get_prec_of_constant(currentPrecision, soExp)
321
        #sollya_lib_autoprint(soExp, None)
322
        print currentPrecision
323
        return(pobyso_get_prec_of_constant_so_sa(soExp))
334
        minConstPrec = pobyso_get_min_prec_of_constant_so_sa(soExp)
335
        #currentConstPrec = pobyso_get_min_prec_of_constant_so_sa(soExp)
336
        #print minConstPrec, " - ", currentConstPrec 
337
        return(pobyso_get_min_prec_of_constant_so_sa(soExp))
338
    
324 339
    elif operator == SOLLYA_BASE_FUNC_FREE_VARIABLE:
325 340
        return(0)
326 341
    else:
327 342
        print "pobyso_get_max_prec_of_exp_so_sa: unexepected operator."
328 343
        return(0)
329 344

  
345
def pobyso_get_min_prec_of_constant_so_sa(soConstExp):
346
    """
347
    Get the minimum precision necessary to represent the value of a Sollya
348
    constant.
349
    MPFR_MIN_PREC and powers of 2 are taken into account.
350
    We assume that soCteExp is a point
351
    """
352
    constExpAsRn = pobyso_get_constant_as_rn_so_sa(soConstExp)
353
    return(min_mpfr_size(get_rn_value(constExpAsRn)))
354

  
330 355
def pobyso_get_sage_exp_from_sollya_exp(sollyaExp, realField = RR):
331 356
    """ Legacy function. See pobyso_get_sage_exp_from_sollya_exp_so_sa. """
332 357
    return(pobyso_get_sage_exp_from_sollya_exp_so_sa(sollyaExp, realField = RR))
......
346 371
        (arity, subexpressions) = pobyso_get_subfunctions_so_sa(sollyaExp)
347 372
        if arity == 1:
348 373
            sageExp = eval(pobyso_function_type_as_string_so_sa(operator) + \
349
            "(" + pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressions[0], realField)\
350
             + ")")
374
            "(" + pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressions[0], \
375
            realField) + ")")
351 376
        elif arity == 2:
352 377
            if operator == SOLLYA_BASE_FUNC_POW:
353 378
                operatorAsString = "**"
354 379
            else:
355
                operatorAsString = pobyso_function_type_as_string_so_sa(operator)
380
                operatorAsString = \
381
                    pobyso_function_type_as_string_so_sa(operator)
356 382
            sageExp = \
357 383
              eval("pobyso_get_sage_exp_from_sollya_exp_so_sa(subexpressions[0], realField)"\
358 384
              + " " + operatorAsString + " " + \
......
462 488
    rangeSo = sollya_lib_range(lowerBoundSo, upperBoundSo)
463 489
    return(rangeSo)
464 490

  
491
def pobyso_remez_canonical_sa_sa(func, \
492
                                 degree, \
493
                                 lowerBound, \
494
                                 upperBound, \
495
                                 weight = None, \
496
                                 quality = None):
497
    """
498
    All arguments are Sage/Python.
499
    The functions (func and weight) must be passed as expressions or strings.
500
    Otherwise the function fails. 
501
    The return value is a pointer is a Sage polynomial.
502
    """
503
    var('zorglub')    # Dummy variable name for type check only.
504
    polySo = pobyso_remez_canonical_sa_so(func, \
505
                                 degree, \
506
                                 lowerBound, \
507
                                 upperBound, \
508
                                 weight = None, \
509
                                 quality = None)
510
    if parent(func) == parent("string"):
511
        functionSa = eval(func)
512
    # Expression test.
513
    elif type(func) == type(zorglub):
514
        functionSa = func
515
    maxPrecision = 0
516
    if polySo is None:
517
        return(None)
518
    maxPrecision = pobyso_get_max_prec_of_exp_so_sa(polySo)
519
    RRRR = RealField(maxPrecision)
520
    polynomialRing = RRRR[functionSa.variables()[0]]
521
    expSa = pobyso_get_sage_exp_from_sollya_exp_so_sa(polySo, RRRR)
522
    polySa = polynomial(expSa, polynomialRing)
523
    return(polySa)
524
    
465 525
def pobyso_remez_canonical(func, \
466 526
                           degree, \
467 527
                           lowerBound, \
......
479 539
                                 degree, \
480 540
                                 lowerBound, \
481 541
                                 upperBound, \
482
                                 weight = "1", \
542
                                 weight = None, \
483 543
                                 quality = None):
484 544
    """
485 545
    All arguments are Sage/Python.
......
487 547
    Otherwise the function fails. 
488 548
    The return value is a pointer to a Sollya function.
489 549
    """
490
    var('zorglub')
550
    var('zorglub')    # Dummy variable name for type check only.
551
    currentVariableName = None
552
    # The func argument can be of different types (string, 
553
    # symbolic expression...)
491 554
    if parent(func) == parent("string"):
492 555
        functionSo = sollya_lib_parse_string(func)
493 556
    # Expression test.
494
    elif type(func) == type(zorglub): 
495
        functionSo = sollya_lib_parse_string_sa_so(func._assume_str())
557
    elif type(func) == type(zorglub):
558
        # Until we are able to translate Sage expressions into Sollya 
559
        # expressions : parse the string version.
560
        currentVariableName = func.variables()[0]
561
        sollya_lib_name_free_variable(str(currentVariableName))
562
        functionSo = sollya_lib_parse_string(func._assume_str())
496 563
    else:
497 564
        return(None)
498
    if parent(weight) == parent("string"):
565
    if weight is None:
566
        weightSo = pobyso_constant_1_sa_so()
567
    elif parent(weight) == parent("string"):
499 568
        weightSo = sollya_lib_parse_string(func)
500 569
    elif type(weight) == type(zorglub): 
501 570
        functionSo = sollya_lib_parse_string_sa_so(weight._assume_str())
......
505 574
    rangeSo = pobyso_range_sa_so(lowerBound, upperBound)
506 575
    if not quality is None:
507 576
        qualitySo= pobyso_constant_sa_so(quality)
508
    return(sollya_lib_remez(functionSo, degreeSo, rangeSo, weightSo, qualitySo, None))
577
    else:
578
        qualitySo = None
579
    return(sollya_lib_remez(functionSo, \
580
                            degreeSo, \
581
                            rangeSo, \
582
                            weightSo, \
583
                            qualitySo, \
584
                            None))
509 585
    
510 586
def pobyso_remez_canonical_so_so(funcSo, \
511 587
                                 degreeSo, \
512 588
                                 rangeSo, \
513
                                 weightSo = pobyso_constant_1_so_so(),\
589
                                 weightSo = pobyso_constant_1_sa_so(),\
514 590
                                 qualitySo = None):
515 591
    """
516 592
    All arguments are pointers to Sollya objects.

Formats disponibles : Unified diff