tico 0.1.0.dev250525__py3-none-any.whl → 0.1.0.dev250527__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.
tico/__init__.py CHANGED
@@ -22,7 +22,7 @@ from tico.config import CompileConfigV1, get_default_config
22
22
  from tico.utils.convert import convert, convert_from_exported_program, convert_from_pt2
23
23
 
24
24
  # THIS LINE IS AUTOMATICALLY GENERATED BY setup.py
25
- __version__ = "0.1.0.dev250525"
25
+ __version__ = "0.1.0.dev250527"
26
26
 
27
27
 
28
28
  if Version(torch.__version__) < Version("2.5.0"):
@@ -29,7 +29,7 @@ from tico.serialize.circle_mapping import (
29
29
  to_circle_dtype,
30
30
  )
31
31
  from tico.serialize.pack import pack_buffer
32
- from tico.serialize.quant_param import QPARAM_KEY
32
+ from tico.serialize.quant_param import QPARAM_KEY, QuantParam
33
33
  from tico.utils.utils import to_circle_qparam
34
34
 
35
35
  """
@@ -184,13 +184,21 @@ class CircleSubgraph(circle.SubGraph.SubGraphT):
184
184
  return tensor
185
185
 
186
186
  def add_tensor_from_scratch(
187
- self, prefix: str, shape: List[int], dtype: int
187
+ self,
188
+ prefix: str,
189
+ shape: List[int],
190
+ dtype: int,
191
+ qparam: Optional[QuantParam] = None,
188
192
  ) -> circle.Tensor.TensorT:
189
193
  assert isinstance(dtype, int), f"{dtype} must be integer. Use to_circle_dtype."
190
194
  tensor = circle.Tensor.TensorT()
191
195
  tensor.name = self._gen_unique_name_with_prefix(prefix)
192
- tensor.type = dtype
193
196
  tensor.shape = shape
197
+ if qparam is not None:
198
+ tensor.quantization = to_circle_qparam(qparam)
199
+ tensor.type = str_to_circle_dtype(qparam.dtype)
200
+ else:
201
+ tensor.type = dtype
194
202
 
195
203
  buffer = circle.Buffer.BufferT()
196
204
  bid = self.model.add_buffer(buffer)
@@ -35,6 +35,7 @@ from tico.utils import logging
35
35
 
36
36
  multiple_output_ops = [
37
37
  torch.ops.aten.split_with_sizes.default,
38
+ torch.ops.aten.max.dim,
38
39
  ]
39
40
 
40
41
  # Build circle model from ExportedProgram
@@ -0,0 +1,53 @@
1
+ # Copyright (c) 2025 Samsung Electronics Co., Ltd. All Rights Reserved
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Dict, List, TYPE_CHECKING
16
+
17
+ if TYPE_CHECKING:
18
+ import torch._ops
19
+ import torch.fx
20
+ import torch
21
+ from circle_schema import circle
22
+
23
+ from tico.serialize.circle_graph import CircleSubgraph
24
+ from tico.serialize.operators.hashable_opcode import OpCode
25
+ from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
26
+ from tico.serialize.operators.utils import create_builtin_operator, get_op_index
27
+ from tico.utils.validate_args_kwargs import AbsArgs
28
+
29
+
30
+ @register_node_visitor
31
+ class AbsVisitor(NodeVisitor):
32
+ target: List[torch._ops.OpOverload] = [torch.ops.aten.abs.default]
33
+
34
+ def __init__(self, op_codes: Dict[OpCode, int], graph: CircleSubgraph):
35
+ super().__init__(op_codes, graph)
36
+
37
+ def define_node(
38
+ self,
39
+ node: torch.fx.Node,
40
+ ) -> circle.Operator.OperatorT:
41
+ op_index = get_op_index(
42
+ circle.BuiltinOperator.BuiltinOperator.ABS, self._op_codes
43
+ )
44
+
45
+ args = AbsArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
46
+ input = args.input
47
+
48
+ inputs = [input]
49
+ outputs = [node]
50
+
51
+ operator = create_builtin_operator(self.graph, op_index, inputs, outputs)
52
+
53
+ return operator
@@ -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
15
+ from typing import Dict, List, Optional, TYPE_CHECKING
16
16
 
17
17
  if TYPE_CHECKING:
18
18
  import torch._ops
@@ -24,6 +24,7 @@ from tico.serialize.circle_mapping import extract_circle_dtype, extract_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
27
+ from tico.serialize.quant_param import QPARAM_KEY, QuantParam
27
28
  from tico.utils.define import define_pad_node
28
29
  from tico.utils.padding import is_same_padding, is_valid_padding, SAME, VALID
29
30
  from tico.utils.validate_args_kwargs import Conv2DArgs
@@ -150,11 +151,14 @@ class Conv2dVisitor(NodeVisitor):
150
151
  # Add (pad_left+pad_Right) to pad_output_shape_w
151
152
  pad_output_shape[2] += padding[1] * 2
152
153
  # create padded output tensor
153
-
154
+ input_qparam: Optional[QuantParam] = (
155
+ input_.meta[QPARAM_KEY] if QPARAM_KEY in input_.meta else None
156
+ )
154
157
  pad_output = self.graph.add_tensor_from_scratch(
155
158
  prefix=f"{node.name}_input_pad_output",
156
159
  shape=pad_output_shape,
157
160
  dtype=input_dtype,
161
+ qparam=input_qparam,
158
162
  )
159
163
  # CirclePad
160
164
  pad_operator = define_pad_node(
@@ -0,0 +1,70 @@
1
+ # Copyright (c) 2025 Samsung Electronics Co., Ltd. All Rights Reserved
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Dict, List, TYPE_CHECKING
16
+
17
+ if TYPE_CHECKING:
18
+ import torch._ops
19
+ import torch.fx
20
+ import torch
21
+ from circle_schema import circle
22
+
23
+ from tico.serialize.circle_graph import CircleSubgraph
24
+ from tico.serialize.circle_mapping import circle_legalize_dtype_to
25
+ from tico.serialize.operators.hashable_opcode import OpCode
26
+ from tico.serialize.operators.node_visitor import NodeVisitor, register_node_visitor
27
+ from tico.serialize.operators.utils import create_builtin_operator, get_op_index
28
+ from tico.utils.validate_args_kwargs import MaxDimArgs
29
+
30
+
31
+ @register_node_visitor
32
+ class MaxDimVisitor(NodeVisitor):
33
+ target: List[torch._ops.OpOverload] = [torch.ops.aten.max.dim]
34
+
35
+ def __init__(self, op_codes: Dict[OpCode, int], graph: CircleSubgraph):
36
+ super().__init__(op_codes, graph)
37
+
38
+ def define_node(
39
+ self,
40
+ node: torch.fx.Node,
41
+ ) -> circle.Operator.OperatorT:
42
+ args = MaxDimArgs(*node.args, **node.kwargs) # type: ignore[arg-type]
43
+ input = args.input
44
+ dim = args.dim
45
+ keepdim = args.keepdim
46
+
47
+ # Only support modules that return the first output.
48
+ assert len(node.users) == 1
49
+ assert list(node.users.keys())[0].args[1] == 0 # node.users: {getitem: None}
50
+
51
+ op_index = get_op_index(
52
+ circle.BuiltinOperator.BuiltinOperator.REDUCE_MAX, self._op_codes
53
+ )
54
+
55
+ dim_i32 = circle_legalize_dtype_to(dim, dtype=torch.int32)
56
+ inputs = [input, dim_i32]
57
+ outputs = [list(node.users.keys())[0]]
58
+
59
+ operator = create_builtin_operator(self.graph, op_index, inputs, outputs)
60
+
61
+ # Op-specific option
62
+ operator.builtinOptionsType = (
63
+ circle.BuiltinOptions.BuiltinOptions.ReducerOptions
64
+ )
65
+ option = circle.ReducerOptions.ReducerOptionsT()
66
+ option.keepDims = keepdim
67
+
68
+ operator.builtinOptions = option
69
+
70
+ return operator
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  from enum import IntEnum
16
- from typing import Dict, List, TYPE_CHECKING
16
+ from typing import Dict, List, Optional, TYPE_CHECKING
17
17
 
18
18
  if TYPE_CHECKING:
19
19
  import torch._ops
@@ -25,7 +25,12 @@ from tico.serialize.circle_graph import CircleSubgraph
25
25
  from tico.serialize.circle_mapping import extract_circle_dtype, extract_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
- from tico.serialize.operators.utils import create_builtin_operator, get_op_index
28
+ from tico.serialize.operators.utils import (
29
+ create_builtin_operator,
30
+ get_integer_dtype_min,
31
+ get_op_index,
32
+ )
33
+ from tico.serialize.quant_param import QPARAM_KEY, QuantParam
29
34
  from tico.utils.validate_args_kwargs import MaxPool2dWithIndicesArgs
30
35
 
31
36
 
@@ -82,7 +87,6 @@ class MaxPool2DWithIndicesVisitor(NodeVisitor):
82
87
  ],
83
88
  dtype=torch.int32,
84
89
  )
85
- padding_value = float("-inf")
86
90
  input_shape = list(extract_shape(input))
87
91
  input_dtype: int = extract_circle_dtype(input)
88
92
  padded_input_shape = [
@@ -93,12 +97,20 @@ class MaxPool2DWithIndicesVisitor(NodeVisitor):
93
97
  ]
94
98
  padded_input_shape[1] += padding[0] * 2
95
99
  padded_input_shape[2] += padding[1] * 2
100
+ input_qparam: Optional[QuantParam] = (
101
+ input.meta[QPARAM_KEY] if QPARAM_KEY in input.meta else None
102
+ )
96
103
  # create padded input tensor
97
104
  padded_input_tensor = self.graph.add_tensor_from_scratch(
98
105
  prefix=f"{input.name}_pad_output",
99
106
  shape=padded_input_shape,
100
107
  dtype=input_dtype,
108
+ qparam=input_qparam,
101
109
  )
110
+ if input_qparam is not None:
111
+ padding_value = get_integer_dtype_min(input_qparam.dtype)
112
+ else:
113
+ padding_value = float("-inf")
102
114
  pad_operator = self.define_padV2_node(
103
115
  [input, padding_vec, padding_value], [padded_input_tensor]
104
116
  )
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import re
15
16
  from typing import Dict, List
16
17
 
17
18
  from circle_schema import circle
@@ -49,3 +50,45 @@ def create_builtin_operator(
49
50
  operator.inputs = [graph.get_tid(input) for input in inputs]
50
51
  operator.outputs = [graph.get_tid(output) for output in outputs]
51
52
  return operator
53
+
54
+
55
+ def get_integer_dtype_min(dtype_str: str):
56
+ """
57
+ Returns the minimum representable value for a given integer dtype string.
58
+
59
+ Supports "intN" and "uintN" where N >= 2 and uses two's complement for
60
+ signed integers.
61
+
62
+ Args:
63
+ dtype_str (str): A string representing the integer dtype.
64
+ Must be in the format "intN" or "uintN" where N is the bit width.
65
+
66
+ Returns:
67
+ int: The minimum representable integer value for the given dtype.
68
+
69
+ Raises:
70
+ ValueError: If the dtype format is invalid or bit width is less then 2.
71
+
72
+ Examples:
73
+ >>> get_integer_dtype_min("int8")
74
+ -128
75
+ >>> get_integer_dtype_min("uint4")
76
+ 0
77
+ >>> get_integer_dtype_min("int4")
78
+ -8
79
+ """
80
+ match = re.fullmatch(r"(u?)int(\d+)", dtype_str)
81
+
82
+ if not match:
83
+ raise ValueError(f"Unsupported or malformed dtype: {dtype_str}")
84
+
85
+ is_unsigned = match.group(1) == "u"
86
+ bits = int(match.group(2))
87
+
88
+ if bits < 2:
89
+ raise ValueError(f"Bit width too small: {bits} bits")
90
+
91
+ if is_unsigned:
92
+ return 0
93
+ else:
94
+ return -(2 ** (bits - 1))
@@ -32,6 +32,16 @@ This file includes OpArgs classes that provide arguments with type annotations.
32
32
  """
