def __new__(cls, *args, **kwargs): options = kwargs.get('options', {}) key = cls._cache_key(*args, **kwargs) obj = cls._cache_get(key) if obj is not None: newobj = sympy.Matrix.__new__(cls, *args, **options) newobj.__init_cached__(key) return newobj name = kwargs.get('name') # Number of dimensions indices, _ = cls.__indices_setup__(**kwargs) # Create new, unique type instance from cls and the symbol name newcls = type(name, (cls,), dict(cls.__dict__)) # Create the new Function object and invoke __init__ comps = cls.__subfunc_setup__(*args, **kwargs) newobj = sympy.ImmutableDenseMatrix.__new__(newcls, comps) # Initialization. The following attributes must be available newobj._indices = indices newobj._name = name newobj._dtype = cls.__dtype_setup__(**kwargs) newobj.__init_finalize__(*args, **kwargs) # Store new instance in symbol cache Cached.__init__(newobj, newcls) return newobj
def __new__(cls, *args, **kwargs): key = cls._cache_key(*args, **kwargs) obj = cls._cache_get(key) if obj is not None: return obj # Not in cache. Create a new Symbol via sympy.Symbol name = kwargs.get('name') or args[0] assumptions, kwargs = cls._filter_assumptions(**kwargs) # Create new, unique type instance from cls and the symbol name newcls = type(name, (cls,), dict(cls.__dict__)) # Create the new Symbol and invoke __init__ newobj = sympy.Symbol.__new__(newcls, name, **assumptions) # Initialization newobj._dtype = cls.__dtype_setup__(**kwargs) newobj.__init_finalize__(*args, **kwargs) # Store new instance in symbol cache Cached.__init__(newobj, newcls) return newobj
def __new__(cls, *args, **kwargs): options = kwargs.get('options', {'evaluate': False}) # Is the object already in cache (e.g., f(x), f(x+1)) ? key = cls._cache_key(*args, **kwargs) obj = cls._cache_get(key) if obj is not None: return obj # Does the base object exist at least (e.g. f(x))? obj = cls._cache_get(cls) if obj is not None: with sympy_mutex: newobj = sympy.Function.__new__(cls, *args, **options) newobj.__init_cached__(obj) Cached.__init__(newobj, key) return newobj # Preprocess arguments args, kwargs = cls.__args_setup__(*args, **kwargs) # Not in cache. Create a new Function via sympy.Function name = kwargs.get('name') dimensions, indices = cls.__indices_setup__(**kwargs) # Create new, unique type instance from cls and the symbol name newcls = type(name, (cls, ), dict(cls.__dict__)) # Create the new Function object and invoke __init__ with sympy_mutex: newobj = sympy.Function.__new__(newcls, *indices, **options) # Initialization. The following attributes must be available # when executing __init_finalize__ newobj._name = name newobj._dimensions = dimensions newobj._shape = cls.__shape_setup__(**kwargs) newobj._dtype = cls.__dtype_setup__(**kwargs) newobj.__init_finalize__(*args, **kwargs) # All objects cached on the AbstractFunction `newobj` keep a reference # to `newobj` through the `function` field. Thus, all indexified # object will point to `newobj`, the "actual Function". newobj.function = newobj # Store new instance in symbol cache key = (newcls, indices) Cached.__init__(newobj, key, newcls) return newobj
def _cache_get(cls, *args, **kwargs): # Is the object already in cache (e.g., f(x), f(x+1)) ? key = cls._cache_key(*args, **kwargs) obj = super()._cache_get(key) if obj is not None: return obj # Does the base object exist at least (e.g. f(x))? obj = super()._cache_get(cls) if obj is not None: options = kwargs.get('options', {'evaluate': False}) with sympy_mutex: newobj = sympy.Function.__new__(cls, *args, **options) newobj.__init_cached__(obj) Cached.__init__(newobj, key) return newobj # Not in cache return None
def __new__(cls, *args, **kwargs): key = cls._cache_key(*args, **kwargs) obj = cls._cache_get(key) if obj is not None: return obj # Not in cache. Create a new Symbol via sympy.Symbol name = kwargs.get('name') or args[0] assumptions, kwargs = cls._filter_assumptions(**kwargs) # Note: use __xnew__ to bypass sympy caching newobj = sympy.Symbol.__xnew__(cls, name, **assumptions) # Initialization newobj._dtype = cls.__dtype_setup__(**kwargs) newobj.__init_finalize__(*args, **kwargs) # Store new instance in symbol cache Cached.__init__(newobj, key) return newobj
def __new__(cls, *args, **kwargs): options = kwargs.get('options', {}) key = cls._cache_key(*args, **kwargs) obj = cls._cache_get(key) if obj is not None: newobj = sympy.Function.__new__(cls, *args, **options) newobj.__init_cached__(key) return newobj # Not in cache. Create a new Function via sympy.Function name = kwargs.get('name') dimensions, indices = cls.__indices_setup__(**kwargs) # Create new, unique type instance from cls and the symbol name newcls = type(name, (cls,), dict(cls.__dict__)) # Create the new Function object and invoke __init__ newobj = sympy.Function.__new__(newcls, *indices, **options) # Initialization. The following attributes must be available # when executing __init_finalize__ newobj._name = name newobj._dimensions = dimensions newobj._shape = cls.__shape_setup__(**kwargs) newobj._dtype = cls.__dtype_setup__(**kwargs) newobj.__init_finalize__(*args, **kwargs) # All objects cached on the AbstractFunction `newobj` keep a reference # to `newobj` through the `function` field. Thus, all indexified # object will point to `newobj`, the "actual Function". newobj.function = newobj # Store new instance in symbol cache Cached.__init__(newobj, newcls) return newobj