def real_dtype(dtype): """Returns the dtype of the real part.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'real_dtype'): return dtype.real_dtype # TODO(jvdillon): Find a better way. return np.array(0, as_numpy_dtype(dtype)).real.dtype
def min(dtype): # pylint: disable=redefined-builtin """Returns the minimum representable value in this data type.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'min'): return dtype.min use_finfo = is_floating(dtype) or is_complex(dtype) return np.finfo(dtype).min if use_finfo else np.iinfo(dtype).min
def is_bool(dtype): """Returns whether this is a boolean data type.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'is_bool'): return dtype.is_bool # We use `kind` because: # np.issubdtype(np.uint8, np.bool) == True. return np.dtype(dtype).kind == 'b'
def name(dtype): """Returns the string name for this `dtype`.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'name'): return dtype.name if hasattr(dtype, '__name__'): return dtype.__name__ return str(dtype)
def common_dtype(args_list, dtype_hint=None): """Returns explict dtype from `args_list` if there is one.""" dtype = None for a in tf.nest.flatten(args_list): if hasattr(a, 'dtype') and a.dtype: dt = as_numpy_dtype(a.dtype) else: continue if dtype is None: dtype = dt elif dtype != dt: if SKIP_DTYPE_CHECKS: dtype = (np.ones([2], dtype) + np.ones([2], dt)).dtype else: raise TypeError( 'Found incompatible dtypes, {} and {}.'.format(dtype, dt)) return dtype_hint if dtype is None else tf.as_dtype(dtype)
def is_complex(dtype): """Returns whether this is a complex floating point type.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'is_complex'): return dtype.is_complex return np.issubdtype(np.dtype(dtype), np.complex)
def base_dtype(dtype): """Returns a non-reference `dtype` based on this `dtype`.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'base_dtype'): return dtype.base_dtype return dtype
def as_numpy_dtype(dtype): """Returns a `np.dtype` based on this `dtype`.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'as_numpy_dtype'): return dtype.as_numpy_dtype return dtype
def size(dtype): """Returns the number of bytes to represent this `dtype`.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'size'): return dtype.size return np.dtype(dtype).itemsize
def is_integer(dtype): """Returns whether this is a (non-quantized) integer type.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'is_integer') and not callable(dtype.is_integer): return dtype.is_integer return np.issubdtype(np.dtype(dtype), np.integer)
def is_floating(dtype): """Returns whether this is a (non-quantized, real) floating point type.""" dtype = tf.as_dtype(dtype) if hasattr(dtype, 'is_floating'): return dtype.is_floating return np.issubdtype(np.dtype(dtype), np.float)