33
33
 
34
34
 
35
+ @enforce_type
36
+ @dataclass
37
+ class AbsArgs:
38
+ """
39
+ abs(Tensor self) -> Tensor
40
+ """
41
+
42
+ input: torch.fx.Node
43
+
44
+
35
45
  @enforce_type
36
46
  @dataclass
37
47
  class AddTensorArgs:
@@ -567,6 +577,18 @@ class LtArgs:
567
577
  other: torch.fx.Node
568
578
 
569
579
 
580
+ @enforce_type
581
+ @dataclass
582
+ class MaxDimArgs:
583
+ """
584
+ max.dim(Tensor self, int dim, bool keepdim=False) -> (Tensor values, Tensor indices)
585
+ """
586
+
587
+ input: torch.fx.Node
588
+ dim: int
589
+ keepdim: bool = False
590
+
591
+
570
592
  @enforce_type
571
593
  @dataclass
572
594
  class MaxPool2dWithIndicesArgs:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tico
3
- Version: 0.1.0.dev250525
3
+ Version: 0.1.0.dev250527
4
4
  Summary: Convert exported Torch module to circle
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -1,4 +1,4 @@
1
- tico/__init__.py,sha256=sisr-h5zQde3H6gNRHOXG69gKOxYZsOWZ_SjRXZn-IA,1181
1
+ tico/__init__.py,sha256=zY__nsnts-mqniDecMFut79ZDvsK2yrh51Bcmt4F8rU,1181
2
2
  tico/pt2_to_circle.py,sha256=PPmFNw20jw2Z2VyM3ln9pX__jTzBOAZiv0gT5a-p-Y8,2666
