def make_attribute( key, # type: Text value, # type: Any doc_string=None # type: Optional[Text] ): # type: (...) -> AttributeProto """Makes an AttributeProto based on the value type.""" attr = AttributeProto() attr.name = key if doc_string: attr.doc_string = doc_string is_iterable = isinstance(value, collections.Iterable) bytes_or_false = _to_bytes_or_false(value) # First, singular cases # float if isinstance(value, float): attr.f = value attr.type = AttributeProto.FLOAT # integer elif isinstance(value, numbers.Integral): attr.i = cast(int, value) attr.type = AttributeProto.INT # string elif bytes_or_false: assert isinstance(bytes_or_false, bytes) attr.s = bytes_or_false attr.type = AttributeProto.STRING elif isinstance(value, TensorProto): attr.t.CopyFrom(value) attr.type = AttributeProto.TENSOR elif isinstance(value, GraphProto): attr.g.CopyFrom(value) attr.type = AttributeProto.GRAPH # third, iterable cases elif is_iterable: byte_array = [_to_bytes_or_false(v) for v in value] if all(isinstance(v, float) for v in value): attr.floats.extend(value) attr.type = AttributeProto.FLOATS elif all(isinstance(v, numbers.Integral) for v in value): # Turn np.int32/64 into Python built-in int. attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS elif all(byte_array): attr.strings.extend(cast(List[bytes], byte_array)) attr.type = AttributeProto.STRINGS elif all(isinstance(v, TensorProto) for v in value): attr.tensors.extend(value) attr.type = AttributeProto.TENSORS elif all(isinstance(v, GraphProto) for v in value): attr.graphs.extend(value) attr.type = AttributeProto.GRAPHS else: raise ValueError( "You passed in an iterable attribute but I cannot figure out " "its applicable type.") else: raise ValueError( 'Value "{}" is not valid attribute data type.'.format(value)) return attr
def make_attribute( key, # type: Text value, # type: Any dtype=None, # type: [np.float32, np.float64] domain='', # type: Text doc_string=None # type: Optional[Text] ): # type: (...) -> AttributeProto """Makes an AttributeProto based on the value type.""" def getshape(obj): if hasattr(obj, 'shape'): return obj.shape else: return (len(obj), ) attr = AttributeProto() attr.name = key if doc_string: attr.doc_string = doc_string is_iterable = isinstance(value, collections.abc.Iterable) bytes_or_false = _to_bytes_or_false(value) use_float64 = dtype == np.float64 and domain not in ('', 'ai.onnx.ml') if isinstance(value, np.float32): attr.f = value attr.type = AttributeProto.FLOAT elif isinstance(value, (float, np.float64)): if use_float64: attr.type = AttributeProto.TENSOR attr.t.CopyFrom( make_tensor(key, TensorProto.DOUBLE, (len(value), ), [value])) else: attr.f = value attr.type = AttributeProto.FLOAT elif isinstance(value, np.int32): attr.i = value attr.type = AttributeProto.INT elif isinstance(value, np.int64): attr.i = value attr.type = AttributeProto.INT elif isinstance(value, numbers.Integral): attr.i = value attr.type = AttributeProto.INT # string elif bytes_or_false is not False: assert isinstance(bytes_or_false, bytes) attr.s = bytes_or_false attr.type = AttributeProto.STRING elif isinstance(value, TensorProto): attr.t.CopyFrom(value) attr.type = AttributeProto.TENSOR elif (SparseTensorProto is not None and isinstance(value, SparseTensorProto)): attr.sparse_tensor.CopyFrom(value) attr.type = AttributeProto.SPARSE_TENSOR elif isinstance(value, GraphProto): attr.g.CopyFrom(value) attr.type = AttributeProto.GRAPH # third, iterable cases elif is_iterable: byte_array = [_to_bytes_or_false(v) for v in value] if all(isinstance(v, np.float32) for v in value): attr.floats.extend(value) attr.type = AttributeProto.FLOATS # return make_attribute( # key, doc_string=doc_string, # value=make_tensor( # key, TensorProto.FLOAT, # getshape(value), value)) elif all(isinstance(v, np.float64) for v in value): attr.floats.extend(value) attr.type = AttributeProto.FLOATS # return make_attribute( # key, doc_string=doc_string, # value=make_tensor( # key, TensorProto.DOUBLE, # getshape(value), value)) elif all(isinstance(v, float) for v in value): attr.floats.extend(value) attr.type = AttributeProto.FLOATS elif all(isinstance(v, np.int32) for v in value): attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS # return make_attribute( # key, doc_string=doc_string, # value=make_tensor( # key, TensorProto.INT32, # getshape(value), value)) elif all(isinstance(v, np.int64) for v in value): attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS # return make_attribute( # key, doc_string=doc_string, # value=make_tensor( # key, TensorProto.INT64, # getshape(value), value)) elif all(isinstance(v, numbers.Integral) for v in value): # Turn np.int32/64 into Python built-in int. attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS elif all( map(lambda bytes_or_false: bytes_or_false is not False, byte_array)): attr.strings.extend(cast(List[bytes], byte_array)) attr.type = AttributeProto.STRINGS elif all(isinstance(v, TensorProto) for v in value): attr.tensors.extend(value) attr.type = AttributeProto.TENSORS elif (SparseTensorProto is not None and all(isinstance(v, SparseTensorProto) for v in value)): attr.sparse_tensors.extend(value) attr.type = AttributeProto.SPARSE_TENSORS elif all(isinstance(v, GraphProto) for v in value): attr.graphs.extend(value) attr.type = AttributeProto.GRAPHS else: raise ValueError( "You passed in an iterable attribute but I cannot figure out " "its applicable type, key='{}', type={}, types={}.".format( key, type(value), [type(_) for _, __ in zip(value, range(0, 5))])) else: raise ValueError( "Value '{}' is not valid attribute data type for attribute " "'{}'.".format(value, key)) return attr
def make_attribute( key, # type: Text value, # type: Any doc_string=None # type: Optional[Text] ): # type: (...) -> AttributeProto """Makes an AttributeProto based on the value type.""" def getshape(obj): if hasattr(obj, 'shape'): return obj.shape else: return (len(obj), ) attr = AttributeProto() attr.name = key if doc_string: attr.doc_string = doc_string is_iterable = isinstance(value, collections.Iterable) bytes_or_false = _to_bytes_or_false(value) if isinstance(value, np.float32): attr.f = value attr.type = AttributeProto.FLOAT elif isinstance(value, np.float64): attr.f = value attr.type = AttributeProto.FLOAT elif isinstance(value, float): attr.f = value attr.type = AttributeProto.FLOAT # raise RuntimeError("float is not allowed anymore # due to ambiguities, " # "use numpy types, key='{}'.".format(key)) elif isinstance(value, np.int32): attr.i = value attr.type = AttributeProto.INT elif isinstance(value, np.int64): attr.i = value attr.type = AttributeProto.INT64 elif isinstance(value, numbers.Integral): attr.i = value attr.type = AttributeProto.INT elif bytes_or_false: assert isinstance(bytes_or_false, bytes) attr.s = bytes_or_false attr.type = AttributeProto.STRING elif isinstance(value, TensorProto): attr.t.CopyFrom(value) attr.type = AttributeProto.TENSOR elif isinstance(value, GraphProto): attr.g.CopyFrom(value) attr.type = AttributeProto.GRAPH # third, iterable cases elif is_iterable: byte_array = [_to_bytes_or_false(v) for v in value] if all(isinstance(v, np.float32) for v in value): attr.floats.extend(value) attr.type = AttributeProto.FLOATS # return make_attribute( # key, doc_string=doc_string, # value=make_tensor( # key, TensorProto.FLOAT, # getshape(value), value)) elif all(isinstance(v, np.float64) for v in value): attr.floats.extend(value) attr.type = AttributeProto.FLOATS # return make_attribute( # key, doc_string=doc_string, # value=make_tensor( # key, TensorProto.DOUBLE, # getshape(value), value)) elif all(isinstance(v, float) for v in value): attr.floats.extend(value) attr.type = AttributeProto.FLOATS elif all(isinstance(v, np.int32) for v in value): attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS # return make_attribute( # key, doc_string=doc_string, # value=make_tensor( # key, TensorProto.INT32, # getshape(value), value)) elif all(isinstance(v, np.int64) for v in value): attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS # return make_attribute( # key, doc_string=doc_string, # value=make_tensor( # key, TensorProto.INT64, # getshape(value), value)) elif all(isinstance(v, numbers.Integral) for v in value): # Turn np.int32/64 into Python built-in int. attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS elif all(byte_array): attr.strings.extend(cast(List[bytes], byte_array)) attr.type = AttributeProto.STRINGS elif all(isinstance(v, TensorProto) for v in value): attr.tensors.extend(value) attr.type = AttributeProto.TENSORS elif all(isinstance(v, GraphProto) for v in value): attr.graphs.extend(value) attr.type = AttributeProto.GRAPHS else: raise ValueError( "You passed in an iterable attribute but I cannot figure out " "its applicable type, key='{}', type={}, types={}.".format( key, type(value), [type(_) for _, __ in zip(value, range(0, 5))])) else: raise ValueError( 'Value "{}" is not valid attribute data type.'.format(value)) return attr
def make_attribute( key, # type: Text value, # type: Any doc_string=None # type: Optional[Text] ): # type: (...) -> AttributeProto """Makes an AttributeProto based on the value type.""" attr = AttributeProto() attr.name = key if doc_string: attr.doc_string = doc_string is_iterable = isinstance(value, collections.abc.Iterable) bytes_or_false = _to_bytes_or_false(value) # First, singular cases # float if isinstance(value, float): attr.f = value attr.type = AttributeProto.FLOAT # integer elif isinstance(value, numbers.Integral): attr.i = cast(int, value) attr.type = AttributeProto.INT # string elif bytes_or_false is not False: assert isinstance(bytes_or_false, bytes) attr.s = bytes_or_false attr.type = AttributeProto.STRING elif isinstance(value, TensorProto): attr.t.CopyFrom(value) attr.type = AttributeProto.TENSOR elif isinstance(value, SparseTensorProto): attr.sparse_tensor.CopyFrom(value) attr.type = AttributeProto.SPARSE_TENSOR elif isinstance(value, GraphProto): attr.g.CopyFrom(value) attr.type = AttributeProto.GRAPH elif isinstance(value, TypeProto): attr.tp.CopyFrom(value) attr.type = AttributeProto.TYPE_PROTO # third, iterable cases elif is_iterable: byte_array = [_to_bytes_or_false(v) for v in value] if all(isinstance(v, numbers.Integral) for v in value): # Turn np.int32/64 into Python built-in int. attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS elif all(isinstance(v, numbers.Real) for v in value): # Since ints and floats are members of Real, this allows a mix of ints and floats # (and converts the ints to floats). attr.floats.extend(float(v) for v in value) attr.type = AttributeProto.FLOATS elif all( map(lambda bytes_or_false: bytes_or_false is not False, byte_array)): attr.strings.extend(cast(List[bytes], byte_array)) attr.type = AttributeProto.STRINGS elif all(isinstance(v, TensorProto) for v in value): attr.tensors.extend(value) attr.type = AttributeProto.TENSORS elif all(isinstance(v, SparseTensorProto) for v in value): attr.sparse_tensors.extend(value) attr.type = AttributeProto.SPARSE_TENSORS elif all(isinstance(v, GraphProto) for v in value): attr.graphs.extend(value) attr.type = AttributeProto.GRAPHS elif all(isinstance(tp, TypeProto) for tp in value): attr.type_protos.extend(value) attr.type = AttributeProto.TYPE_PROTOS else: raise ValueError( "You passed in an iterable attribute but I cannot figure out " "its applicable type.") else: raise TypeError( 'value "{}" is not valid attribute data type.'.format(value)) return attr
def make_attribute( key, # type: Text value, # type: Any dtype=None, # type: [np.float32, np.float64] domain='', # type: Text doc_string=None # type: Optional[Text] ): # type: (...) -> AttributeProto """Makes an AttributeProto based on the value type.""" attr = AttributeProto() attr.name = key if doc_string: attr.doc_string = doc_string try: iter(value) is_iterable = True except TypeError: is_iterable = False bytes_or_false = _to_bytes_or_false(value) use_float64 = dtype == np.float64 and domain not in ('', 'ai.onnx.ml') if isinstance(value, np.float32): attr.f = value attr.type = AttributeProto.FLOAT elif isinstance(value, (float, np.float64)): if use_float64: attr.type = AttributeProto.TENSOR attr.t.CopyFrom( make_tensor( key, TensorProto.DOUBLE, (1, ), [value])) else: attr.f = value attr.type = AttributeProto.FLOAT elif isinstance(value, np.int32): attr.i = value attr.type = AttributeProto.INT elif isinstance(value, np.int64): attr.i = value attr.type = AttributeProto.INT elif isinstance(value, numbers.Integral): attr.i = value attr.type = AttributeProto.INT # string elif bytes_or_false is not False: assert isinstance(bytes_or_false, bytes) attr.s = bytes_or_false attr.type = AttributeProto.STRING elif isinstance(value, TensorProto): attr.t.CopyFrom(value) attr.type = AttributeProto.TENSOR elif (SparseTensorProto is not None and isinstance(value, SparseTensorProto)): attr.sparse_tensor.CopyFrom(value) attr.type = AttributeProto.SPARSE_TENSOR elif isinstance(value, GraphProto): attr.g.CopyFrom(value) attr.type = AttributeProto.GRAPH # third, iterable cases elif is_iterable: byte_array = [_to_bytes_or_false(v) for v in value] if all(isinstance(v, np.float32) for v in value): attr.floats.extend(value) attr.type = AttributeProto.FLOATS elif all(isinstance(v, np.float64) for v in value): if use_float64: attr.type = AttributeProto.TENSOR attr.t.CopyFrom( make_tensor( key, TensorProto.DOUBLE, (len(value), ), value)) else: attr.floats.extend(value) attr.type = AttributeProto.FLOATS elif all(isinstance(v, float) for v in value): if use_float64: attr.type = AttributeProto.TENSOR attr.t.CopyFrom( make_tensor( key, TensorProto.DOUBLE, (len(value), ), value)) else: attr.floats.extend(value) attr.type = AttributeProto.FLOATS elif all(isinstance(v, np.int32) for v in value): attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS elif all(isinstance(v, np.int64) for v in value): attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS elif all(isinstance(v, numbers.Integral) for v in value): # Turn np.int32/64 into Python built-in int. attr.ints.extend(int(v) for v in value) attr.type = AttributeProto.INTS elif all(map(lambda bytes_or_false: bytes_or_false is not False, byte_array)): attr.strings.extend(cast(List[bytes], byte_array)) attr.type = AttributeProto.STRINGS elif all(isinstance(v, TensorProto) for v in value): attr.tensors.extend(value) attr.type = AttributeProto.TENSORS elif (SparseTensorProto is not None and all(isinstance(v, SparseTensorProto) for v in value)): attr.sparse_tensors.extend(value) attr.type = AttributeProto.SPARSE_TENSORS elif all(isinstance(v, GraphProto) for v in value): attr.graphs.extend(value) attr.type = AttributeProto.GRAPHS elif isinstance(value, np.matrix): return make_attribute( key, np.asarray(value).ravel(), dtype=dtype, domain=domain, doc_string=doc_string) else: raise ValueError( "You passed in an iterable attribute but the type cannot " "be figured out, key='{}', type={}, dtype={}, " "types[:5]={} set(types)={}.".format( key, type(value), dtype, [type(_) for _, __ in zip(value, range(0, 5))], set(type(t) for t in value))) else: raise ValueError( "Value '{}' is not valid attribute data type for attribute " "'{}'.".format(value, key)) return attr
def _make_att_graph(name, new_body): attr = AttributeProto() attr.name = name attr.g.CopyFrom(new_body) # pylint: disable=E1101 attr.type = AttributeProto.GRAPH # pylint: disable=E1101 return attr
def _make_att_graph(name, new_body): attr = AttributeProto() attr.name = name attr.g.CopyFrom(new_body) attr.type = AttributeProto.GRAPH return attr