tico 0.1.0.dev250723__py3-none-any.whl → 0.1.0.dev250727__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. tico/__init__.py +9 -1
  2. tico/config/base.py +1 -1
  3. tico/experimental/quantization/__init__.py +5 -0
  4. tico/experimental/quantization/passes/remove_weight_dequant_op.py +1 -1
  5. tico/passes/cast_mixed_type_args.py +1 -1
  6. tico/passes/decompose_addmm.py +0 -3
  7. tico/passes/decompose_fake_quantize.py +0 -2
  8. tico/passes/decompose_group_norm.py +0 -3
  9. tico/passes/legalize_predefined_layout_operators.py +1 -10
  10. tico/passes/lower_to_resize_nearest_neighbor.py +1 -1
  11. tico/passes/remove_redundant_reshape.py +2 -2
  12. tico/serialize/circle_graph.py +8 -19
  13. tico/serialize/circle_mapping.py +21 -2
  14. tico/serialize/circle_serializer.py +5 -2
  15. tico/serialize/operators/op_any.py +7 -13
  16. tico/serialize/operators/op_avg_pool2d.py +13 -3
  17. tico/serialize/operators/op_clamp.py +4 -3
  18. tico/serialize/operators/op_conv2d.py +9 -4
  19. tico/serialize/operators/op_copy.py +26 -3
  20. tico/serialize/operators/op_cumsum.py +2 -0
  21. tico/serialize/operators/op_depthwise_conv2d.py +11 -5
  22. tico/serialize/operators/op_index_select.py +8 -1
  23. tico/serialize/operators/op_instance_norm.py +0 -6
  24. tico/serialize/operators/op_log1p.py +3 -2
  25. tico/serialize/operators/op_max_pool2d_with_indices.py +12 -2
  26. tico/serialize/operators/op_mm.py +1 -0
  27. tico/serialize/operators/op_mul.py +2 -8
  28. tico/serialize/operators/op_pow.py +2 -0
  29. tico/serialize/operators/op_repeat.py +6 -2
  30. tico/serialize/operators/op_reshape.py +1 -1
  31. tico/serialize/operators/op_split_with_sizes.py +16 -8
  32. tico/serialize/operators/op_transpose_conv.py +9 -6
  33. tico/serialize/operators/op_view.py +2 -1
  34. tico/serialize/quant_param.py +5 -5
  35. tico/utils/utils.py +1 -1
  36. {tico-0.1.0.dev250723.dist-info → tico-0.1.0.dev250727.dist-info}/METADATA +1 -1
  37. {tico-0.1.0.dev250723.dist-info → tico-0.1.0.dev250727.dist-info}/RECORD +41 -41
  38. {tico-0.1.0.dev250723.dist-info → tico-0.1.0.dev250727.dist-info}/LICENSE +0 -0
  39. {tico-0.1.0.dev250723.dist-info → tico-0.1.0.dev250727.dist-info}/WHEEL +0 -0
  40. {tico-0.1.0.dev250723.dist-info → tico-0.1.0.dev250727.dist-info}/entry_points.txt +0 -0
  41. {tico-0.1.0.dev250723.dist-info → tico-0.1.0.dev250727.dist-info}/top_level.txt +0 -0
tico/__init__.py CHANGED
@@ -20,8 +20,16 @@ from packaging.version import Version
20
20
  from tico.config import CompileConfigV1, get_default_config
21
21
  from tico.utils.convert import convert, convert_from_exported_program, convert_from_pt2
22
22
 
23
+ __all__ = [
24
+ "CompileConfigV1",
25
+ "get_default_config",
26
+ "convert",
27
+ "convert_from_exported_program",
28
+ "convert_from_pt2",
29
+ ]
30
+
23
31
  # THIS LINE IS AUTOMATICALLY GENERATED BY setup.py
24
- __version__ = "0.1.0.dev250723"
32
+ __version__ = "0.1.0.dev250727"
25
33
 
26
34
  MINIMUM_SUPPORTED_VERSION = "2.5.0"
27
35
  SECURE_TORCH_VERSION = "2.6.0"
tico/config/base.py CHANGED
@@ -31,7 +31,7 @@ class CompileConfigBase:
31
31
  config = cls()
32
32
  for key in config_dict:
33
33
  if key in config.to_dict():
34
- assert type(config.get(key)) == bool
34
+ assert isinstance(config.get(key), bool)
35
35
  config.set(key, config_dict[key])
36
36
 
37
37
  return config
@@ -1 +1,6 @@
1
1
  from tico.experimental.quantization.public_interface import convert, prepare
2
+
3
+ __all__ = [
4
+ "convert",
5
+ "prepare",
6
+ ]
@@ -53,7 +53,7 @@ class ValRange:
53
53
  if isinstance(val, torch.Tensor):
54
54
  self.max = torch.max(val).item()
55
55
  self.min = torch.min(val).item()
56
- elif type(val) == list:
56
+ elif isinstance(val, list):
57
57
  self.max = max(val)
58
58
  self.min = min(val)
59
59
  else:
@@ -124,7 +124,7 @@ class CastMixedTypeArgs(PassBase):
124
124
  if rhs_val.dtype == type_to_promote:
125
125
  ori_type = lhs_val.dtype
126
126
  arg_to_promote = lhs
127
- assert arg_to_promote != None
127
+ assert arg_to_promote is not None
128
128
 
129
129
  if isinstance(arg_to_promote, torch.fx.Node):
130
130
  with graph.inserting_after(arg_to_promote):
@@ -20,7 +20,6 @@ import torch
20
20
  from torch.export import ExportedProgram
21
21
 
22
22
  from tico.serialize.circle_mapping import extract_shape
23
- from tico.utils import logging
24
23
  from tico.utils.graph import add_placeholder, create_node
25
24
  from tico.utils.passes import PassBase, PassResult
26
25
  from tico.utils.trace_decorators import trace_graph_diff_on_pass
@@ -59,8 +58,6 @@ class DecomposeAddmm(PassBase):
59
58
  super().__init__()
60
59
 
61
60
  def call(self, exported_program: ExportedProgram) -> PassResult:
62
- logger = logging.getLogger(__name__)
63
-
64
61
  gm = exported_program.graph_module
65
62
  graph: torch.fx.Graph = gm.graph
66
63
  modified = False
@@ -21,7 +21,6 @@ import torch
21
21
  # To import torch.ops.quantized_decomposed related operator
22
22
  from torch.export import ExportedProgram
23
23
 
24
- from tico.utils import logging
25
24
  from tico.utils.graph import create_node
26
25
  from tico.utils.passes import PassBase, PassResult
27
26
  from tico.utils.trace_decorators import trace_graph_diff_on_pass
@@ -65,7 +64,6 @@ class DecomposeFakeQuantize(PassBase):
65
64
  super().__init__()
66
65
 
67
66
  def call(self, exported_program: ExportedProgram) -> PassResult:
68
- logger = logging.getLogger(__name__)
69
67
  modified = False
70
68
 
71
69
  gm = exported_program.graph_module
@@ -22,7 +22,6 @@ import torch
22
22
  from torch.export import ExportedProgram
23
23
 
24
24
  from tico.serialize.circle_mapping import extract_shape
25
- from tico.utils import logging
26
25
  from tico.utils.graph import create_node
27
26
  from tico.utils.passes import PassBase, PassResult
28
27
  from tico.utils.trace_decorators import trace_graph_diff_on_pass
@@ -126,8 +125,6 @@ class DecomposeGroupNorm(PassBase):
126
125
  )
127
126
 
128
127
  def call(self, exported_program: ExportedProgram) -> PassResult:
129
- logger = logging.getLogger(__name__)
130
-
131
128
  gm = exported_program.graph_module
132
129
  graph: torch.fx.Graph = gm.graph
133
130
  modified = False
@@ -206,7 +206,6 @@ class LegalizePreDefinedLayoutOperators(PassBase):
206
206
 
207
207
  args = ConvTranspose2DArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
208
208
  input = args.input
209
- padding = args.padding
210
209
  groups = args.groups
211
210
  dilation = args.dilation
212
211
 
@@ -288,13 +287,12 @@ class LegalizePreDefinedLayoutOperators(PassBase):
288
287
  input = args.input
289
288
  weight = args.weight
290
289
  bias = args.bias
291
- eps = args.eps
292
290
 
293
291
  running_mean = args.running_mean
294
292
  running_var = args.running_var
295
293
  use_input_stats = args.use_input_stats
296
294
 
297
- if not (use_input_stats == True):
295
+ if not use_input_stats:
298
296
  raise NotYetSupportedError("Only support use_input_stats is True.")
299
297
  if not isinstance(running_mean, NoneType):
300
298
  raise NotYetSupportedError("Only support running_mean=None")
@@ -350,10 +348,6 @@ class LegalizePreDefinedLayoutOperators(PassBase):
350
348
  # max_pool2d_with_indices(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=0, int[2] dilation=1, bool ceil_mode=False) -> (Tensor, Tensor)
351
349
  args = MaxPool2dWithIndicesArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
352
350
  input_ = args.input
353
- kernel_size = args.kernel_size
354
- stride = args.stride
355
- padding = args.padding
356
- dilation = args.dilation
357
351
  ceil_mode = args.ceil_mode
358
352
  if ceil_mode:
359
353
  raise NotYetSupportedError("Only support non-ceil model.")
@@ -402,9 +396,6 @@ class LegalizePreDefinedLayoutOperators(PassBase):
402
396
  # avg_pool2d(Tensor self, int[2] kernel_size, int[2] stride=[], int[2] padding=0, bool ceil_mode=False, bool count_include_pad=True, int? divisor_override=None) -> (Tensor)
403
397
  args = AvgPool2dArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
404
398
  input_ = args.input
405
- kernel_size = args.kernel_size
406
- stride = args.stride
407
- padding = args.padding
408
399
  ceil_mode = args.ceil_mode
409
400
  if ceil_mode:
410
401
  raise NotYetSupportedError("Only support non-ceil model.")
