Description
Instead of creating "type" classes (i.e. Type
s) and manually attaching them to Aesara objects (i.e. via Variable.type
), we should actual use Python's built-in type/class inheritance. I'm not immediately aware of any required functionality in the current Aesara type system that wouldn't allow this.
Here's an illustration of the current situation:
import aesara.tensor as at
x = at.vector()
We created a simple Aesara vector, x
; now, let's inspect its (Python) types:
>>> type(x).mro()
[aesara.tensor.var.TensorVariable,
aesara.tensor.var._tensor_py_operators,
aesara.gof.graph.Variable,
aesara.gof.graph.Node,
aesara.gof.utils.object2,
object]
Oddly, there's also a separate Variable.type
field/member/property introduced by inheriting from Variable
:
>>> x.type
TensorType(float64, vector)
>>> x.type.Variable
aesara.tensor.var.TensorVariable
>>> x.type.Constant
aesara.tensor.var.TensorConstant
As we can see, this extra Type
object holds information about the variable's dtype
and broadcastable dimensions (i.e. the vector
means x.type.broadcastable
equals [False]
/[True]
). From the latter two properties, it's also clear that the actual Python type (i.e. TensorVariable
) is directly associated with the Aesara type (i.e. TensorType
) as illustrated by the value of TensorType.Variable
.
This leads to the question: why doesn't TensorVariable
just inherit from its x.type
type/class (i.e. some TensorType
)?
If anything, the mechanics behind such inheritance might seem non-standard, as it could require some form of automatic type generation for sub-classes like TensorVariable
, but—even so—that's pretty straightforward to do in a __new__
class method (e.g. we already do that in symbolic-pymc
).
Regarding actual code changes, it seems like we would at least need to change all the Variable.type
invocations with the standard type(...)
calls, and/or more direct calls to isinstance(x, TensorType)
instead of things like x.type == TensorType(...)
.
We could also keep Variable.type
and have it return type(self)
just to make the initial transition easy.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status