def _coerce_map_from_(self, P): r""" Return whether ``P`` coerces into this symbolic subring. INPUT: - ``P`` -- a parent. OUTPUT: A boolean or ``None``. TESTS:: sage: from sage.symbolic.subring import GenericSymbolicSubring sage: GenericSymbolicSubring(vars=tuple()).has_coerce_map_from(SR) # indirect doctest # not tested see #19231 False :: sage: from sage.symbolic.subring import SymbolicSubring sage: C = SymbolicSubring(no_variables=True) sage: C.has_coerce_map_from(ZZ) # indirect doctest True sage: C.has_coerce_map_from(QQ) # indirect doctest True sage: C.has_coerce_map_from(RR) # indirect doctest True sage: C.has_coerce_map_from(RIF) # indirect doctest True sage: C.has_coerce_map_from(CC) # indirect doctest True sage: C.has_coerce_map_from(CIF) # indirect doctest True sage: C.has_coerce_map_from(AA) # indirect doctest True sage: C.has_coerce_map_from(QQbar) # indirect doctest True sage: C.has_coerce_map_from(SR) # indirect doctest False """ if P == SR: # Workaround; can be deleted once #19231 is fixed return False from sage.rings.real_mpfr import mpfr_prec_min from sage.rings.all import (ComplexField, RLF, CLF, AA, QQbar, InfinityRing) from sage.rings.real_mpfi import is_RealIntervalField from sage.rings.complex_interval_field import is_ComplexIntervalField if isinstance(P, type): return SR._coerce_map_from_(P) elif RLF.has_coerce_map_from(P) or \ CLF.has_coerce_map_from(P) or \ AA.has_coerce_map_from(P) or \ QQbar.has_coerce_map_from(P): return True elif (P is InfinityRing or is_RealIntervalField(P) or is_ComplexIntervalField(P)): return True elif ComplexField(mpfr_prec_min()).has_coerce_map_from(P): return P not in (RLF, CLF, AA, QQbar)
def _coerce_map_from_(self, R): r""" There is a coercion from anything that has a coercion into the reals. The way Sage works is that everything that should be comparable with infinity can be coerced into the infinity ring, so if you ever compare with infinity the comparison is done there. If you don't have a coercion then you will get undesirable answers from the fallback comparison (likely memory location). EXAMPLES:: sage: InfinityRing.has_coerce_map_from(int) # indirect doctest True sage: InfinityRing.has_coerce_map_from(AA) True sage: InfinityRing.has_coerce_map_from(RDF) True sage: InfinityRing.has_coerce_map_from(RIF) True As explained above, comparison works by coercing to the infinity ring:: sage: cm = get_coercion_model() sage: cm.explain(AA(3), oo, operator.lt) Coercion on left operand via Coercion map: From: Algebraic Real Field To: The Infinity Ring Arithmetic performed after coercions. Result lives in The Infinity Ring The Infinity Ring The symbolic ring does not coerce to the infinity ring, so symbolic comparisons with infinities all happen in the symbolic ring:: sage: SR.has_coerce_map_from(InfinityRing) True sage: InfinityRing.has_coerce_map_from(SR) False Complex numbers do not coerce into the infinity ring (what would `i \infty` coerce to?). This is fine since they can not be compared, so we do not have to enforce consistency when comparing with infinity either:: sage: InfinityRing.has_coerce_map_from(CDF) False sage: InfinityRing.has_coerce_map_from(CC) False sage: CC(0, oo) < CC(1) # does not coerce to infinity ring True """ from sage.rings.real_mpfr import mpfr_prec_min, RealField if RealField(mpfr_prec_min()).has_coerce_map_from(R): return True from sage.rings.real_mpfi import RealIntervalField_class if isinstance(R, RealIntervalField_class): return True try: from sage.rings.real_arb import RealBallField if isinstance(R, RealBallField): return True except ImportError: pass return False
def _coerce_map_from_(self, R): r""" There is a coercion from anything that has a coercion into the reals. The way Sage works is that everything that should be comparable with infinity can be coerced into the infinity ring, so if you ever compare with infinity the comparison is done there. If you don't have a coercion then you will get undesirable answers from the fallback comparison (likely memory location). EXAMPLES:: sage: InfinityRing.has_coerce_map_from(int) # indirect doctest True sage: InfinityRing.has_coerce_map_from(AA) True sage: InfinityRing.has_coerce_map_from(RDF) True sage: InfinityRing.has_coerce_map_from(RIF) True As explained above, comparison works by coercing to the infinity ring:: sage: cm = get_coercion_model() sage: cm.explain(AA(3), oo, operator.lt) Coercion on left operand via Conversion map: From: Algebraic Real Field To: The Infinity Ring Arithmetic performed after coercions. Result lives in The Infinity Ring The Infinity Ring The symbolic ring does not coerce to the infinity ring, so symbolic comparisons with infinities all happen in the symbolic ring:: sage: SR.has_coerce_map_from(InfinityRing) True sage: InfinityRing.has_coerce_map_from(SR) False Complex numbers do not coerce into the infinity ring (what would `i \infty` coerce to?). This is fine since they can not be compared, so we do not have to enforce consistency when comparing with infinity either:: sage: InfinityRing.has_coerce_map_from(CDF) False sage: InfinityRing.has_coerce_map_from(CC) False sage: CC(0, oo) < CC(1) # does not coerce to infinity ring True """ from sage.rings.real_mpfr import mpfr_prec_min, RealField if RealField(mpfr_prec_min()).has_coerce_map_from(R): return True from sage.rings.real_mpfi import RealIntervalField_class if isinstance(R, RealIntervalField_class): return True return False