Source code for algebra.symbols
"""
Defines symbols for extension to +/- infinity and related methods.
"""
from clothesline.exceptions import IndeterminateFormError, UnparseableDictError
[docs]class PlusInf: # noqa: PLR0903
"""
Symbolic constant for "+infinity"
"""
@staticmethod
def __repr__():
return "+inf"
[docs]class MinusInf: # noqa: PLR0903
"""
Symbolic constant for "-infinity"
"""
@staticmethod
def __repr__():
return "-inf"
[docs]def is_symbol(value):
"""
Return True if the value is a symbolic constant.
"""
return value is PlusInf or value is MinusInf
[docs]def x_repr(val):
"""
String representation
"""
if is_symbol(val): # noqa: PLR1705
return val.__repr__()
else:
return val.__repr__()
[docs]def x_to_dict(value, v_encoder):
"""
Return a json-encodable representation of this extended 'value'.
"""
if is_symbol(value): # noqa: PLR1705
return {"symbol": value.__repr__()}
else:
# "ordinary value"
return {"o_value": v_encoder(value)}
[docs]def x_from_dict(input_dict, v_decoder):
"""
Extract a extended value from a dictionary item, leveraging the passed
decoder.
"""
if "symbol" in input_dict: # noqa: PLR1705
if input_dict["symbol"] == PlusInf.__repr__(): # noqa: PLR1705
return PlusInf
elif input_dict["symbol"] == MinusInf.__repr__():
return MinusInf
else:
raise UnparseableDictError
else:
return v_decoder(input_dict["o_value"])
# Extensions of arithmetic to "domain + infinities"
[docs]def x_equals(val1, val2):
"""
Equality, extended
"""
if val1 is PlusInf: # noqa: PLR1705
return val2 is PlusInf
elif val1 is MinusInf:
return val2 is MinusInf
else:
return val1 == val2
[docs]def x_gt(val1, val2):
"""
Greater-than, extended
"""
if val1 is PlusInf: # noqa: PLR1705
return val2 is not PlusInf
elif val1 is MinusInf:
return False
else:
# val1 is a regular number:
if val2 is PlusInf: # noqa: PLR1705
return False
elif val2 is MinusInf:
return True
else:
# both are numbers
return val1 > val2
[docs]def x_lt(val1, val2):
"""
Less-than, extended
"""
return x_gt(val2, val1) # noqa: PLW1114
[docs]def x_cmp(val1, val2):
"""
a valid 'cmp' to use for sorting values-and-symbols
"""
if x_equals(val1, val2): # noqa: PLR1705
return 0
else:
return -1 if x_lt(val1, val2) else +1
[docs]def x_ge(val1, val2):
"""
Greater-or-equal, extended
"""
return x_equals(val1, val2) or x_gt(val1, val2)
[docs]def x_le(val1, val2):
"""
Less-or-equal, extended
"""
return x_equals(val1, val2) or x_lt(val1, val2)
[docs]def x_sum(val1, val2, adder): # noqa: PLR0911
"""
Sum of two values.
Will raise an error if the two values are the two (opposite) infinities
"""
if val1 is PlusInf: # noqa: PLR1705
if val2 is PlusInf: # noqa: PLR1705
# +inf + +inf
return PlusInf
elif val2 is MinusInf:
# +inf + -inf
raise IndeterminateFormError
else:
# +inf + num
return PlusInf
elif val1 is MinusInf:
if val2 is PlusInf: # noqa: PLR1705, PLR1720
# -inf + +inf
raise IndeterminateFormError
elif val2 is MinusInf:
# -inf + -inf
return MinusInf
else:
# -inf + num
return MinusInf
else:
if val2 is PlusInf: # noqa: PLR1705
# num + +inf
return PlusInf
elif val2 is MinusInf:
# num + -inf
return MinusInf
else:
# num + num
return adder(val1, val2)
[docs]def x_subtract(val1, val2, subtracter): # noqa: PLR0911
"""
Evaluate the difference val1 - val2.
Will raise an error if indeterminate forms arise.
"""
if val1 is PlusInf: # noqa: PLR1705
if val2 is PlusInf: # noqa: PLR1705, PLR1720
# +inf - +inf
raise IndeterminateFormError
elif val2 is MinusInf:
# +inf - -inf
return PlusInf
else:
# +inf - num
return PlusInf
elif val1 is MinusInf:
if val2 is PlusInf: # noqa: PLR1705
# -inf - +inf
return MinusInf
elif val2 is MinusInf:
# -inf - -inf
raise IndeterminateFormError
else:
# -inf - num
return MinusInf
else:
if val2 is PlusInf: # noqa: PLR1705
# num - +inf
return MinusInf
elif val2 is MinusInf:
# num - -inf
return PlusInf
else:
# num - num
return subtracter(val1, val2)