Skip to content

Add class to yield results form onnx model and computes differences between two runs #71

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Feb 6, 2024
Merged
Prev Previous commit
Next Next commit
add distance
  • Loading branch information
xadupre committed Feb 5, 2024
commit a8c2932e1c65a392fe127b168fa9e3cba27af9c1
1 change: 1 addition & 0 deletions CHANGELOGS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Change Logs
0.2.0
+++++

* :pr:`71`: adds tools to compare two onnx graphs
* :pr:`61`: adds function to plot onnx model as graphs
* :pr:`60`: supports translation of local functions
* :pr:`59`: add methods to update nodes in GraphAPI
Expand Down
7 changes: 7 additions & 0 deletions _doc/api/reference.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,10 @@ YieldEvaluator

.. autoclass:: onnx_array_api.reference.YieldEvaluator
:members:

DistanceExecution
+++++++++++++++++

.. autoclass:: onnx_array_api.reference.DistanceExecution
:members:

198 changes: 192 additions & 6 deletions _unittests/ut_reference/test_evaluator_yield.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
make_tensor_value_info,
)
from onnx_array_api.ext_test_case import ExtTestCase
from onnx_array_api.reference import YieldEvaluator, ResultType
from onnx_array_api.reference import YieldEvaluator, ResultType, DistanceExecution


class TestArrayTensor(ExtTestCase):
Expand Down Expand Up @@ -147,18 +147,19 @@ def test_evaluator_yield_summary(self):
yield_eval.enumerate_summarized(None, {"A": cst, "B": cst, "X": cst})
)
expected = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIO", "Abs"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIO", "Abs", "Y"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]
self.assertEqual(len(expected), len(results))
for a, b in zip(expected, results):
Expand All @@ -168,6 +169,191 @@ def test_evaluator_yield_summary(self):
self.assertEqual(a[2], b[2])
self.assertEqual(a[3], b[3])
self.assertEqual(a[4], b[4])
self.assertEqual(a[5], b[5])

def test_distance_pair(self):
el1 = (ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None)
el2 = el1
dc = DistanceExecution()
self.assertEqual(dc.distance_pair(el1, el2), 0)
el2 = (ResultType.INPUT, np.dtype("float16"), (2, 2), "ABCD", None)
self.assertEqual(dc.distance_pair(el1, el2), 2)
el2 = (ResultType.OUTPUT, np.dtype("float16"), (2, 2, 4), "GBCD", "Abs")
self.assertEqual(dc.distance_pair(el1, el2), 1130)
el2 = (ResultType.OUTPUT, np.dtype("float16"), (2, 3), "GBCD", "Abs")
self.assertEqual(dc.distance_pair(el1, el2), 1021)

def test_distance_sequence_0(self):
expected = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIO", "Abs", "Y"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]

dc = DistanceExecution()
d, align = dc.distance_sequence(expected, expected)
self.assertEqual(d, 0)
self.assertEqual(align, [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])

def test_distance_sequence_ins(self):
s1 = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIO", "Abs", "Y"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]
s2 = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]

dc = DistanceExecution()
d, align = dc.distance_sequence(s1, s2)
self.assertEqual(d, dc.insert_cost)
self.assertEqual(align, [(0, 0), (1, 1), (2, 2), (3, 3), (4, 3)])
d, align = dc.distance_sequence(s2, s1)
self.assertEqual(d, dc.insert_cost)
self.assertEqual(align, [(0, 0), (1, 1), (2, 2), (3, 3), (3, 4)])

def test_distance_sequence_equal(self):
s1 = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIO", "Abs", "Y"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]
s2 = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIO", "Abs", "Z"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]

dc = DistanceExecution()
d, align = dc.distance_sequence(s1, s2)
self.assertEqual(d, 0)
self.assertEqual(align, [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])

def test_distance_sequence_diff(self):
s1 = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIO", "Abs", "Y"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]
s2 = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIP", "Abs", "Z"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]

dc = DistanceExecution()
d, align = dc.distance_sequence(s1, s2)
self.assertEqual(d, 1)
self.assertEqual(align, [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])

def test_distance_sequence_diff2(self):
s1 = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 2), "CEIO", "Abs", "Y"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIO", None, "Y"),
]
s2 = [
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "A"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "B"),
(ResultType.INPUT, np.dtype("float32"), (2, 2), "ABCD", None, "X"),
(
ResultType.RESULT,
np.dtype("float32"),
(2, 2),
"CEIO",
"LinearRegression",
"Y1",
),
(ResultType.RESULT, np.dtype("float32"), (2, 3), "CEIP", "Abs", "Z"),
(ResultType.OUTPUT, np.dtype("float32"), (2, 2), "CEIP", None, "Y"),
]

dc = DistanceExecution()
d, align = dc.distance_sequence(s1, s2)
self.assertEqual(d, 5)
self.assertEqual(align, [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])


if __name__ == "__main__":
Expand Down
2 changes: 1 addition & 1 deletion onnx_array_api/reference/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
)
from onnx.reference.op_run import to_array_extended
from .evaluator import ExtendedReferenceEvaluator
from .evaluator_yield import YieldEvaluator, ResultType
from .evaluator_yield import DistanceExecution, ResultType, YieldEvaluator


def from_array_extended(tensor: np.array, name: Optional[str] = None) -> TensorProto:
Expand Down
Loading
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy