1
1
import unittest
2
2
from textwrap import dedent
3
3
import numpy as np
4
+ import onnx .helper as oh
4
5
from onnx import ModelProto , TensorProto
5
6
from onnx .checker import check_model
6
7
from onnx .defs import onnx_opset_version
@@ -29,37 +30,43 @@ def test_exp(self):
29
30
self .assertEqualArray (np .exp (a ), got )
30
31
31
32
code = translate (onx , api = "builder" )
32
- expected = dedent (
33
- """
33
+ expected = (
34
+ dedent (
35
+ """
34
36
def light_api(
35
37
op: "GraphBuilder",
36
38
X: "FLOAT[]",
37
39
):
38
- Y = op.Exp(X)
40
+ Y = op.Exp(X, outputs=['Y'] )
39
41
op.Identity(Y, outputs=["Y"])
40
42
return Y
41
43
42
44
g = GraphBuilder({'': 19}, ir_version=10)
43
45
g.make_tensor_input("X", TensorProto.FLOAT, ())
44
46
light_api(g.op, "X")
45
- g.make_tensor_output("Y", TensorProto.FLOAT, ())
47
+ g.make_tensor_output("Y", TensorProto.FLOAT, ()__SUFFIX__ )
46
48
model = g.to_onnx()
47
49
"""
48
- ).strip ("\n " )
50
+ )
51
+ .strip ("\n " )
52
+ .replace ("__SUFFIX__" , ", is_dimension=False, indexed=False" )
53
+ )
49
54
self .assertEqual (expected , code .strip ("\n " ))
50
55
51
56
def light_api (
52
57
op : "GraphBuilder" ,
53
58
X : "FLOAT[]" , # noqa: F722
54
59
):
55
- Y = op .Exp (X )
60
+ Y = op .Exp (X , outputs = [ "Y" ] )
56
61
op .Identity (Y , outputs = ["Y" ])
57
62
return Y
58
63
59
64
g2 = GraphBuilder ({"" : 19 })
60
65
g2 .make_tensor_input ("X" , TensorProto .FLOAT , ("A" ,))
61
66
light_api (g2 .op , "X" )
62
- g2 .make_tensor_output ("Y" , TensorProto .FLOAT , ("A" ,))
67
+ g2 .make_tensor_output (
68
+ "Y" , TensorProto .FLOAT , ("A" ,), is_dimension = False , indexed = False
69
+ )
63
70
onx2 = g2 .to_onnx ()
64
71
65
72
ref = ReferenceEvaluator (onx2 )
@@ -78,25 +85,29 @@ def test_zdoc(self):
78
85
.to_onnx ()
79
86
)
80
87
code = translate (onx , api = "builder" )
81
- expected = dedent (
82
- """
88
+ expected = (
89
+ dedent (
90
+ """
83
91
def light_api(
84
92
op: "GraphBuilder",
85
93
X: "FLOAT[]",
86
94
):
87
95
r = np.array([-1, 1], dtype=np.int64)
88
- r0_0 = op.Reshape(X, r)
89
- Y = op.Transpose(r0_0, perm=[1, 0])
96
+ r0_0 = op.Reshape(X, r, outputs=['r0_0'] )
97
+ Y = op.Transpose(r0_0, perm=[1, 0], outputs=['Y'] )
90
98
op.Identity(Y, outputs=["Y"])
91
99
return Y
92
100
93
101
g = GraphBuilder({'': 19}, ir_version=10)
94
102
g.make_tensor_input("X", TensorProto.FLOAT, ())
95
103
light_api(g.op, "X")
96
- g.make_tensor_output("Y", TensorProto.FLOAT, ())
104
+ g.make_tensor_output("Y", TensorProto.FLOAT, ()__SUFFIX__ )
97
105
model = g.to_onnx()
98
106
"""
99
- ).strip ("\n " )
107
+ )
108
+ .strip ("\n " )
109
+ .replace ("__SUFFIX__" , ", is_dimension=False, indexed=False" )
110
+ )
100
111
self .maxDiff = None
101
112
self .assertEqual (expected , code .strip ("\n " ))
102
113
@@ -130,13 +141,14 @@ def test_exp_f(self):
130
141
tr = Translater (onx , emitter = BuilderEmitter ("mm" ))
131
142
code = tr .export (as_str = True )
132
143
133
- expected = dedent (
134
- """
144
+ expected = (
145
+ dedent (
146
+ """
135
147
def light_api(
136
148
op: "GraphBuilder",
137
149
X: "FLOAT[]",
138
150
):
139
- Y = op.Exp(X)
151
+ Y = op.Exp(X, outputs=['Y'] )
140
152
op.Identity(Y, outputs=["Y"])
141
153
return Y
142
154
@@ -145,14 +157,17 @@ def mm() -> "ModelProto":
145
157
g = GraphBuilder({'': 19}, ir_version=10)
146
158
g.make_tensor_input("X", TensorProto.FLOAT, ())
147
159
light_api(g.op, "X")
148
- g.make_tensor_output("Y", TensorProto.FLOAT, ())
160
+ g.make_tensor_output("Y", TensorProto.FLOAT, ()__SUFFIX__ )
149
161
model = g.to_onnx()
150
162
return model
151
163
152
164
153
165
model = mm()
154
166
"""
155
- ).strip ("\n " )
167
+ )
168
+ .strip ("\n " )
169
+ .replace ("__SUFFIX__" , ", is_dimension=False, indexed=False" )
170
+ )
156
171
self .assertEqual (expected , code .strip ("\n " ))
157
172
158
173
def light_api (
@@ -166,14 +181,105 @@ def light_api(
166
181
g2 = GraphBuilder ({"" : 19 })
167
182
g2 .make_tensor_input ("X" , TensorProto .FLOAT , ("A" ,))
168
183
light_api (g2 .op , "X" )
169
- g2 .make_tensor_output ("Y" , TensorProto .FLOAT , ("A" ,))
184
+ g2 .make_tensor_output (
185
+ "Y" , TensorProto .FLOAT , ("A" ,), is_dimension = False , indexed = False
186
+ )
170
187
onx2 = g2 .to_onnx ()
171
188
172
189
ref = ReferenceEvaluator (onx2 )
173
190
a = np .arange (10 ).astype (np .float32 )
174
191
got = ref .run (None , {"X" : a })[0 ]
175
192
self .assertEqualArray (np .exp (a ), got )
176
193
194
+ def test_local_function (self ):
195
+ new_domain = "custom"
196
+
197
+ linear_regression = oh .make_function (
198
+ new_domain ,
199
+ "LinearRegression" ,
200
+ ["x" , "a" , "b" ],
201
+ ["y" ],
202
+ [
203
+ oh .make_node ("MatMul" , ["x" , "a" ], ["xa" ]),
204
+ oh .make_node ("Add" , ["xa" , "b" ], ["y" ]),
205
+ ],
206
+ [oh .make_opsetid ("" , 14 )],
207
+ [],
208
+ )
209
+
210
+ graph = oh .make_graph (
211
+ [
212
+ oh .make_node (
213
+ "LinearRegression" , ["X" , "A" , "B" ], ["Y1" ], domain = new_domain
214
+ ),
215
+ oh .make_node ("Abs" , ["Y1" ], ["Y" ]),
216
+ ],
217
+ "example" ,
218
+ [
219
+ oh .make_tensor_value_info ("X" , TensorProto .FLOAT , [None , None ]),
220
+ oh .make_tensor_value_info ("A" , TensorProto .FLOAT , [None , None ]),
221
+ oh .make_tensor_value_info ("B" , TensorProto .FLOAT , [None , None ]),
222
+ ],
223
+ [oh .make_tensor_value_info ("Y" , TensorProto .FLOAT , None )],
224
+ )
225
+
226
+ onnx_model = oh .make_model (
227
+ graph ,
228
+ opset_imports = [oh .make_opsetid ("" , 14 ), oh .make_opsetid (new_domain , 1 )],
229
+ functions = [linear_regression ],
230
+ ir_version = 10 ,
231
+ )
232
+ tr = Translater (onnx_model , emitter = BuilderEmitter ("mm" ))
233
+ code = tr .export (as_str = True )
234
+
235
+ expected = (
236
+ dedent (
237
+ """
238
+ def example(
239
+ op: "GraphBuilder",
240
+ X: "FLOAT[, ]",
241
+ A: "FLOAT[, ]",
242
+ B: "FLOAT[, ]",
243
+ ):
244
+ Y1 = op.LinearRegression(X, A, B, domain='custom', outputs=['Y1'])
245
+ Y = op.Abs(Y1, outputs=['Y'])
246
+ op.Identity(Y, outputs=["Y"])
247
+ return Y
248
+
249
+
250
+ def make_custom_LinearRegression(g: "GraphBuilder"):
251
+ gr = GraphBuilder({'': 14}, as_function=True)
252
+ x = gr.make_tensor_input('x')
253
+ a = gr.make_tensor_input('a')
254
+ b = gr.make_tensor_input('b')
255
+ op = gr.op
256
+ xa = op.MatMul(x, a, outputs=['xa'])
257
+ y = op.Add(xa, b, outputs=['y'])
258
+ gr.make_tensor_output(y)
259
+ g.add_function(builder=gr)
260
+ return gr
261
+
262
+
263
+ def mm() -> "ModelProto":
264
+ g = GraphBuilder({'': 14, 'custom': 1}, ir_version=10)
265
+ g.make_tensor_input("X", TensorProto.FLOAT, ('', ''))
266
+ g.make_tensor_input("A", TensorProto.FLOAT, ('', ''))
267
+ g.make_tensor_input("B", TensorProto.FLOAT, ('', ''))
268
+ example(g.op, "X", "A", "B")
269
+ g.make_tensor_output("Y", TensorProto.FLOAT, ()__SUFFIX__)
270
+ make_custom_LinearRegression(g)
271
+ model = g.to_onnx()
272
+ return model
273
+
274
+
275
+ model = mm()
276
+ """
277
+ )
278
+ .strip ("\n " )
279
+ .replace ("__SUFFIX__" , ", is_dimension=False, indexed=False" )
280
+ )
281
+ self .assertEqual (expected , code .strip ("\n " ))
282
+
177
283
178
284
if __name__ == "__main__" :
179
285
unittest .main (verbosity = 2 )
0 commit comments