@@ -67,7 +67,7 @@ class LowerToResizeNearestNeighbor(PassBase):
67
67
  return None
68
68
  # indices = [None, None, H index, W index]
69
69
  N, C, H, W = indices
70
- if N != None or C != None:
70
+ if N is not None or C is not None:
71
71
  return None
72
72
  if not isinstance(H, torch.fx.Node):
73
73
  return None
@@ -90,7 +90,7 @@ class RemoveRedundantReshapePattern1(PassBase):
90
90
  if len(permute.users) != 1:
91
91
  continue
92
92
  permute_args = PermuteArgs(*permute.args, **permute.kwargs) # type: ignore[arg-type]
93
- permute_input, permute_dims = permute_args.input, permute_args.dims
93
+ permute_dims = permute_args.dims
94
94
  # (1xAxBxC) - `aten.permute` - (1xAxCxB)
95
95
  if permute_dims != [0, 1, 3, 2]:
96
96
  continue
@@ -172,7 +172,7 @@ class RemoveRedundantReshapePattern2(PassBase):
172
172
  if len(permute.users) != 1:
173
173
  continue
174
174
  permute_args = PermuteArgs(*permute.args, **permute.kwargs) # type: ignore[arg-type]
175
- permute_input, permute_dims = permute_args.input, permute_args.dims
175
+ permute_dims = permute_args.dims
176
176
  # (1xAxBxC) - `aten.permute` - (Bx1xAxC)
177
177
  if permute_dims != [2, 0, 1, 3]:
178
178
  continue
@@ -24,7 +24,7 @@ from torch._subclasses.fake_tensor import FakeTensor
24
24
 
25
25
  from tico.serialize.circle_mapping import (
26
26
  extract_circle_dtype,
27
- extract_shape,
27
+ extract_circle_shape,
28
28
  str_to_circle_dtype,
29
29
  to_circle_dtype,
30
30
  )
@@ -151,15 +151,7 @@ class CircleSubgraph(circle.SubGraph.SubGraphT):
151
151
  self.name_to_node[tensor.name] = node
152
152
  assert node.meta.get("val") is not None
153
153
  tensor.type = extract_circle_dtype(node)
154
- tensor.shape = list(extract_shape(node))
155
-
156
- # Handle dynamic shape
157
- if any(isinstance(s, torch.SymInt) for s in tensor.shape):
158
- tensor.shapeSignature = tensor.shape.copy()
159
- for idx, s in enumerate(tensor.shape):
160
- if isinstance(s, torch.SymInt):
161
- tensor.shape[idx] = 1
162
- tensor.shapeSignature[idx] = -1
154
+ tensor.shape, tensor.shapeSignature = extract_circle_shape(node)
163
155
 
164
156
  if QPARAM_KEY in node.meta:
165
157
  tensor.quantization = to_circle_qparam(node.meta[QPARAM_KEY])
@@ -208,6 +200,7 @@ class CircleSubgraph(circle.SubGraph.SubGraphT):
208
200
  self,
209
201
  prefix: str,
210
202
  shape: List[int],
203
+ shape_signature: Optional[List[int]],
211
204
  dtype: int,
212
205
  qparam: Optional[QuantParam] = None,
213
206
  source_node: Optional[torch.fx.Node] = None,
@@ -230,6 +223,8 @@ class CircleSubgraph(circle.SubGraph.SubGraphT):
230
223
  A name prefix used to generate a unique tensor name.
231
224
  shape : List[int]
232
225
  The shape of the tensor.
226
+ shape_signature : Optional[List[int]]
227
+ The shape signature of the tensor to express Dynamic Shape. Defaults to `None` for Static Shape.
233
228
  dtype : int
234
229
  The Circle-compatible dtype of the tensor. Use `to_circle_dtype()` to convert.
235
230
  qparam : Optional[QuantParam]
@@ -250,14 +245,8 @@ class CircleSubgraph(circle.SubGraph.SubGraphT):
250
245
  if source_node is not None:
251
246
  self.name_to_node[tensor.name] = source_node
252
247
  tensor.shape = shape
253
-
254
- # Handle dynamic shape
255
- if any(isinstance(s, torch.SymInt) for s in tensor.shape):
256
- tensor.shapeSignature = tensor.shape.copy()
257
- for idx, s in enumerate(tensor.shape):
258
- if isinstance(s, torch.SymInt):
259
- tensor.shape[idx] = 1
260
- tensor.shapeSignature[idx] = -1
248
+ if shape_signature is not None:
249
+ tensor.shapeSignature = shape_signature
261
250
 
262
251
  if qparam is not None:
263
252
  tensor.quantization = to_circle_qparam(qparam)
@@ -323,7 +312,7 @@ class CircleSubgraph(circle.SubGraph.SubGraphT):
323
312
  self, node: Union[torch.fx.Node, circle.Tensor.TensorT, ConstData]
324
313
  ) -> int:
325
314
  # return -1 if node is None. This is for generating CircleOutputExclude
326
- if node == None:
315
+ if node is None:
327
316
  return -1
328
317
 
329
318
  if hasattr(node, "name") and node.name in self.name_to_tid:
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Tuple, TYPE_CHECKING, Union
15
+ from typing import List, Optional, Tuple, TYPE_CHECKING, Union
16
16
 
17
17
  if TYPE_CHECKING:
18
18
  import torch.fx
@@ -128,6 +128,24 @@ def extract_shape(node: torch.fx.Node) -> torch.Size:
128
128
  return val_shape
129
129
 
130
130
 
131
+ def extract_circle_shape(node: torch.fx.Node) -> Tuple[List[int], Optional[List[int]]]:
132
+ return to_circle_shape(extract_shape(node))
133
+
134
+
135
+ def to_circle_shape(torch_shape: torch.Size) -> Tuple[List[int], Optional[List[int]]]:
136
+ shape: List[int] = list(torch_shape)
137
+ shapeSignature: Optional[List[int]] = None
138
+
139
+ if any(isinstance(s, torch.SymInt) for s in shape):
140
+ shapeSignature = shape.copy()
141
+ for idx, s in enumerate(shape):
142
+ if isinstance(s, torch.SymInt):
143
+ shape[idx] = 1
144
+ shapeSignature[idx] = -1
145
+
146
+ return shape, shapeSignature
147
+
148
+
131
149
  # Return stride of node
132
150
  def extract_stride(node: torch.fx.Node) -> Tuple[int, ...]:
133
151
  assert node.meta is not None
@@ -157,7 +175,8 @@ def check_if_i32_range(axis: Union[list, int]):
157
175
  return all(INT32_MIN <= val <= INT32_MAX for val in values)
158
176
 
159
177
 