3
3
  tico/config/__init__.py,sha256=xZzCXjZ84qE-CsBi-dfaL05bqpQ3stKKfTXhnrJRyVs,142
4
4
  tico/config/base.py,sha256=anwOiJFkUxUi7Cef573JgQcjk6S-FSi6O_TLjYASW-g,1244
@@ -93,14 +93,15 @@ tico/passes/remove_redundant_to_copy.py,sha256=uTIjAn3Eli_RvXC-QOqxBAkV_whDBkkNh
93
93
  tico/passes/restore_linear.py,sha256=UMMHdLmRGq9bfJx_0L9lL2UQBd51PGNP0WywO8KdrDM,4066
94
94
  tico/passes/segment_index_select.py,sha256=ifXOIFC12lNwsB-s3k1cJcMHP3UEijPpkMAbwI7lZbQ,5097
95
95
  tico/serialize/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
96
- tico/serialize/circle_graph.py,sha256=BCg7y81DhXS2V17KXpLV-9S3kpF1VVOy9TC_h6sOXuY,9248
96
+ tico/serialize/circle_graph.py,sha256=l9fcvV4x3L5Bh2WmEseo--0KFjSVTrlSBaBrqbrmXgg,9498
97
97
  tico/serialize/circle_mapping.py,sha256=C9C3ORACQOdvBdnt5KRzlT8zao_TvzQklIxH794OhP0,5719
