Révision 154 pobysoPythonSage/src/pobyso.py
pobyso.py (revision 154) | ||
---|---|---|
112 | 112 |
maxPrecSa = max(lbPrecSa, ubPrecSa) |
113 | 113 |
else: |
114 | 114 |
maxPrecSa = precisionSa |
115 |
sollyaCurrentPrecSo = pobyso_get_prec_so() |
|
116 |
sollyaCurrentPrecSa = pobyso_constant_from_int_so_sa(sollyaCurrentPrecSo) |
|
117 |
# Change the current Sollya precision only if necessary. |
|
118 |
if maxPrecSa > sollyaCurrentPrecSa: |
|
119 |
pobyso_set_prec_sa_so(maxPrecSa) |
|
120 | 115 |
# From Sage to Sollya bounds. |
121 |
lowerBoundSo = sollya_lib_constant(get_rn_value(rnLowerBoundSa)) |
|
122 |
upperBoundSo = sollya_lib_constant(get_rn_value(rnUpperBoundSa)) |
|
116 |
lowerBoundSo = sollya_lib_constant(get_rn_value(rnLowerBoundSa), |
|
117 |
maxPrecSa) |
|
118 |
upperBoundSo = sollya_lib_constant(get_rn_value(rnUpperBoundSa), |
|
119 |
maxPrecSa) |
|
123 | 120 |
# From Sollya bounds to range. |
124 | 121 |
rangeSo = sollya_lib_range(lowerBoundSo, upperBoundSo) |
125 | 122 |
# Back to original precision. |
126 |
if maxPrecSa > sollyaCurrentPrecSa: |
|
127 |
sollya_lib_set_prec(sollyaCurrentPrecSo) |
|
128 | 123 |
# Clean up |
129 |
sollya_lib_clear_obj(sollyaCurrentPrecSo) |
|
130 | 124 |
sollya_lib_clear_obj(lowerBoundSo) |
131 | 125 |
sollya_lib_clear_obj(upperBoundSo) |
132 |
return(rangeSo)
|
|
126 |
return rangeSo
|
|
133 | 127 |
# End pobyso_bounds_to_range_sa_so |
134 | 128 |
|
135 | 129 |
def pobyso_build_function_sub_so_so(exp1So, exp2So): |
... | ... | |
242 | 236 |
if precisionSa > currentSollyaPrecisionSa: |
243 | 237 |
pobyso_set_prec_sa_so(precisionSa) |
244 | 238 |
constantSo = sollya_lib_constant(get_rn_value(rnArgSa)) |
245 |
pobyso_set_prec_sa_so(currentSollyaPrecision)
|
|
239 |
pobyso_set_prec_so_so(currentSollyaPrecisionSo)
|
|
246 | 240 |
else: |
247 | 241 |
constantSo = sollya_lib_constant(get_rn_value(rnArgSa)) |
248 | 242 |
sollya_lib_clear_obj(currentSollyaPrecisionSo) |
249 |
return(constantSo)
|
|
243 |
return constantSo
|
|
250 | 244 |
# End pobyso_constant_sa_so |
251 | 245 |
|
252 | 246 |
def pobyso_constant_0_sa_so(): |
... | ... | |
745 | 739 |
precSa = c_int(0) |
746 | 740 |
sollya_lib_get_constant_as_int(byref(precSa), precSo) |
747 | 741 |
sollya_lib_clear_obj(precSo) |
748 |
return(int(precSa.value))
|
|
742 |
return int(precSa.value)
|
|
749 | 743 |
# End pobyso_get_prec_so_sa. |
750 | 744 |
|
751 | 745 |
def pobyso_get_prec_of_constant(ctExpSo): |
... | ... | |
767 | 761 |
return(int(prec.value)) |
768 | 762 |
# End pobyso_get_prec_of_range_so_sa() |
769 | 763 |
|
764 |
def pobyso_guess_degree_sa_sa(functionSa, intervalSa, errorSa, weightSa=None, \ |
|
765 |
degreeBoundSa=None): |
|
766 |
functionAsStringSa = functionSa._assume_str() |
|
767 |
functionSo = pobyso_parse_string_sa_so(functionAsStringSa) |
|
768 |
rangeSo = pobyso_interval_to_range_sa_so(intervalSa) |
|
769 |
errorSo = pobyso_constant_sa_so(errorSa) |
|
770 |
if not weightSa is None: |
|
771 |
weightAsStringSa = weightSa._assume_str() |
|
772 |
weightSo = pobyso_parse_string_sa_so(weightAsStringSa) |
|
773 |
else: |
|
774 |
weightSo = None |
|
775 |
if not degreeBoundSa is None: |
|
776 |
degreeBoundSo = pobyso_constant_from_int_sa_so(degreeBoundSa) |
|
777 |
else: |
|
778 |
degreeBoundSo = None |
|
779 |
guessedDegreeSa = pobyso_guess_degree_so_sa(functionSo, |
|
780 |
rangeSo, |
|
781 |
errorSo, |
|
782 |
weightSo, |
|
783 |
degreeBoundSo) |
|
784 |
sollya_lib_clear_obj(functionSo) |
|
785 |
sollya_lib_clear_obj(rangeSo) |
|
786 |
sollya_lib_clear_obj(errorSo) |
|
787 |
if not weightSo is None: |
|
788 |
sollya_lib_clear_obj(weightSo) |
|
789 |
if not degreeBoundSo is None: |
|
790 |
sollya_lib_clear_obj(degreeBoundSo) |
|
791 |
return guessedDegreeSa |
|
792 |
# End poyso_guess_degree_sa_sa |
|
793 |
|
|
770 | 794 |
def pobyso_guess_degree_so_sa(functionSo, rangeSo, errorSo, weightSo=None, \ |
771 |
degreeBoundsSo=None): |
|
795 |
degreeBoundSo=None): |
|
796 |
""" |
|
797 |
Thin wrapper around the guessdegree function. |
|
798 |
Nevertheless, some precision control stuff has been appended. |
|
799 |
""" |
|
800 |
# Deal with Sollya internal precision issues: if it is too small, |
|
801 |
# compared with the error, increases it to about twice -log2(error). |
|
802 |
errorSa = pobyso_get_constant_as_rn_with_rf_so_sa(errorSo) |
|
803 |
log2ErrorSa = errorSa.log2() |
|
804 |
if log2ErrorSa < 0: |
|
805 |
neededPrecisionSa = int(2 * int(-log2ErrorSa) / 64) * 64 |
|
806 |
else: |
|
807 |
neededPrecisionSa = int(2 * int(log2ErrorSa) / 64) * 64 |
|
808 |
#print "Needed precision:", neededPrecisionSa |
|
809 |
currentPrecSa = pobyso_get_prec_so_sa() |
|
810 |
if neededPrecisionSa > currentPrecSa: |
|
811 |
currentPrecSo = pobyso_get_prec_so() |
|
812 |
pobyso_set_prec_sa_so(neededPrecisionSa) |
|
772 | 813 |
# weightSo and degreeBoundsSo are optional arguments. |
773 | 814 |
if weightSo is None: |
774 |
degreeRangeSo = sollya_lib_guessdegree(functionSo, rangeSo, errorSo) |
|
775 |
elif degreeBounds is None:
|
|
815 |
degreeRangeSo = sollya_lib_guessdegree(functionSo, rangeSo, errorSo, None)
|
|
816 |
elif degreeBoundSo is None:
|
|
776 | 817 |
degreeRangeSo = sollya_lib_guessdegree(functionSo, rangeSo, \ |
777 |
errorSo, weightSo) |
|
818 |
errorSo, weightSo, None)
|
|
778 | 819 |
else: |
779 | 820 |
degreeRangeSo = sollya_lib_guessdegree(functionSo, rangeSo, errorSo, \ |
780 |
weightSo, degreeBoundsSo) |
|
781 |
pobyso_range_to_interval_so_sa(degreeRangeSo) |
|
782 |
# End pobyso_guess_degree_so_sa |
|
821 |
weightSo, degreeBoundSo, None) |
|
822 |
# Restore internal precision, if applicable. |
|
823 |
if neededPrecisionSa > currentPrecSa: |
|
824 |
pobyso_set_prec_so_so(currentPrecSo) |
|
825 |
sollya_lib_clear_obj(currentPrecSo) |
|
826 |
degreeIntervalSa = pobyso_range_to_interval_so_sa(degreeRangeSo) |
|
827 |
sollya_lib_clear_obj(degreeRangeSo) |
|
828 |
# When ok, both bounds match. |
|
829 |
# When the degree bound is too low, the upper bound is the degree |
|
830 |
# for which the error can be honored. |
|
831 |
# When it really goes wrong, the upper bound is infinity. |
|
832 |
if degreeIntervalSa.lower() == degreeIntervalSa.upper(): |
|
833 |
return int(degreeIntervalSa.lower()) |
|
834 |
else: |
|
835 |
if degreeIntervalSa.upper().is_infinity(): |
|
836 |
return None |
|
837 |
else: |
|
838 |
return int(degreeIntervalSa.upper()) |
|
839 |
# End pobyso_guess_degree_so_sa |
|
783 | 840 |
|
784 | 841 |
def pobyso_infnorm_so_so(func, interval, file = None, intervalList = None): |
785 | 842 |
print "Do not use this function. User pobyso_supnorm_so_so instead." |
Formats disponibles : Unified diff