Description
Currently in tensorflow-core/tensorflow-core-api/src/main/java/org/tensorflow/DataType.java, we use an uncomfortable pattern: DataType
is omniscient about TType
and dispatches on a string TType.NAME
. For example:
/** Returns true if this data type represents an integer type */
public boolean isInteger() {
switch (this.name()) {
case TInt32.NAME:
case TInt64.NAME:
case TUint8.NAME:
return true;
default:
return false;
}
}
The author of this pattern, @JimClarke5, mentioned in our Google Group that he regarded it as temporary:
My present code does a switch on DataType.name(), but IMO, this isn’t the most elegant way to do this.
@karllessard suggested a direction, although with some open questions:
Each data type in Java inherit from a "type family" as in here, which can be use to set bounds on a given datatype when used as a generic parameter (e.g.
Tensor<? extends TNumber>
to only accept tensors that are numeric). But if doesn't do in your case and you really want to check the data type family at runtime, then we need to add new methods, likedataType.isNumber()
. I think ideally it should be in line with the same data types classes defined in the core library; the new methods could even be added to the C API, in this file.
Let's decide on a direction! This is moderately pervasive in our code, but also a pretty simple change, so I'd advocate we choose a direction soon and I'm tempted to volunteer to make the change.