98
- tico/serialize/circle_serializer.py,sha256=GVEyiQCcLXAvFasto4swCBMR8X17dQ7kuQ2M14oNzjA,8727
98
+ tico/serialize/circle_serializer.py,sha256=AWpLRgwjp1Xm70xMPY3cxWZTOtjV_DKzzIxJXLVKBdg,8755
99
99
  tico/serialize/pack.py,sha256=5HZ9kX3x6C6CyT_FWS6FRmvx_P7Dx21orjUNQxJ2xlo,1297
100
100
  tico/serialize/quant_param.py,sha256=s97GJyDOZULnqFUWPakHais31G_qqPuO0awPHCkZDvI,1342
101
101
  tico/serialize/operators/__init__.py,sha256=LIvXsNnN4yUCS2CGNQ5XW8p8oXDTV_WHWuOEAw1t6WY,990
102
102
  tico/serialize/operators/hashable_opcode.py,sha256=sDVKNTgIQw4IBtMEjNH8tzssMPx1x8-U2oagomRjGF0,1368
103
103
  tico/serialize/operators/node_visitor.py,sha256=UYyCwXqSCeRyimThMShstHnt7vKM9tsuzQ_02uEwF9I,2356
104
+ tico/serialize/operators/op_abs.py,sha256=Y-vy7rcqPT-qD3QS5R8zbApWWTPpjY6xuMMVnbIhYmQ,1827
104
105
  tico/serialize/operators/op_add.py,sha256=otm062DMHVAThWmOtSTZdPyP3P5-2cv5VL_UWBJeLms,2346
105
106
  tico/serialize/operators/op_alias_copy.py,sha256=Xu9OiILbGf8oddh8yTqovvLfgVs8XYV7Cg4n6CesWcg,2175