160
- def circle_legalize_dtype_to(values, *, dtype: torch.dtype):
178
+ # TODO: Revisit this dtype legalization function as it breaks SRP
179
+ def circle_legalize_dtype_to(values, *, dtype: torch.dtype) -> torch.Tensor:
161
180
  """
162
181
  Legalize data types from `torch.int64` to `torch.int32`.
163
182
 
@@ -20,7 +20,7 @@ import torch
20
20
  from circle_schema import circle
21
21
  from torch.export.exported_program import ConstantArgument, ExportedProgram, InputKind
22
22
 
23
- from tico.serialize.circle_mapping import to_circle_dtype
23
+ from tico.serialize.circle_mapping import to_circle_dtype, to_circle_shape
24
24
  from tico.serialize.operators import *
25
25
  from tico.serialize.circle_graph import CircleModel, CircleSubgraph
26
26
  from tico.serialize.operators.hashable_opcode import OpCode
@@ -322,9 +322,12 @@ def _handle_get_attr_node(
322
322
  if not isinstance(attr_tensor, torch.Tensor):
323
323
  raise ValueError(f"Attribute {node.target} is not a tensor")
324
324
 
325
+ attr_shape, attr_shape_signature = to_circle_shape(attr_tensor.shape)
326
+
325
327
  graph.add_tensor_from_scratch(
326
328
  prefix=node.name,
327
- shape=list(attr_tensor.shape),
329
+ shape=attr_shape,
330
+ shape_signature=attr_shape_signature,
328
331
  dtype=to_circle_dtype(attr_tensor.dtype),
329
332
  source_node=node,
330
333
  )
@@ -22,6 +22,7 @@ from circle_schema import circle
22
22
  from tico.serialize.circle_graph import CircleSubgraph
23
23
  from tico.serialize.circle_mapping import (
24
24
  circle_legalize_dtype_to,
25
+ extract_circle_shape,
25
26
  extract_shape,
26
27
  extract_torch_dtype,
27
28
  )
@@ -99,19 +100,10 @@ class AnyVisitor(NodeVisitor):
99
100
  keepdim = args.keepdim
100
101
 
101
102
  input_shape = list(extract_shape(input))
102
- output_shape = list(extract_shape(node))
103
-
104
- dim_i32 = None
105
103
  if dim is None:
106
- dims = tuple(i for i in range(0, len(input_shape)))
107
- dim_i32 = tuple(
108
- circle_legalize_dtype_to(dim, dtype=torch.int32) for dim in dims
109
- )
110
- if isinstance(dim, int):
111
- dim_i32 = circle_legalize_dtype_to(dim, dtype=torch.int32)
112
- if isinstance(dim, tuple):
113
- dim_i32 = tuple(circle_legalize_dtype_to(d, dtype=torch.int32) for d in dim)
114
- assert dim_i32 is not None
104
+ dim = tuple(i for i in range(0, len(input_shape)))
105
+
106
+ dim_i32 = circle_legalize_dtype_to(dim, dtype=torch.int32)
115
107
 
116
108
  inputs = [
117
109
  input,
@@ -125,9 +117,11 @@ class AnyVisitor(NodeVisitor):
125
117
  if dtype_torch in [torch.int32, torch.int64, torch.float32, torch.float64]:
126
118
  dst_dtype_circle = circle.TensorType.TensorType.BOOL
127
119
  dst_dtype_torch = torch.bool
120
+ dst_shape, dst_shape_signature = extract_circle_shape(input)
128
121
  ne_tensor: circle.Tensor.TensorT = self.graph.add_tensor_from_scratch(
129
122
  prefix=f"{input.name}_ne",
130
- shape=input_shape,
123
+ shape=dst_shape,
124
+ shape_signature=dst_shape_signature,
131
125
  dtype=dst_dtype_circle,
132
126
  source_node=input,
133
127
  )
@@ -22,7 +22,7 @@ import torch
22
22
  from circle_schema import circle
23
23
 
24
24
  from tico.serialize.circle_graph import CircleSubgraph
25
- from tico.serialize.circle_mapping import extract_circle_dtype, extract_shape
25
+ from tico.serialize.circle_mapping import extract_circle_dtype, extract_circle_shape
26
26
  from tico.serialize.operators.hashable_opcode import OpCode
27
27
  from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
28
28
  from tico.serialize.operators.utils import create_builtin_operator, get_op_index
@@ -57,7 +57,12 @@ class AvgPool2DVisitor(NodeVisitor):
57
57
  return True
58
58
 
59
59
  def has_same_padding(self, args: AvgPool2dArgs) -> bool:
60
- input_shape = list(extract_shape(args.input))
60
+ input_shape, input_shape_signature = extract_circle_shape(args.input)
61
+
62
+ if input_shape_signature is not None:
63
+ # TODO: support dynamic shapes
64
+ raise NotImplementedError("Dynamic shape is not supported yet")
65
+
61
66
  kernel_size = args.kernel_size
62
67
  stride = args.stride
63
68
  assert stride
@@ -137,7 +142,11 @@ class AvgPool2DVisitor(NodeVisitor):
137
142
  ],
138
143
  dtype=torch.int32,
139
144
  )
140
- input_shape = list(extract_shape(input))
145
+ input_shape, input_shape_signature = extract_circle_shape(input)
146
+
147
+ if input_shape_signature is not None:
148
+ raise RuntimeError("Dynamic shape is not supported yet.")
149
+
141
150
  input_dtype: int = extract_circle_dtype(input)
142
151
  padded_input_shape = [
143
152
  input_shape[0],
@@ -151,6 +160,7 @@ class AvgPool2DVisitor(NodeVisitor):
151
160
  padded_input_tensor = self.graph.add_tensor_from_scratch(
152
161
  prefix=f"{input.name}_pad_output",
153
162
  shape=padded_input_shape,
163
+ shape_signature=None,
154
164
  dtype=input_dtype,
155
165
  source_node=node,
156
166
  )
@@ -23,7 +23,7 @@ from circle_schema import circle
23
23
  from tico.passes import ops
24
24
  from tico.serialize.circle_graph import CircleSubgraph
25
25
 
26
- from tico.serialize.circle_mapping import extract_circle_dtype, extract_shape
26
+ from tico.serialize.circle_mapping import extract_circle_dtype, extract_circle_shape
27
27
  from tico.serialize.operators.hashable_opcode import OpCode
28
28
  from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
29
29
  from tico.serialize.operators.utils import create_builtin_operator, get_op_index
@@ -101,12 +101,13 @@ class ClampVisitor(NodeVisitor):
101
101
  return self.define_minimum_node([input, max_val], [node])
102
102
 
103
103
  elif min_val is not None and max_val is not None:
104
- input_shape = extract_shape(input)
104
+ input_shape, input_shape_signature = extract_circle_shape(input)
105
105
  input_dtype = extract_circle_dtype(input)
106
106
  minimum_tensor = self.graph.add_tensor_from_scratch(
107
107
  prefix=f"{input.name}_min",
108
108
  dtype=input_dtype,
109
- shape=list(input_shape),
109
+ shape=input_shape,
110
+ shape_signature=input_shape_signature,
110
111
  source_node=node,
111
112
  )
112
113
  minimum_opertor = self.define_minimum_node(
@@ -20,7 +20,7 @@ if TYPE_CHECKING:
20
20
  import torch
21
21
  from circle_schema import circle
22
22
 
23
- from tico.serialize.circle_mapping import extract_circle_dtype, extract_shape
23
+ from tico.serialize.circle_mapping import extract_circle_dtype, extract_circle_shape
24
24
  from tico.serialize.operators.hashable_opcode import OpCode
25
25
  from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
26
26
  from tico.serialize.operators.utils import create_builtin_operator, get_op_index
@@ -111,13 +111,17 @@ class Conv2dVisitor(NodeVisitor):
111
111
 
112
112
  assert groups == 1, "Only support group 1 conv2d"
113
113
 
114
- input_shape = list(extract_shape(input_))
115
- output_shape = list(extract_shape(node))
116
- weight_shape = list(extract_shape(weight))
114
+ input_shape, input_shape_signature = extract_circle_shape(input_)
115
+ output_shape, _ = extract_circle_shape(node)
116
+ weight_shape, _ = extract_circle_shape(weight)
117
117
  assert len(input_shape) == 4, len(input_shape)
118
118
  assert len(output_shape) == 4, len(output_shape)
119
119
  assert len(weight_shape) == 4, len(weight_shape)
120
120
 
121
+ if input_shape_signature is not None:
122
+ # TODO: support dynamic shapes
123
+ raise NotImplementedError("Dynamic shape is not supported yet")
124
+
121
125
  pad_decision = identify_padding(padding, input_shape, output_shape, stride)
122
126
 
123
127
  conv_input: torch.fx.Node | circle.Tensor.TensorT = input_
@@ -143,6 +147,7 @@ class Conv2dVisitor(NodeVisitor):
143
147
  pad_output = self.graph.add_tensor_from_scratch(
144
148
  prefix=f"{node.name}_input_pad_output",
145
149
  shape=pad_output_shape,
150
+ shape_signature=None,
146
151
  dtype=extract_circle_dtype(input_),
147
152
  qparam=input_qparam,
148
153
  source_node=node,
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Dict, List, TYPE_CHECKING, Union
15
+ from typing import Dict, List, Optional, TYPE_CHECKING, Union
16
16
 
17
17
  if TYPE_CHECKING:
18
18
  import torch._ops
@@ -52,7 +52,15 @@ class CopyVisitor(NodeVisitor):
52
52
  def __init__(self, op_codes: Dict[OpCode, int], graph: CircleSubgraph):
53
53
  super().__init__(op_codes, graph)
54
54
 
55
- def check_to_do_broadcast(self, dst: List[int], src: List[int]) -> bool:
55
+ def check_to_do_broadcast(
56
+ self,
57
+ dst: List[int],
58
+ dst_sig: Optional[List[int]],
59
+ src: List[int],
60
+ src_sig: Optional[List[int]],
61
+ ) -> bool:
62
+ assert dst_sig is None
63
+ assert src_sig is None
56
64
  return dst != src
57
65
 
58
66
  def define_broadcast_to_node(
@@ -102,6 +110,12 @@ class CopyVisitor(NodeVisitor):
102
110
  # To connect 'dst' to Reshape node in the graph, 'dst' must be converted to Shape op.
103
111
  dst_tensor: circle.Tensor.TensorT = self.graph.get_tensor(dst)
104
112
  dst_shape: List[int] = dst_tensor.shape
113
+ dst_shape_signature: List[int] = dst_tensor.shapeSignature
114
+
115
+ if dst_shape_signature is not None:
116
+ # TODO: support dynamic shape
117
+ raise NotYetSupportedError("Dynamic shape is not supported yet.")
118
+
105
119
  dst_shape_tensor = torch.as_tensor(dst_shape, dtype=torch.int32)
106
120
 
107
121
  dst_shape_shape = [len(dst_shape)]
@@ -110,6 +124,7 @@ class CopyVisitor(NodeVisitor):
110
124
  shape_output = self.graph.add_tensor_from_scratch(
111
125
  prefix=f"{dst_name}_shape_output",
112
126
  shape=dst_shape_shape,
127
+ shape_signature=None,
113
128
  dtype=circle.TensorType.TensorType.INT32,
114
129
  source_node=node,
115
130
  )
@@ -119,9 +134,16 @@ class CopyVisitor(NodeVisitor):
119
134
 
120
135
  src_tensor: circle.Tensor.TensorT = self.graph.get_tensor(src)
121
136
  src_shape: List[int] = src_tensor.shape
137
+ src_shape_signature: List[int] = src_tensor.shapeSignature
138
+
139
+ if src_shape_signature is not None:
140
+ # TODO: support dynamic shape
141
+ raise NotYetSupportedError("Dynamic shape is not supported yet.")
122
142
 
123
143
  # The src tensor must be broadcastable with the dst tensor.
124
- do_broadcast = self.check_to_do_broadcast(dst_shape, src_shape)
144
+ do_broadcast = self.check_to_do_broadcast(
145
+ dst_shape, dst_shape_signature, src_shape, src_shape_signature
146
+ )
125
147
  if do_broadcast:
126
148
  # create braodcastTo output tensor
127
149
  src_name: str = src.name
@@ -131,6 +153,7 @@ class CopyVisitor(NodeVisitor):
131
153
  self.graph.add_tensor_from_scratch(
132
154
  prefix=f"{src_name}_broadcast_to_output",
133
155
  shape=dst_shape,
156
+ shape_signature=dst_shape_signature,
134
157
  dtype=src_type,
135
158
  source_node=node,
136
159
  )
@@ -57,6 +57,7 @@ class CumsumVisitor(NodeVisitor):
57
57
  if input_dtype == torch.int32:
58
58
  input_tensor: circle.Tensor.TensorT = self.graph.get_tensor(input)
59
59
  input_shape: List[int] = input_tensor.shape
60
+ input_shape_signature: List[int] = input_tensor.shapeSignature
60
61
  cast_op_index = get_op_index(
61
62
  circle.BuiltinOperator.BuiltinOperator.CAST, self._op_codes
62
63
  )
@@ -66,6 +67,7 @@ class CumsumVisitor(NodeVisitor):
66
67
  prefix=cast_name,
67
68
  dtype=cast_dtype,
68
69
  shape=input_shape,
70
+ shape_signature=input_shape_signature,
69
71
  source_node=node,
70
72
  )
71
73
  cast_operator = create_builtin_operator(
@@ -20,7 +20,7 @@ if TYPE_CHECKING:
20
20
  import torch
21
21
  from circle_schema import circle
22
22
 
23
- from tico.serialize.circle_mapping import extract_circle_dtype, extract_shape
23
+ from tico.serialize.circle_mapping import extract_circle_dtype, extract_circle_shape
24
24
  from tico.serialize.operators.hashable_opcode import OpCode
25
25
  from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
26
26
  from tico.serialize.operators.utils import create_builtin_operator, get_op_index
@@ -115,12 +115,17 @@ class DepthwiseConv2dVisitor(NodeVisitor):
115
115
  dilation = args.dilation
116
116
  groups = args.groups
117
117
 
118
- input_shape = list(extract_shape(input_)) # OHWI
119
- output_shape = list(extract_shape(node)) # OHWI
120
- weight_shape = list(extract_shape(weight)) # 1HWO
118
+ input_shape, input_shape_signature = extract_circle_shape(input_) # OHWI
119
+ output_shape, _ = extract_circle_shape(node) # OHWI
120
+ weight_shape, _ = extract_circle_shape(weight) # 1HWO
121
121
  assert len(input_shape) == 4, len(input_shape)
122
122
  assert len(output_shape) == 4, len(output_shape)
123
- assert len(weight_shape) == 4
123
+ assert len(weight_shape) == 4, len(weight_shape)
124
+
125
+ if input_shape_signature is not None:
126
+ # TODO: support dynamic shapes
127
+ raise NotImplementedError("Dynamic shape is not supported yet")
128
+
124
129
  assert weight_shape[0] == 1
125
130
  assert weight_shape[3] == output_shape[3]
126
131
  assert input_shape[3] == groups
@@ -156,6 +161,7 @@ class DepthwiseConv2dVisitor(NodeVisitor):
156
161
  pad_output = self.graph.add_tensor_from_scratch(
157
162
  prefix=f"{node.name}_input_pad_output",
158
163
  shape=pad_output_shape,
164
+ shape_signature=None,
159
165
  dtype=extract_circle_dtype(input_),
160
166
  qparam=input_qparam,
161
167
  source_node=node,
@@ -49,7 +49,14 @@ class IndexSelectVisitor(NodeVisitor):
49
49
  self._op_codes,
50
50
  )
51
51
 
52
+ # TODO: Revise this to be simple
52
53
  dim_i32 = circle_legalize_dtype_to(dim, dtype=torch.int32)
54
+ assert (
55
+ dim_i32.dim() == 0 or len(dim_i32) == 1
56
+ ), f"dim should be scalar: {dim_i32}"
57
+ dim_i32_item = dim_i32.item()
58
+ assert isinstance(dim_i32_item, int)
59
+
53
60
  inputs = [input, index]
54
61
  outputs = [node]
55
62
 
@@ -57,7 +64,7 @@ class IndexSelectVisitor(NodeVisitor):
57
64
 
58
65
  operator.builtinOptionsType = circle.BuiltinOptions.BuiltinOptions.GatherOptions
59
66
  option = circle.GatherOptions.GatherOptionsT()
60
- option.axis = dim_i32
67
+ option.axis = dim_i32_item
61
68
 
62
69
  operator.builtinOptions = option
63
70
 
@@ -73,12 +73,6 @@ class InstanceNormVisitor(NodeVisitor):
73
73
  eps = args.eps
74
74
 
75
75
  # Ignore training-related args
76
- running_mean = args.running_mean
77
- running_var = args.running_var
78
- use_input_stats = args.use_input_stats
79
- momentum = args.momentum
80
- cudnn_enabled = args.cudnn_enabled
81
-
82
76
  input_shape = list(extract_shape(input))
83
77
  assert len(input_shape) == 4, len(input_shape)
84
78
 
@@ -23,7 +23,7 @@ from circle_schema import circle
23
23
  from tico.serialize.circle_graph import CircleSubgraph
24
24
  from tico.serialize.circle_mapping import (
25
25
  extract_circle_dtype,
26
- extract_shape,
26
+ extract_circle_shape,
27
27
  extract_torch_dtype,
28
28
  )
29
29
  from tico.serialize.operators.hashable_opcode import OpCode
@@ -62,11 +62,12 @@ class Log1pVisitor(NodeVisitor):
62
62
  args = Log1pArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
63
63
  input = args.input
64
64
 
65
- input_shape = list(extract_shape(input))
65
+ input_shape, input_shape_signature = extract_circle_shape(input)
66
66
  dst_dtype_circle = extract_circle_dtype(input)
67
67
  add_tensor: circle.Tensor.TensorT = self.graph.add_tensor_from_scratch(
68
68
  prefix=f"{input.name}_add",
69
69
  shape=input_shape,
70
+ shape_signature=input_shape_signature,
70
71
  dtype=dst_dtype_circle,
71
72
  source_node=node,
72
73
  )
@@ -22,7 +22,11 @@ import torch
22
22
  from circle_schema import circle
23
23
 
24
24
  from tico.serialize.circle_graph import CircleSubgraph
25
- from tico.serialize.circle_mapping import extract_circle_dtype, extract_shape
25
+ from tico.serialize.circle_mapping import (
26
+ extract_circle_dtype,
27
+ extract_circle_shape,
28
+ extract_shape,
29
+ )
26
30
  from tico.serialize.operators.hashable_opcode import OpCode
27
31
  from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
28
32
  from tico.serialize.operators.utils import (
@@ -88,7 +92,12 @@ class MaxPool2DWithIndicesVisitor(NodeVisitor):
88
92
  ],
89
93
  dtype=torch.int32,
90
94
  )
91
- input_shape = list(extract_shape(input))
95
+ input_shape, input_shape_signature = extract_circle_shape(input)
96
+
97
+ if input_shape_signature is not None:
98
+ # TODO: support dynamic shape
99
+ raise NotImplementedError("Padding with dynamic shape is not supported")
100
+
92
101
  input_dtype: int = extract_circle_dtype(input)
93
102
  padded_input_shape = [
94
103
  input_shape[0],
@@ -105,6 +114,7 @@ class MaxPool2DWithIndicesVisitor(NodeVisitor):
105
114
  padded_input_tensor = self.graph.add_tensor_from_scratch(
106
115
  prefix=f"{input.name}_pad_output",
107
116
  shape=padded_input_shape,
117
+ shape_signature=None,
108
118
  dtype=input_dtype,
109
119
  qparam=input_qparam,
110
120
  source_node=node,
@@ -129,6 +129,7 @@ class MatmulDefaultVisitor(NodeVisitor):
129
129
  trs_output = self.graph.add_tensor_from_scratch(
130
130
  prefix=f"{rhs_name}_transposed_output",
131
131
  shape=rhs_shape_transpose,
132
+ shape_signature=None,
132
133
  dtype=rhs_type,
133
134
  source_node=node,
134
135
  )
@@ -66,10 +66,7 @@ class MulTensorVisitor(BaseMulVisitor):
66
66
  self,
67
67
  node: torch.fx.Node,
68
68
  ) -> circle.Operator.OperatorT:
69
- args = MulTensorArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
70
- input = args.input
71
- other = args.other
72
-
69
+ _ = MulTensorArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
73
70
  operator = super().define_node(
74
71
  node,
75
72
  )
@@ -88,10 +85,7 @@ class MulScalarVisitor(BaseMulVisitor):
88
85
  self,
89
86
  node: torch.fx.Node,
90
87
  ) -> circle.Operator.OperatorT:
91
- args = MulScalarArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
92
- input = args.input
93
- other = args.other
94
-
88
+ _ = MulScalarArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
95
89
  operator = super().define_node(
96
90
  node,
97
91
  )
@@ -36,6 +36,7 @@ class BasePowVisitor(NodeVisitor):
36
36
  assert isinstance(node, torch.fx.Node), type(node)
37
37
  node_tensor: circle.Tensor.TensorT = self.graph.get_tensor(node)
38
38
  node_shape: List[int] = node_tensor.shape
39
+ node_shape_signature: List[int] = node_tensor.shapeSignature
39
40
  op_index = get_op_index(
40
41
  circle.BuiltinOperator.BuiltinOperator.CAST, self._op_codes
41
42
  )
@@ -45,6 +46,7 @@ class BasePowVisitor(NodeVisitor):
45
46
  prefix=cast_name,
46
47
  dtype=cast_dtype,
47
48
  shape=node_shape,
49
+ shape_signature=node_shape_signature,
48
50
  source_node=node,
49
51
  )
50
52
  cast_operator = create_builtin_operator(
@@ -21,7 +21,7 @@ import torch
21
21
  from circle_schema import circle
22
22
 
23
23
  from tico.serialize.circle_graph import CircleSubgraph
24
- from tico.serialize.circle_mapping import extract_circle_dtype, extract_shape
24
+ from tico.serialize.circle_mapping import extract_circle_dtype, extract_circle_shape
25
25
  from tico.serialize.operators.hashable_opcode import OpCode
26
26
  from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
27
27
  from tico.serialize.operators.utils import create_builtin_operator, get_op_index
@@ -51,7 +51,10 @@ class RepeatVisitor(NodeVisitor):
51
51
  elif r < 0:
52
52
  raise InvalidArgumentError("Only support positive repeat value")
53
53
 
54
- tensor_shape = extract_shape(input)
54
+ tensor_shape, tensor_shape_signature = extract_circle_shape(input)
55
+ if tensor_shape_signature is not None:
56
+ # TODO: support dynamic shape
57
+ raise NotYetSupportedError("Repeat does not support dynamic shape yet.")
55
58
  assert len(tensor_shape) <= len(repeats)
56
59
  if len(tensor_shape) != len(repeats):
57
60
  # TODO Support len(tensor_shape) < len(repeats)
@@ -75,6 +78,7 @@ class RepeatVisitor(NodeVisitor):
75
78
  concat_output = self.graph.add_tensor_from_scratch(
76
79
  prefix=f"{node.name}_concat_{idx}",
77
80
  shape=repeated_shape,
81
+ shape_signature=None, # TODO: support dynamic shape
78
82
  dtype=tensor_dtype,
79
83
  source_node=node,
80
84
  )
@@ -66,7 +66,7 @@ class ReshapeVisitor(NodeVisitor):
66
66
  circle.BuiltinOptions.BuiltinOptions.ReshapeOptions
67
67
  )
68
68
  option = circle.ReshapeOptions.ReshapeOptionsT()
69
- option.newShape = size_i32
69
+ option.newShape = size_i32.tolist()
70
70
 
71
71
  operator.builtinOptions = option
72
72
 
@@ -58,12 +58,14 @@ class SplitWithSizesVisitor(NodeVisitor):
58
58
  inputs = [input, split_sizes_i32, axis_i32]
59
59
 
60
60
  """
