Files
apache--tvm/python/tvm/_ffi/node_generic.py
T
2018-11-13 13:32:38 -08:00

87 lines
2.3 KiB
Python

"""Common implementation of Node generic related logic"""
# pylint: disable=unused-import
from __future__ import absolute_import
from numbers import Number, Integral
from .. import _api_internal
from .base import string_types
# Node base class
_CLASS_NODE_BASE = None
def _set_class_node_base(cls):
global _CLASS_NODE_BASE
_CLASS_NODE_BASE = cls
class NodeGeneric(object):
"""Base class for all classes that can be converted to node."""
def asnode(self):
"""Convert value to node"""
raise NotImplementedError()
def convert_to_node(value):
"""Convert a python value to corresponding node type.
Parameters
----------
value : str
The value to be inspected.
Returns
-------
node : Node
The corresponding node value.
"""
if isinstance(value, _CLASS_NODE_BASE):
return value
elif isinstance(value, bool):
return const(value, 'uint1x1')
elif isinstance(value, Number):
return const(value)
elif isinstance(value, string_types):
return _api_internal._str(value)
elif isinstance(value, (list, tuple)):
value = [convert_to_node(x) for x in value]
return _api_internal._Array(*value)
elif isinstance(value, dict):
vlist = []
for item in value.items():
if (not isinstance(item[0], _CLASS_NODE_BASE) and
not isinstance(item[0], string_types)):
raise ValueError("key of map must already been a container type")
vlist.append(item[0])
vlist.append(convert_to_node(item[1]))
return _api_internal._Map(*vlist)
elif isinstance(value, NodeGeneric):
return value.asnode()
elif value is None:
return None
else:
raise ValueError("don't know how to convert type %s to node" % type(value))
def const(value, dtype=None):
"""Construct a constant value for a given type.
Parameters
----------
value : int or float
The input value
dtype : str
The data type.
Returns
-------
expr : Expr
Constant expression corresponds to the value.
"""
if dtype is None:
if isinstance(value, Integral):
dtype = 'int32'
else:
dtype = 'float32'
return _api_internal._const(value, dtype)