106
107
  tico/serialize/operators/op_any.py,sha256=WMsHLq7WIcl6rD2G3QqpWRSCR-a6UYX6y5AjB6BDS3U,5049
@@ -112,7 +113,7 @@ tico/serialize/operators/op_cat.py,sha256=XDYOh0XAyrM0TlxVm6Sa0OFFGrKk7aSDcGXC-h
112
113
  tico/serialize/operators/op_clamp.py,sha256=V3rncHvUAuJ2nXOyywTnOGCvNBeCQGqQIW1_zxKlSsA,4231
113
114
  tico/serialize/operators/op_clone.py,sha256=vzDYJ8TS3tc2BAyd_z8nt5VqT1inpymSseMEhd9dva0,2394
114
115
  tico/serialize/operators/op_constant_pad_nd.py,sha256=OpP4AP-d1IFcWZolNa-o9ZxzXJQkMdG9WQ66soX3s-E,2675
115
- tico/serialize/operators/op_conv2d.py,sha256=KikjotUaUEuaRStdA-xJrgRXljkkOTUQMlgq_gFJXSo,7031
116
+ tico/serialize/operators/op_conv2d.py,sha256=a8aU0CwPgCYM37rDWmrCpxMoQZQdxzXaPtJAVB7dK0M,7283
116
117
  tico/serialize/operators/op_copy.py,sha256=W_ih1yqqMwSCO_l9l_LUn_G_IoTgDJcNUnAbX1ZITZI,6054
117
118
  tico/serialize/operators/op_cos.py,sha256=N12bNyuTQIxRnD0eHRPdFVzRQPMy1NFM4iM8oQ4lYzw,2034
118
119
  tico/serialize/operators/op_cumsum.py,sha256=HhPF2uKMamk8KIiV0j6P-grU8oZ9AhlcRsRVC28oYVw,3731
@@ -138,7 +139,8 @@ tico/serialize/operators/op_log1p.py,sha256=lH0rLxpag7kGeM5UiE5b1Q4JluOE-yiQSsEc
138
139
  tico/serialize/operators/op_logical_and.py,sha256=WhQ8knuq32BO-WhAqkOgpcUStPkjoPmRWuYNsKveF3w,2163
139
140
  tico/serialize/operators/op_logical_not.py,sha256=ugrVcRqR3IvUUaiRVW5cArCYJbzmkcXp88QM846jCww,2129
140
141
  tico/serialize/operators/op_lt.py,sha256=_vA7dWpV9wVBxB7JL9pLQT9BsV91NGQBq_0auAtHK5Y,2080
141
- tico/serialize/operators/op_max_pool2d_with_indices.py,sha256=ilQdirgSOjJR6dRIgAEF-sFmjPLQB3O2F_Fq5mbpYNA,5203
142
+ tico/serialize/operators/op_max_dim.py,sha256=nS_TZl5uq4uv1LwgBD9Wddyac4atKqBiIWKIyeXse2s,2519
143
+ tico/serialize/operators/op_max_pool2d_with_indices.py,sha256=GBeBNEyohVSGMIiY0Z1UUX-9N8OdVGitbGNAq_TJZd4,5631
142
144
  tico/serialize/operators/op_maximum.py,sha256=JjBr6gWEnuakLuk1_feotTHfIIm3s5YqWmqhUMpSPI0,1873
143
145
  tico/serialize/operators/op_mean.py,sha256=rVQZOxCJkHFY4kQBAS1HVK0HkcqxgkSy6zvEDLX_WYQ,2267
144
146
  tico/serialize/operators/op_minimum.py,sha256=fASjQVcTPCin02umQwFPdq2ss-Ve7S5A33J3QmmQ_wQ,1873
@@ -173,7 +175,7 @@ tico/serialize/operators/op_to_copy.py,sha256=a8T0uPMavMO_md1a-4_0dlvDHyZS_xew0q
173
175
  tico/serialize/operators/op_unsqueeze.py,sha256=ZHhfVXSWEiwb2VDYX5uhxbGQyzZjKT7CrbBpVGxVHBU,2310
174
176
  tico/serialize/operators/op_view.py,sha256=5EMww-ve17Vm9XPuV03Tn7vJsjpU2J8U4d_FOrlm9_o,2546
175
177
  tico/serialize/operators/op_where.py,sha256=qZDFKVQ2u8HB0Jjpto_1A4g-jfpEprAbBT3PmIGzdoY,2855