61
- `split_with_sizes` has multiple output tensors and they are represented as `getitem`.
62
- Therefore, unlike other ops, node itself doesn't become a circle tensor. Instead, each `getitem` will be
61
+ `split_with_sizes` has multiple output tensors along with `getitem`.
62
+ Unlike other ops, node itself doesn't become a circle tensor. Instead, each `getitem` will be
63
63
  a circle tensor.
64
- Further, torch module having `split_with_sizes` may somtimes return selected outputs. At that time, `getitem`
65
- nodes are generated only for the ouptut selected. Since one-compiler assumes that `CircleSplitV` always has
66
- all the outputs, let's add unused output tensors to compensate this restriction.
64
+
65
+ torch module having `split_with_sizes` may return selected outputs by using `getitem`.
66
+ However, one-compiler assumes that `CircleSplitV` always have all outputs.
67
+
68
+ So, let's add unused output tensors to compensate this restriction.
67
69
  """
68
70
  outputs: List[Union[circle.Tensor.TensorT, torch.fx.node.Node]] = []
69
71
  sorted_users = sorted(node.users.keys(), key=lambda x: x.args[1]) # type: ignore[arg-type, return-value]
@@ -80,11 +82,17 @@ class SplitWithSizesVisitor(NodeVisitor):
80
82
  fake_tensor = node_val[idx]
81
83
  assert isinstance(fake_tensor, FakeTensor)
82
84
  shape = list(fake_tensor.size())
85
+
86
+ if any(isinstance(s, torch.SymInt) for s in shape):
87
+ # TODO: support dynamic shape
88
+ raise NotImplementedError("Dynamic shape is not supported yet.")
89
+
83
90
  dtype = to_circle_dtype(fake_tensor.dtype)
84
91
  tensor = self.graph.add_tensor_from_scratch(
85
- f"{node.name}_unused_{idx}",
86
- shape,
87
- dtype,
92
+ prefix=f"{node.name}_unused_{idx}",
93
+ shape=shape,
94
+ shape_signature=None, # TODO: support dynamic shape
95
+ dtype=dtype,
88
96
  source_node=node,
89
97
  )
90
98
  outputs.append(tensor)
@@ -23,7 +23,7 @@ from circle_schema import circle
23
23
  from tico.serialize.circle_mapping import (
24
24
  circle_legalize_dtype_to,
25
25
  extract_circle_dtype,
26
- extract_shape,
26
+ extract_circle_shape,
27
27
  )
28
28
  from tico.serialize.operators.hashable_opcode import OpCode
29
29
  from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
@@ -76,19 +76,21 @@ class TransposeConvVisitor(NodeVisitor):
76
76
  bias = args.bias
77
77
  stride = args.stride
78
78
  padding = args.padding
79
- output_padding = args.output_padding
80
79
  groups = args.groups
81
- dilation = args.dilation
82
80
 
83
81
  assert groups == 1, "Only support group 1"
84
82
 
85
- input_shape = list(extract_shape(input_))
86
- output_shape = list(extract_shape(node))
87
- weight_shape = list(extract_shape(weight))
83
+ input_shape, input_shape_signature = extract_circle_shape(input_)
84
+ output_shape, _ = extract_circle_shape(node)
85
+ weight_shape, _ = extract_circle_shape(weight)
88
86
  assert len(input_shape) == 4, len(input_shape)
89
87
  assert len(output_shape) == 4, len(output_shape)
90
88
  assert len(weight_shape) == 4, len(weight_shape)
91
89
 
90
+ if input_shape_signature is not None:
91
+ # TODO: support dynamic shapes
92
+ raise NotImplementedError("Dynamic shape is not supported yet")
93
+
92
94
  pad_decision = identify_padding(padding, input_shape, output_shape, stride)
93
95
 
94
96
  conv_input: torch.fx.Node | circle.Tensor.TensorT = input_
@@ -114,6 +116,7 @@ class TransposeConvVisitor(NodeVisitor):
114
116
  pad_output = self.graph.add_tensor_from_scratch(
115
117
  prefix=f"{node.name}_input_pad_output",
116
118
  shape=pad_output_shape,
119
+ shape_signature=None,
117
120
  dtype=extract_circle_dtype(input_),
118
121
  qparam=input_qparam,
119
122
  source_node=node,
@@ -56,6 +56,7 @@ class ViewVisitor(NodeVisitor):
56
56
  if isinstance(size, int):
57
57
  raise Exception("scalar size conversion is not supported yet.")
58
58
 
59
+ # TODO: support dynamic shape
59
60
  size_i32 = circle_legalize_dtype_to(size, dtype=torch.int32)
60
61
  inputs = [input, size_i32]
61
62
  outputs = [node]
@@ -67,7 +68,7 @@ class ViewVisitor(NodeVisitor):
67
68
  circle.BuiltinOptions.BuiltinOptions.ReshapeOptions
68
69
  )
69
70
  option = circle.ReshapeOptions.ReshapeOptionsT()
70
- option.newShape = size_i32
71
+ option.newShape = size_i32.tolist()
71
72
 
72
73
  operator.builtinOptions = option
73
74
 
@@ -12,6 +12,11 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from dataclasses import dataclass
16
+ from typing import List, Optional
17
+
18
+ import torch
19
+
15
20
  """
