emx-onnx-cgen 0.2.0__py3-none-any.whl → 0.3.1__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.

Potentially problematic release.


This version of emx-onnx-cgen might be problematic. Click here for more details.

Files changed (99) hide show
  1. emx_onnx_cgen/_build_info.py +1 -1
  2. emx_onnx_cgen/_version.py +34 -0
  3. emx_onnx_cgen/cli.py +372 -64
  4. emx_onnx_cgen/codegen/__init__.py +2 -0
  5. emx_onnx_cgen/codegen/c_emitter.py +3932 -1398
  6. emx_onnx_cgen/codegen/emitter.py +5 -0
  7. emx_onnx_cgen/compiler.py +169 -343
  8. emx_onnx_cgen/ir/context.py +87 -0
  9. emx_onnx_cgen/ir/model.py +1 -0
  10. emx_onnx_cgen/ir/op_base.py +193 -0
  11. emx_onnx_cgen/ir/op_context.py +65 -0
  12. emx_onnx_cgen/ir/ops/__init__.py +130 -0
  13. emx_onnx_cgen/ir/ops/elementwise.py +146 -0
  14. emx_onnx_cgen/ir/ops/misc.py +421 -0
  15. emx_onnx_cgen/ir/ops/nn.py +580 -0
  16. emx_onnx_cgen/ir/ops/reduce.py +95 -0
  17. emx_onnx_cgen/lowering/__init__.py +79 -1
  18. emx_onnx_cgen/lowering/adagrad.py +114 -0
  19. emx_onnx_cgen/lowering/arg_reduce.py +1 -1
  20. emx_onnx_cgen/lowering/attention.py +1 -1
  21. emx_onnx_cgen/lowering/average_pool.py +1 -1
  22. emx_onnx_cgen/lowering/batch_normalization.py +1 -1
  23. emx_onnx_cgen/lowering/cast.py +1 -1
  24. emx_onnx_cgen/lowering/common.py +406 -11
  25. emx_onnx_cgen/lowering/concat.py +1 -1
  26. emx_onnx_cgen/lowering/constant_of_shape.py +1 -1
  27. emx_onnx_cgen/lowering/conv.py +1 -1
  28. emx_onnx_cgen/lowering/conv_transpose.py +301 -0
  29. emx_onnx_cgen/lowering/cumsum.py +1 -1
  30. emx_onnx_cgen/lowering/depth_space.py +1 -1
  31. emx_onnx_cgen/lowering/dropout.py +1 -1
  32. emx_onnx_cgen/lowering/einsum.py +153 -0
  33. emx_onnx_cgen/lowering/elementwise.py +152 -4
  34. emx_onnx_cgen/lowering/expand.py +1 -1
  35. emx_onnx_cgen/lowering/eye_like.py +1 -1
  36. emx_onnx_cgen/lowering/flatten.py +1 -1
  37. emx_onnx_cgen/lowering/gather.py +1 -1
  38. emx_onnx_cgen/lowering/gather_elements.py +2 -4
  39. emx_onnx_cgen/lowering/gather_nd.py +79 -0
  40. emx_onnx_cgen/lowering/gemm.py +1 -1
  41. emx_onnx_cgen/lowering/global_max_pool.py +59 -0
  42. emx_onnx_cgen/lowering/grid_sample.py +1 -1
  43. emx_onnx_cgen/lowering/group_normalization.py +1 -1
  44. emx_onnx_cgen/lowering/hardmax.py +53 -0
  45. emx_onnx_cgen/lowering/identity.py +7 -6
  46. emx_onnx_cgen/lowering/instance_normalization.py +1 -1
  47. emx_onnx_cgen/lowering/layer_normalization.py +1 -1
  48. emx_onnx_cgen/lowering/logsoftmax.py +6 -2
  49. emx_onnx_cgen/lowering/lp_normalization.py +1 -1
  50. emx_onnx_cgen/lowering/lp_pool.py +141 -0
  51. emx_onnx_cgen/lowering/lrn.py +1 -1
  52. emx_onnx_cgen/lowering/lstm.py +1 -1
  53. emx_onnx_cgen/lowering/matmul.py +7 -8
  54. emx_onnx_cgen/lowering/maxpool.py +1 -1
  55. emx_onnx_cgen/lowering/mean_variance_normalization.py +1 -1
  56. emx_onnx_cgen/lowering/negative_log_likelihood_loss.py +13 -13
  57. emx_onnx_cgen/lowering/non_max_suppression.py +157 -0
  58. emx_onnx_cgen/lowering/nonzero.py +42 -0
  59. emx_onnx_cgen/lowering/one_hot.py +120 -0
  60. emx_onnx_cgen/lowering/pad.py +1 -1
  61. emx_onnx_cgen/lowering/qlinear_matmul.py +212 -0
  62. emx_onnx_cgen/lowering/quantize_linear.py +126 -0
  63. emx_onnx_cgen/lowering/range.py +1 -1
  64. emx_onnx_cgen/lowering/reduce.py +6 -7
  65. emx_onnx_cgen/lowering/registry.py +24 -5
  66. emx_onnx_cgen/lowering/reshape.py +224 -52
  67. emx_onnx_cgen/lowering/resize.py +1 -1
  68. emx_onnx_cgen/lowering/rms_normalization.py +1 -1
  69. emx_onnx_cgen/lowering/rotary_embedding.py +165 -0
  70. emx_onnx_cgen/lowering/scatter_nd.py +82 -0
  71. emx_onnx_cgen/lowering/shape.py +6 -25
  72. emx_onnx_cgen/lowering/size.py +1 -1
  73. emx_onnx_cgen/lowering/slice.py +1 -1
  74. emx_onnx_cgen/lowering/softmax.py +6 -2
  75. emx_onnx_cgen/lowering/softmax_cross_entropy_loss.py +1 -1
  76. emx_onnx_cgen/lowering/split.py +1 -1
  77. emx_onnx_cgen/lowering/squeeze.py +6 -6
  78. emx_onnx_cgen/lowering/tensor_scatter.py +110 -0
  79. emx_onnx_cgen/lowering/tile.py +1 -1
  80. emx_onnx_cgen/lowering/topk.py +134 -0
  81. emx_onnx_cgen/lowering/transpose.py +1 -1
  82. emx_onnx_cgen/lowering/trilu.py +89 -0
  83. emx_onnx_cgen/lowering/unsqueeze.py +6 -6
  84. emx_onnx_cgen/lowering/variadic.py +1 -1
  85. emx_onnx_cgen/lowering/where.py +1 -1
  86. emx_onnx_cgen/onnx_import.py +4 -0
  87. emx_onnx_cgen/onnxruntime_utils.py +11 -0
  88. emx_onnx_cgen/ops.py +4 -0
  89. emx_onnx_cgen/runtime/evaluator.py +785 -43
  90. emx_onnx_cgen/testbench.py +23 -0
  91. emx_onnx_cgen/verification.py +31 -0
  92. {emx_onnx_cgen-0.2.0.dist-info → emx_onnx_cgen-0.3.1.dist-info}/METADATA +33 -6
  93. emx_onnx_cgen-0.3.1.dist-info/RECORD +107 -0
  94. {emx_onnx_cgen-0.2.0.dist-info → emx_onnx_cgen-0.3.1.dist-info}/WHEEL +1 -1
  95. shared/scalar_functions.py +60 -17
  96. shared/ulp.py +65 -0
  97. emx_onnx_cgen-0.2.0.dist-info/RECORD +0 -76
  98. {emx_onnx_cgen-0.2.0.dist-info → emx_onnx_cgen-0.3.1.dist-info}/entry_points.txt +0 -0
  99. {emx_onnx_cgen-0.2.0.dist-info → emx_onnx_cgen-0.3.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,23 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ import numpy as np
6
+
7
+
8
+ def _convert_hex_floats(value: Any) -> Any:
9
+ if isinstance(value, list):
10
+ return [_convert_hex_floats(item) for item in value]
11
+ if isinstance(value, str):
12
+ return float.fromhex(value)
13
+ return value
14
+
15
+
16
+ def decode_testbench_array(data: object, dtype: np.dtype) -> np.ndarray:
17
+ """Decode testbench JSON data into a numpy array.
18
+
19
+ Floating-point values are expected to be hex strings (C99 %a formatting).
20
+ """
21
+ if np.issubdtype(dtype, np.floating):
22
+ data = _convert_hex_floats(data)
23
+ return np.array(data, dtype=dtype)
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ import numpy as np
4
+
5
+ from shared.ulp import ulp_intdiff_float
6
+
7
+
8
+ def max_ulp_diff(actual: np.ndarray, expected: np.ndarray) -> int:
9
+ if actual.shape != expected.shape:
10
+ raise ValueError(
11
+ f"Shape mismatch for ULP calculation: {actual.shape} vs {expected.shape}"
12
+ )
13
+ if not np.issubdtype(expected.dtype, np.floating):
14
+ return 0
15
+ dtype = expected.dtype
16
+ if dtype not in (np.float16, np.float32, np.float64):
17
+ raise ValueError(f"Unsupported floating dtype for ULP calculation: {dtype}")
18
+ actual_cast = actual.astype(dtype, copy=False)
19
+ expected_cast = expected.astype(dtype, copy=False)
20
+ max_diff = 0
21
+ for actual_value, expected_value in np.nditer(
22
+ [actual_cast, expected_cast], flags=["refs_ok"]
23
+ ):
24
+ diff = ulp_intdiff_float(actual_value[()], expected_value[()])
25
+ if diff > max_diff:
26
+ max_diff = diff
27
+ return max_diff
28
+
29
+
30
+ def format_success_message(max_ulp: int) -> str:
31
+ return f"OK (max ULP {max_ulp})"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: emx-onnx-cgen
3
- Version: 0.2.0
3
+ Version: 0.3.1
4
4
  Summary: emmtrix ONNX-to-C Code Generator
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -9,14 +9,14 @@ Description-Content-Type: text/markdown
9
9
 
10
10
  [![PyPI - Version](https://img.shields.io/pypi/v/emx-onnx-cgen.svg)](https://pypi.org/project/emx-onnx-cgen)
11
11
 
12
- `emx-onnx-cgen` compiles ONNX models to portable, deterministic C code for deeply embedded systems. The generated code is designed to run without dynamic memory allocation, operating systems, or external runtimes, making it suitable for safety-critical and resource-constrained targets.
12
+ `emx-onnx-cgen` compiles ONNX models to portable, deterministic C code for deeply embedded systems. The generated code is designed to run without dynamic memory allocation, operating-system services, or external runtimes, making it suitable for safety-critical and resource-constrained targets.
13
13
 
14
14
  Key characteristics:
15
15
 
16
16
  - **No dynamic memory allocation** (`malloc`, `free`, heap usage)
17
17
  - **Static, compile-time known memory layout** for parameters, activations, and temporaries
18
18
  - **Deterministic control flow** (explicit loops, no hidden dispatch or callbacks)
19
- - **No OS or libc dependencies** beyond basic C
19
+ - **No OS dependencies**, using only standard C headers (for example, `stdint.h` and `stddef.h`)
20
20
  - **Single-threaded execution model**
21
21
  - **Bitwise-stable code generation** for reproducible builds
22
22
  - **Readable, auditable C code** suitable for certification and code reviews
@@ -47,7 +47,7 @@ Key characteristics:
47
47
  - `float`, `double`, `float16`
48
48
  - `int8_t`, `uint8_t`, `int16_t`, `uint16_t`, `int32_t`, `uint32_t`, `int64_t`, `uint64_t`
49
49
  - `bool`
50
- - Supporting dynamic dimensions by utilizing C99 variable-length arrays (VLAs).
50
+ - Optional support for dynamic dimensions using C99 variable-length arrays (VLAs), when the target compiler supports them.
51
51
 
52
52
  ## Installation
53
53
 
@@ -71,7 +71,7 @@ Compile an ONNX model into a C source file:
71
71
  emx-onnx-cgen compile path/to/model.onnx build/model.c
72
72
  ```
73
73
 
74
- Verify an ONNX model end-to-end against ONNX Runtime:
74
+ Verify an ONNX model end-to-end against ONNX Runtime (default):
75
75
 
76
76
  ```bash
77
77
  emx-onnx-cgen verify path/to/model.onnx
@@ -93,6 +93,8 @@ Options:
93
93
  - `--model-name`: Override the generated model name (default: output file stem).
94
94
  - `--emit-testbench`: Emit a JSON-producing `main()` testbench for validation.
95
95
  - `--emit-data-file`: Emit constant data arrays into a companion `_data` C file.
96
+ - `--large-weight-threshold`: Store weights larger than this element count in a binary file (default: `1048576`; set to `0` to disable).
97
+ - `--large-temp-threshold-bytes`: Mark temporary buffers larger than this threshold as static (default: `1024`).
96
98
  - `--no-restrict-arrays`: Disable `restrict` qualifiers on generated array parameters.
97
99
 
98
100
  ### `verify`
@@ -106,6 +108,26 @@ Options:
106
108
  - `--template-dir`: Directory containing the C templates (default: `templates`).
107
109
  - `--model-name`: Override the generated model name (default: model file stem).
108
110
  - `--cc`: Explicit C compiler command for building the testbench binary.
111
+ - `--large-weight-threshold`: Store weights larger than this element count in a binary file (default: `1024`).
112
+ - `--large-temp-threshold-bytes`: Mark temporary buffers larger than this threshold as static (default: `1024`).
113
+ - `--max-ulp`: Maximum allowed ULP distance for floating outputs (default: `100`).
114
+ - `--runtime`: Runtime backend for verification (`onnxruntime` or `onnx-reference`, default: `onnx-reference`).
115
+
116
+ How verification works:
117
+
118
+ 1. **Compile with a testbench**: the compiler is invoked with `--emit-testbench`,
119
+ generating a C program that runs the model and prints inputs/outputs as JSON.
120
+ 2. **Build and execute**: the testbench is compiled with the selected C compiler
121
+ (`--cc`, `CC`, or a detected `cc/gcc/clang`) and executed in a temporary
122
+ directory.
123
+ 3. **Run runtime backend**: the JSON inputs from the testbench are fed to the
124
+ selected runtime (`onnxruntime` or `onnx-reference`) using the same model.
125
+ 4. **Compare outputs**: floating outputs are compared by maximum ULP distance
126
+ (see https://www.emmtrix.com/wiki/ULP_Difference_of_Float_Numbers for the
127
+ ULP definition and algorithm); non-floating outputs must match exactly.
128
+ Missing outputs or mismatches are treated as failures.
129
+ 5. **ORT unsupported models**: when using `onnxruntime`, if ORT reports
130
+ `NOT_IMPLEMENTED`, verification is skipped with a warning (exit code 0).
109
131
 
110
132
  ## Output
111
133
 
@@ -113,15 +135,20 @@ By default, the compiler emits a single C source file that includes:
113
135
 
114
136
  - A generated entry point that mirrors the ONNX graph inputs/outputs.
115
137
  - Tensor buffers for constants and temporaries.
116
- - A lightweight runtime implemented via templates in `templates/`.
117
138
 
118
139
  When `--emit-data-file` is enabled, the main C source declares constant arrays
119
140
  as `extern`, and a second file named like the output with a `_data` suffix
120
141
  contains the constant definitions.
121
142
 
143
+ When `--large-weight-threshold` is set and a weight exceeds the threshold, the
144
+ compiler emits a `<model>.bin` file with weights packed contiguously and
145
+ generates a `<model>_load` helper that loads weights from the binary file at
146
+ runtime.
147
+
122
148
  ## Official ONNX test coverage
123
149
 
124
150
  See [`OFFICIAL_ONNX_FILE_SUPPORT.md`](OFFICIAL_ONNX_FILE_SUPPORT.md) for the generated support matrix.
151
+ See [`SUPPORT_OPS.md`](SUPPORT_OPS.md) for operator-level support derived from the expectation JSON files.
125
152
 
126
153
  ## Maintained by
127
154
 
@@ -0,0 +1,107 @@
1
+ emx_onnx_cgen/__init__.py,sha256=jUSbu1kJ0krzVTYEcph3jCprBhD7tWNtiSdL6r29KrM,221
2
+ emx_onnx_cgen/__main__.py,sha256=iC1lLVtR6-TmpL6OxXcy3oIntExUtajn9-q627R1XyI,140
3
+ emx_onnx_cgen/_build_info.py,sha256=UjOz9h7BLDTSfb-7Ezl4VZcyIqCD5aBHbjIspfGxTak,112
4
+ emx_onnx_cgen/_version.py,sha256=gGLpQUQx-ty9SEy9PYw9OgJWWzJLBnCpfJOfzL7SjlI,704
5
+ emx_onnx_cgen/cli.py,sha256=7Y9JW-t1PLg25zOizuqyMqwsXbbG9ok99DsYeFSiOFQ,21685
6
+ emx_onnx_cgen/compiler.py,sha256=qXKUQedaQY6A2jX-twte4qVA263T3UtCDlPjvoM5vYU,16513
7
+ emx_onnx_cgen/dtypes.py,sha256=jRx3BBvk0qFW14bngoL1B7L_IRasyNJ4jqhpM5YhcOM,1335
8
+ emx_onnx_cgen/errors.py,sha256=HpOv95mTgr9ZX2gYe1RtwVMbPskh7zkqjU_FgAD-uIM,363
9
+ emx_onnx_cgen/onnx_import.py,sha256=IF7KZGfEP9H4H1fHYjobGbB_381fqD_67KtqZYs9AZ4,9168
10
+ emx_onnx_cgen/onnxruntime_utils.py,sha256=mEsC1x00M1jyBgVBKqnKoqx6H1tdgsFFUy7rbITs3bs,308
11
+ emx_onnx_cgen/ops.py,sha256=qpPOaqsYprlJrhCNLVBZ3XnREBRDdmkXbd1zaAkywOI,16732
12
+ emx_onnx_cgen/testbench.py,sha256=-NbqD1aC7OXvFMLiLzd2IPObenQdHFH85cNxNSB1GeY,640
13
+ emx_onnx_cgen/validation.py,sha256=KFdUdGjQbzTj1szCJcjxnTi8f5l6ywNgCB9abbBpTbM,2360
14
+ emx_onnx_cgen/verification.py,sha256=IrhIMm29R2vEkW1Q8gtoQtscMGxfJRavNRSMJHBAJ5g,1041
15
+ emx_onnx_cgen/codegen/__init__.py,sha256=H_kBdc_w_W-3qdUZJHwKBDns1AeP_Un3-46LW20yLV0,406
16
+ emx_onnx_cgen/codegen/c_emitter.py,sha256=dS-vjjuWT0GHETbV3ipoYedvuvcJB0yGwMZgoQuJe-g,452931
17
+ emx_onnx_cgen/codegen/emitter.py,sha256=udcsqJNr46TFHiyVv5I4wdVH8ll6Bi4VqcR1VvofbnY,92
18
+ emx_onnx_cgen/ir/__init__.py,sha256=fD2D8qxlGoCFJb0m9v6u3XTgzSxDOhB4cfLBiCLovzg,102
19
+ emx_onnx_cgen/ir/context.py,sha256=cM3V6G3zs6VCsABP6TnZ8vvQ7VGwOF1iKtb1hq0WO3g,3356
20
+ emx_onnx_cgen/ir/model.py,sha256=SZ3K8t4dKUqWuXWe5ozApofXx4bdcf4p0WYCdeU-mFA,1265
21
+ emx_onnx_cgen/ir/op_base.py,sha256=mHvp0VD55JIrwQI2MFEmSILi22kuurBX085aamcjQ0g,6160
22
+ emx_onnx_cgen/ir/op_context.py,sha256=9CZCUNJLsV4cJsYmJqWbaDrwQd4sr-9Ot1PmPSqGAto,2103
23
+ emx_onnx_cgen/ir/ops/__init__.py,sha256=IcllGXB4T3TCrpBq9cy3jR_edS_IJ_qXac37K_rIZcA,2440
24
+ emx_onnx_cgen/ir/ops/elementwise.py,sha256=sZ1S6X_fagNDevN6dXHBy75g_z-WP_dHFAVmPGnmeaU,3721
25
+ emx_onnx_cgen/ir/ops/misc.py,sha256=1ekAgV5j6Stc1Yw8e-0EPD5t8mI1YJxmyIkAn9Zr4h8,10920
26
+ emx_onnx_cgen/ir/ops/nn.py,sha256=-4ZqDkcu7zgci3YVfMzCDzokqpZHgOYZaq_C1GclBZQ,14365
27
+ emx_onnx_cgen/ir/ops/reduce.py,sha256=-aA4bwOMppd9pnWQwhl6hOxryh0G2xRaHqeNwQ97AdY,2756
28
+ emx_onnx_cgen/lowering/__init__.py,sha256=AxnUfmpf5Teos1ms3zE6r0EBxxPYznGSOICDEFWH_pk,1535
29
+ emx_onnx_cgen/lowering/adagrad.py,sha256=DuW3MeNNJjhXz1k7XI9JDwfgWr-TyD5Q-B9eAZrNecM,4797
30
+ emx_onnx_cgen/lowering/arg_reduce.py,sha256=7dvlOItEp_Mtxj-lohI_mNRqHFZZnGCsdfx8ON0i2F0,3377
31
+ emx_onnx_cgen/lowering/attention.py,sha256=-Il_8AQMuwQtq-2-RkVyVfnvtRJuO61Cv1PlMIypxEc,16477
32
+ emx_onnx_cgen/lowering/average_pool.py,sha256=kcaOBPNaVMITY7gprbJSIMRrwhgIbeI3OEVxzO1xRM0,8074
33
+ emx_onnx_cgen/lowering/batch_normalization.py,sha256=_i-vwlhuAQYqxJIezHaxeqcmISV66Y_5o929_FTtMZg,3976
34
+ emx_onnx_cgen/lowering/cast.py,sha256=J2Tf7MprIcZjsgVLGsaccpbyvftfXfm57o--Il-8GlQ,2841
35
+ emx_onnx_cgen/lowering/common.py,sha256=lQVBapOlo3w0ats2R2kPwftuTYMc8aAsQuLWrcQQ_pM,16783
36
+ emx_onnx_cgen/lowering/concat.py,sha256=aY1QjCBzmyxDmfybyzRRSEPiL3hR1JwtCCXvHA7vFDE,1086
37
+ emx_onnx_cgen/lowering/constant_of_shape.py,sha256=N01UvbVroDk08FTbBMndrLYIzI0G6M0UQuCr4oxpP40,3197
38
+ emx_onnx_cgen/lowering/conv.py,sha256=9VFdsChsJ_AL25mhe2H482Aa2-89-S1dSJpiu7ixgQg,7298
39
+ emx_onnx_cgen/lowering/conv_transpose.py,sha256=10K7nhQ60p0PAB3qxmeazm2tbsSS1GDeINBk7VzsH1U,11153
40
+ emx_onnx_cgen/lowering/cumsum.py,sha256=9E0C5NtvPt6g5T4QLdIOeDkXaZNzyDklus2-qu2B7eA,4114
41
+ emx_onnx_cgen/lowering/depth_space.py,sha256=i7INioNkofBxFlZW9y0W_qA6mp67_FAXouhKCiB9RKc,4206
42
+ emx_onnx_cgen/lowering/dropout.py,sha256=MZ4YrB-jvUFXpIKE5kOLyrEF5uy5dh0yjJH6Rj8KlMs,1764
43
+ emx_onnx_cgen/lowering/einsum.py,sha256=MWAgWVOzP38RSOxJABwvYU6ykD9odmhrmddXinmFs7s,6117
44
+ emx_onnx_cgen/lowering/elementwise.py,sha256=q9X3qTll7gLp39NTTdzuLs9RBsONssw50l1hWo8wby0,12229
45
+ emx_onnx_cgen/lowering/expand.py,sha256=GmYJZWXXcBV42hMGUgbKKbLjeCxpbcMSoG9OU1ZkFFY,5518
46
+ emx_onnx_cgen/lowering/eye_like.py,sha256=QBiHWYZbgK4uiUYWuS7WHCMBGMSG0paNZM84OYmGb7c,1723
47
+ emx_onnx_cgen/lowering/flatten.py,sha256=6h-TQNy9iq5hfXR9h2clUrc2eHmZP9gAb9KbCSJdV20,2131
48
+ emx_onnx_cgen/lowering/gather.py,sha256=PCER36AjmpxzAM4wuL7En3XR1RKZCdSzjxualDCUHAI,1803
49
+ emx_onnx_cgen/lowering/gather_elements.py,sha256=cCp2UFOjktgEfS9s9npMS_BXklBkpMpD7UhIIMhQ-_Y,2318
50
+ emx_onnx_cgen/lowering/gather_nd.py,sha256=rmr_ijeSeCrZ_R_QPwdoHPQUCe8nE0YRSv2NjUiiFjY,3090
51
+ emx_onnx_cgen/lowering/gemm.py,sha256=qBaZ-6FZAAMEaZ4uifo58tJI8SoBsJvkZTCg7jvq288,4579
52
+ emx_onnx_cgen/lowering/global_max_pool.py,sha256=RMjaspdwThsHFGq_CJ2lUo5MOZc4NtmG-W5zshhc85A,2212
53
+ emx_onnx_cgen/lowering/grid_sample.py,sha256=FFbK-jrjqFLwSUu7BfSZC9So7MeCZprGKG5N4XQUxR4,5217
54
+ emx_onnx_cgen/lowering/group_normalization.py,sha256=Ep7toUW9sHvMHb2EwNpgayygTW-TN62ooVLdaF0z9_c,2653
55
+ emx_onnx_cgen/lowering/hardmax.py,sha256=PKY7w_4N6qzJq_l1O3le8J-uspPPK3Ujpl6Kdmt4tOU,1950
56
+ emx_onnx_cgen/lowering/identity.py,sha256=zzmmSz1NTiRAPIZqU81qnNQFuuSJq6EvqbUOt1Hc3gA,1848
57
+ emx_onnx_cgen/lowering/instance_normalization.py,sha256=XrDOAo8Af7yDObtAAJ006dVCN175cWPb5Wvh61PE7xs,1939
58
+ emx_onnx_cgen/lowering/layer_normalization.py,sha256=RjRn1sPFupB8n3RsA8O9p5vDmfmj2Q6hjMVhSFzfLkU,4518
59
+ emx_onnx_cgen/lowering/logsoftmax.py,sha256=giFEKQKN7xxlQqV64HNvO1QQobjM-IgavWJi7DT5pJk,1884
60
+ emx_onnx_cgen/lowering/lp_normalization.py,sha256=il1fBWan8DwZ3dlRVSJWVhMpzHDYtwjh1YJaNm6palY,1701
61
+ emx_onnx_cgen/lowering/lp_pool.py,sha256=aG-J6xwhprMJIXTNXwA781XfbBnUD0oh9_POwwEEAe4,4862
62
+ emx_onnx_cgen/lowering/lrn.py,sha256=rJ_7ISllYphbHKmlMv3c5IwqPl-oZrEKWux7QCdjqIQ,3359
63
+ emx_onnx_cgen/lowering/lstm.py,sha256=RVe0qGesoK-FfWeV0vCKCkoWD32Fv_C22LnQLFLr4Tc,12294
64
+ emx_onnx_cgen/lowering/matmul.py,sha256=CpxloKLXX7u5SofOTYUTt8vU9IkD7h25VByQbLwkGiw,4248
65
+ emx_onnx_cgen/lowering/maxpool.py,sha256=0XoazajqrB5So-hEnR73LOSsdF7ZnguVNAc9NSjK6Q4,7483
66
+ emx_onnx_cgen/lowering/mean_variance_normalization.py,sha256=tFeDgrocZO5Q5hNBaFl4cTFpKTPNVmRH9-FZircEffA,1864
67
+ emx_onnx_cgen/lowering/negative_log_likelihood_loss.py,sha256=J5VfAQN2bIrt8D4_6KIGxRBk4Q9ykJvlqJftCrqy-jc,9333
68
+ emx_onnx_cgen/lowering/non_max_suppression.py,sha256=9EeHm2aF7QBmP-s23r43VDgRvGyFWcNcI1s_jYPqln0,5749
69
+ emx_onnx_cgen/lowering/nonzero.py,sha256=qjDlI_0s37hK-arOD-Bm_Ft9N_gTVt0X3OEqxuP1sR0,1626
70
+ emx_onnx_cgen/lowering/one_hot.py,sha256=JGJsA35Q5hyX7nutNVJMGgTgcFxlAlolH9k4igVc2s0,4341
71
+ emx_onnx_cgen/lowering/pad.py,sha256=Z8361NQCwypKfTnS8-0rylX6P-S8xLU6QLbahVzxrzw,10405
72
+ emx_onnx_cgen/lowering/qlinear_matmul.py,sha256=gsV8CAB9_PhPuCGBYEvqfhby3uHQ6-4lyfDI2Xgvw0c,7899
73
+ emx_onnx_cgen/lowering/quantize_linear.py,sha256=yJOvZbGxI8HcZ_Zl9VO49qJVfZ5FwNoDq5TjTiGzKmg,4760
74
+ emx_onnx_cgen/lowering/range.py,sha256=yaRvLHLlWNvvg-IO590jSVPv2dWrJjPWXyysSNOj0IY,3452
75
+ emx_onnx_cgen/lowering/reduce.py,sha256=W_wa1ev2tD8gqSTTQX5K0brwvB_x1kqf9vo8R5HHN6k,18402
76
+ emx_onnx_cgen/lowering/registry.py,sha256=tNmnP6ZhIrKv83Q6VdfkTLSsw6P8cqch-nqSWpURYX8,2002
77
+ emx_onnx_cgen/lowering/reshape.py,sha256=L5h-u7DbrRzuPucDFwXw-oCX8bikD9R2RBkz9lTwEBM,13441
78
+ emx_onnx_cgen/lowering/resize.py,sha256=XCTUppSDj9-GyztBORIuK1MJMxelA3DU_NZzfsVIlgQ,14633
79
+ emx_onnx_cgen/lowering/rms_normalization.py,sha256=pWu5u0TqHZaL3rh07MtA6eOP0zLzNCoQ84f1V0un2Iw,2525
80
+ emx_onnx_cgen/lowering/rotary_embedding.py,sha256=IfDxuUCJqFIK8SCviYXZfdJcrgg8tjT2ofYFUP2uv8c,6068
81
+ emx_onnx_cgen/lowering/scatter_nd.py,sha256=WuNxsMQmCTXgqen5rygpAbZIsfca537lvvFPakn0rJU,3210
82
+ emx_onnx_cgen/lowering/shape.py,sha256=r68BQSK2ldY6ct3iPfkpJsGySmaViOGqn3Mi3qoPTTM,2224
83
+ emx_onnx_cgen/lowering/size.py,sha256=Mfj2x0zvDrhMAcmhXI5F63dzd3w3ZT2IxfI0jMbTSuQ,1250
84
+ emx_onnx_cgen/lowering/slice.py,sha256=rMzmQ5nwaM8oJVmChOeVHPJn0qMXYpKZCPzO_eoEj_M,14805
85
+ emx_onnx_cgen/lowering/softmax.py,sha256=mImrc0oeFpMywsx94PdDS1aQVj7DUgqoFhjsMjLLDdk,1863
86
+ emx_onnx_cgen/lowering/softmax_cross_entropy_loss.py,sha256=B6h23sGBZLdpKcbtoQUhVwfLrdSJwNcbCoPoDc3rTc0,5219
87
+ emx_onnx_cgen/lowering/split.py,sha256=w4OPi4X-xoJgmTJuCTIfp0Dm7wd2NLZZ6AJM-jUROFg,5883
88
+ emx_onnx_cgen/lowering/squeeze.py,sha256=p9bER1Jkc8_6BGjsD3b7zhuak11eywoQhVFIvJ9Vzj0,6084
89
+ emx_onnx_cgen/lowering/tensor_scatter.py,sha256=1Wqb9XsNNj1CEKnH3Vx45xh3QQbxHF9L90ycVbcsy44,4485
90
+ emx_onnx_cgen/lowering/tile.py,sha256=PJva752IM55f8evZzOz12Y7PUGsQ0kC_YR86SqowWqM,3030
91
+ emx_onnx_cgen/lowering/topk.py,sha256=Dqx7qMr4HbXhVGN-wJf_D4dPTvYMVT6S82A2M3f9Dwo,4819
92
+ emx_onnx_cgen/lowering/transpose.py,sha256=oNFRjkH63KqnO2Q4oJengEAUEYC1M3PW12AauWwebzI,1751
93
+ emx_onnx_cgen/lowering/trilu.py,sha256=OjJjyo2ZRcfo9UGH8Zfq4o0PR6YDeoHSj8DzMu0w318,3266
94
+ emx_onnx_cgen/lowering/unsqueeze.py,sha256=9y-OM-oY6ln1-R6duRRemeRrwBIpX2TZs_nRtlYQMYE,5985
95
+ emx_onnx_cgen/lowering/variadic.py,sha256=etIWA7jVqWrWH3NkNvpF5opVGgvb0ZS4iLo4L3euWDs,3287
96
+ emx_onnx_cgen/lowering/where.py,sha256=K2RUDvLg0uTvi6Z_uTOXM5jgc3PXRj0cTZ4u58GEGko,2644
97
+ emx_onnx_cgen/runtime/__init__.py,sha256=88xGpAs1IEBlzlWL_e9tnKUlaSRdc7pQUeVCu5LC4DY,50
98
+ emx_onnx_cgen/runtime/evaluator.py,sha256=yqsBpAIlBky-rby7J5z7i1SvDaK6PjObxH-wQSdZ2G0,114732
99
+ shared/__init__.py,sha256=bmP79AVZdY_1aNULJap9pm76Q41Rabrza6X-0A8lDzw,45
100
+ shared/scalar_functions.py,sha256=CErro1Du2Ri3uqX6Dgd18DzNbxduckAvsmLJ6oHGx9A,91123
101
+ shared/scalar_types.py,sha256=kEpsl5T-NVFxCcTzXqPJbtpvDiCgKHfz91dphLLZxZA,4912
102
+ shared/ulp.py,sha256=DpeovCFijmP8_M7zyTZWsNyfOtJ1AjNSdxf5jGsdfJo,1856
103
+ emx_onnx_cgen-0.3.1.dist-info/METADATA,sha256=CRqsDQzG05b3ksDd12Ym6vKtLtqrGd3V63Vs2HPQyG8,6266
104
+ emx_onnx_cgen-0.3.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
105
+ emx_onnx_cgen-0.3.1.dist-info/entry_points.txt,sha256=b7Rvmz_Bi9kWyn7QayQC_FEXiRpt4cS1RnluKh49yoo,57
106
+ emx_onnx_cgen-0.3.1.dist-info/top_level.txt,sha256=g39fo-blEbgiVcC_GRqAnBzN234w3LXbcVdLUoItSLk,21
107
+ emx_onnx_cgen-0.3.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, field
4
4
  from enum import Enum
5
5
  import math
6
6
  from typing import Callable, Dict, List, Mapping, Set
@@ -26,6 +26,7 @@ class _GeneratedScalar:
26
26
  lines: List[str]
27
27
  deps: Set[ScalarFunctionKey]
28
28
  includes: Set[str]
29
+ constants: Set[str] = field(default_factory=set)
29
30
 
30
31
 
31
32
  def _scalar_function_spec(
@@ -396,6 +397,7 @@ _ONNX_OP_TO_SCALAR_FUNCTION = {
396
397
  "Max": ScalarFunction.MAXIMUM,
397
398
  "Mean": ScalarFunction.MEAN,
398
399
  "Min": ScalarFunction.MINIMUM,
400
+ "Mish": ScalarFunction.MISH,
399
401
  "Mod": ScalarFunction.FMOD,
400
402
  "Mul": ScalarFunction.MUL,
401
403
  "Neg": ScalarFunction.NEG,
@@ -1071,7 +1073,7 @@ def _float_sign(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
1071
1073
 
1072
1074
 
1073
1075
  def _float_round(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
1074
- return _float_unary_math(dtype_info, "round", "round")
1076
+ return _float_unary_math(dtype_info, "round", "rint")
1075
1077
 
1076
1078
 
1077
1079
  def _float_trunc(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
@@ -1089,7 +1091,7 @@ def _float_angle(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
1089
1091
  f" return a < {zero} ? {pi} : {zero};",
1090
1092
  "}",
1091
1093
  ]
1092
- return _GeneratedScalar(lines=lines, deps=set(), includes=set())
1094
+ return _GeneratedScalar(lines=lines, deps=set(), includes=set(), constants={pi})
1093
1095
 
1094
1096
 
1095
1097
  def _float_conj(dtype_info: _ScalarTypeInfo, name: str) -> _GeneratedScalar:
@@ -1099,13 +1101,25 @@ def _float_conj(dtype_info: _ScalarTypeInfo, name: str) -> _GeneratedScalar:
1099
1101
  def _float_deg2rad(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
1100
1102
  pi = "REF_PI_F" if dtype_info.suffix == "f32" else "REF_PI_D"
1101
1103
  one_eighty = _float_literal(180.0, dtype_info)
1102
- return _simple_unary(dtype_info, "deg2rad", f"a * ({pi} / {one_eighty})")
1104
+ generated = _simple_unary(dtype_info, "deg2rad", f"a * ({pi} / {one_eighty})")
1105
+ return _GeneratedScalar(
1106
+ lines=generated.lines,
1107
+ deps=generated.deps,
1108
+ includes=generated.includes,
1109
+ constants={pi},
1110
+ )
1103
1111
 
1104
1112
 
1105
1113
  def _float_rad2deg(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
1106
1114
  pi = "REF_PI_F" if dtype_info.suffix == "f32" else "REF_PI_D"
1107
1115
  one_eighty = _float_literal(180.0, dtype_info)
1108
- return _simple_unary(dtype_info, "rad2deg", f"a * ({one_eighty} / {pi})")
1116
+ generated = _simple_unary(dtype_info, "rad2deg", f"a * ({one_eighty} / {pi})")
1117
+ return _GeneratedScalar(
1118
+ lines=generated.lines,
1119
+ deps=generated.deps,
1120
+ includes=generated.includes,
1121
+ constants={pi},
1122
+ )
1109
1123
 
1110
1124
 
1111
1125
  def _float_digamma_f64() -> _GeneratedScalar:
@@ -1135,7 +1149,9 @@ def _float_digamma_f64() -> _GeneratedScalar:
1135
1149
  " return result;",
1136
1150
  "}",
1137
1151
  ]
1138
- return _GeneratedScalar(lines=lines, deps=set(), includes=set())
1152
+ return _GeneratedScalar(
1153
+ lines=lines, deps=set(), includes=set(), constants={"REF_PI_D"}
1154
+ )
1139
1155
 
1140
1156
 
1141
1157
  def _float_digamma(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
@@ -1186,7 +1202,7 @@ def _float_erfinv(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
1186
1202
  " return approx;",
1187
1203
  "}",
1188
1204
  ]
1189
- return _GeneratedScalar(lines=lines, deps=set(), includes=set())
1205
+ return _GeneratedScalar(lines=lines, deps=set(), includes=set(), constants={pi})
1190
1206
 
1191
1207
 
1192
1208
  def _float_frac(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
@@ -1288,7 +1304,7 @@ def _float_sinc(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
1288
1304
  f" return {_math_fn('sin', dtype_info)}(x) / x;",
1289
1305
  "}",
1290
1306
  ]
1291
- return _GeneratedScalar(lines=lines, deps=set(), includes=set())
1307
+ return _GeneratedScalar(lines=lines, deps=set(), includes=set(), constants={pi})
1292
1308
 
1293
1309
 
1294
1310
  def _float_square(dtype_info: _ScalarTypeInfo) -> _GeneratedScalar:
@@ -2043,6 +2059,17 @@ def _bool_from_ops(name: str) -> _GeneratedScalar:
2043
2059
 
2044
2060
 
2045
2061
  _SCALAR_TYPES: Dict[ScalarType, _ScalarTypeInfo] = {
2062
+ ScalarType.F16: _ScalarTypeInfo(
2063
+ scalar_type=ScalarType.F16,
2064
+ c_type="_Float16",
2065
+ prefix="ref_scalar_f16_",
2066
+ suffix="f16",
2067
+ is_float=True,
2068
+ is_bool=False,
2069
+ is_signed=True,
2070
+ is_small_int=False,
2071
+ bits=None,
2072
+ ),
2046
2073
  ScalarType.F32: _ScalarTypeInfo(
2047
2074
  scalar_type=ScalarType.F32,
2048
2075
  c_type="float",
@@ -2285,7 +2312,12 @@ def _generate_scalar(key: ScalarFunctionKey) -> _GeneratedScalar:
2285
2312
  includes.add("#include <limits.h>")
2286
2313
  if dtype_info.is_bool:
2287
2314
  includes.add("#include <stdbool.h>")
2288
- return _GeneratedScalar(lines=generated.lines, deps=generated.deps, includes=includes)
2315
+ return _GeneratedScalar(
2316
+ lines=generated.lines,
2317
+ deps=generated.deps,
2318
+ includes=includes,
2319
+ constants=generated.constants,
2320
+ )
2289
2321
 
2290
2322
 
2291
2323
  def _function_name_for_key(key: ScalarFunctionKey) -> str:
@@ -2352,6 +2384,7 @@ class ScalarFunctionRegistry:
2352
2384
  def include_lines(self) -> List[str]:
2353
2385
  includes: Set[str] = set()
2354
2386
  visited: Set[ScalarFunctionKey] = set()
2387
+ constants: Set[str] = set()
2355
2388
 
2356
2389
  def collect(key: ScalarFunctionKey) -> None:
2357
2390
  if key in visited:
@@ -2362,18 +2395,28 @@ class ScalarFunctionRegistry:
2362
2395
  for dep in entry.deps:
2363
2396
  collect(dep)
2364
2397
  includes.update(entry.includes)
2398
+ constants.update(entry.constants)
2365
2399
 
2366
2400
  for key in self._requested:
2367
2401
  collect(key)
2368
2402
  ordered = sorted(includes)
2369
- preamble = [
2370
- "#ifndef REF_PI_F",
2371
- "#define REF_PI_F 3.14159265358979323846f",
2372
- "#endif",
2373
- "#ifndef REF_PI_D",
2374
- "#define REF_PI_D 3.14159265358979323846",
2375
- "#endif",
2376
- ]
2403
+ preamble: List[str] = []
2404
+ if "REF_PI_F" in constants:
2405
+ preamble.extend(
2406
+ [
2407
+ "#ifndef REF_PI_F",
2408
+ "#define REF_PI_F 3.14159265358979323846f",
2409
+ "#endif",
2410
+ ]
2411
+ )
2412
+ if "REF_PI_D" in constants:
2413
+ preamble.extend(
2414
+ [
2415
+ "#ifndef REF_PI_D",
2416
+ "#define REF_PI_D 3.14159265358979323846",
2417
+ "#endif",
2418
+ ]
2419
+ )
2377
2420
  return ordered + preamble
2378
2421
 
2379
2422
  def render(self) -> List[str]:
shared/ulp.py ADDED
@@ -0,0 +1,65 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Dict
4
+
5
+ import numpy as np
6
+
7
+ from shared.scalar_types import ScalarFunctionError
8
+
9
+ _FLOAT_TO_UINT: Dict[np.dtype, np.dtype] = {
10
+ np.dtype("float16"): np.dtype("uint16"),
11
+ np.dtype("float32"): np.dtype("uint32"),
12
+ np.dtype("float64"): np.dtype("uint64"),
13
+ }
14
+
15
+
16
+ def _coerce_float_scalar(value: object, dtype: np.dtype) -> np.ndarray:
17
+ return np.asarray(value, dtype=dtype).reshape(())
18
+
19
+
20
+ def _ulp_intdiff_same_sign(
21
+ f1: np.ndarray, f2: np.ndarray, uint_dtype: np.dtype
22
+ ) -> int:
23
+ i1 = f1.view(uint_dtype).item()
24
+ i2 = f2.view(uint_dtype).item()
25
+ return int(i1 - i2) if i1 > i2 else int(i2 - i1)
26
+
27
+
28
+ def ulp_intdiff_float(f1: object, f2: object) -> int:
29
+ dtype = np.result_type(f1, f2)
30
+ try:
31
+ uint_dtype = _FLOAT_TO_UINT[dtype]
32
+ except KeyError as exc:
33
+ raise ScalarFunctionError(
34
+ f"unsupported dtype for ULP diff: {dtype}"
35
+ ) from exc
36
+
37
+ f1_scalar = _coerce_float_scalar(f1, dtype)
38
+ f2_scalar = _coerce_float_scalar(f2, dtype)
39
+ f1_nan = bool(np.isnan(f1_scalar))
40
+ f2_nan = bool(np.isnan(f2_scalar))
41
+ if f1_nan and f2_nan:
42
+ return 0
43
+ if f1_nan or f2_nan:
44
+ return max_ulp_value(dtype)
45
+
46
+ if np.signbit(f1_scalar) != np.signbit(f2_scalar):
47
+ zero = _coerce_float_scalar(0.0, dtype)
48
+ return (
49
+ ulp_intdiff_float(zero, np.abs(f1_scalar))
50
+ + ulp_intdiff_float(zero, np.abs(f2_scalar))
51
+ + 1
52
+ )
53
+
54
+ return _ulp_intdiff_same_sign(f1_scalar, f2_scalar, uint_dtype)
55
+
56
+
57
+ def max_ulp_value(dtype: np.dtype) -> int:
58
+ dtype = np.dtype(dtype)
59
+ try:
60
+ uint_dtype = _FLOAT_TO_UINT[dtype]
61
+ except KeyError as exc:
62
+ raise ScalarFunctionError(
63
+ f"unsupported dtype for ULP diff: {dtype}"
64
+ ) from exc
65
+ return int(np.iinfo(uint_dtype).max)
@@ -1,76 +0,0 @@
1
- emx_onnx_cgen/__init__.py,sha256=jUSbu1kJ0krzVTYEcph3jCprBhD7tWNtiSdL6r29KrM,221
2
- emx_onnx_cgen/__main__.py,sha256=iC1lLVtR6-TmpL6OxXcy3oIntExUtajn9-q627R1XyI,140
3
- emx_onnx_cgen/_build_info.py,sha256=tp1Kzo4PNvj3ydRSCdr84YUd2wEUVUopl7AoaJfOaHk,112
4
- emx_onnx_cgen/cli.py,sha256=2eQ6JxfdamiLDqo-ZfZNnnb1a1I7NTEvecfUJaAA_3M,11024
5
- emx_onnx_cgen/compiler.py,sha256=foB9JK1Z2NRcRg_Fn-kL9K7L7tKGWxI9-kaMbYg3dnM,20877
6
- emx_onnx_cgen/dtypes.py,sha256=jRx3BBvk0qFW14bngoL1B7L_IRasyNJ4jqhpM5YhcOM,1335
7
- emx_onnx_cgen/errors.py,sha256=HpOv95mTgr9ZX2gYe1RtwVMbPskh7zkqjU_FgAD-uIM,363
8
- emx_onnx_cgen/onnx_import.py,sha256=aMvSxT3ycg4UmnutWYvsQpzGt2m_KpNnDIiddlg-vDA,9028
9
- emx_onnx_cgen/ops.py,sha256=pW3ks2EJITiJxvThfU58KjQZE7AFUiPmMwKZRCNb1mY,16586
10
- emx_onnx_cgen/validation.py,sha256=KFdUdGjQbzTj1szCJcjxnTi8f5l6ywNgCB9abbBpTbM,2360
11
- emx_onnx_cgen/codegen/__init__.py,sha256=-_sxL87uyAIunaetjUvIUo2bc46ugVlaNtSsidegMRM,362
12
- emx_onnx_cgen/codegen/c_emitter.py,sha256=gCgbqTgDWGAmp7H8TCFPBKp7DCNb_nskkMCAzKwDG0Y,337438
13
- emx_onnx_cgen/ir/__init__.py,sha256=fD2D8qxlGoCFJb0m9v6u3XTgzSxDOhB4cfLBiCLovzg,102
14
- emx_onnx_cgen/ir/model.py,sha256=e8vRA0RNDU8Ioz3TXQKpdUhDtUK6Hm71KouUPMhCcpg,1213
15
- emx_onnx_cgen/lowering/__init__.py,sha256=wrxLMWcPUH1RbPJOs0Tsdb12FhXjAAeZVDYwKqcIuzw,103
16
- emx_onnx_cgen/lowering/arg_reduce.py,sha256=2AowDRCJRkIvrVBphbA0rM18oCWEpCDEV5Y4K9wSDII,3388
17
- emx_onnx_cgen/lowering/attention.py,sha256=19Jq_k0DXwH71a3pmLTWCNMttmw5uuiNK6Jhln5HC4A,16488
18
- emx_onnx_cgen/lowering/average_pool.py,sha256=9kg3pYHG7QLid_M2dbleC1VoNlVlGsKdOrsWp3pt7sc,8085
19
- emx_onnx_cgen/lowering/batch_normalization.py,sha256=_aFCm4QaC5jH-JNEvqDFYOyAMdzgUFS_3Gmo1vdPyKE,3987
20
- emx_onnx_cgen/lowering/cast.py,sha256=zKiE4wI7oWP_TjxBV4fY3-FXvZxK2zy58O6tWJ2dODQ,2852
21
- emx_onnx_cgen/lowering/common.py,sha256=4w9kjKW3_LilOGgmXYcUGg5lohbYsaLudoL4ALoDUkk,2356
22
- emx_onnx_cgen/lowering/concat.py,sha256=TefckPfuaIHVHxGExJiO9wlkjyRO1TGg-QAMeoW8hW0,1097
23
- emx_onnx_cgen/lowering/constant_of_shape.py,sha256=btQflQFMP_y22sK7RrhkbGdaeSSLPC_DWhLjxY7CAgk,3208
24
- emx_onnx_cgen/lowering/conv.py,sha256=I1_tssw_ySf4beKV0sCVe8DRhNxL58PqC0wxtWjD79s,7309
25
- emx_onnx_cgen/lowering/cumsum.py,sha256=eX0bDtwY-qevz0KXNHtJaDiKUUHIOhDX0uDiSxcC0ZU,4125
26
- emx_onnx_cgen/lowering/depth_space.py,sha256=M4md379jiumGWmg7EgR-CinoPzwof2RdfOiNqOzxd9o,4217
27
- emx_onnx_cgen/lowering/dropout.py,sha256=oBKPMN-J9Gnw8dRXvf-bN15L1-5W7-qKhR72Z6AgLXQ,1775
28
- emx_onnx_cgen/lowering/elementwise.py,sha256=HN6vEW58lceYECp-7QWLCWOBo1ImyY66aZIg06nA5g8,6231
29
- emx_onnx_cgen/lowering/expand.py,sha256=4msnYM-6RnzMplQqde2ovOLsjmWQ4bnXEoUiEM6CT6k,5529
30
- emx_onnx_cgen/lowering/eye_like.py,sha256=76HEdT-EofDCCy7DewjIpILJdIJyJ-YVCbLXO54SX5E,1734
31
- emx_onnx_cgen/lowering/flatten.py,sha256=sGol05FDN0xoNgSl_DlVbjYvBHCHWjQC2KB15ytYfPs,2142
32
- emx_onnx_cgen/lowering/gather.py,sha256=9zMB9fcdJi1fkTmDs_-L6FvQi1fnhdk0h7RmeN5MP2M,1814
33
- emx_onnx_cgen/lowering/gather_elements.py,sha256=0E-WAge15HhGeWPRC_ZE94fb9C6LIoef8p5D1usWvBQ,2358
34
- emx_onnx_cgen/lowering/gemm.py,sha256=Ps2T4tZgXr5FObz5figwbLZq-Njzg44iBQ9cFmvH78k,4590
35
- emx_onnx_cgen/lowering/grid_sample.py,sha256=Ne-97ljxSdqfjBJtVHp2AQnEeXGQ5HE-HegCoxcNCm0,5228
36
- emx_onnx_cgen/lowering/group_normalization.py,sha256=RqXud5_xNxMu8DP5EsPr4L2b6CZghQWCcG6Bh1x2gMA,2664
37
- emx_onnx_cgen/lowering/identity.py,sha256=fn1Tg56xACwAjhesy0wyr9TJjCmmddnd8QrQ4-uCdO0,1843
38
- emx_onnx_cgen/lowering/instance_normalization.py,sha256=1Yx2KPKq_BHberCBTrGQXQswAS0FfDle9NpyeD41ypU,1950
39
- emx_onnx_cgen/lowering/layer_normalization.py,sha256=ZvqGZOhuoYh8ZPyzb-PV0kIc2bbunWTYj12wmrGu9YY,4529
40
- emx_onnx_cgen/lowering/logsoftmax.py,sha256=1FEaX45GdDr6jIdS_sOwXOy_DdVDruZem4yZ9XA4a38,1669
41
- emx_onnx_cgen/lowering/lp_normalization.py,sha256=61CGS-2yN0bf5dby5b7Ug1PH3CStZN1xZmYWa5TysTI,1712
42
- emx_onnx_cgen/lowering/lrn.py,sha256=zGw1Jk7iBk1jHdjdDqfAREsV5VcSdOG3LcAmEllIB08,3370
43
- emx_onnx_cgen/lowering/lstm.py,sha256=JhGxiF3bTSY3flkw_u9mil2esRxvIjr5Tc4vSPULDr4,12305
44
- emx_onnx_cgen/lowering/matmul.py,sha256=NEfBa140ofpgm9xnqUBulMSA-yQlb29F2NqhCJpmKSY,4262
45
- emx_onnx_cgen/lowering/maxpool.py,sha256=MRLeoCEdIwO8JNWOi7iKoeIsJvukqpx_w6GCHaDaYHU,7494
46
- emx_onnx_cgen/lowering/mean_variance_normalization.py,sha256=L_6ECH9wPEnNX2mL6yroZRexZM8JV5ZnJvoPQS6IAuc,1875
47
- emx_onnx_cgen/lowering/negative_log_likelihood_loss.py,sha256=wMWvJ9ymkA-ptFgqx0VmHAJHS5NVvDeo2GAlrECztJ8,9307
48
- emx_onnx_cgen/lowering/pad.py,sha256=cNlh-rA3CRPfO-u8gvJ1MeF1j-vdBMXLuJBpp2DkFTc,10416
49
- emx_onnx_cgen/lowering/range.py,sha256=xLbG3SGvQiboPqSIh5qZyw3Krbxjk0nd3YvRlUI_q64,3463
50
- emx_onnx_cgen/lowering/reduce.py,sha256=XRxPopJCU9FGd1XmdxCZickmSTEvmkpAgLUPDFfjRm0,18431
51
- emx_onnx_cgen/lowering/registry.py,sha256=rKyWnLDBFHJbHw-iyOtXv2Qc5LEBCwgopUXewvQpEpg,1392
52
- emx_onnx_cgen/lowering/reshape.py,sha256=SF46eP95Z19PT67ayJDKW1fwllBWEZmGfXAL5q9wy-I,6881
53
- emx_onnx_cgen/lowering/resize.py,sha256=J_x53hVHlfJemLwEhq5n_11Pe1TlF9nRMEpkw6IpzN8,14644
54
- emx_onnx_cgen/lowering/rms_normalization.py,sha256=_H56Pf9T80FYbmy1m3oc7_D5TbNxRrVeJScD5VmLZRo,2536
55
- emx_onnx_cgen/lowering/shape.py,sha256=Vvd2zQB06wZcEe4mW5WBRrQuVF8f_tXSM9fpGxe9PEo,2913
56
- emx_onnx_cgen/lowering/size.py,sha256=Z_DTevdpx2W_3k0GoyQ2uWE3ms_PN1d_Ti7hh6HhB1Q,1261
57
- emx_onnx_cgen/lowering/slice.py,sha256=yHm_mXeHcLufDmVNvj_kv08zMdbvI39ViHcE-tVPKa0,14816
58
- emx_onnx_cgen/lowering/softmax.py,sha256=ZaOZf00f5PNHRjSki08Fv-iod6UgqL7cmblfpE_OQRU,1648
59
- emx_onnx_cgen/lowering/softmax_cross_entropy_loss.py,sha256=I0pbWyJdnf-9vAuX8-xsnovDKDGxynlBhfj5k_IVIa4,5230
60
- emx_onnx_cgen/lowering/split.py,sha256=ImGnsqrl7IdWbPTPazfXYjcsoRoziqsqtJBum12xTXY,5894
61
- emx_onnx_cgen/lowering/squeeze.py,sha256=rgICFprcWhC03h-GXZNaIQsdFjsqyxybJYtPklTfaYM,6086
62
- emx_onnx_cgen/lowering/tile.py,sha256=fT-ybiBZfb4bqBAPrCORZCNm3KWeu4rRW2BJ_UVIVZU,3041
63
- emx_onnx_cgen/lowering/transpose.py,sha256=TrRXUt-4UFNHZWaOpS3N5zEz5-OCK6-twZdlrnw7Pqg,1762
64
- emx_onnx_cgen/lowering/unsqueeze.py,sha256=sE3vribz8EyHqDG8lEcreKII7rQDElnHf1OpoM5HiAo,5987
65
- emx_onnx_cgen/lowering/variadic.py,sha256=hmPzRIj0kcZriGRTR2ma1YMH9g21K_4f-3FXw6qO3jE,3298
66
- emx_onnx_cgen/lowering/where.py,sha256=uiaWU9RM6o-n38N0AEINIkXS33yVK3-ohkfKIApJOoA,2655
67
- emx_onnx_cgen/runtime/__init__.py,sha256=88xGpAs1IEBlzlWL_e9tnKUlaSRdc7pQUeVCu5LC4DY,50
68
- emx_onnx_cgen/runtime/evaluator.py,sha256=GFxrBXcKuQkZ0HY46twOTrNc955UqW3cRKAu5AYVJzQ,84910
69
- shared/__init__.py,sha256=bmP79AVZdY_1aNULJap9pm76Q41Rabrza6X-0A8lDzw,45
70
- shared/scalar_functions.py,sha256=OAFO6kT6Gtcv5jp7UBLRhifhGmAbWhDKAmapTvqQruc,89911
71
- shared/scalar_types.py,sha256=kEpsl5T-NVFxCcTzXqPJbtpvDiCgKHfz91dphLLZxZA,4912
72
- emx_onnx_cgen-0.2.0.dist-info/METADATA,sha256=xTbPSAdUMfyXwvkxGGVYhsGhKjpxgPSzV1rimuB8zn0,4256
73
- emx_onnx_cgen-0.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
74
- emx_onnx_cgen-0.2.0.dist-info/entry_points.txt,sha256=b7Rvmz_Bi9kWyn7QayQC_FEXiRpt4cS1RnluKh49yoo,57
75
- emx_onnx_cgen-0.2.0.dist-info/top_level.txt,sha256=g39fo-blEbgiVcC_GRqAnBzN234w3LXbcVdLUoItSLk,21
76
- emx_onnx_cgen-0.2.0.dist-info/RECORD,,