176
- tico/serialize/operators/utils.py,sha256=wQrcrnZ942_4SfhEW_7hIVi0tncGor-o7zuf2kmk9Io,1803
178
+ tico/serialize/operators/utils.py,sha256=lXGpEJW1h8U_-gfc6EWjvvSiq3yJ9P-v1v3EMRT_pSk,2954
177
179
  tico/utils/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
178
180
  tico/utils/convert.py,sha256=KCllPnvQ8bjEYR1yI72s9aNBp7Py1CzIEEpYSYZcu60,11684
179
181
  tico/utils/define.py,sha256=Ypgp7YffM4pgPl4Zh6TmogSn1OxGBMRw_e09qYGflZk,1467
@@ -187,14 +189,14 @@ tico/utils/passes.py,sha256=kGmDe__5cPaO6i5EDAoXSVe6yXEoX9hAny4ROb3ZEmQ,2409
187
189
  tico/utils/register_custom_op.py,sha256=iRQvdqlBqrJxq_pNkvJyDIJD_SYtCUl88wwbbuvSwlk,22952
188
190
  tico/utils/trace_decorators.py,sha256=ddLIiKQfSaQrxgF1kNpwjFTQnXENzeSfcr1kuAW4jGI,3221
189
191
  tico/utils/utils.py,sha256=pybDU1LoNhjEplANig11lboX9yzYRkvFCSmyYth_2Do,10359
190
- tico/utils/validate_args_kwargs.py,sha256=z7JySDhyviI7G6Mo54AFdTiJIOE6Q6UrYnOFJj-5M24,24724
192
+ tico/utils/validate_args_kwargs.py,sha256=P4aMnr9EhNCtc_AgJPpuezfQbqFfDn0lhJSWqmumLZ8,25054
191
193
  tico/utils/mx/__init__.py,sha256=IO6FP_xYbGy0dW0HL26GXD3ouxARaxCK7bz9dn4blPQ,26
192
194
  tico/utils/mx/elemwise_ops.py,sha256=V6glyAHsVR1joqpsgnNytatCD_ew92xNWZ19UFDoMTA,10281
193
195
  tico/utils/mx/formats.py,sha256=uzNWyu-1onUlwQfX5cZ6fZSUfHMRqorper7_T1k3jfk,3404
194
196
  tico/utils/mx/mx_ops.py,sha256=RcfUTYVi-wilGB2sC35OeARdwDqnixv7dG5iyZ-fQT8,8555
195
- tico-0.1.0.dev250525.dist-info/LICENSE,sha256=kp4JLII7bzRhPb0CPD5XTDZMh22BQ7h3k3B7t8TiSbw,12644
196
- tico-0.1.0.dev250525.dist-info/METADATA,sha256=JmTBFrT_IohQJUAcJWLTbIU4YV7pv-v6ZkywtLpmDLk,8633
197
- tico-0.1.0.dev250525.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
198
- tico-0.1.0.dev250525.dist-info/entry_points.txt,sha256=kBKYSS_IYrSXmUYevmmepqIVPScq5vF8ulQRu3I_Zf0,59
199
- tico-0.1.0.dev250525.dist-info/top_level.txt,sha256=oqs7UPoNSKZEwqsX8B-KAWdQwfAa7i60pbxW_Jk7P3w,5
200
- tico-0.1.0.dev250525.dist-info/RECORD,,
197
+ tico-0.1.0.dev250527.dist-info/LICENSE,sha256=kp4JLII7bzRhPb0CPD5XTDZMh22BQ7h3k3B7t8TiSbw,12644
198
+ tico-0.1.0.dev250527.dist-info/METADATA,sha256=6z0-wJTVKt3EvNXMPY3CLHXIvQulhZdeQaJ1oMFhoz0,8633
199
+ tico-0.1.0.dev250527.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
200
+ tico-0.1.0.dev250527.dist-info/entry_points.txt,sha256=kBKYSS_IYrSXmUYevmmepqIVPScq5vF8ulQRu3I_Zf0,59
201
+ tico-0.1.0.dev250527.dist-info/top_level.txt,sha256=oqs7UPoNSKZEwqsX8B-KAWdQwfAa7i60pbxW_Jk7P3w,5
202
+ tico-0.1.0.dev250527.dist-info/RECORD,,