16
21
  This is a key for torch.fx.Node's meta dict to save QuantParam
17
22
 
@@ -19,11 +24,6 @@ QuantParam can be retrieved as node.meta[QPARAM_KEY]
19
24
  """
20
25
  QPARAM_KEY = "_quantization_parameters_"
21
26
 
22
- from dataclasses import dataclass
23
- from typing import List, Optional
24
-
25
- import torch
26
-
27
27
 
28
28
  @dataclass
29
29
  class QuantParam:
tico/utils/utils.py CHANGED
@@ -130,7 +130,7 @@ def enforce_type(callable):
130
130
 
131
131
  return True
132
132
 
133
- if typing.get_origin(type_hint) == dict:
133
+ if typing.get_origin(type_hint) is dict:
134
134
  if not isinstance(value, typing.get_origin(type_hint)):
135
135
  return False
136
136
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tico
3
- Version: 0.1.0.dev250723
3
+ Version: 0.1.0.dev250727
4
4
  Summary: Convert exported Torch module to circle
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -1,11 +1,11 @@
1
- tico/__init__.py,sha256=e1nx3N3UdH9Ok1YI1Q0qGVr_5_AqoG4ei8NnoEsxeuk,1743
1
+ tico/__init__.py,sha256=37Am_n1sr3CrCWSfMslOBX7P-iHXyaZ9IjQWSLozypc,1883
2
2
  tico/pt2_to_circle.py,sha256=gu3MD4Iqc0zMZcCZ2IT8oGbyj21CTSbT3Rgd9s2B_9A,2767
3
3
  tico/config/__init__.py,sha256=xZzCXjZ84qE-CsBi-dfaL05bqpQ3stKKfTXhnrJRyVs,142
4
- tico/config/base.py,sha256=anwOiJFkUxUi7Cef573JgQcjk6S-FSi6O_TLjYASW-g,1244
4
+ tico/config/base.py,sha256=q5xMqGxTUZs4mFqt5c7i_y9U00fYgdMGl9nUqIVMlCo,1248
5
5
  tico/config/factory.py,sha256=il0zqB6Lm5NX2LnG-TUhmiP9vVeZ_3TucJMorVZIodY,1324
6
6
  tico/config/v1.py,sha256=O1jzpUBDwoWpLohEpI08pJNwVB-yz3ufPrQm2_XWq4Y,1108
7
7
  tico/experimental/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
8
- tico/experimental/quantization/__init__.py,sha256=aBkUiNH6v6WOPXdFa1TUx8WbF3dVfPGqJNdUFYbkfSo,77
8
+ tico/experimental/quantization/__init__.py,sha256=IaJPZegVJp0P3luutBo907Kp5sOJensE1Mm-XBG_jBs,122
9
9
  tico/experimental/quantization/config.py,sha256=h01WpP8Y-dLj6yg12pMZm3PXJqUnU2sWip5jBRc5x9Q,1604
10
10
  tico/experimental/quantization/public_interface.py,sha256=OKW8UoBMjPwiTacrWgQY9ENCh8ucPnYMSrl2R-w0pJ0,3982
11
11
  tico/experimental/quantization/quantizer.py,sha256=_2pDtWFKDCuKfYF2bptOwIYsa0VFNFM1ZNgi8_OGvHM,2365
@@ -55,24 +55,24 @@ tico/experimental/quantization/passes/insert_quantize_on_dtype_mismatch.py,sha25
55
55
  tico/experimental/quantization/passes/propagate_qparam_backward.py,sha256=TGtyW0Z2qOTgVIasBdGRgbwH31YYd6ek7OvLTmCV614,3118
56
56
  tico/experimental/quantization/passes/propagate_qparam_forward.py,sha256=RhUHGCR2RpBO5KYkQ7Z8U5u7HEwDq2wdKHLKAJCi-5c,5138
57
57
  tico/experimental/quantization/passes/quantize_bias.py,sha256=T7YxJ70N0tSK0FF9VJZA5iP0sHdnnsX9GX4AT4JDFSk,4325
58
- tico/experimental/quantization/passes/remove_weight_dequant_op.py,sha256=Klc_9-94tl0_AuAToKOjsWED_YPk5RB67eum0ddPX7o,6588
58
+ tico/experimental/quantization/passes/remove_weight_dequant_op.py,sha256=gI1MtrHazWpdNfys7f1ngTTWplzluF7SA-uX0HMR5Mc,6592
59
59
  tico/interpreter/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
60
60
  tico/interpreter/infer.py,sha256=1ZFe3DVMR2mlwBosoedqoL0-CGN_01CKLgMgxuw62KA,4861
61
61
  tico/interpreter/interpreter.py,sha256=tGbluCbrehTCqBu8mtGDNzby_ieJ2ry8_RH_eC0CQxk,3828
62
62
  tico/passes/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
63
63
  tico/passes/cast_aten_where_arg_type.py,sha256=QOaet85z23ad3s9c8md5r11q9dEw4-lfJqlpM7aiBic,7228
64
64
  tico/passes/cast_clamp_mixed_type_args.py,sha256=m3_HpXLywWmWERfE5lM5PgvjBod7C4BWu_Q-TkRyO8k,5387
65
- tico/passes/cast_mixed_type_args.py,sha256=gsDJfqxVE2dqQnLjSEsPWWs9FGXT-tIyMzjLhxfktKA,7617
65
+ tico/passes/cast_mixed_type_args.py,sha256=oXC0nDRnx4DJvmkzSVFVGqa4d2ICZvSarkXPgi9vTig,7621
66
66
  tico/passes/const_prop_pass.py,sha256=hDxGgJNiRjsgOArdaoeAOcOOA-nKBvA1W1zcMZQA5yg,11531
67
67
  tico/passes/convert_conv1d_to_conv2d.py,sha256=ktS3h158y9rg1sQiW8BZZbflV_dk_UdjBPQnuiOKyzg,5303
68
68
  tico/passes/convert_layout_op_to_reshape.py,sha256=sCAFjkmVtiKjvDQSAgnjNBHl3_hWXJZElGDXQiTH-7s,2963
69
69
  tico/passes/convert_repeat_to_expand_copy.py,sha256=JbtFTmWyfJS2SSd_higP1IEhQeh7wHdN5dmTbbiFVCs,3237
70
70
  tico/passes/convert_to_relu6.py,sha256=1BJpUwUb6Zli_1y3eyJQo7dg9B1xvZ7sYjMbvEQsFJM,6442
71
- tico/passes/decompose_addmm.py,sha256=0IUZjRS8G-h7LPeYu27gxWyTKi3pKAF1uNU1y-mHLL0,4056
71
+ tico/passes/decompose_addmm.py,sha256=KjnpZjSuA0uvNmKaTN_EMwobcOi3CAB81buORzTDxro,3979
72
72
  tico/passes/decompose_batch_norm.py,sha256=06LAxhSmpTxFZJmUelwB3I_GipNWrLoM7PfM6ZkxOZY,6512
73
- tico/passes/decompose_fake_quantize.py,sha256=dvXZ5LyjrbpgvasmcBgjk2-xJyijefPRoNXBjFmAkRI,5294
73
+ tico/passes/decompose_fake_quantize.py,sha256=736srs8SM8K_mLR0WG10LVMMLRkYkBM9OF0k1GCkAW0,5218
74
74
  tico/passes/decompose_fake_quantize_tensor_qparams.py,sha256=k9MJhMVABFNF6lXgEum1fJyGpdQwVRKxWOYhkMR2M7c,13915
75
- tico/passes/decompose_group_norm.py,sha256=rtjv3PrcFTtZ68uCsmE2LibnWaQU-e8NdKkblL4LqxE,10197
75
+ tico/passes/decompose_group_norm.py,sha256=6BqvYtMTPzeIgp8cPA8OFMwEBvb7odcg04IUgwtp7NQ,10120
76
76
  tico/passes/decompose_grouped_conv2d.py,sha256=n2qv320akL1ju33ucZ6lU1cKEAaj0NI8YZ5CrUnkRLM,8512
77
77
  tico/passes/decompose_slice_scatter.py,sha256=xqMHKhW2595YoAeubKZ4jRhYW4TQ09EXPgLNgODqXG8,5653
78
78
  tico/passes/extract_dtype_kwargs.py,sha256=ObpsaFlrTPYQw2hJ7UsC5CocyAtBkT_bMtzkMUqAyKc,4333
@@ -80,9 +80,9 @@ tico/passes/fill_meta_val.py,sha256=Xbam6Aq90ZfWItZw1dgLIwH_q8RCiU5JodKNqkj-ink,
80
80
  tico/passes/fuse_leading_unsqueeze_reshape.py,sha256=88jwTP35yRyXOk9xdO6YW2OEfdKAws3KFRT16WQz0RI,4291
81
81
  tico/passes/fuse_redundant_reshape_to_mean.py,sha256=GhJS1ZKB6Ns4AhwcW3uUQ6q-0N-AzlD32B2EwusUJHg,3761
82
82
  tico/passes/legalize_causal_mask_value.py,sha256=0nfUKGd7XSe9Hg5TAi4dUi6Nn6-JRTWCwhULR5AEgqs,4079
83
- tico/passes/legalize_predefined_layout_operators.py,sha256=MdpI47_AI6PDqxWHGlJCsjbg_qxJhDzMhTl1fWn8I04,18936
83
+ tico/passes/legalize_predefined_layout_operators.py,sha256=3gILn38jzIMDXtMTWpjdROgwmavDC64w115W171encg,18641
84
84
  tico/passes/lower_pow2_to_mul.py,sha256=nfJXa9ZTZMiLg6ownSyvkM4KF2z9tZW34Q3CCWI_vmQ,2402
85
- tico/passes/lower_to_resize_nearest_neighbor.py,sha256=N6F56Of8Aiv-KIiYLHnh33WX72W60ZVQSBEYWHdYqNQ,9005
85
+ tico/passes/lower_to_resize_nearest_neighbor.py,sha256=gbrvTmWSXDPdJ1XJtWGI5mo-uEiauXEG3ELwbKYVPLI,9013
86
86
  tico/passes/lower_to_slice.py,sha256=OzlFzK3lBYyYwC3WThsWd94Ob4JINIJF8UaLAtnumzU,7262
87
87
  tico/passes/merge_consecutive_cat.py,sha256=ayZNLDA1DFM7Fxxi2Dmk1CujkgUuaVCH1rhQgLrvvOQ,2701
88
88
  tico/passes/ops.py,sha256=cSj3Sk2x2cOE9b8oU5pmSa_rHr-iX2lORzu3N_UHMSQ,2967
@@ -90,37 +90,37 @@ tico/passes/remove_nop.py,sha256=Hf91p_EJAOC6DyWNthash0_UWtEcNc_M7znamQfYQ5Y,268
90
90
  tico/passes/remove_redundant_assert_nodes.py,sha256=IONd3xBy6I8tH6_Y1eN3_eCHH7WTC8soBgjXzOju9cQ,1612
91
91
  tico/passes/remove_redundant_expand.py,sha256=auyqIoQT4HJhiJfuUe6BrEtUhvz221ohnIK5EuszWeg,2112
92
92
  tico/passes/remove_redundant_permute.py,sha256=98UsaZzFZdQzEEAR1pIzRisAf6hgfXLa88aayjalt3E,4292
93
- tico/passes/remove_redundant_reshape.py,sha256=OnhU7FKpudGEaF6ufsMvkzf9hn84FNmNKk37M7FN3Pc,16454
93
+ tico/passes/remove_redundant_reshape.py,sha256=aeep6LDvY58GEuOrWckkEXnJa6wkkbiJ9FrimT9F3-s,16384
94
94
  tico/passes/remove_redundant_slice.py,sha256=Iv7TbB39fktNb4eq0VdyZnwxL_VsKLJ90diMmaf3kZk,2087
95
95
  tico/passes/remove_redundant_to_copy.py,sha256=tKy4XKkO2l33fMxVPQ_iFkUeFvP15kbPvzPPhT_g0c8,3292
96
96
  tico/passes/restore_linear.py,sha256=xGJdNb-1CrkOKS9BnLbcblkZc6P2vVjKIi-7lRcs7Bk,4111
97
97
  tico/passes/segment_index_select.py,sha256=VVCKNLtYRkr9n5lGnlzEuQsQ0WVxEYXGchFrDnB1C40,5189
98
98
  tico/serialize/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
99
- tico/serialize/circle_graph.py,sha256=3t78g5eKzhHKvIBJqQ-CcwbqoV-2QwAdd_8wm4W1yXw,12317
100
- tico/serialize/circle_mapping.py,sha256=C9C3ORACQOdvBdnt5KRzlT8zao_TvzQklIxH794OhP0,5719
101
- tico/serialize/circle_serializer.py,sha256=eb90eTgU6WAZEWPclZIkInJsqAP1KjRSF2QeY5F3c3E,10766
99
+ tico/serialize/circle_graph.py,sha256=GSrrv6UGs2-sH5wJ19M-JLNimC-ZDsPzAO_ZswlHEU4,11945
100
+ tico/serialize/circle_mapping.py,sha256=FEOGme-ewmZyTl_V34ErF7CI-KnDb98xmK_OcOKl4PA,6417
101
+ tico/serialize/circle_serializer.py,sha256=bVKxAex_Nmc4O9RUFWIB_KhAuubVbhhA19CS3x967y8,10891
102
102
  tico/serialize/pack.py,sha256=5HZ9kX3x6C6CyT_FWS6FRmvx_P7Dx21orjUNQxJ2xlo,1297
103
- tico/serialize/quant_param.py,sha256=s97GJyDOZULnqFUWPakHais31G_qqPuO0awPHCkZDvI,1342
103
+ tico/serialize/quant_param.py,sha256=6nbGKdqwMI9Cx9BLXJ9A9JU4qb770S8vTM1vCZRX3Eo,1342
104
104
  tico/serialize/operators/__init__.py,sha256=LIvXsNnN4yUCS2CGNQ5XW8p8oXDTV_WHWuOEAw1t6WY,990
105
105
  tico/serialize/operators/hashable_opcode.py,sha256=sDVKNTgIQw4IBtMEjNH8tzssMPx1x8-U2oagomRjGF0,1368
106
106
  tico/serialize/operators/node_visitor.py,sha256=UYyCwXqSCeRyimThMShstHnt7vKM9tsuzQ_02uEwF9I,2356
107
107
  tico/serialize/operators/op_abs.py,sha256=Y-vy7rcqPT-qD3QS5R8zbApWWTPpjY6xuMMVnbIhYmQ,1827
108
108
  tico/serialize/operators/op_add.py,sha256=otm062DMHVAThWmOtSTZdPyP3P5-2cv5VL_UWBJeLms,2346
109
109
  tico/serialize/operators/op_alias_copy.py,sha256=Xu9OiILbGf8oddh8yTqovvLfgVs8XYV7Cg4n6CesWcg,2175
110
- tico/serialize/operators/op_any.py,sha256=vZ37qzSEAOVPjfakSkgPDym91S9kOMUpLisAqkP-3Po,5211
110
+ tico/serialize/operators/op_any.py,sha256=wrTXFQ1TWl-2ET2NGXAXI1dzfDDJsYtA71pyj2numPE,4968
111
111
  tico/serialize/operators/op_arange_start_step.py,sha256=0T5lWwh3TfsFStmVv0v5qG03KENRDBmMix08RXQ4D-U,2132
112
112
  tico/serialize/operators/op_argmax.py,sha256=ARyGHlmWVmzwCct93V5x1-VyKqhxMOvV8GuM8yQWXdo,2290
113
- tico/serialize/operators/op_avg_pool2d.py,sha256=vc7WCakGXtGFPV1ix5EJmboH23tQ-cSI36ePY3PHKI4,7544
113
+ tico/serialize/operators/op_avg_pool2d.py,sha256=OlxEezOtqdmc76d88Q5zziBBoOaIwtsHyhHMYKXHHog,7930
114
114
  tico/serialize/operators/op_bmm.py,sha256=AELjHC9ISFPIzEEl5Kr1s4GSNLZElwZmVZJWkEyCEoA,2189
115
115
  tico/serialize/operators/op_cat.py,sha256=XDYOh0XAyrM0TlxVm6Sa0OFFGrKk7aSDcGXC-hYX4gs,2204
116
- tico/serialize/operators/op_clamp.py,sha256=6iDFZZTMkEqJ8lpNcEhKUpAIc4h2oPkBCBWnnt4lTDw,4322
116
+ tico/serialize/operators/op_clamp.py,sha256=RRQVrzayDfN3PioCVJqa_yYOtcYwb5HHwkMe4E_YPmE,4408
117
117
  tico/serialize/operators/op_clone.py,sha256=vzDYJ8TS3tc2BAyd_z8nt5VqT1inpymSseMEhd9dva0,2394
118
118
  tico/serialize/operators/op_constant_pad_nd.py,sha256=OpP4AP-d1IFcWZolNa-o9ZxzXJQkMdG9WQ66soX3s-E,2675
119
- tico/serialize/operators/op_conv2d.py,sha256=UfYk5xnA9PqVYyjU9dUCSW0CiCmcEK3LnlnFh0WY4Gg,6599
120
- tico/serialize/operators/op_copy.py,sha256=vaianLQ19-2ZQZ-MdQ07YuOPeFeo_HAx2a0Qfn7I5Kk,6122
119
+ tico/serialize/operators/op_conv2d.py,sha256=I9OgOr1cBGFkx1Q6eyLLvY5DmKdaieMSNmVAuZ8pBa0,6842
120
+ tico/serialize/operators/op_copy.py,sha256=z0GCaRP4dyJdJ1ajQ45BKmBRJlirWUPqYfnrqBtbeUM,6921
121
121
  tico/serialize/operators/op_cos.py,sha256=N12bNyuTQIxRnD0eHRPdFVzRQPMy1NFM4iM8oQ4lYzw,2034
122
- tico/serialize/operators/op_cumsum.py,sha256=3fmOf1mIeCX1uhTBcSJmRGXejzLtO8UwaI1eEQDC6nA,3798
123
- tico/serialize/operators/op_depthwise_conv2d.py,sha256=wH1SFjhWJdJrb8xi2qCiCeSWNxlL8IjEwALGCxTQxbc,7034
122
+ tico/serialize/operators/op_cumsum.py,sha256=Y8eVvtX57uPA4NIwS-Vbfjoiz_rPpc_wmViTQtCoz6s,3928
123
+ tico/serialize/operators/op_depthwise_conv2d.py,sha256=S2naBMWAoUL3nJiV7RVg97bUvuQdB5VldE_r--rX0hA,7297
124
124
  tico/serialize/operators/op_dequantize_per_channel.py,sha256=aPcVxjdgvfSFoLnv9NL-RxO5vZYj8ulqriMP5LHIWs0,3133
125
125
  tico/serialize/operators/op_dequantize_per_tensor.py,sha256=u9aK_Xle9rDN0EHLE0YrCTlXY4Q53Ch9Di4qmx7ynps,2304
126
126
  tico/serialize/operators/op_div.py,sha256=WjeM2Ux7TyGlSNx2aVC783JvcL0xnY6FBYo1Q_kdb5Q,2201
@@ -134,33 +134,33 @@ tico/serialize/operators/op_ge.py,sha256=TrgZ6wbIEYkDGfVFNtDlfM7ZkMMWjvcks5U5Dan
134
134
  tico/serialize/operators/op_gelu.py,sha256=bS8-0rg5_bT__OI3mBDywxGx4xTO2Iqea3h-uC17MpU,2145
135
135
  tico/serialize/operators/op_gt.py,sha256=JAVbtuAUNLYhtJycJJCEkYo9QAvmiK4lTMdw5yHUd10,1886
136
136
  tico/serialize/operators/op_index.py,sha256=iDW2YSeUS_kLiWEaQ_MjrYpxZAFBbm7_GU_2B4SRe6c,3033
137
- tico/serialize/operators/op_index_select.py,sha256=cw7IbvixooikGxzbpUmI9tHS4kjl4lXLtO9D-GO8qLQ,2277
138
- tico/serialize/operators/op_instance_norm.py,sha256=AhcVm71ChB16BlPNwqBh5tMHCqMShOXHPkE8Ag9jBfQ,3144
137
+ tico/serialize/operators/op_index_select.py,sha256=O2MXXWGnCgS8QG3DrWKdYKbl88VBVscmOuoGcgBEf_0,2522
138
+ tico/serialize/operators/op_instance_norm.py,sha256=5QvLefa74BrAPsTNYsi4Y7IB8d1wer4gtWantKo2nlQ,2940
139
139
  tico/serialize/operators/op_leaky_relu.py,sha256=UJPoL7kAIp6nAjyDdda_afdOcMLHme7NE77b2y76exc,2160
140
140
  tico/serialize/operators/op_linear.py,sha256=bw_mn2CiJy8CbpPevOV0PMPh0ZMWKAybLZ9cnIKJSsk,2527
141
141
  tico/serialize/operators/op_log.py,sha256=1TKvH2lttdAHE0P84vcxmOvGBBRUs6D71Jrei7SdZHE,1827
142
- tico/serialize/operators/op_log1p.py,sha256=gG7Fs4UDj_Nnp7U60UtPyz0fLv1lBpJVOGGCMm-42pY,3121
142
+ tico/serialize/operators/op_log1p.py,sha256=c-fSBkaDFZ2Z_4LcZMnEvKCfGZbNOrWBMz6-Hdw98V8,3203
143
143
  tico/serialize/operators/op_logical_and.py,sha256=WhQ8knuq32BO-WhAqkOgpcUStPkjoPmRWuYNsKveF3w,2163
144
144
  tico/serialize/operators/op_logical_not.py,sha256=ugrVcRqR3IvUUaiRVW5cArCYJbzmkcXp88QM846jCww,2129
145
145
  tico/serialize/operators/op_lt.py,sha256=_vA7dWpV9wVBxB7JL9pLQT9BsV91NGQBq_0auAtHK5Y,2080
146
146
  tico/serialize/operators/op_max_dim.py,sha256=nS_TZl5uq4uv1LwgBD9Wddyac4atKqBiIWKIyeXse2s,2519
147
- tico/serialize/operators/op_max_pool2d_with_indices.py,sha256=Vab8KV4w0i70P5XPdqItXEv_hLFjscVngypOltRvBV8,5746
147
+ tico/serialize/operators/op_max_pool2d_with_indices.py,sha256=2Q1upWdChLpq1x7IaoP0eRNgqTt7dH7yqlRjhEKlnjM,6034
148
148
  tico/serialize/operators/op_maximum.py,sha256=JjBr6gWEnuakLuk1_feotTHfIIm3s5YqWmqhUMpSPI0,1873
149
149
  tico/serialize/operators/op_mean.py,sha256=rVQZOxCJkHFY4kQBAS1HVK0HkcqxgkSy6zvEDLX_WYQ,2267
150
150
  tico/serialize/operators/op_minimum.py,sha256=fASjQVcTPCin02umQwFPdq2ss-Ve7S5A33J3QmmQ_wQ,1873
151
- tico/serialize/operators/op_mm.py,sha256=Fgq_HUUKuXOQY_t8lah3SOUqTsGet-KbVttCK4-fjAk,6821
152
- tico/serialize/operators/op_mul.py,sha256=42Guc0MWBGBCZoj9-4LcLtTMtUPwsmDSVmvkR8tqLhM,3165
151
+ tico/serialize/operators/op_mm.py,sha256=XcH15gjbP5aAl9rBKFQsVvN2GE4127zNH6_0v81_ExA,6855
152
+ tico/serialize/operators/op_mul.py,sha256=si_VdYNyFbULb50SnXHOINh0dZQ2PhRB6Fzl54ZBj5Y,3049
153
153
  tico/serialize/operators/op_ne.py,sha256=xa2WJL2tYksxw7fIJic_D9ltLEseyCII8HpR32Oq8Do,1900
154
154
  tico/serialize/operators/op_neg.py,sha256=fkI3ExyD3QF-qtxBcXqQutPNDbNL8g7lZYE7CyD2wLk,2046
155
155
  tico/serialize/operators/op_permute.py,sha256=5DfX3pfZ5FDNmrSqx3-hRwPA7vm36z7BfG-nuyyBTsM,2282
156
- tico/serialize/operators/op_pow.py,sha256=z_4G_J1k_keeVE6ZYKSy-kqkdJ_i4p4kHkO0dJZnz-Y,5434
156
+ tico/serialize/operators/op_pow.py,sha256=G_GpdddmlE3opaCJtcfkV0qAWMau5uBa1sEB46qrNdo,5553
157
157
  tico/serialize/operators/op_prelu.py,sha256=0ZybL5pNvBrRvQGy4M6gELrjiEXEsb2wBDdU8x4D75I,1874
158
158
  tico/serialize/operators/op_quantize_per_tensor.py,sha256=w-vYxSPnN2gtx-pEkkcMGU0ZjiwaS4y1sxy56pKEq3E,3004
159
159
  tico/serialize/operators/op_reciprocal.py,sha256=6b9_bxjg_0EvgAitSv1MgBi4PJSEgm-21s5qtWI1UR4,2394
160
160
  tico/serialize/operators/op_relu.py,sha256=WXCR_chwEUBqjFIQ_4E2avwk-Acy76pmX20rJQCBTQo,1832
161
161
  tico/serialize/operators/op_relu6.py,sha256=ZWqEolfAKjOdUC1ZCg0iuu4dBhkJRxVYR2tUzpbvKQM,1829
162
- tico/serialize/operators/op_repeat.py,sha256=0wTv1Mg7kg0eHz0CT6atyVAli4T4h5rYXq5opY6op20,4235
163
- tico/serialize/operators/op_reshape.py,sha256=0_bJwimiGAHaKkfwfhxUw9Gebt5tnecGaEVoKhEvV0Q,2550
162
+ tico/serialize/operators/op_repeat.py,sha256=q05RQOheLxkWgj63Czrp6tGpjGuB0900FNRKLxXdNJ4,4524
163
+ tico/serialize/operators/op_reshape.py,sha256=6wErQpmDX9mAmfJRCTg_cg1uOdJZqHm8Nux8dNI53Vg,2559
164
164
  tico/serialize/operators/op_resize_nearest_neighbor.py,sha256=dXaAnZ5M_ko_tH-HolxNpHFXkDUQ8x45myskojP5XZE,2771
165
165
  tico/serialize/operators/op_round.py,sha256=pe6w_TB4xGLu0iPv4Qo0a0fIkY9DgCgXk5127TWt8pE,1837
166
166
  tico/serialize/operators/op_rsqrt.py,sha256=yl2vd8InjhLPbE0vHIrEera6DVXlY9dLgO7yZZCH3RI,1837
@@ -170,16 +170,16 @@ tico/serialize/operators/op_sigmoid.py,sha256=ZubbGG1yU5uvNkEmOmbjj3eq7d9mwEaJdC
170
170
  tico/serialize/operators/op_sin.py,sha256=MbttmHTVKhwKK6gH9Vbcbn5aAaxnQ71NdpmQAlTcojU,1827
171
171
  tico/serialize/operators/op_slice.py,sha256=g0r8lj5CIxpT6ixOKqUzwKiNhoiuIFwWjbpaiCoOg6w,5259
172
172
  tico/serialize/operators/op_softmax.py,sha256=qwYke5zfhnSL89DZbzdr5Fc9SsJf0vI-LDZjT_NFpbc,3669
173
- tico/serialize/operators/op_split_with_sizes.py,sha256=TgYg1cu-3BSz9SsXfAhoJbo4q5ZzFaoFArkH_obsYlU,4274
173
+ tico/serialize/operators/op_split_with_sizes.py,sha256=DzSnMEsBoWpmun-NAW-lS-gssVUhaclzJ_nTxL5zZtM,4491
174
174
  tico/serialize/operators/op_sqrt.py,sha256=9Q5jkuEPrim11XfSQHGDGVTMYk1TQhOfVqMVYD_eIrI,1871
175
175
  tico/serialize/operators/op_squeeze.py,sha256=QnNwfAdTC1xBm04C9DkVs8VB5YRN-4fCsIWn189QaPg,2416
176
176
  tico/serialize/operators/op_sub.py,sha256=yZskQJF0ylXVk02Uid8djPNIWDJ-0uHJar4UYhlJVkk,2479
177
177
  tico/serialize/operators/op_sum.py,sha256=B5aSwQMhyoBe2JYdE5nVQ3QeVDSzL-yuZZujsG08OdQ,2294
178
178
  tico/serialize/operators/op_tanh.py,sha256=rs7FsbQeUQ7Ak8RoQV9ymNGXHXRObojfY_SiqJiyqdA,1846
179
179
  tico/serialize/operators/op_to_copy.py,sha256=a8T0uPMavMO_md1a-4_0dlvDHyZS_xew0qB6xjf69rI,3934
180
- tico/serialize/operators/op_transpose_conv.py,sha256=YDObXXaHNOD7yjO1ccaB_NCfc5-L76ClvT3pduL8E90,5631
180
+ tico/serialize/operators/op_transpose_conv.py,sha256=PgM0mSIeiCMk-V2jQ2L1JdF-v3mHwdsdY4nTEp2GRro,5796
181
181
  tico/serialize/operators/op_unsqueeze.py,sha256=ZHhfVXSWEiwb2VDYX5uhxbGQyzZjKT7CrbBpVGxVHBU,2310
182
- tico/serialize/operators/op_view.py,sha256=5EMww-ve17Vm9XPuV03Tn7vJsjpU2J8U4d_FOrlm9_o,2546
182
+ tico/serialize/operators/op_view.py,sha256=xxE-GvTJ1UpcHst5KXYz3qKY-eJQvXKKrSZiA2O7E40,2593
183
183
  tico/serialize/operators/op_where.py,sha256=doE81GSwygrPBm3JIfN9w7kKXxeIYKxgk0eoY22QIcg,2845
184
184
  tico/serialize/operators/utils.py,sha256=lXGpEJW1h8U_-gfc6EWjvvSiq3yJ9P-v1v3EMRT_pSk,2954
185
185
  tico/utils/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
@@ -199,15 +199,15 @@ tico/utils/register_custom_op.py,sha256=3-Yl6iYmx1qQA2igNHt4hYhQhQMkdPb7gF50LIY8
199
199
  tico/utils/serialize.py,sha256=cBtEUfi_SU_9_v0cq2CNikzn8GnzEz2RwRvUH2NkWu4,1378
200
200
  tico/utils/torch_compat.py,sha256=oc6PztVsXdHcQ3iaVR90wLLxrGaj6zFHWZ8K9rRS6q8,1795
201
201
  tico/utils/trace_decorators.py,sha256=ddLIiKQfSaQrxgF1kNpwjFTQnXENzeSfcr1kuAW4jGI,3221
202
- tico/utils/utils.py,sha256=Ln6FgrnWuwvKEL1ntzZXgH1tClcaOfQHt117dQ_mSb8,12976
202
+ tico/utils/utils.py,sha256=A5p3iAAxRGDsZJh4ybp-Qo3MX3vk5RrmSY-R3rXqVeI,12976
203
203
  tico/utils/validate_args_kwargs.py,sha256=CRj_SXMUUn6onsl8XLAt-zPZCFxR4C0XOCoaad_ZD4I,26689
204
204
  tico/utils/mx/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
205
205
  tico/utils/mx/elemwise_ops.py,sha256=V6glyAHsVR1joqpsgnNytatCD_ew92xNWZ19UFDoMTA,10281
206
206
  tico/utils/mx/formats.py,sha256=uzNWyu-1onUlwQfX5cZ6fZSUfHMRqorper7_T1k3jfk,3404
207
207
  tico/utils/mx/mx_ops.py,sha256=RcfUTYVi-wilGB2sC35OeARdwDqnixv7dG5iyZ-fQT8,8555
208
- tico-0.1.0.dev250723.dist-info/LICENSE,sha256=kp4JLII7bzRhPb0CPD5XTDZMh22BQ7h3k3B7t8TiSbw,12644
209
- tico-0.1.0.dev250723.dist-info/METADATA,sha256=MGuH7gedgNwadikvqXLQL_zTHDmzk20cwDohwgRkreg,8430
210
- tico-0.1.0.dev250723.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
211
- tico-0.1.0.dev250723.dist-info/entry_points.txt,sha256=kBKYSS_IYrSXmUYevmmepqIVPScq5vF8ulQRu3I_Zf0,59
212
- tico-0.1.0.dev250723.dist-info/top_level.txt,sha256=oqs7UPoNSKZEwqsX8B-KAWdQwfAa7i60pbxW_Jk7P3w,5
213
- tico-0.1.0.dev250723.dist-info/RECORD,,
208
+ tico-0.1.0.dev250727.dist-info/LICENSE,sha256=kp4JLII7bzRhPb0CPD5XTDZMh22BQ7h3k3B7t8TiSbw,12644
209
+ tico-0.1.0.dev250727.dist-info/METADATA,sha256=gE7opbcJdg8CiBvfdcjjvCuyrfQvy-q4BaBt8meVP84,8430
210
+ tico-0.1.0.dev250727.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
211
+ tico-0.1.0.dev250727.dist-info/entry_points.txt,sha256=kBKYSS_IYrSXmUYevmmepqIVPScq5vF8ulQRu3I_Zf0,59
212
+ tico-0.1.0.dev250727.dist-info/top_level.txt,sha256=oqs7UPoNSKZEwqsX8B-KAWdQwfAa7i60pbxW_Jk7P3w,5
213
+ tico-0.1.0.dev250727.dist-info/RECORD,,