from sympy import S, Basic, Set, ordered, sympify | |
from sympy.sets import FiniteSet as SympyFiniteSet | |
from sympy.core.parameters import global_parameters | |
class FiniteSet(SympyFiniteSet): | |
""" | |
FiniteSet which keeps the _unsorted_args attribute, only available till the first evaluation | |
""" | |
def __new__(cls, *args, **kwargs): | |
evaluate = kwargs.get('evaluate', global_parameters.evaluate) | |
if evaluate: | |
args = list(map(sympify, args)) | |
if len(args) == 0: | |
return S.EmptySet | |
else: | |
args = list(map(sympify, args)) | |
unsorted_args = args | |
# keep the form of the first canonical arg | |
dargs = {} | |
for i in reversed(list(ordered(args))): | |
if i.is_Symbol: | |
dargs[i] = i | |
else: | |
try: | |
dargs[i.as_dummy()] = i | |
except TypeError: | |
# e.g. i = class without args like `Interval` | |
dargs[i] = i | |
_args_set = set(dargs.values()) | |
args = list(ordered(_args_set, Set._infimum_key)) | |
obj = Basic.__new__(cls, *args) | |
obj._args_set = _args_set | |
obj._unsorted_args = unsorted_args | |
return obj | |