From b8d4f28e9a58d46251552bb87695c072fe99552f Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Mon, 13 Jul 2026 15:41:04 +0200 Subject: [PATCH] [tmva][sofie] Generate ONNX models and refs instead of binaries in repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SOFIE ONNX unit tests relied on 145 binary .onnx files checked into tmva/sofie/test/input_models, plus ~108 frozen reference headers (input_models/references/*.ref.hxx) whose expected outputs were computed once from the exact weights inside those binaries. This made it impossible to tell from the repository what the models contain, and impossible to regenerate them (some were exported with pytorch versions as old as 1.5). Replace both with a single script, tmva/sofie/test/generate_input_models.py: * Each model is built with the onnx helper API in a make_() function, so graph structure, attributes, shapes and initializers are readable and reviewable. Large weight tensors that used to be opaque random blobs are seeded-random via _random_tensor(), with pytorch-like 1/sqrt(fan_in) scaling. * The inputs for the value-based tests are defined in TEST_INPUTS, and the expected outputs are computed with onnx's ReferenceEvaluator and written to references/.ref next to the generated models. Where the evaluator is wrong or unimplemented (MaxPool with asymmetric padding, Mean with multidirectional broadcasting, bidirectional or batchwise RNN/LSTM/GRU), numpy fallbacks implement the ONNX operator definitions directly. * The script runs as the new SofieGenerateModels_ONNX ctest, which the other SOFIE ONNX tests require as a fixture. CMake gets the model list at configure time from `generate_input_models.py --list`, which works without the onnx module. TestCustomModelsFromONNX.cxx and TestCladAutodiff.cxx read the inputs and expected outputs at runtime through a small reader in test_helpers.h instead of including frozen headers. SOFIE's results are thus checked against an independent implementation instead of a snapshot of its own past output. While migrating, all computed references were validated to reproduce the frozen .ref.hxx values with the original weights before switching to seeded-random weights. The ONNX model tests now require the onnx python package; they are disabled with a warning if it is missing or has the broken version 1.19.0. The TMVA_SOFIE_ONNX.C tutorial input is likewise generated at configure time instead of being copied from the test sources. 🤖 Done with the help of AI. --- tmva/sofie/test/CMakeLists.txt | 151 +- tmva/sofie/test/TestCladAutodiff.cxx | 18 +- tmva/sofie/test/TestCustomModelsFromONNX.cxx | 2876 ++------- tmva/sofie/test/generate_input_models.py | 5286 +++++++++++++++++ tmva/sofie/test/input_models/Abs.onnx | 12 - tmva/sofie/test/input_models/Add.onnx | 16 - .../test/input_models/AddBroadcast1.onnx | 16 - .../test/input_models/AddBroadcast2.onnx | 20 - .../test/input_models/AddBroadcast3.onnx | 22 - .../test/input_models/AddBroadcast4.onnx | 16 - .../test/input_models/AddBroadcast5.onnx | 19 - .../test/input_models/AddBroadcast6.onnx | 25 - .../test/input_models/AddBroadcast7.onnx | 22 - tmva/sofie/test/input_models/AvgPool.onnx | Bin 220 -> 0 bytes tmva/sofie/test/input_models/Cast.onnx | 12 - tmva/sofie/test/input_models/Clip.onnx | Bin 211 -> 0 bytes .../input_models/Comparison_broadcast.onnx | 32 - .../input_models/Comparison_broadcast_3d.onnx | 36 - tmva/sofie/test/input_models/ComplexTopK.onnx | Bin 293 -> 0 bytes tmva/sofie/test/input_models/Concat_0D.onnx | Bin 151 -> 0 bytes tmva/sofie/test/input_models/Constant.onnx | Bin 222 -> 0 bytes tmva/sofie/test/input_models/ConvAddRelu.onnx | Bin 283 -> 0 bytes .../test/input_models/ConvTranspose1d.onnx | Bin 166 -> 0 bytes .../test/input_models/ConvTranspose2d.onnx | Bin 228 -> 0 bytes .../input_models/ConvTransposeBias2d.onnx | Bin 267 -> 0 bytes .../ConvTransposeBias2dBatched.onnx | Bin 267 -> 0 bytes .../ConvWithAsymmetricPadding.onnx | Bin 268 -> 0 bytes .../ConvWithAutopadSameLower.onnx | Bin 275 -> 0 bytes .../ConvWithAutopadSameUpper.onnx | Bin 222 -> 0 bytes .../test/input_models/ConvWithDilation.onnx | Bin 269 -> 0 bytes .../input_models/ConvWithDynShapeStride.onnx | Bin 187 -> 0 bytes .../test/input_models/ConvWithPadding.onnx | Bin 240 -> 0 bytes .../ConvWithStridesNoPadding.onnx | Bin 267 -> 0 bytes .../input_models/ConvWithStridesPadding.onnx | Bin 265 -> 0 bytes .../test/input_models/ConvWithoutPadding.onnx | Bin 243 -> 0 bytes tmva/sofie/test/input_models/Cos.onnx | 12 - tmva/sofie/test/input_models/Div.onnx | 16 - tmva/sofie/test/input_models/Einsum_3.onnx | 20 - tmva/sofie/test/input_models/Einsum_4.onnx | 24 - .../test/input_models/Einsum_dotprod.onnx | Bin 158 -> 0 bytes .../test/input_models/Einsum_matmul.onnx | 18 - tmva/sofie/test/input_models/Elu.onnx | Bin 1551 -> 0 bytes tmva/sofie/test/input_models/EluAlpha.onnx | Bin 120 -> 0 bytes tmva/sofie/test/input_models/Equal.onnx | 16 - tmva/sofie/test/input_models/Erf.onnx | 11 - tmva/sofie/test/input_models/Exp.onnx | 13 - .../test/input_models/ExpandDiffSize.onnx | Bin 113 -> 0 bytes .../test/input_models/ExpandSameSize.onnx | Bin 111 -> 0 bytes tmva/sofie/test/input_models/EyeLike.onnx | 11 - .../input_models/FMod_ConstantFolding.onnx | Bin 179 -> 0 bytes .../sofie/test/input_models/GRUBatchwise.onnx | Bin 898 -> 0 bytes .../test/input_models/GRUBidirectional.onnx | Bin 1187 -> 0 bytes tmva/sofie/test/input_models/GRUDefaults.onnx | Bin 740 -> 0 bytes .../test/input_models/GRUInitialBias.onnx | Bin 645 -> 0 bytes .../sofie/test/input_models/GRUSeqLength.onnx | Bin 960 -> 0 bytes tmva/sofie/test/input_models/Gather2d.onnx | Bin 134 -> 0 bytes tmva/sofie/test/input_models/GatherAxis0.onnx | Bin 138 -> 0 bytes tmva/sofie/test/input_models/GatherAxis1.onnx | Bin 138 -> 0 bytes tmva/sofie/test/input_models/GatherAxis2.onnx | 21 - tmva/sofie/test/input_models/GatherAxis3.onnx | 22 - tmva/sofie/test/input_models/GatherND_1.onnx | 18 - tmva/sofie/test/input_models/GatherND_2.onnx | 18 - tmva/sofie/test/input_models/GatherND_3.onnx | 24 - .../input_models/GatherNegativeIndices.onnx | Bin 131 -> 0 bytes tmva/sofie/test/input_models/Gelu.onnx | Bin 64 -> 0 bytes tmva/sofie/test/input_models/Greater.onnx | 16 - .../test/input_models/GreaterOrEqual.onnx | 16 - tmva/sofie/test/input_models/HardSigmoid.onnx | Bin 134 -> 0 bytes tmva/sofie/test/input_models/HardSwish.onnx | Bin 97 -> 0 bytes tmva/sofie/test/input_models/IsInf.onnx | 11 - .../test/input_models/LSTMBatchwise.onnx | Bin 1338 -> 0 bytes .../test/input_models/LSTMBidirectional.onnx | Bin 873 -> 0 bytes .../sofie/test/input_models/LSTMDefaults.onnx | Bin 567 -> 0 bytes .../test/input_models/LSTMInitialBias.onnx | Bin 947 -> 0 bytes .../test/input_models/LSTMPeepholes.onnx | Bin 1129 -> 0 bytes .../input_models/LayerNormalization2d.onnx | Bin 205 -> 0 bytes .../input_models/LayerNormalization4d.onnx | 26 - tmva/sofie/test/input_models/Less.onnx | 16 - tmva/sofie/test/input_models/LessOrEqual.onnx | 16 - .../input_models/LinearWithLeakyRelu.onnx | 12 - .../test/input_models/LinearWithSelu.onnx | Bin 1623 -> 0 bytes .../test/input_models/LinearWithSigmoid.onnx | Bin 1635 -> 0 bytes tmva/sofie/test/input_models/Linear_16.onnx | Bin 105481 -> 0 bytes tmva/sofie/test/input_models/Linear_32.onnx | Bin 105481 -> 0 bytes tmva/sofie/test/input_models/Linear_64.onnx | Bin 105481 -> 0 bytes tmva/sofie/test/input_models/Log.onnx | 11 - .../test/input_models/MatMul_Stacked.onnx | 19 - .../test/input_models/MatMul_Stacked2.onnx | 19 - tmva/sofie/test/input_models/Max.onnx | 17 - .../MaxMultidirectionalBroadcast.onnx | Bin 112 -> 0 bytes tmva/sofie/test/input_models/MaxPool1d.onnx | Bin 202 -> 0 bytes tmva/sofie/test/input_models/MaxPool2d.onnx | Bin 218 -> 0 bytes .../test/input_models/MaxPool2d_AsymPad.onnx | Bin 165 -> 0 bytes .../test/input_models/MaxPool2d_CeilMode.onnx | Bin 159 -> 0 bytes tmva/sofie/test/input_models/MaxPool3d.onnx | Bin 234 -> 0 bytes .../MeanMultidirectionalBroadcast.onnx | Bin 114 -> 0 bytes .../MinMultidirectionalBroadcast.onnx | Bin 112 -> 0 bytes .../input_models/Mod_ConstantFolding.onnx | Bin 202 -> 0 bytes tmva/sofie/test/input_models/Mul.onnx | 16 - tmva/sofie/test/input_models/Neg.onnx | 11 - tmva/sofie/test/input_models/NonZero.onnx | 12 - .../test/input_models/NonZero_Constant.onnx | Bin 171 -> 0 bytes tmva/sofie/test/input_models/NotIsNaN.onnx | 13 - tmva/sofie/test/input_models/Pad.onnx | Bin 211 -> 0 bytes tmva/sofie/test/input_models/Pow.onnx | 16 - .../test/input_models/Pow_broadcast.onnx | 18 - .../sofie/test/input_models/RNNBatchwise.onnx | Bin 404 -> 0 bytes .../test/input_models/RNNBidirectional.onnx | Bin 862 -> 0 bytes .../RNNBidirectionalBatchwise.onnx | Bin 871 -> 0 bytes tmva/sofie/test/input_models/RNNDefaults.onnx | Bin 544 -> 0 bytes .../sofie/test/input_models/RNNSeqLength.onnx | Bin 545 -> 0 bytes tmva/sofie/test/input_models/RNNSequence.onnx | Bin 739 -> 0 bytes .../input_models/RNNSequenceBatchwise.onnx | Bin 748 -> 0 bytes .../sofie/test/input_models/RandomNormal.onnx | Bin 148 -> 0 bytes .../test/input_models/RandomUniform.onnx | Bin 148 -> 0 bytes tmva/sofie/test/input_models/RangeFloat.onnx | 20 - tmva/sofie/test/input_models/RangeInt.onnx | 20 - tmva/sofie/test/input_models/Reciprocal.onnx | 13 - tmva/sofie/test/input_models/ReduceMean.onnx | Bin 181 -> 0 bytes .../test/input_models/ReduceMean_kFirst.onnx | Bin 117 -> 0 bytes tmva/sofie/test/input_models/ReduceProd.onnx | Bin 181 -> 0 bytes tmva/sofie/test/input_models/ReduceSum.onnx | Bin 160 -> 0 bytes .../test/input_models/ReduceSumSquare.onnx | Bin 164 -> 0 bytes .../test/input_models/ScatterElements.onnx | 22 - tmva/sofie/test/input_models/ScatterND_1.onnx | 21 - tmva/sofie/test/input_models/ScatterND_2.onnx | 22 - tmva/sofie/test/input_models/ScatterND_3.onnx | 22 - tmva/sofie/test/input_models/Shape.onnx | Bin 232 -> 0 bytes tmva/sofie/test/input_models/Sin.onnx | 12 - tmva/sofie/test/input_models/Slice.onnx | Bin 238 -> 0 bytes .../test/input_models/Slice_Default_Axis.onnx | Bin 193 -> 0 bytes .../input_models/Slice_Default_Steps.onnx | Bin 238 -> 0 bytes tmva/sofie/test/input_models/Slice_Neg.onnx | Bin 210 -> 0 bytes tmva/sofie/test/input_models/Softmax1d.onnx | 11 - tmva/sofie/test/input_models/Softmax2d.onnx | 12 - tmva/sofie/test/input_models/Softmax3d.onnx | 14 - tmva/sofie/test/input_models/Softmax4d.onnx | 16 - tmva/sofie/test/input_models/Softplus.onnx | 11 - tmva/sofie/test/input_models/Split_0.onnx | 23 - tmva/sofie/test/input_models/Split_1.onnx | 24 - tmva/sofie/test/input_models/Split_2.onnx | 22 - tmva/sofie/test/input_models/Sqrt.onnx | 11 - tmva/sofie/test/input_models/Sub.onnx | 16 - .../SumMultidirectionalBroadcast.onnx | Bin 112 -> 0 bytes tmva/sofie/test/input_models/Swish.onnx | Bin 84 -> 0 bytes tmva/sofie/test/input_models/Tanh.onnx | 11 - tmva/sofie/test/input_models/Tile5D.onnx | 20 - tmva/sofie/test/input_models/TopK.onnx | Bin 278 -> 0 bytes tmva/sofie/test/input_models/Where.onnx | 22 - .../test/input_models/references/Add.ref.hxx | 5 - .../references/AddBroadcast1.ref.hxx | 6 - .../references/AddBroadcast2.ref.hxx | 17 - .../references/AddBroadcast3.ref.hxx | 22 - .../references/AddBroadcast4.ref.hxx | 3 - .../references/AddBroadcast5.ref.hxx | 5 - .../references/AddBroadcast6.ref.hxx | 9 - .../references/AddBroadcast7.ref.hxx | 5 - .../input_models/references/AvgPool.ref.hxx | 6 - .../test/input_models/references/Cast.ref.hxx | 6 - .../references/ComplexTopK.ref.hxx | 14 - .../input_models/references/Constant.ref.hxx | 5 - .../references/ConvAddRelu.ref.hxx | 5 - .../references/ConvTranspose1d.ref.hxx | 3 - .../references/ConvTranspose2d.ref.hxx | 6 - .../references/ConvTranspose3d.ref.hxx | 7 - .../references/ConvTransposeBias2d.ref.hxx | 6 - .../ConvTransposeBias2dBatched.ref.hxx | 12 - .../ConvWithAsymmetricPadding.ref.hxx | 3 - .../ConvWithAutopadSameLower.ref.hxx | 3 - .../ConvWithAutopadSameUpper.ref.hxx | 4 - .../references/ConvWithDilation.ref.hxx | 3 - .../references/ConvWithPadding.ref.hxx | 5 - .../ConvWithStridesNoPadding.ref.hxx | 3 - .../references/ConvWithStridesPadding.ref.hxx | 4 - .../references/ConvWithoutPadding.ref.hxx | 3 - .../test/input_models/references/Div.ref.hxx | 5 - .../test/input_models/references/Elu.ref.hxx | 6 - .../input_models/references/EluAlpha.ref.hxx | 6 - .../input_models/references/Equal.ref.hxx | 5 - .../test/input_models/references/Erf.ref.hxx | 6 - .../test/input_models/references/Exp.ref.hxx | 4 - .../references/ExpandDiffSize.ref.hxx | 5 - .../references/ExpandSameSize.ref.hxx | 3 - .../input_models/references/EyeLike.ref.hxx | 3 - .../references/GRUBatchwise.ref.hxx | 7 - .../references/GRUBidirectional.ref.hxx | 9 - .../references/GRUDefaults.ref.hxx | 6 - .../references/GRUInitialBias.ref.hxx | 4 - .../references/GRUSeqLength.ref.hxx | 13 - .../input_models/references/Gather2d.ref.hxx | 3 - .../references/GatherAxis0.ref.hxx | 5 - .../references/GatherAxis1.ref.hxx | 7 - .../references/GatherAxis2.ref.hxx | 6 - .../references/GatherAxis3.ref.hxx | 5 - .../references/GatherNegativeIndices.ref.hxx | 3 - .../test/input_models/references/Gelu.ref.hxx | 5 - .../input_models/references/Greater.ref.hxx | 5 - .../references/GreaterOrEqual.ref.hxx | 5 - .../references/HardSigmoid.ref.hxx | 3 - .../input_models/references/HardSwish.ref.hxx | 3 - .../references/LSTMBatchwise.ref.hxx | 8 - .../references/LSTMBidirectional.ref.hxx | 9 - .../references/LSTMDefaults.ref.hxx | 7 - .../references/LSTMInitialBias.ref.hxx | 7 - .../references/LSTMPeepholes.ref.hxx | 4 - .../references/LayerNormalization2d.hxx | 3 - .../references/LayerNormalization4d.hxx | 12 - .../test/input_models/references/Less.ref.hxx | 5 - .../references/LessOrEqual.ref.hxx | 5 - .../references/LinearWithLeakyRelu.ref.hxx | 7 - .../references/LinearWithSelu.ref.hxx | 6 - .../references/LinearWithSigmoid.ref.hxx | 6 - .../input_models/references/Linear_16.ref.hxx | 32 - .../input_models/references/Linear_32.ref.hxx | 59 - .../input_models/references/Linear_64.ref.hxx | 112 - .../test/input_models/references/Log.ref.hxx | 5 - .../test/input_models/references/Max.ref.hxx | 5 - .../MaxMultidirectionalBroadcast.ref.hxx | 8 - .../input_models/references/MaxPool1d.ref.hxx | 14 - .../input_models/references/MaxPool2d.ref.hxx | 8 - .../references/MaxPool2d_AsymPad.ref.hxx | 3 - .../references/MaxPool2d_CeilMode.ref.hxx | 3 - .../input_models/references/MaxPool3d.ref.hxx | 6 - .../MeanMultidirectionalBroadcast.ref.hxx | 8 - .../MinMultidirectionalBroadcast.ref.hxx | 6 - .../test/input_models/references/Mul.ref.hxx | 5 - .../test/input_models/references/Neg.ref.hxx | 6 - .../test/input_models/references/Pow.ref.hxx | 5 - .../references/Pow_broadcast.ref.hxx | 6 - .../references/RNNBatchwise.ref.hxx | 5 - .../references/RNNBidirectional.ref.hxx | 19 - .../RNNBidirectionalBatchwise.ref.hxx | 18 - .../references/RNNDefaults.ref.hxx | 9 - .../references/RNNSeqLength.ref.hxx | 13 - .../references/RNNSequence.ref.hxx | 14 - .../references/RNNSequenceBatchwise.ref.hxx | 14 - .../references/RangeFloat.ref.hxx | 3 - .../input_models/references/RangeInt.ref.hxx | 3 - .../references/Reciprocal.ref.hxx | 3 - .../references/ReduceMean.ref.hxx | 5 - .../references/ReduceProd.ref.hxx | 5 - .../input_models/references/Shape.ref.hxx | 5 - .../input_models/references/Slice.ref.hxx | 4 - .../references/Slice_Default_Axis.ref.hxx | 4 - .../references/Slice_Default_Steps.ref.hxx | 4 - .../input_models/references/Slice_Neg.ref.hxx | 4 - .../input_models/references/Softmax1d.ref.hxx | 3 - .../input_models/references/Softmax2d.ref.hxx | 3 - .../input_models/references/Softmax3d.ref.hxx | 6 - .../input_models/references/Softmax4d.ref.hxx | 9 - .../test/input_models/references/Sqrt.ref.hxx | 3 - .../test/input_models/references/Sub.ref.hxx | 5 - .../SumMultidirectionalBroadcast.ref.hxx | 7 - .../input_models/references/Swish.ref.hxx | 3 - .../test/input_models/references/Tanh.ref.hxx | 7 - .../input_models/references/Tile5D.ref.hxx | 177 - .../test/input_models/references/TopK.ref.hxx | 6 - tmva/sofie/test/test_helpers.h | 95 + tutorials/CMakeLists.txt | 13 +- 259 files changed, 6086 insertions(+), 4508 deletions(-) create mode 100644 tmva/sofie/test/generate_input_models.py delete mode 100644 tmva/sofie/test/input_models/Abs.onnx delete mode 100644 tmva/sofie/test/input_models/Add.onnx delete mode 100644 tmva/sofie/test/input_models/AddBroadcast1.onnx delete mode 100644 tmva/sofie/test/input_models/AddBroadcast2.onnx delete mode 100644 tmva/sofie/test/input_models/AddBroadcast3.onnx delete mode 100644 tmva/sofie/test/input_models/AddBroadcast4.onnx delete mode 100644 tmva/sofie/test/input_models/AddBroadcast5.onnx delete mode 100644 tmva/sofie/test/input_models/AddBroadcast6.onnx delete mode 100644 tmva/sofie/test/input_models/AddBroadcast7.onnx delete mode 100644 tmva/sofie/test/input_models/AvgPool.onnx delete mode 100644 tmva/sofie/test/input_models/Cast.onnx delete mode 100644 tmva/sofie/test/input_models/Clip.onnx delete mode 100644 tmva/sofie/test/input_models/Comparison_broadcast.onnx delete mode 100644 tmva/sofie/test/input_models/Comparison_broadcast_3d.onnx delete mode 100644 tmva/sofie/test/input_models/ComplexTopK.onnx delete mode 100644 tmva/sofie/test/input_models/Concat_0D.onnx delete mode 100644 tmva/sofie/test/input_models/Constant.onnx delete mode 100644 tmva/sofie/test/input_models/ConvAddRelu.onnx delete mode 100644 tmva/sofie/test/input_models/ConvTranspose1d.onnx delete mode 100644 tmva/sofie/test/input_models/ConvTranspose2d.onnx delete mode 100644 tmva/sofie/test/input_models/ConvTransposeBias2d.onnx delete mode 100644 tmva/sofie/test/input_models/ConvTransposeBias2dBatched.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithAsymmetricPadding.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithAutopadSameLower.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithAutopadSameUpper.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithDilation.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithDynShapeStride.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithPadding.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithStridesNoPadding.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithStridesPadding.onnx delete mode 100644 tmva/sofie/test/input_models/ConvWithoutPadding.onnx delete mode 100644 tmva/sofie/test/input_models/Cos.onnx delete mode 100644 tmva/sofie/test/input_models/Div.onnx delete mode 100644 tmva/sofie/test/input_models/Einsum_3.onnx delete mode 100644 tmva/sofie/test/input_models/Einsum_4.onnx delete mode 100644 tmva/sofie/test/input_models/Einsum_dotprod.onnx delete mode 100644 tmva/sofie/test/input_models/Einsum_matmul.onnx delete mode 100644 tmva/sofie/test/input_models/Elu.onnx delete mode 100644 tmva/sofie/test/input_models/EluAlpha.onnx delete mode 100644 tmva/sofie/test/input_models/Equal.onnx delete mode 100644 tmva/sofie/test/input_models/Erf.onnx delete mode 100644 tmva/sofie/test/input_models/Exp.onnx delete mode 100644 tmva/sofie/test/input_models/ExpandDiffSize.onnx delete mode 100644 tmva/sofie/test/input_models/ExpandSameSize.onnx delete mode 100644 tmva/sofie/test/input_models/EyeLike.onnx delete mode 100644 tmva/sofie/test/input_models/FMod_ConstantFolding.onnx delete mode 100644 tmva/sofie/test/input_models/GRUBatchwise.onnx delete mode 100644 tmva/sofie/test/input_models/GRUBidirectional.onnx delete mode 100644 tmva/sofie/test/input_models/GRUDefaults.onnx delete mode 100644 tmva/sofie/test/input_models/GRUInitialBias.onnx delete mode 100644 tmva/sofie/test/input_models/GRUSeqLength.onnx delete mode 100644 tmva/sofie/test/input_models/Gather2d.onnx delete mode 100644 tmva/sofie/test/input_models/GatherAxis0.onnx delete mode 100644 tmva/sofie/test/input_models/GatherAxis1.onnx delete mode 100644 tmva/sofie/test/input_models/GatherAxis2.onnx delete mode 100644 tmva/sofie/test/input_models/GatherAxis3.onnx delete mode 100644 tmva/sofie/test/input_models/GatherND_1.onnx delete mode 100644 tmva/sofie/test/input_models/GatherND_2.onnx delete mode 100644 tmva/sofie/test/input_models/GatherND_3.onnx delete mode 100644 tmva/sofie/test/input_models/GatherNegativeIndices.onnx delete mode 100644 tmva/sofie/test/input_models/Gelu.onnx delete mode 100644 tmva/sofie/test/input_models/Greater.onnx delete mode 100644 tmva/sofie/test/input_models/GreaterOrEqual.onnx delete mode 100644 tmva/sofie/test/input_models/HardSigmoid.onnx delete mode 100644 tmva/sofie/test/input_models/HardSwish.onnx delete mode 100644 tmva/sofie/test/input_models/IsInf.onnx delete mode 100644 tmva/sofie/test/input_models/LSTMBatchwise.onnx delete mode 100644 tmva/sofie/test/input_models/LSTMBidirectional.onnx delete mode 100644 tmva/sofie/test/input_models/LSTMDefaults.onnx delete mode 100644 tmva/sofie/test/input_models/LSTMInitialBias.onnx delete mode 100644 tmva/sofie/test/input_models/LSTMPeepholes.onnx delete mode 100644 tmva/sofie/test/input_models/LayerNormalization2d.onnx delete mode 100644 tmva/sofie/test/input_models/LayerNormalization4d.onnx delete mode 100644 tmva/sofie/test/input_models/Less.onnx delete mode 100644 tmva/sofie/test/input_models/LessOrEqual.onnx delete mode 100644 tmva/sofie/test/input_models/LinearWithLeakyRelu.onnx delete mode 100644 tmva/sofie/test/input_models/LinearWithSelu.onnx delete mode 100644 tmva/sofie/test/input_models/LinearWithSigmoid.onnx delete mode 100644 tmva/sofie/test/input_models/Linear_16.onnx delete mode 100644 tmva/sofie/test/input_models/Linear_32.onnx delete mode 100644 tmva/sofie/test/input_models/Linear_64.onnx delete mode 100644 tmva/sofie/test/input_models/Log.onnx delete mode 100644 tmva/sofie/test/input_models/MatMul_Stacked.onnx delete mode 100644 tmva/sofie/test/input_models/MatMul_Stacked2.onnx delete mode 100644 tmva/sofie/test/input_models/Max.onnx delete mode 100644 tmva/sofie/test/input_models/MaxMultidirectionalBroadcast.onnx delete mode 100644 tmva/sofie/test/input_models/MaxPool1d.onnx delete mode 100644 tmva/sofie/test/input_models/MaxPool2d.onnx delete mode 100644 tmva/sofie/test/input_models/MaxPool2d_AsymPad.onnx delete mode 100644 tmva/sofie/test/input_models/MaxPool2d_CeilMode.onnx delete mode 100644 tmva/sofie/test/input_models/MaxPool3d.onnx delete mode 100644 tmva/sofie/test/input_models/MeanMultidirectionalBroadcast.onnx delete mode 100644 tmva/sofie/test/input_models/MinMultidirectionalBroadcast.onnx delete mode 100644 tmva/sofie/test/input_models/Mod_ConstantFolding.onnx delete mode 100644 tmva/sofie/test/input_models/Mul.onnx delete mode 100644 tmva/sofie/test/input_models/Neg.onnx delete mode 100644 tmva/sofie/test/input_models/NonZero.onnx delete mode 100644 tmva/sofie/test/input_models/NonZero_Constant.onnx delete mode 100644 tmva/sofie/test/input_models/NotIsNaN.onnx delete mode 100644 tmva/sofie/test/input_models/Pad.onnx delete mode 100644 tmva/sofie/test/input_models/Pow.onnx delete mode 100644 tmva/sofie/test/input_models/Pow_broadcast.onnx delete mode 100644 tmva/sofie/test/input_models/RNNBatchwise.onnx delete mode 100644 tmva/sofie/test/input_models/RNNBidirectional.onnx delete mode 100644 tmva/sofie/test/input_models/RNNBidirectionalBatchwise.onnx delete mode 100644 tmva/sofie/test/input_models/RNNDefaults.onnx delete mode 100644 tmva/sofie/test/input_models/RNNSeqLength.onnx delete mode 100644 tmva/sofie/test/input_models/RNNSequence.onnx delete mode 100644 tmva/sofie/test/input_models/RNNSequenceBatchwise.onnx delete mode 100644 tmva/sofie/test/input_models/RandomNormal.onnx delete mode 100644 tmva/sofie/test/input_models/RandomUniform.onnx delete mode 100644 tmva/sofie/test/input_models/RangeFloat.onnx delete mode 100644 tmva/sofie/test/input_models/RangeInt.onnx delete mode 100644 tmva/sofie/test/input_models/Reciprocal.onnx delete mode 100644 tmva/sofie/test/input_models/ReduceMean.onnx delete mode 100644 tmva/sofie/test/input_models/ReduceMean_kFirst.onnx delete mode 100644 tmva/sofie/test/input_models/ReduceProd.onnx delete mode 100644 tmva/sofie/test/input_models/ReduceSum.onnx delete mode 100644 tmva/sofie/test/input_models/ReduceSumSquare.onnx delete mode 100644 tmva/sofie/test/input_models/ScatterElements.onnx delete mode 100644 tmva/sofie/test/input_models/ScatterND_1.onnx delete mode 100644 tmva/sofie/test/input_models/ScatterND_2.onnx delete mode 100644 tmva/sofie/test/input_models/ScatterND_3.onnx delete mode 100644 tmva/sofie/test/input_models/Shape.onnx delete mode 100644 tmva/sofie/test/input_models/Sin.onnx delete mode 100644 tmva/sofie/test/input_models/Slice.onnx delete mode 100644 tmva/sofie/test/input_models/Slice_Default_Axis.onnx delete mode 100644 tmva/sofie/test/input_models/Slice_Default_Steps.onnx delete mode 100644 tmva/sofie/test/input_models/Slice_Neg.onnx delete mode 100644 tmva/sofie/test/input_models/Softmax1d.onnx delete mode 100644 tmva/sofie/test/input_models/Softmax2d.onnx delete mode 100644 tmva/sofie/test/input_models/Softmax3d.onnx delete mode 100644 tmva/sofie/test/input_models/Softmax4d.onnx delete mode 100644 tmva/sofie/test/input_models/Softplus.onnx delete mode 100644 tmva/sofie/test/input_models/Split_0.onnx delete mode 100644 tmva/sofie/test/input_models/Split_1.onnx delete mode 100644 tmva/sofie/test/input_models/Split_2.onnx delete mode 100644 tmva/sofie/test/input_models/Sqrt.onnx delete mode 100644 tmva/sofie/test/input_models/Sub.onnx delete mode 100644 tmva/sofie/test/input_models/SumMultidirectionalBroadcast.onnx delete mode 100644 tmva/sofie/test/input_models/Swish.onnx delete mode 100644 tmva/sofie/test/input_models/Tanh.onnx delete mode 100644 tmva/sofie/test/input_models/Tile5D.onnx delete mode 100644 tmva/sofie/test/input_models/TopK.onnx delete mode 100644 tmva/sofie/test/input_models/Where.onnx delete mode 100644 tmva/sofie/test/input_models/references/Add.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/AddBroadcast1.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/AddBroadcast2.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/AddBroadcast3.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/AddBroadcast4.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/AddBroadcast5.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/AddBroadcast6.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/AddBroadcast7.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/AvgPool.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Cast.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ComplexTopK.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Constant.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvAddRelu.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvTranspose1d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvTranspose2d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvTranspose3d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvTransposeBias2d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvTransposeBias2dBatched.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvWithAsymmetricPadding.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvWithAutopadSameLower.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvWithAutopadSameUpper.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvWithDilation.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvWithPadding.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvWithStridesNoPadding.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvWithStridesPadding.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ConvWithoutPadding.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Div.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Elu.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/EluAlpha.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Equal.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Erf.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Exp.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ExpandDiffSize.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ExpandSameSize.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/EyeLike.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GRUBatchwise.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GRUBidirectional.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GRUDefaults.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GRUInitialBias.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GRUSeqLength.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Gather2d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GatherAxis0.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GatherAxis1.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GatherAxis2.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GatherAxis3.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GatherNegativeIndices.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Gelu.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Greater.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/GreaterOrEqual.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/HardSigmoid.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/HardSwish.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LSTMBatchwise.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LSTMBidirectional.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LSTMDefaults.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LSTMInitialBias.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LSTMPeepholes.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LayerNormalization2d.hxx delete mode 100644 tmva/sofie/test/input_models/references/LayerNormalization4d.hxx delete mode 100644 tmva/sofie/test/input_models/references/Less.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LessOrEqual.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LinearWithLeakyRelu.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LinearWithSelu.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/LinearWithSigmoid.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Linear_16.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Linear_32.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Linear_64.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Log.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Max.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/MaxMultidirectionalBroadcast.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/MaxPool1d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/MaxPool2d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/MaxPool2d_AsymPad.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/MaxPool2d_CeilMode.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/MaxPool3d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/MeanMultidirectionalBroadcast.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/MinMultidirectionalBroadcast.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Mul.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Neg.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Pow.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Pow_broadcast.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RNNBatchwise.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RNNBidirectional.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RNNBidirectionalBatchwise.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RNNDefaults.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RNNSeqLength.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RNNSequence.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RNNSequenceBatchwise.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RangeFloat.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/RangeInt.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Reciprocal.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ReduceMean.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/ReduceProd.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Shape.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Slice.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Slice_Default_Axis.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Slice_Default_Steps.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Slice_Neg.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Softmax1d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Softmax2d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Softmax3d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Softmax4d.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Sqrt.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Sub.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/SumMultidirectionalBroadcast.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Swish.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Tanh.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/Tile5D.ref.hxx delete mode 100644 tmva/sofie/test/input_models/references/TopK.ref.hxx diff --git a/tmva/sofie/test/CMakeLists.txt b/tmva/sofie/test/CMakeLists.txt index 2a2d730a432a2..02242e5037536 100644 --- a/tmva/sofie/test/CMakeLists.txt +++ b/tmva/sofie/test/CMakeLists.txt @@ -10,56 +10,107 @@ ############################################################################ +# Look for needed Python modules +ROOT_FIND_PYTHON_MODULE(torch) + +# onnx 1.19.0 has a bug that makes this version unusable: +# https://github.com/onnx/onnx/issues/7249 +# 1.19.1 instead could be used +# In that case, we have to disable the "TestSofieModels" test, +# which imports onnx indirectly via torch.onnx +ROOT_FIND_PYTHON_MODULE(onnx) +if (ROOT_ONNX_FOUND AND DEFINED ROOT_ONNX_VERSION) + if(ROOT_ONNX_VERSION VERSION_EQUAL "1.19.0") + message(WARNING "Found broken onnx version ${ROOT_ONNX_VERSION} (see https://github.com/onnx/onnx/issues/7249). Some TMVA SOFIE tests will be disabled.") + set(broken_onnx TRUE) + endif() +endif() + +# The ONNX input models are not checked into the repository: they are created +# by generate_input_models.py, which runs as the SofieGenerateModels_ONNX test +# that the other ONNX tests depend on. Set ONNX_MODELS_DIR to use pre-existing +# models from a custom directory instead. if (NOT ONNX_MODELS_DIR) - set(ONNX_MODELS_DIR input_models) + if (ROOT_ONNX_FOUND AND NOT broken_onnx) + set(ONNX_MODELS_DIR ${CMAKE_CURRENT_BINARY_DIR}/input_models) + set(generate_onnx_models TRUE) + # Get the model names from the generator script (--list does not require + # the onnx module, only a Python interpreter). + execute_process( + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_input_models.py --list + OUTPUT_VARIABLE _onnx_model_names + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _onnx_list_status) + if (NOT _onnx_list_status EQUAL 0) + message(FATAL_ERROR "Failed to list the SOFIE ONNX test models with generate_input_models.py") + endif() + string(REPLACE "\n" ";" ONNX_MODEL_NAMES "${_onnx_model_names}") + else() + message(WARNING "The onnx Python module is not usable: the ONNX input models for the TMVA SOFIE tests cannot be generated and the corresponding tests are disabled.") + endif() +else() + get_filename_component(ONNX_MODELS_DIR ${ONNX_MODELS_DIR} ABSOLUTE) + file(GLOB ONNX_FILES "${ONNX_MODELS_DIR}/*.onnx") + set(ONNX_MODEL_NAMES "") + foreach(onnx_file ${ONNX_FILES}) + get_filename_component(fname ${onnx_file} NAME_WE) + list(APPEND ONNX_MODEL_NAMES ${fname}) + endforeach() endif() -# Finding .onnx files to be parsed and creating the appropriate code to -# parse all file. It is much faster to combine all parsing in a single executable -# which will avoid initialization time (especially when using ROOT) -set(CAPTURE_STR "EmitModel( \"@1\", \"@2\");") -set(ALL_CAPTURES "") -# Finding .onnx files to be parsed and creating the appropriate command -file(GLOB ONNX_FILES "${ONNX_MODELS_DIR}/*.onnx") -foreach(onnx_file ${ONNX_FILES}) - get_filename_component(fname ${onnx_file} NAME_WE) - get_filename_component(fdir ${onnx_file} DIRECTORY) - string(REPLACE "@1" ${onnx_file} cap ${CAPTURE_STR}) - string(REPLACE "@2" ${fname} cap ${cap}) - list(APPEND ALL_CAPTURES ${cap}) -endforeach() -string(REPLACE ";" ";\n" EMIT_CAPTURES "${ALL_CAPTURES}") -configure_file(EmitFromONNX.cxx.in EmitFromONNX_all.cxx @ONLY) - -ROOTTEST_GENERATE_EXECUTABLE(emitFromONNX EmitFromONNX_all.cxx - LIBRARIES protobuf::libprotobuf ROOTTMVASofie ROOTTMVASofieParser - FIXTURES_SETUP sofie-compile-models-onnx-build) - -# silence protobuf warnings seen in version 3.0 and 3.6. Not needed from protobuf version 3.17 -target_compile_options(emitFromONNX PRIVATE -Wno-unused-parameter -Wno-array-bounds) - -ROOTTEST_ADD_TEST(SofieCompileModels_ONNX - COMMAND ${CMAKE_COMMAND} -E env ROOTIGNOREPREFIX=1 ./emitFromONNX ${onnx_file} ${CMAKE_CURRENT_BINARY_DIR}/${fname} - FIXTURES_REQUIRED sofie-compile-models-onnx-build - FIXTURES_SETUP sofie-compile-models-onnx -) - -# Creating a Google Test -if (BLAS_FOUND) # we need BLAS for compiling the models - ROOT_EXECUTABLE(TestCustomModelsFromONNX TestCustomModelsFromONNX.cxx - LIBRARIES Core GTest::gtest GTest::gtest_main +if (ONNX_MODELS_DIR) + # Creating the appropriate code to parse all ONNX model files. It is much + # faster to combine all parsing in a single executable which will avoid + # initialization time (especially when using ROOT) + set(CAPTURE_STR "EmitModel( \"@1\", \"@2\");") + set(ALL_CAPTURES "") + foreach(fname ${ONNX_MODEL_NAMES}) + string(REPLACE "@1" ${ONNX_MODELS_DIR}/${fname}.onnx cap ${CAPTURE_STR}) + string(REPLACE "@2" ${fname} cap ${cap}) + list(APPEND ALL_CAPTURES ${cap}) + endforeach() + string(REPLACE ";" ";\n" EMIT_CAPTURES "${ALL_CAPTURES}") + configure_file(EmitFromONNX.cxx.in EmitFromONNX_all.cxx @ONLY) + + ROOTTEST_GENERATE_EXECUTABLE(emitFromONNX EmitFromONNX_all.cxx + LIBRARIES protobuf::libprotobuf ROOTTMVASofie ROOTTMVASofieParser + FIXTURES_SETUP sofie-compile-models-onnx-build) + + # silence protobuf warnings seen in version 3.0 and 3.6. Not needed from protobuf version 3.17 + target_compile_options(emitFromONNX PRIVATE -Wno-unused-parameter -Wno-array-bounds) + + set(compile_models_fixtures sofie-compile-models-onnx-build) + if (generate_onnx_models) + ROOTTEST_ADD_TEST(SofieGenerateModels_ONNX + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/generate_input_models.py --outdir ${ONNX_MODELS_DIR} + FIXTURES_SETUP sofie-generate-models-onnx + ) + list(APPEND compile_models_fixtures sofie-generate-models-onnx) + endif() + + ROOTTEST_ADD_TEST(SofieCompileModels_ONNX + COMMAND ${CMAKE_COMMAND} -E env ROOTIGNOREPREFIX=1 ./emitFromONNX + FIXTURES_REQUIRED ${compile_models_fixtures} + FIXTURES_SETUP sofie-compile-models-onnx ) - ROOTTEST_ADD_TEST(TestCustomModelsFromONNX - EXEC ./TestCustomModelsFromONNX - FIXTURES_REQUIRED sofie-compile-models-onnx) - if (clad) - ROOT_EXECUTABLE(TestCladAutodiff TestCladAutodiff.cxx + # Creating a Google Test + if (BLAS_FOUND) # we need BLAS for compiling the models + ROOT_EXECUTABLE(TestCustomModelsFromONNX TestCustomModelsFromONNX.cxx LIBRARIES Core GTest::gtest GTest::gtest_main ) - ROOTTEST_ADD_TEST(TestCladAutodiff - EXEC ./TestCladAutodiff + ROOTTEST_ADD_TEST(TestCustomModelsFromONNX + EXEC ./TestCustomModelsFromONNX FIXTURES_REQUIRED sofie-compile-models-onnx) + + if (clad) + ROOT_EXECUTABLE(TestCladAutodiff TestCladAutodiff.cxx + LIBRARIES Core GTest::gtest GTest::gtest_main + ) + ROOTTEST_ADD_TEST(TestCladAutodiff + EXEC ./TestCladAutodiff + FIXTURES_REQUIRED sofie-compile-models-onnx) + endif() endif() endif() @@ -70,22 +121,6 @@ if (BLAS_FOUND) endif() endif() -# Look for needed Python modules -ROOT_FIND_PYTHON_MODULE(torch) - -# onnx 1.19.0 has a bug that makes this version unusable: -# https://github.com/onnx/onnx/issues/7249 -# 1.19.1 instead could be used -# In that case, we have to disable the "TestSofieModels" test, -# which imports onnx indirectly via torch.onnx -ROOT_FIND_PYTHON_MODULE(onnx) -if (ROOT_ONNX_FOUND AND DEFINED ROOT_ONNX_VERSION) - if(ROOT_ONNX_VERSION VERSION_EQUAL "1.19.0") - message(WARNING "Found broken onnx version ${ROOT_ONNX_VERSION} (see https://github.com/onnx/onnx/issues/7249). Some TMVA SOFIE tests will be disabled.") - set(broken_onnx TRUE) - endif() -endif() - if (ROOT_TORCH_FOUND AND ROOT_ONNX_FOUND AND NOT broken_onnx) configure_file(Conv1dModelGenerator.py Conv1dModelGenerator.py COPYONLY) configure_file(Conv2dModelGenerator.py Conv2dModelGenerator.py COPYONLY) diff --git a/tmva/sofie/test/TestCladAutodiff.cxx b/tmva/sofie/test/TestCladAutodiff.cxx index fd6c5fda2adfd..5ce6e4904b30a 100644 --- a/tmva/sofie/test/TestCladAutodiff.cxx +++ b/tmva/sofie/test/TestCladAutodiff.cxx @@ -2,8 +2,6 @@ constexpr auto modelHeaderSuffix = "_FromONNX_unoptimized.hxx"; constexpr auto modelDataSuffix = "_FromONNX_unoptimized.dat"; #include "test_helpers.h" -#include "input_models/references/Linear_16.ref.hxx" - #include "gtest/gtest.h" // Test differentiating a fully-connected neural network with Clad. @@ -12,9 +10,9 @@ TEST(ONNXClad, Linear16) { constexpr float TOLERANCE = DEFAULT_TOLERANCE; - // Preparing the standard all-ones input - std::vector input(1600); - std::fill_n(input.data(), input.size(), 1.0f); + SofieReference ref = readReference("Linear_16"); + // Mutable copy: the numeric differentiation below perturbs the input values + std::vector input = ref.f32("input0"); ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_16", input); @@ -135,13 +133,5 @@ float Linear_16_wrapper_num_diff(TMVA_SOFIE_Linear_16::Session const &session, f ADD_FAILURE() << "Further mismatches suppressed (total mismatches: " << mismatchCount << ")"; } - // Checking output size - EXPECT_EQ(output.size(), sizeof(Linear_16_ExpectedOutput::all_ones) / sizeof(float)); - - float *correct = Linear_16_ExpectedOutput::all_ones; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), TOLERANCE); } diff --git a/tmva/sofie/test/TestCustomModelsFromONNX.cxx b/tmva/sofie/test/TestCustomModelsFromONNX.cxx index 40aa1603fa731..02cc1762ad877 100644 --- a/tmva/sofie/test/TestCustomModelsFromONNX.cxx +++ b/tmva/sofie/test/TestCustomModelsFromONNX.cxx @@ -2,800 +2,282 @@ constexpr auto modelHeaderSuffix = "_FromONNX.hxx"; constexpr auto modelDataSuffix = "_FromONNX.dat"; #include "test_helpers.h" -#include "input_models/references/Linear_16.ref.hxx" -#include "input_models/references/Linear_32.ref.hxx" -#include "input_models/references/Linear_64.ref.hxx" -#include "input_models/references/LinearWithSelu.ref.hxx" -#include "input_models/references/Sub.ref.hxx" -#include "input_models/references/Add.ref.hxx" -#include "input_models/references/Mul.ref.hxx" -#include "input_models/references/Div.ref.hxx" -#include "input_models/references/Cast.ref.hxx" -#include "input_models/references/ReduceMean.ref.hxx" -#include "input_models/references/ReduceProd.ref.hxx" -#include "input_models/references/Shape.ref.hxx" -#include "input_models/references/Constant.ref.hxx" -#include "input_models/references/TopK.ref.hxx" -#include "input_models/references/ComplexTopK.ref.hxx" -#include "input_models/references/LinearWithLeakyRelu.ref.hxx" -#include "input_models/references/Tanh.ref.hxx" -#include "input_models/references/Erf.ref.hxx" -#include "input_models/references/LinearWithSigmoid.ref.hxx" -#include "input_models/references/ConvWithPadding.ref.hxx" -#include "input_models/references/ConvWithDilation.ref.hxx" -#include "input_models/references/ConvWithoutPadding.ref.hxx" -#include "input_models/references/ConvWithAutopadSameLower.ref.hxx" -#include "input_models/references/ConvWithAutopadSameUpper.ref.hxx" -#include "input_models/references/ConvWithStridesPadding.ref.hxx" -#include "input_models/references/ConvWithStridesNoPadding.ref.hxx" -#include "input_models/references/ConvWithAsymmetricPadding.ref.hxx" -#include "input_models/references/ConvAddRelu.ref.hxx" -#include "input_models/references/MaxPool1d.ref.hxx" -#include "input_models/references/MaxPool2d.ref.hxx" -#include "input_models/references/MaxPool2d_CeilMode.ref.hxx" -#include "input_models/references/MaxPool3d.ref.hxx" -#include "input_models/references/MaxPool2d_AsymPad.ref.hxx" -#include "input_models/references/Max.ref.hxx" -#include "input_models/references/MaxMultidirectionalBroadcast.ref.hxx" -#include "input_models/references/MinMultidirectionalBroadcast.ref.hxx" -#include "input_models/references/MeanMultidirectionalBroadcast.ref.hxx" -#include "input_models/references/SumMultidirectionalBroadcast.ref.hxx" -#include "input_models/references/AvgPool.ref.hxx" -#include "input_models/references/Pow.ref.hxx" -#include "input_models/references/Pow_broadcast.ref.hxx" -#include "input_models/references/RNNBatchwise.ref.hxx" -#include "input_models/references/RNNBidirectional.ref.hxx" -#include "input_models/references/RNNBidirectionalBatchwise.ref.hxx" -#include "input_models/references/RNNDefaults.ref.hxx" -#include "input_models/references/RNNSeqLength.ref.hxx" -#include "input_models/references/RNNSequence.ref.hxx" -#include "input_models/references/RNNSequenceBatchwise.ref.hxx" -#include "input_models/references/LSTMBatchwise.ref.hxx" -#include "input_models/references/LSTMBidirectional.ref.hxx" -#include "input_models/references/LSTMDefaults.ref.hxx" -#include "input_models/references/LSTMInitialBias.ref.hxx" -#include "input_models/references/LSTMPeepholes.ref.hxx" -#include "input_models/references/GRUBatchwise.ref.hxx" -#include "input_models/references/GRUBidirectional.ref.hxx" -#include "input_models/references/GRUDefaults.ref.hxx" -#include "input_models/references/GRUInitialBias.ref.hxx" -#include "input_models/references/GRUSeqLength.ref.hxx" -#include "input_models/references/Softmax1d.ref.hxx" -#include "input_models/references/Softmax2d.ref.hxx" -#include "input_models/references/Softmax3d.ref.hxx" -#include "input_models/references/Softmax4d.ref.hxx" -#include "input_models/references/ConvTranspose1d.ref.hxx" -#include "input_models/references/ConvTranspose2d.ref.hxx" -// #include "input_models/references/ConvTranspose3d.ref.hxx" -#include "input_models/references/ConvTransposeBias2d.ref.hxx" -#include "input_models/references/ConvTransposeBias2dBatched.ref.hxx" -#include "input_models/references/Sqrt.ref.hxx" -#include "input_models/references/Reciprocal.ref.hxx" -#include "input_models/references/Neg.ref.hxx" -#include "input_models/references/Exp.ref.hxx" -#include "input_models/references/AddBroadcast1.ref.hxx" -#include "input_models/references/AddBroadcast2.ref.hxx" -#include "input_models/references/AddBroadcast3.ref.hxx" -#include "input_models/references/AddBroadcast4.ref.hxx" -#include "input_models/references/AddBroadcast5.ref.hxx" -#include "input_models/references/AddBroadcast6.ref.hxx" -#include "input_models/references/AddBroadcast7.ref.hxx" -#include "input_models/references/LayerNormalization2d.hxx" -#include "input_models/references/LayerNormalization4d.hxx" -#include "input_models/references/ExpandSameSize.ref.hxx" -#include "input_models/references/ExpandDiffSize.ref.hxx" -#include "input_models/references/GatherAxis0.ref.hxx" -#include "input_models/references/GatherAxis1.ref.hxx" -#include "input_models/references/GatherAxis2.ref.hxx" -#include "input_models/references/GatherAxis3.ref.hxx" -#include "input_models/references/Gather2d.ref.hxx" -#include "input_models/references/GatherNegativeIndices.ref.hxx" -#include "input_models/references/Slice.ref.hxx" -#include "input_models/references/Slice_Default_Axis.ref.hxx" -#include "input_models/references/Slice_Default_Steps.ref.hxx" -#include "input_models/references/Slice_Neg.ref.hxx" -#include "input_models/references/Log.ref.hxx" -#include "input_models/references/Elu.ref.hxx" -#include "input_models/references/Gelu.ref.hxx" -#include "input_models/references/HardSigmoid.ref.hxx" -#include "input_models/references/HardSwish.ref.hxx" -#include "input_models/references/Equal.ref.hxx" -#include "input_models/references/EluAlpha.ref.hxx" -#include "input_models/references/LessOrEqual.ref.hxx" -#include "input_models/references/GreaterOrEqual.ref.hxx" -#include "input_models/references/Less.ref.hxx" -#include "input_models/references/Greater.ref.hxx" -#include "input_models/references/EyeLike.ref.hxx" -#include "input_models/references/RangeFloat.ref.hxx" -#include "input_models/references/RangeInt.ref.hxx" -#include "input_models/references/Tile5D.ref.hxx" -#include "input_models/references/Swish.ref.hxx" - #include "gtest/gtest.h" TEST(ONNX, Linear16) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(1600); - std::fill_n(input.data(), input.size(), 1.0f); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_16", input); + SofieReference ref = readReference("Linear_16"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Linear_16_ExpectedOutput::all_ones)); - - float *correct = Linear_16_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_16", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } /*TEST(ONNX, Linear32RootFeature) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(3200); - std::fill_n(input.data(), input.size(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_32", input); + SofieReference ref = readReference("Linear_32"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Linear_32_ExpectedOutput::all_ones)); - - float *correct = Linear_32_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_32", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); }*/ TEST(ONNX, Linear32) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(3200); - std::fill_n(input.data(), input.size(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_32", input); + SofieReference ref = readReference("Linear_32"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Linear_32_ExpectedOutput::all_ones)); - - float *correct = Linear_32_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_32", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, Sub) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input1({ - 1, 2 - }); - std::vector input2({ - 0, 1 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Sub", input1, input2); - - // Checking output size - EXPECT_EQ(output.size(), std::size(Sub_ExpectedOutput::outputs)); +{ + SofieReference ref = readReference("Sub"); - float *correct = Sub_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Sub", ref.f32("input0"), ref.f32("input1")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} TEST(ONNX, Add) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input1({ - 1, 2 - }); - std::vector input2({ - 0, 1 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Add", input1, input2); - - // Checking output size - EXPECT_EQ(output.size(), std::size(Add_ExpectedOutput::outputs)); +{ + SofieReference ref = readReference("Add"); - float *correct = Add_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Add", ref.f32("input0"), ref.f32("input1")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} TEST(ONNX, Mul) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input1({ - 1, 2 - }); - std::vector input2({ - 0, 1 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Mul", input1, input2); - - // Checking output size - EXPECT_EQ(output.size(), std::size(Mul_ExpectedOutput::outputs)); +{ + SofieReference ref = readReference("Mul"); - float *correct = Mul_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Mul", ref.f32("input0"), ref.f32("input1")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} TEST(ONNX, Div) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input1({ - 4, 2 - }); - std::vector input2({ - 2, 2 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Div", input1, input2); - - // Checking output size - EXPECT_EQ(output.size(), std::size(Div_ExpectedOutput::outputs)); +{ + SofieReference ref = readReference("Div"); - float *correct = Div_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Div", ref.f32("input0"), ref.f32("input1")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} TEST(ONNX, Neg) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - -1.9100, 1.8811, -1.7269, -0.1094, -0.0145, 0.2509, 0.5893, -2.2733, - -0.7077, 1.0645, -0.8607, 0.2085 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Neg", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(Neg_ExpectedOutput::outputs)); +{ + SofieReference ref = readReference("Neg"); - float *correct = Neg_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Neg", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} TEST(ONNX, Elu) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - 1.0, -2.0, 3.0, 0.5, -1.0, 2.0 - }); +{ + SofieReference ref = readReference("Elu"); - ASSERT_INCLUDE_AND_RUN(std::vector, "Elu", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "Elu", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output.size(), std::size(Elu_ExpectedOutput::outputs)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} +TEST(ONNX, EluAlpha) +{ + SofieReference ref = readReference("EluAlpha"); - float *correct = Elu_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "EluAlpha", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } -TEST(ONNX, EluAlpha) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - // Regression test for alpha != 1.0 (fixes #21539) - std::vector input({ - 1.0, -2.0, 3.0, 0.5, -1.0, 2.0 - }); - ASSERT_INCLUDE_AND_RUN(std::vector, "EluAlpha", input); - // Checking output size - EXPECT_EQ(output.size(), std::size(EluAlpha_ExpectedOutput::outputs)); - float *correct = EluAlpha_ExpectedOutput::outputs; - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} TEST(ONNX, Constant) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input (none for Constant Op) + SofieReference ref = readReference("Constant"); ASSERT_INCLUDE_AND_RUN_0(std::vector, "Constant"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Constant_ExpectedOutput::outputs)); - - float *correct = Constant_ExpectedOutput::outputs; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ComplexTopK) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input({ - 9.0000, 8.0000, 4.5000, 1.7000, 2.9000, 3.2000, 4.0000, 2.6000, 7.4000, - 3.5000, 5.6000, 7.1000, 9.8000, 1.1000, 3.3000, 6.2000, 8.4000, 0.7000, - 2.2000, 3.3000, 4.4000, 5.5000, 6.6000, 7.7000, 8.8000, 9.9000, 1.0000, - - 1.0000, 2.0000, 3.0000, 4.0000, 5.0000, 6.0000, 7.0000, 8.0000, 9.0000, - 9.0000, 8.0000, 7.0000, 6.0000, 5.0000, 4.0000, 3.0000, 2.0000, 1.0000, - 5.0000, 4.0000, 3.0000, 2.0000, 1.0000, 6.0000, 7.0000, 8.0000, 9.0000 }); - - ASSERT_INCLUDE_AND_RUN(TupleFloatInt64_t, "ComplexTopK", input); - std::vector values = std::get<0>(output); - std::vector indexes = std::get<1>(output); - - // Checking output size - EXPECT_EQ(values.size(), std::size(ComplexTopK_ExpectedOutput::values)); + SofieReference ref = readReference("ComplexTopK"); -float *correct_values = ComplexTopK_ExpectedOutput::values; - -// Checking every output value, one by one -for (size_t i = 0; i < values.size(); ++i) { - EXPECT_LE(std::abs(values[i] - correct_values[i]), TOLERANCE); -} - - -// Checking output size -EXPECT_EQ(indexes.size(), std::size(ComplexTopK_ExpectedOutput::indexes)); - -float *correct_indexes = ComplexTopK_ExpectedOutput::indexes; - -// Checking every output value, one by one -for (size_t i = 0; i < indexes.size(); ++i) { - EXPECT_LE(std::abs(indexes[i] - correct_indexes[i]), TOLERANCE); -} + ASSERT_INCLUDE_AND_RUN(TupleFloatInt64_t, "ComplexTopK", ref.f32("input0")); + expectNear(std::get<0>(output), ref.f32("output0"), DEFAULT_TOLERANCE); + expectEqual(std::get<1>(output), ref.i64("output1")); } TEST(ONNX, TopK) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("TopK"); - // Preparing the standard all-ones input - std::vector input({9.0, 8.0, 4.5, 1.7, 2.9, 3.2, 4, 2.6, 7.4}); + ASSERT_INCLUDE_AND_RUN(TupleFloatInt64_t, "TopK", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(TupleFloatInt64_t, "TopK", input); - std::vector values = std::get<0>(output); - std::vector indexes = std::get<1>(output); - - // Checking output size - EXPECT_EQ(values.size(), std::size(TopK_ExpectedOutput::values)); - - float *correct_values = TopK_ExpectedOutput::values; - - // Checking every output value, one by one - for (size_t i = 0; i < values.size(); ++i) { - EXPECT_LE(std::abs(values[i] - correct_values[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(indexes.size(), std::size(TopK_ExpectedOutput::indexes)); - - float *correct_indexes= TopK_ExpectedOutput::indexes; - - // Checking every output value, one by one - for (size_t i = 0; i < indexes.size(); ++i) { - EXPECT_LE(std::abs(indexes[i] - correct_indexes[i]), TOLERANCE); - } + expectNear(std::get<0>(output), ref.f32("output0"), DEFAULT_TOLERANCE); + expectEqual(std::get<1>(output), ref.i64("output1")); } TEST(ONNX, EyeLike) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "EyeLike", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(EyeLike_ExpectedOutput::output)); +{ + SofieReference ref = readReference("EyeLike"); - float *correct = EyeLike_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN(std::vector, "EyeLike", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} TEST(ONNX, Cast) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - 1,2,3,4,5,6 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Cast", input); + SofieReference ref = readReference("Cast"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Cast_ExpectedOutput::outputs)); - - float *correct = Cast_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Cast", ref.i64("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f64("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, Linear64) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(6400); - std::fill_n(input.data(), input.size(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_64", input); + SofieReference ref = readReference("Linear_64"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Linear_64_ExpectedOutput::all_ones)); - - float *correct = Linear_64_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "Linear_64", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, LinearWithSelu) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(48); - std::fill_n(input.data(), input.size(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "LinearWithSelu", input); + SofieReference ref = readReference("LinearWithSelu"); - // Checking output size - EXPECT_EQ(output.size(), std::size(LinearWithSelu_ExpectedOutput::all_ones)); - - float *correct = LinearWithSelu_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "LinearWithSelu", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, Tanh) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the random input - std::vector input({ - -0.3896, -0.3521, 0.0363, 1.0962, 0.5085, -0.8523, -0.6766, 0.2421, - 1.5971, 1.3873, -0.2112, -0.6895, -0.5069, -2.1395, -0.7087, 1.1658, - 1.3493, 0.8132, 1.7156, -0.8637, -0.1971, 0.0411, -0.5662, -0.2516 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Tanh", input); + SofieReference ref = readReference("Tanh"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Tanh_ExpectedOutput::outputs)); - - float *correct = Tanh_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Tanh", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, Erf) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the random input - std::vector input({ - -1.0412, 0.1918, 0.9985, -0.5959, 0.6842, -2.4718, 0.1804, 0.6851, - 1.5646, -1.4981, 0.4248, -0.8504 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Erf", input); + SofieReference ref = readReference("Erf"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Erf_ExpectedOutput::outputs)); - - float *correct = Erf_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Erf", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, Log) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the random input - std::vector input({ - 1, 2, 3, 4 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Log", input); + SofieReference ref = readReference("Log"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Log_ExpectedOutput::outputs)); - - float *correct = Log_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Log", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, LinearWithLeakyRelu) { - constexpr float TOLERANCE = 1; - - // Preparing the standard all-ones input - std::vector input({ - 0.4369, -0.6882, 1.0309, -1.0263, -0.1519, 1.2237, -0.7054, -0.1762, - -0.6811, -2.2597, 1.0388, -0.7993, 0.1468, 1.3257, -0.4714, -0.0958, - 0.7057, -0.3749, -0.3310, 0.0986, -0.1370, 0.0832, -1.6465, -0.2793 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "LinearWithLeakyRelu", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(LinearWithLeakyRelu_ExpectedOutput::outputs)); + SofieReference ref = readReference("LinearWithLeakyRelu"); - float *correct = LinearWithLeakyRelu_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "LinearWithLeakyRelu", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), 1); } TEST(ONNX, LinearWithSigmoid) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(48); - std::fill_n(input.data(), input.size(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "LinearWithSigmoid", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(LinearWithSigmoid_ExpectedOutput::all_ones)); + SofieReference ref = readReference("LinearWithSigmoid"); - float *correct = LinearWithSigmoid_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "LinearWithSigmoid", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ConvWithPadding) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(25); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithPadding", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvWithPadding_ExpectedOutput::all_ones)); + SofieReference ref = readReference("ConvWithPadding"); - float *correct = ConvWithPadding_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithPadding", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ConvWithoutPadding) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(25); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithoutPadding", input); + SofieReference ref = readReference("ConvWithoutPadding"); - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvWithoutPadding_ExpectedOutput::all_ones)); - - float *correct = ConvWithoutPadding_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithoutPadding", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ConvWithAutopadSameLower) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(25); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithAutopadSameLower", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvWithAutopadSameLower_ExpectedOutput::all_ones)); + SofieReference ref = readReference("ConvWithAutopadSameLower"); - float *correct = ConvWithAutopadSameLower_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithAutopadSameLower", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ConvWithAutopadSameUpper) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("ConvWithAutopadSameUpper"); - // Input (1,1,5,5) with values 0..24; kernel (1,1,3,3) all-ones, auto_pad=SAME_UPPER, stride=1 - // Odd kernel: total_pad=2 per dim, begin=1 end=1 (symmetric); output shape (1,1,5,5) - std::vector input(25); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithAutopadSameUpper", input); - - // Checking output size - EXPECT_EQ(output.size(), sizeof(ConvWithAutopadSameUpper_ExpectedOutput::output) / sizeof(float)); - - float *correct = ConvWithAutopadSameUpper_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithAutopadSameUpper", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ConvWithStridesPadding) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(35); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithStridesPadding", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvWithStridesPadding_ExpectedOutput::all_ones)); + SofieReference ref = readReference("ConvWithStridesPadding"); - float *correct = ConvWithStridesPadding_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithStridesPadding", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ConvWithDilation) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(49); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithDilation", input); + SofieReference ref = readReference("ConvWithDilation"); - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvWithDilation_ExpectedOutput::all_ones)); - - float *correct = ConvWithDilation_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithDilation", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ConvWithStridesNoPadding) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("ConvWithStridesNoPadding"); - // Preparing the standard all-ones input - std::vector input(35); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithStridesNoPadding", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithStridesNoPadding", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvWithStridesNoPadding_ExpectedOutput::all_ones)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - float *correct = ConvWithStridesNoPadding_ExpectedOutput::all_ones; +TEST(ONNX, ConvAddRelu) +{ + SofieReference ref = readReference("ConvAddRelu"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, ConvAddRelu) -{ - // Regression test for the fusion of Conv and Add into a single Conv - // operator with bias: the parser used to mark the Add node as fused - // without creating the fused operator, so the type of the Add output was - // never registered and parsing the following Relu node failed. + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvAddRelu", ref.f32("input0")); - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing a ramp input starting at -7, so that the Relu clips part of - // the fused Conv+Add output - std::vector input(16); - std::iota(input.begin(), input.end(), -7.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvAddRelu", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvAddRelu_ExpectedOutput::outputs)); - - float *correct = ConvAddRelu_ExpectedOutput::outputs; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ConvWithDynShapeStride) @@ -823,228 +305,83 @@ TEST(ONNX, ConvWithDynShapeStride) // Disables test (asymmetric padding not supported) TEST(DISABLED_ONNX, ConvWithAsymmetricPadding) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(35); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithAsymmetricPadding", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvWithAsymmetricPadding_ExpectedOutput::all_ones)); + SofieReference ref = readReference("ConvWithAsymmetricPadding"); - float *correct = ConvWithAsymmetricPadding_ExpectedOutput::all_ones; + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvWithAsymmetricPadding", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, MaxPool1d){ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({0.0907, 0.1029, 0.8143, 1.4497, -0.7785, 0.3825, -0.3764, - 1.5785, -0.0835, 0.1622, - 1.5867, 0.9823, -0.8821, 0.4439, -0.1378, -0.2273, -0.0198, - -2.0230, 0.0905, 0.6674, - -1.4290, -1.3100, -0.9439, -0.0833, -0.1919, 0.6886, 0.9389, - -1.2914, -1.3584, -2.0341, - -0.3269, 0.1704, 1.1776, 1.3972, -1.8874, -1.5334, 1.1541, - 0.3011, 0.6569, -2.3504, - 0.4033, 0.1142, 2.2846, -1.3948, -0.8573, 0.5756, -1.0864, - 0.2283, 0.8947, 1.7627, - -0.1657, 0.0649, -1.6066, 0.4162, -1.1525, -0.8184, 1.1324, - -1.1086, 0.1061, 1.0071}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool1d", input); - // Checking output size - EXPECT_EQ(output.size(), std::size(MaxPool1d_ExpectedOutput::output)); - - float *correct = MaxPool1d_ExpectedOutput::output; +TEST(ONNX, MaxPool1d) +{ + SofieReference ref = readReference("MaxPool1d"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool1d", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, MaxPool2d){ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - 0.6266, 0.1656, 0.2753, -0.4558, -1.4592, 0.9285, -1.3410, - 1.3223, -0.5936, -1.3648, - -0.2989, 0.5901, -0.8845, -0.0433, 0.8314, -1.7159, -0.5765, - 0.8678, 1.0257, 0.7847, - -0.3421, -1.2364, -0.5805, 0.4421, 1.2184, 0.5043, 1.6823, - -1.0483, -2.2798, -1.8927, - 0.7716, 0.0405, 0.3121, -0.3011, -0.3266, -1.9660, 1.0837, - 0.2317, 0.9084, -0.3285, - -0.9398, -0.2065, -0.9499, -0.9739, -0.1288, -0.1375, -1.2612, - 0.8810, 0.8506, 0.4455 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool2d", input); - // Checking output size - EXPECT_EQ(output.size(), std::size(MaxPool2d_ExpectedOutput::output)); - - float *correct = MaxPool2d_ExpectedOutput::output; +TEST(ONNX, MaxPool2d) +{ + SofieReference ref = readReference("MaxPool2d"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool2d", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, MaxPool2d_AsymPad) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // 1x1x4x4 input with values 0..15 - std::vector input({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}); + SofieReference ref = readReference("MaxPool2d_AsymPad"); - ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool2d_AsymPad", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool2d_AsymPad", ref.f32("input0")); - // pads=[0,1,0,1] (width padded, height not) gives a 1x1x3x5 output; - // the pre-fix code mis-read the pads and produced a 4x4 grid instead - EXPECT_EQ(output.size(), std::size(MaxPool2d_AsymPad_ExpectedOutput::output)); - - float *correct = MaxPool2d_AsymPad_ExpectedOutput::output; - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, MaxPool2d_CeilMode) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // 1x1x5x5 input: values 0..24; MaxPool kernel=2x2 stride=2 ceil_mode=1 -> 1x1x3x3 output - std::vector input(25); - for (int i = 0; i < 25; i++) - input[i] = static_cast(i); + SofieReference ref = readReference("MaxPool2d_CeilMode"); - ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool2d_CeilMode", input); - EXPECT_EQ(output.size(), std::size(MaxPool2d_CeilMode_ExpectedOutput::output)); + ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool2d_CeilMode", ref.f32("input0")); - float *correct = MaxPool2d_CeilMode_ExpectedOutput::output; - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, MaxPool3d){ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - -2.6496, 1.0476, -0.5153, - 0.3771, 0.4129, -0.3077, - -0.8717, -0.8040, -0.3525, - - -0.1765, -0.3364, 0.8737, - -0.2381, -0.8297, 0.4666, - 0.6984, -0.6760, 0.6298, - - 1.3833, 0.1101, 0.2039, - -0.5477, 0.2341, 0.9181, - 0.3842, 0.2428, 1.7924 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool3d", input); - // Checking output size - EXPECT_EQ(output.size(), std::size(MaxPool3d_ExpectedOutput::output)); - - float *correct = MaxPool3d_ExpectedOutput::output; +TEST(ONNX, MaxPool3d) +{ + SofieReference ref = readReference("MaxPool3d"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "MaxPool3d", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, AvgPool){ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - 0.4764, -0.1976, 1.6506, -0.2421, 0.6412, 1.9985, 0.3938, - 0.1347, 0.2204, -0.7503, - 0.2139, 0.7285, -0.0210, -0.4585, -1.5333, -0.4772, 0.5560, - 0.6323, -2.5372, 1.4906, - -1.1062, -0.9703, 0.2366, -0.9184, 0.3014, 0.7985, -0.6841, - -2.2854, -2.7728, -1.2806, - -1.0947, -0.5990, -0.3033, -1.9042, -0.5403, 0.2332, 0.9215, - -0.1549, 0.0557, -0.5567, - -1.4971, 0.5386, -0.2922, 0.4860, -0.3973, -0.4624, 0.4514, - 0.2385, 0.3783, -1.0500 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "AvgPool", input); - // Checking output size - EXPECT_EQ(output.size(), std::size(AvgPool_ExpectedOutput::output)); - - float *correct = AvgPool_ExpectedOutput::output; +TEST(ONNX, AvgPool) +{ + SofieReference ref = readReference("AvgPool"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "AvgPool", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Pow){ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input1({ - 1, 2, 3 - }); - std::vector input2({ - 4, 5, 6 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Pow", input1, input2); - // Checking output size - EXPECT_EQ(output.size(), std::size(Pow_ExpectedOutput::outputs)); - - float *correct = Pow_ExpectedOutput::outputs; +TEST(ONNX, Pow) +{ + SofieReference ref = readReference("Pow"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "Pow", ref.f32("input0"), ref.f32("input1")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Pow_broadcast){ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input1({ - 1, 2, 3, 3, 4, 5 - }); - std::vector input2({ - 2, 3, 4, 2, 3, 4 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Pow_broadcast", input1, input2); - // Checking output size - EXPECT_EQ(output.size(), std::size(Pow_broadcast_ExpectedOutput::outputs)); - - float *correct = Pow_broadcast_ExpectedOutput::outputs; +TEST(ONNX, Pow_broadcast) +{ + SofieReference ref = readReference("Pow_broadcast"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "Pow_broadcast", ref.f32("input0"), ref.f32("input1")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, FMod_ConstantFolding) @@ -1069,26 +406,13 @@ TEST(ONNX, Mod_ConstantFolding) EXPECT_EQ(output[i], correct_output[i]); } - TEST(ONNX, ReduceMean){ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - 5, 2, 3, - 5, 5, 4 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "ReduceMean", input); - // Checking output size - EXPECT_EQ(output.size(), std::size(ReduceMean_ExpectedOutput::output)); - - float *correct = ReduceMean_ExpectedOutput::output; + TEST(ONNX, ReduceMean) +{ + SofieReference ref = readReference("ReduceMean"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "ReduceMean", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ReduceMean_kFirst) @@ -1106,26 +430,13 @@ TEST(ONNX, ReduceMean_kFirst) } } - TEST(ONNX, ReduceProd){ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input({ - 5, 2, 3, - 5, 5, 4 - }); - - ASSERT_INCLUDE_AND_RUN(std::vector, "ReduceProd", input); - // Checking output size - EXPECT_EQ(output.size(), std::size(ReduceProd_ExpectedOutput::output)); - - float *correct = ReduceProd_ExpectedOutput::output; + TEST(ONNX, ReduceProd) +{ + SofieReference ref = readReference("ReduceProd"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "ReduceProd", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ReduceSum){ @@ -1181,1364 +492,437 @@ TEST(ONNX, ReduceSumSquare){ } TEST(ONNX, Max) - { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +{ + SofieReference ref = readReference("Max"); - // Preparing the standard input - std::vector input1({ - 1.0, 2.0, -1.0 - }); - std::vector input2({ - 3.0, 0.0, 4.0 - }); + ASSERT_INCLUDE_AND_RUN(std::vector, "Max", ref.f32("input0"), ref.f32("input1")); - ASSERT_INCLUDE_AND_RUN(std::vector, "Max", input1, input2); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - // Checking output size - EXPECT_EQ(output.size(), std::size(Max_ExpectedOutput::outputs)); +TEST(ONNX, MaxMultidirectionalBroadcast) +{ + SofieReference ref = readReference("MaxMultidirectionalBroadcast"); - float *correct = Max_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN( + std::vector, + "MaxMultidirectionalBroadcast", + ref.f32("input0"), + ref.f32("input1"), + ref.f32("input2")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} -TEST(ONNX, MaxMultidirectionalBroadcast) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, MinMultidirectionalBroadcast) +{ + SofieReference ref = readReference("MinMultidirectionalBroadcast"); - std::vector a({0.35974154, -2.20873388, 0.95746274}); - std::vector b({0.75901985, -0.46544461, -0.34920575, -0.1460754 , 0.08269051, -0.70045695}); - std::vector c({-0.41468981, -0.46591926, 0.56172534, 0.05616931}); + ASSERT_INCLUDE_AND_RUN( + std::vector, + "MinMultidirectionalBroadcast", + ref.f32("input0"), + ref.f32("input1"), + ref.f32("input2")); - ASSERT_INCLUDE_AND_RUN(std::vector, "MaxMultidirectionalBroadcast", a, b, c); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - EXPECT_EQ(output.size(), std::size(MaxMultidirectionalBroadcast_ExpectedOutput::output)); +TEST(ONNX, MeanMultidirectionalBroadcast) +{ + SofieReference ref = readReference("MeanMultidirectionalBroadcast"); - float* correct = MaxMultidirectionalBroadcast_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN( + std::vector, + "MeanMultidirectionalBroadcast", + ref.f32("input0"), + ref.f32("input1"), + ref.f32("input2")); - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, MinMultidirectionalBroadcast) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, SumMultidirectionalBroadcast) +{ + SofieReference ref = readReference("SumMultidirectionalBroadcast"); - std::vector a({0.35974154, -2.20873388, 0.95746274}); - std::vector b({0.75901985, -0.46544461, -0.34920575, -0.1460754 , 0.08269051, -0.70045695}); - std::vector c({-0.41468981, -0.46591926, 0.56172534, 0.05616931}); + ASSERT_INCLUDE_AND_RUN( + std::vector, + "SumMultidirectionalBroadcast", + ref.f32("input0"), + ref.f32("input1"), + ref.f32("input2")); - ASSERT_INCLUDE_AND_RUN(std::vector, "MinMultidirectionalBroadcast", a, b, c); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - EXPECT_EQ(output.size(), std::size(MinMultidirectionalBroadcast_ExpectedOutput::output)); +TEST(ONNX, Shape) +{ + SofieReference ref = readReference("Shape"); - float* correct = MinMultidirectionalBroadcast_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN(std::vector, "Shape", ref.f32("input0")); - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, MeanMultidirectionalBroadcast) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, RNNBatchwise) +{ + SofieReference ref = readReference("RNNBatchwise"); - std::vector a({0.35974154, -2.20873388, 0.95746274}); - std::vector b({0.75901985, -0.46544461, -0.34920575, -0.1460754 , 0.08269051, -0.70045695}); - std::vector c({-0.41468981, -0.46591926, 0.56172534, 0.05616931}); + ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNBatchwise", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(std::vector, "MeanMultidirectionalBroadcast", a, b, c); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} - EXPECT_EQ(output.size(), std::size(MeanMultidirectionalBroadcast_ExpectedOutput::output)); +TEST(ONNX, RNNBidirectional) +{ + SofieReference ref = readReference("RNNBidirectional"); - float* correct = MeanMultidirectionalBroadcast_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNBidirectional", ref.f32("input0")); - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); } -TEST(ONNX, SumMultidirectionalBroadcast) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, RNNBidirectionalBatchwise) +{ + SofieReference ref = readReference("RNNBidirectionalBatchwise"); - std::vector a({0.35974154, -2.20873388, 0.95746274}); - std::vector b({0.75901985, -0.46544461, -0.34920575, -0.1460754 , 0.08269051, -0.70045695}); - std::vector c({-0.41468981, -0.46591926, 0.56172534, 0.05616931}); + ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNBidirectionalBatchwise", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(std::vector, "SumMultidirectionalBroadcast", a, b, c); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} - EXPECT_EQ(output.size(), std::size(SumMultidirectionalBroadcast_ExpectedOutput::output)); +TEST(ONNX, RNNDefaults) +{ + SofieReference ref = readReference("RNNDefaults"); - float* correct = SumMultidirectionalBroadcast_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNDefaults", ref.f32("input0")); - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); } -TEST(ONNX, Shape){ - // test of Shape. Use shape operator to get shape and create a tensor equal to input shape and multiply the two - // Avoid test directly Shape otherwise get a compilation warning for the input that is not used in infer function - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, RNNSeqLength) +{ + SofieReference ref = readReference("RNNSeqLength"); - // Preparing the input ( a tensor of shape [1,2,3]) - std::vector input( {1,2,3,4,5,6} ); + ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNSeqLength", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(std::vector, "Shape", input); - // Checking output size - EXPECT_EQ(output.size(), std::size(Shape_ExpectedOutput::outputs)); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} - float *correct = Shape_ExpectedOutput::outputs; +TEST(ONNX, RNNSequence) +{ + SofieReference ref = readReference("RNNSequence"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNSequence", ref.f32("input0")); + + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); } -TEST(ONNX, RNNBatchwise) +TEST(ONNX, RNNSequenceBatchwise) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("RNNSequenceBatchwise"); - // Preparing the standard all-ones input - std::vector input(6); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNBatchwise", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; + ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNSequenceBatchwise", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output_y.size(), std::size(RNNBatchwise_ExpectedOutput::all_ones)); - EXPECT_EQ(output_yh.size(), std::size(RNNBatchwise_ExpectedOutput::all_ones)); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} - float *correct = RNNBatchwise_ExpectedOutput::all_ones; +TEST(ONNX, LSTMBatchwise) +{ + SofieReference ref = readReference("LSTMBatchwise"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct[i]), TOLERANCE); - EXPECT_LE(std::abs(output_yh[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMBatchwise", ref.f32("input0")); + + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); } -TEST(ONNX, RNNBidirectional) +TEST(ONNX, LSTMBidirectional) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("LSTMBidirectional"); - // Preparing the standard all-ones input - std::vector input({0., 0.01, 0.02, 0.03, 0.04, 0.05, - 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, - 0.12, 0.13, 0.14, 0.15, 0.16, 0.17}); - ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNBidirectional", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; + ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMBidirectional", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output_y.size(), std::size(RNNBidirectional_ExpectedOutput::all_ones_y)); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); + expectNear(output[2], ref.f32("output2"), DEFAULT_TOLERANCE); +} - float *correct_y = RNNBidirectional_ExpectedOutput::all_ones_y; +TEST(ONNX, LSTMDefaults) +{ + SofieReference ref = readReference("LSTMDefaults"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMDefaults", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(RNNBidirectional_ExpectedOutput::all_ones_yh)); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} + +TEST(ONNX, LSTMInitialBias) +{ + SofieReference ref = readReference("LSTMInitialBias"); - float *correct_yh = RNNBidirectional_ExpectedOutput::all_ones_yh; + ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMInitialBias", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); } -TEST(ONNX, RNNBidirectionalBatchwise) +TEST(ONNX, LSTMPeepholes) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("LSTMPeepholes"); - // Preparing the standard all-ones input - std::vector input({ - 0, 0.01, 0.06, 0.07, 0.12, 0.13, - 0.02, 0.03, 0.08, 0.09, 0.14, 0.15, - 0.04, 0.05, 0.1, 0.11, 0.16, 0.17}); - ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNBidirectionalBatchwise", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; + ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMPeepholes", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output_y.size(), std::size(RNNBidirectionalBatchwise_ExpectedOutput::all_ones_y)); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} + +// GRU tests +TEST(ONNX, GRUBatchwise) +{ + SofieReference ref = readReference("GRUBatchwise"); - float *correct_y = RNNBidirectionalBatchwise_ExpectedOutput::all_ones_y; + ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUBatchwise", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(RNNBidirectionalBatchwise_ExpectedOutput::all_ones_yh)); +TEST(ONNX, GRUBidirectional) +{ + SofieReference ref = readReference("GRUBidirectional"); - float *correct_yh = RNNBidirectionalBatchwise_ExpectedOutput::all_ones_yh; + ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUBidirectional", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); } -TEST(ONNX, RNNDefaults) +TEST(ONNX, GRUDefaults) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("GRUDefaults"); - // Preparing the standard all-ones input - std::vector input(9); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNDefaults", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; + ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUDefaults", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output_y.size(), std::size(RNNDefaults_ExpectedOutput::all_ones_y)); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} - float *correct_y = RNNDefaults_ExpectedOutput::all_ones_y; +TEST(ONNX, GRUInitialBias) +{ + SofieReference ref = readReference("GRUInitialBias"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUInitialBias", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(RNNDefaults_ExpectedOutput::all_ones_yh)); + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); +} - float *correct_yh = RNNDefaults_ExpectedOutput::all_ones_yh; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } -} - -TEST(ONNX, RNNSeqLength) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(18); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNSeqLength", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(RNNSeqLength_ExpectedOutput::all_ones_y)); - - float *correct_y = RNNSeqLength_ExpectedOutput::all_ones_y; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(RNNSeqLength_ExpectedOutput::all_ones_yh)); - - float *correct_yh = RNNSeqLength_ExpectedOutput::all_ones_yh; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } -} - -TEST(ONNX, RNNSequence) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input({ - 0.01, -0.01, 0.08, 0.09, 0.001, - 0.09, -0.7, -0.35, 0.0, 0.001, - 0.16, -0.19, 0.003, 0.0, 0.0001, - 0.05, -0.09, 0.013, 0.5, 0.005, - 0.2, -0.05, 0.062, -0.04, -0.04, - 0.0, 0.0, 0.0, 0.0, 0.0, - 0.06, 0.087, 0.01, 0.3, -0.001, - 0.0, 0.0, 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0, 0.0, 0.0}); - ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNSequence", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(RNNSequence_ExpectedOutput::all_ones_y)); - - float *correct_y = RNNSequence_ExpectedOutput::all_ones_y; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(RNNSequence_ExpectedOutput::all_ones_yh)); - - float *correct_yh = RNNSequence_ExpectedOutput::all_ones_yh; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } -} - -TEST(ONNX, RNNSequenceBatchwise) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input({ - 0.01, -0.01, 0.08, 0.09, 0.001, - 0.05, -0.09, 0.013, 0.5, 0.005, - 0.06, 0.087, 0.01, 0.3, -0.001, - 0.09, -0.7, -0.35, 0.0, 0.001, - 0.2, -0.05, 0.062, -0.04, -0.04, - 0.0, 0.0, 0.0, 0.0, 0.0, - 0.16, -0.19, 0.003, 0.0, 0.0001, - 0.0, 0.0, 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0, 0.0, 0.0}); - ASSERT_INCLUDE_AND_RUN(std::vector>, "RNNSequenceBatchwise", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(RNNSequenceBatchwise_ExpectedOutput::all_ones_y)); - - float *correct_y = RNNSequenceBatchwise_ExpectedOutput::all_ones_y; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(RNNSequenceBatchwise_ExpectedOutput::all_ones_yh)); - - float *correct_yh = RNNSequenceBatchwise_ExpectedOutput::all_ones_yh; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } -} - -TEST(ONNX, LSTMBatchwise) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(6); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMBatchwise", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(LSTMBatchwise_ExpectedOutput::all_ones)); - - float *correct = LSTMBatchwise_ExpectedOutput::all_ones; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(LSTMBatchwise_ExpectedOutput::all_ones)); - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, LSTMBidirectional) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(6); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMBidirectional", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - std::vector output_yc = output[2]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(LSTMBidirectional_ExpectedOutput::all_ones_y)); - - float *correct_y = LSTMBidirectional_ExpectedOutput::all_ones_y; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(LSTMBidirectional_ExpectedOutput::all_ones_yh)); - - float *correct_yh = LSTMBidirectional_ExpectedOutput::all_ones_yh; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yc.size(), std::size(LSTMBidirectional_ExpectedOutput::all_ones_yc)); - - float *correct_yc = LSTMBidirectional_ExpectedOutput::all_ones_yc; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yc[i] - correct_yc[i]), TOLERANCE); - } -} - -TEST(ONNX, LSTMDefaults) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(6); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMDefaults", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(LSTMDefaults_ExpectedOutput::all_ones_y)); - - float *correct_y = LSTMDefaults_ExpectedOutput::all_ones_y; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(LSTMDefaults_ExpectedOutput::all_ones_yh)); - - float *correct_yh = LSTMDefaults_ExpectedOutput::all_ones_yh; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } -} - -TEST(ONNX, LSTMInitialBias) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(9); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMInitialBias", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(LSTMInitialBias_ExpectedOutput::all_ones_y)); - - float *correct_y = LSTMInitialBias_ExpectedOutput::all_ones_y; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(LSTMInitialBias_ExpectedOutput::all_ones_yh)); - - float *correct_yh = LSTMInitialBias_ExpectedOutput::all_ones_yh; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } -} - -TEST(ONNX, LSTMPeepholes) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(8); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "LSTMPeepholes", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(LSTMPeepholes_ExpectedOutput::all_ones)); - - float *correct = LSTMPeepholes_ExpectedOutput::all_ones; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(LSTMPeepholes_ExpectedOutput::all_ones)); - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct[i]), TOLERANCE); - } -} - -// GRU tests -TEST(ONNX, GRUBatchwise) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(6); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUBatchwise", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(GRUBatchwise_ExpectedOutput::all_ones)); - - float *correct = GRUBatchwise_ExpectedOutput::all_ones; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(GRUBatchwise_ExpectedOutput::all_ones)); - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, GRUBidirectional) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(6); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUBidirectional", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(GRUBidirectional_ExpectedOutput::all_ones)); - - float *correct = GRUBidirectional_ExpectedOutput::all_ones; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(GRUBidirectional_ExpectedOutput::all_ones)); - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, GRUDefaults) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(6); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUDefaults", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(GRUDefaults_ExpectedOutput::all_ones)); - - float *correct = GRUDefaults_ExpectedOutput::all_ones; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(GRUDefaults_ExpectedOutput::all_ones)); - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, GRUInitialBias) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(9); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUInitialBias", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(GRUInitialBias_ExpectedOutput::all_ones)); - - float *correct = GRUInitialBias_ExpectedOutput::all_ones; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(GRUInitialBias_ExpectedOutput::all_ones)); - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, GRUSeqLength) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(18); - std::iota(input.begin(), input.end(), 1.0f); - ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUSeqLength", input); - std::vector output_y = output[0]; - std::vector output_yh = output[1]; - - // Checking output size - EXPECT_EQ(output_y.size(), std::size(GRUSeqLength_ExpectedOutput::all_ones_y)); - - float *correct_y = GRUSeqLength_ExpectedOutput::all_ones_y; - - // Checking every output value, one by one - for (size_t i = 0; i < output_y.size(); ++i) { - EXPECT_LE(std::abs(output_y[i] - correct_y[i]), TOLERANCE); - } - - // Checking output size - EXPECT_EQ(output_yh.size(), std::size(GRUSeqLength_ExpectedOutput::all_ones_yh)); - - float *correct_yh = GRUSeqLength_ExpectedOutput::all_ones_yh; - - // Checking every output value, one by one - for (size_t i = 0; i < output_yh.size(); ++i) { - EXPECT_LE(std::abs(output_yh[i] - correct_yh[i]), TOLERANCE); - } -} - -TEST(ONNX, Softmax1d) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - std::vector input({-1., 0., 1.}); - ASSERT_INCLUDE_AND_RUN(std::vector, "Softmax1d", input); - - EXPECT_EQ(output.size(), std::size(Softmax1d_ExpectedOutput::output)); - - float *correct = Softmax1d_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, Softmax2d) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - std::vector input({-1., 0., 1.}); - ASSERT_INCLUDE_AND_RUN(std::vector, "Softmax2d", input); - - EXPECT_EQ(output.size(), std::size(Softmax2d_ExpectedOutput::output)); - - float *correct = Softmax2d_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, Softmax3d) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - std::vector input({ - -0.8939, -0.3674, 0.1763, 1.5804, -0.4687, 1.2253, -1.3488, -0.1000, - -0.1262, 0.4962, 1.0870, 0.6905, -0.3451, -1.6981, -0.4688, 0.4468, - -0.5479, 0.0650, 1.0446, -1.6249, -0.7190, -1.7520, 3.7753, -1.4939}); - ASSERT_INCLUDE_AND_RUN(std::vector, "Softmax3d", input); - - EXPECT_EQ(output.size(), std::size(Softmax3d_ExpectedOutput::output)); - - float *correct = Softmax3d_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, Softmax4d) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - std::vector input({ - -0.5869, -1.4272, -0.1546, 0.0096, 0.1706, 0.0388, -0.3484, -0.7829, - 1.1138, -0.5644, -0.6264, -1.1890, 1.6741, -0.7130, 0.9592, 1.7477, - -0.4775, 1.3407, -0.3882, -0.4560, 1.0385, -0.1669, 0.5540, -1.0790, - -0.6153, -0.6274, -1.2304, -0.6757, 1.0178, -0.2379, -0.7912, -0.0165, - -0.5423, 0.1459, 1.3585, -0.5005, -0.2187, -1.8181, -0.6642, 0.0287, - -1.9103, 0.7984, -0.7860, 1.5134, 1.3873, -0.6462, -0.6354, -0.1335}); - ASSERT_INCLUDE_AND_RUN(std::vector, "Softmax4d", input); - - EXPECT_EQ(output.size(), std::size(Softmax4d_ExpectedOutput::output)); - - float *correct = Softmax4d_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, ConvTranspose1d) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(3); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTranspose1d", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvTranspose1d_ExpectedOutput::output)); - - float *correct = ConvTranspose1d_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, ConvTranspose2d) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(9); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTranspose2d", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvTranspose2d_ExpectedOutput::output)); - - float *correct = ConvTranspose2d_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -/* -TEST(ONNX, ConvTranspose3d) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(8); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTranspose3d", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvTranspose3d_ExpectedOutput::output)); - - float *correct = ConvTranspose3d_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} -*/ - -TEST(ONNX, ConvTransposeBias2d) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(9); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTransposeBias2d", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvTransposeBias2d_ExpectedOutput::output)); - - float *correct = ConvTransposeBias2d_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, ConvTransposeBias2dBatched) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard all-ones input - std::vector input(18); - std::iota(input.begin(), input.end(), 0.0f); - ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTransposeBias2dBatched", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(ConvTransposeBias2dBatched_ExpectedOutput::output)); - - float *correct = ConvTransposeBias2dBatched_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, Sqrt) -{ - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - std::vector input({0.8344, 0.4716, 0.6226, 0.8448, 0.2483, 0.9467}); - ASSERT_INCLUDE_AND_RUN(std::vector, "Sqrt", input); - - EXPECT_EQ(output.size(), std::size(Sqrt_ExpectedOutput::output)); - - float* correct = Sqrt_ExpectedOutput::output; - - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, Reciprocal) +TEST(ONNX, GRUSeqLength) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - std::vector input({1.2691, -1.2160, 0.6393, -0.4438, 0.8065, 0.2011}); - ASSERT_INCLUDE_AND_RUN(std::vector, "Reciprocal", input); - - EXPECT_EQ(output.size(), std::size(Reciprocal_ExpectedOutput::output)); + SofieReference ref = readReference("GRUSeqLength"); - float* correct = Reciprocal_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN(std::vector>, "GRUSeqLength", ref.f32("input0")); - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output[0], ref.f32("output0"), DEFAULT_TOLERANCE); + expectNear(output[1], ref.f32("output1"), DEFAULT_TOLERANCE); } -TEST(ONNX, Exp) +TEST(ONNX, Softmax1d) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - std::vector input({1.46566453, 0.63334515, 2.4048165 , 0.54468453, - -1.41271672, -0.18609187, 0.2754482 , 1.10615209, 0.88474389, 0.47531232}); - ASSERT_INCLUDE_AND_RUN(std::vector, "Exp", input); - - EXPECT_EQ(output.size(), std::size(Exp_ExpectedOutput::output)); - - float* correct = Exp_ExpectedOutput::output; - - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, AddBroadcast1) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // input - // The shape of A is {5} - std::vector A({-0.78023305, -1.34029483, -3.01482951, 0.53641361, - -1.22594789}); - // The shape of B is {4, 5} - std::vector B({1.0626695, 0.43842875, 1.22476468, 0.79763274, 0.98688211, - 0.25267614, 0.44874883, 0.31516773, -0.78771195, 0.64565664, - 0.50450593, -0.41265227, -0.22474539, -0.22362374, 0.00509674, - 0.16927211, 1.06756969, -0.81634773, 0.88467744, 0.78902059}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast1", A, B); - - // Checking the output size - EXPECT_EQ(output.size(), std::size(AddBroadcast1_ExpectedOutput::output)); - - float* correct = AddBroadcast1_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, AddBroadcast2) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // input - // The shape of A is {5} - std::vector A({0.60081805, 0.56575772, -0.58408511, -1.50827751, 1.2396254}); - // The shape of B is {2, 3, 4, 5} - std::vector B({ - -1.22516739e+00, -2.50373737e+00, -6.14517347e-01, 4.43165956e-01, - 4.09232228e-03, 1.43520073e+00, -8.37526920e-01, 1.18762642e+00, - -1.42122220e+00, 3.77123343e-01, -6.16450821e-01, 1.96641319e+00, - -2.03568224e+00, -5.36703377e-01, -2.22149348e+00, -1.58297075e+00, - -1.25149214e+00, 6.50629098e-01, 2.06339687e+00, 6.02281648e-01, - -5.39034004e-01, -1.26280821e+00, 7.87767451e-01, 1.08251530e-01, - 2.32829794e+00, -1.50890004e+00, -5.95592927e-01, -9.20059053e-02, - 1.63228625e+00, 1.94686070e+00, 7.45655684e-01, 3.86955114e-01, - -1.83205116e+00, -1.15734817e+00, 3.80085814e-02, -2.16949162e-01, - -2.35165487e-01, 2.18171406e-01, 6.13588954e-02, -8.57086260e-01, - -2.01864267e+00, -1.61373575e+00, -2.02050258e+00, -3.25052069e-01, - -1.07114643e-01, 4.68470099e-01, 1.99557999e-01, -1.94637668e+00, - 2.47900553e-01, 7.76198825e-01, -1.98736855e-01, -2.00884998e+00, - 1.46847865e+00, 9.61028795e-01, -8.14965358e-03, 4.63333332e-01, - -1.11316244e-01, 1.82046921e+00, -1.00519072e-01, 2.40577520e+00, - 2.57814258e+00, -1.51412865e+00, -6.48090386e-02, 9.22939224e-01, - -1.31486041e+00, 3.67387151e-01, -2.17020478e-03, -4.74744054e-01, - -6.28942699e-01, -1.31704730e+00, -6.20633846e-01, -4.90250204e-01, - -2.12485120e-01, -2.36786681e-02, 2.88809968e-02, -7.44777791e-01, - 1.30091804e-02, -1.68105549e+00, 8.22247057e-02, -1.14939503e+00, - -1.57565418e+00, -7.99386689e-01, -4.06411097e-01, 1.09358391e+00, - 1.58323366e+00, -8.15174970e-02, -9.09925044e-02, 2.35596716e+00, - -6.85364818e-02, 4.12883924e-01, 5.00495425e-01, -1.48442647e+00, - -5.19349052e-01, 3.81025828e-01, -1.06188597e-01, 2.83921542e-01, - 1.13215001e+00, 1.21558052e+00, -1.04667496e+00, -9.41151099e-01, - -4.04363040e-02, 1.45554304e+00, 1.64025681e-01, -3.34693361e-01, - 1.27701314e+00, 8.64744621e-01, 1.09621430e+00, -1.06563435e+00, - -1.55637568e+00, 2.14343040e+00, 4.69610352e-01, 9.09135609e-01, - -6.20603382e-01, -1.04235434e+00, -1.32974691e+00, -1.35968049e-01, - 9.62438348e-01, 1.13413513e+00, -9.24612219e-01, -2.26132356e+00}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast2", A, B); - - // Checking the output size - EXPECT_EQ(output.size(), std::size(AddBroadcast2_ExpectedOutput::output)); - - float* correct = AddBroadcast2_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, AddBroadcast3) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // input - // The shape of A is {2, 1, 1, 5} - std::vector A({0.13225244, -0.47801406, -1.47034622, 0.87786363, -0.51388502, - 0.77012016, 0.99407484, -0.41014198, 1.76506248, 1.24142803}); - // The shape of B is {2, 3, 4, 5} - std::vector B({ - -0.79900037, 1.26774471, 0.10287351, -0.00704713, 0.19927171, - 1.77125926, 0.23393901, -0.75160577, -0.40987021, 0.02957325, - 2.48770369, 2.72426688, 0.16116267, 0.13580884, -1.34550983, - 1.08341747, -0.57232679, -0.27434247, 2.29759196, 0.72506479, - -0.35984264, -1.47553974, 0.46544721, 0.45304508, 0.39350919, - 0.25335039, -2.15455262, 0.58592831, 0.0907586, 1.32830358, - 2.16876532, -1.31509165, -0.77901816, 1.72970744, 0.89410519, - 1.18891089, 0.58372505, -0.6117035, -0.83829228, 0.63917945, - 0.66626077, -1.07667629, 0.01411519, -0.67082652, -0.04556866, - -0.04949148, -1.87075929, 0.25587637, 0.14715114, -0.74584515, - -1.19373527, -1.52142058, -0.92522942, -0.98126531, -0.07535746, - -1.4692508, -0.08861242, 0.64951867, -0.16918995, 0.87015361, - 0.57688991, 1.36293834, 1.28256834, 0.39245538, 0.43308474, - 0.84529828, -0.56686547, -0.84791844, -0.11286944, 0.60857973, - -0.79519511, -0.20491925, -1.52951743, -0.39030064, -2.76160767, - 0.09055906, -0.99142034, 0.33480785, -1.09999883, 1.36149355, - 0.18557576, 0.55407001, 1.23164067, -0.23469015, -1.37274723, - 1.80717934, 1.42966758, 0.72077395, -0.09774939, 1.12065382, - -0.51515613, -0.9527945, 0.87646967, -0.59440101, -0.12440208, - -0.71096692, -0.6301275, 0.51726169, 1.23726643, 1.56255466, - -0.94469759, -0.38114756, -0.42021761, -0.58921487, -0.71439637, - 0.04793575, -2.04214516, -0.45765407, -1.12307202, 0.90727137, - 0.96272832, 0.54303206, -0.84973033, 0.28780329, 0.17027854, - -0.11893711, -1.22414638, -1.62747593, 0.53264501, 0.53483601}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast3", A, B); - - // Checking the output size - EXPECT_EQ(output.size(), std::size(AddBroadcast3_ExpectedOutput::output)); - - float* correct = AddBroadcast3_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, AddBroadcast4) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("Softmax1d"); - // input - // The shape of A is {2, 1} - std::vector A({1.94301397, 0.40606817}); - // The shape of B is {2, 4} - std::vector B({0.50898894, -0.27829921, -0.68761628, 0.33186382, 0.57915535, - 0.406858 , 1.4203833 , 0.19857093}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast4", A, B); - - // Checking the output size - EXPECT_EQ(output.size(), std::size(AddBroadcast4_ExpectedOutput::output)); - - float* correct = AddBroadcast4_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, AddBroadcast5) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // input - // The shape of A is {2, 1, 4} - std::vector A({-0.45616139, -0.05853134, 1.09564217, 0.95880315, 0.94995322, - -0.35864105, 1.08570897, 0.6028053}); - // The shape of B is {2, 3, 4} - std::vector B({1.69787452, 1.10641673, 2.19755165, 0.06709206, 0.04572308, - -2.14504366, -0.47730702, 0.15205423, -0.25159224, -0.07529807, - 0.5174367 , 0.08267595, 0.34015625, 0.09460231, -1.16608969, - -0.23466058, -0.5520268 , -0.13844847, 0.53055759, 0.17068648, - -0.49491276, -1.4246271 , -0.99973914, -0.2571329}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast5", A, B); - - // Checking the output size - EXPECT_EQ(output.size(), std::size(AddBroadcast5_ExpectedOutput::output)); - - float* correct = AddBroadcast5_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, AddBroadcast6) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // input - // The shape of A is {2, 1, 3, 1, 2} - std::vector A({1.05498675, -1.64311041, 0.11925147, -1.59755778, -0.01445313, - -0.69440541, -0.12011281, 0.00539323, -0.16923531, 2.34533598, - 1.30268048, 0.45699443}); - // The shape of B is {2, 2, 3, 2, 2} - std::vector B({ - 0.03162163, 1.36340443, -0.34736459, -0.71856324, 0.40669968, - -0.37595741, 0.22234952, 1.69563792, 0.91459166, -0.02081215, - -1.64894217, -0.01189261, 0.58031339, -0.11880191, 0.70099317, - -0.37424243, -0.23980527, -0.03178407, -0.27969109, 0.01895688, - 1.32111755, 0.02113906, 0.51450298, -1.41760768, -0.19220553, - 0.23529522, 0.95199908, -1.38971445, -0.75836965, -0.90956958, - -0.13006828, -0.64390454, -0.0808229 , 0.79134757, 1.00684867, - -1.43818087, -0.14550621, -0.33635512, -0.6185612 , -0.49281407, - -1.12947258, 1.61818821, -0.05826431, -1.47802183, 0.25637381, - -0.1547858 , 2.50788792, 0.30898059}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast6", A, B); - - // Checking the output size - EXPECT_EQ(output.size(), std::size(AddBroadcast6_ExpectedOutput::output)); - - float* correct = AddBroadcast6_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, AddBroadcast7) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // input - // The shape of A is {2, 1, 3, 1} - std::vector A({-0.42164834, -0.61767078, -0.68778897, -1.14175916, 0.63204375, - -0.60630317}); - // The shae of B is {1, 1, 3, 4} - std::vector B({1.40519865e+00, -2.87660856e-01, 7.49375999e-02, 1.22074840e+00, - -4.86212681e-01, -6.88210109e-01, -6.77434705e-01, 3.67088873e-01, - 8.05744026e-04, -2.08031088e-01, 9.69779132e-01, 7.58373863e-01}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast7", A, B); - - // Checking the output size - EXPECT_EQ(output.size(), std::size(AddBroadcast7_ExpectedOutput::output)); - - float* correct = AddBroadcast7_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } -} - -TEST(ONNX, Concat0D) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // input - std::vector input({1.40519865e+00, -2.87660856e-01}); - std::vector expected_output({1.40519865e+00, -2.87660856e-01, 1.40519865e+00, -2.87660856e-01}); - ASSERT_INCLUDE_AND_RUN(std::vector, "Concat_0D", input); - - // Checking the output size - EXPECT_EQ(expected_output.size(), expected_output.size()); - - float* correct = expected_output.data(); + ASSERT_INCLUDE_AND_RUN(std::vector, "Softmax1d", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, LayerNormalization2d) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, Softmax2d) +{ + SofieReference ref = readReference("Softmax2d"); - // input - std::vector x(12); - std::iota(x.begin(), x.end(), 0.); - ASSERT_INCLUDE_AND_RUN(std::vector, "LayerNormalization2d", x); + ASSERT_INCLUDE_AND_RUN(std::vector, "Softmax2d", ref.f32("input0")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(LayerNormalization2d_ExpectedOutput::output)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - float* correct = LayerNormalization2d_ExpectedOutput::output; +TEST(ONNX, Softmax3d) +{ + SofieReference ref = readReference("Softmax3d"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "Softmax3d", ref.f32("input0")); + + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, LayerNormalization4d) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, Softmax4d) +{ + SofieReference ref = readReference("Softmax4d"); - // input - std::vector x(120); - std::iota(x.begin(), x.end(), 0.); - ASSERT_INCLUDE_AND_RUN(std::vector, "LayerNormalization4d", x); + ASSERT_INCLUDE_AND_RUN(std::vector, "Softmax4d", ref.f32("input0")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(LayerNormalization4d_ExpectedOutput::output)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} + +TEST(ONNX, ConvTranspose1d) +{ + SofieReference ref = readReference("ConvTranspose1d"); - float* correct = LayerNormalization4d_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTranspose1d", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Equal){ - constexpr float TOLERANCE = 0; +TEST(ONNX, ConvTranspose2d) +{ + SofieReference ref = readReference("ConvTranspose2d"); - // Preparing the standard input - std::vector input1({ - 1.0, 2.0, 3.0 - }); - std::vector input2({ - 4.0, 2.0, 6.0 - }); + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTranspose2d", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(std::vector, "Equal", input1, input2); - // Checking output size - EXPECT_EQ(output.size(), std::size(Equal_ExpectedOutput::outputs)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - bool *correct = Equal_ExpectedOutput::outputs; +/* ConvTranspose3d is not supported yet; a ConvTranspose3d model would have + to be added to generate_input_models.py to enable this test. +TEST(ONNX, ConvTranspose3d) +{ + SofieReference ref = readReference("ConvTranspose3d"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(((correct[i]==output[i])?0:1), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTranspose3d", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } +*/ -TEST(ONNX, LessOrEqual){ - constexpr float TOLERANCE = 0; +TEST(ONNX, ConvTransposeBias2d) +{ + SofieReference ref = readReference("ConvTransposeBias2d"); - // Preparing the standard input - std::vector input1({ - 1.0, 2.0, 3.0 - }); - std::vector input2({ - 4.0, 2.0, 6.0 - }); + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTransposeBias2d", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(std::vector, "LessOrEqual", input1, input2); - // Checking output size - EXPECT_EQ(output.size(), std::size(LessOrEqual_ExpectedOutput::outputs)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - bool *correct = LessOrEqual_ExpectedOutput::outputs; +TEST(ONNX, ConvTransposeBias2dBatched) +{ + SofieReference ref = readReference("ConvTransposeBias2dBatched"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(((correct[i]==output[i])?0:1), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "ConvTransposeBias2dBatched", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, GreaterOrEqual){ - constexpr float TOLERANCE = 0; +TEST(ONNX, Sqrt) +{ + SofieReference ref = readReference("Sqrt"); - // Preparing the standard input - std::vector input1({ - 1.0, 2.0, 3.0 - }); - std::vector input2({ - 4.0, 2.0, 6.0 - }); + ASSERT_INCLUDE_AND_RUN(std::vector, "Sqrt", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(std::vector, "GreaterOrEqual", input1, input2); - // Checking output size - EXPECT_EQ(output.size(), std::size(GreaterOrEqual_ExpectedOutput::outputs)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - bool *correct = GreaterOrEqual_ExpectedOutput::outputs; +TEST(ONNX, Reciprocal) +{ + SofieReference ref = readReference("Reciprocal"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(((correct[i]==output[i])?0:1), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "Reciprocal", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Greater){ - constexpr float TOLERANCE = 0; +TEST(ONNX, Exp) +{ + SofieReference ref = readReference("Exp"); - // Preparing the standard input - std::vector input1({ - 1.0, 2.0, 3.0 - }); - std::vector input2({ - 4.0, 2.0, 6.0 - }); + ASSERT_INCLUDE_AND_RUN(std::vector, "Exp", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(std::vector, "Greater", input1, input2); - // Checking output size - EXPECT_EQ(output.size(), std::size(Greater_ExpectedOutput::outputs)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - bool *correct = Greater_ExpectedOutput::outputs; +TEST(ONNX, AddBroadcast1) +{ + SofieReference ref = readReference("AddBroadcast1"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(((correct[i]==output[i])?0:1), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast1", ref.f32("input0"), ref.f32("input1")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Less){ - constexpr float TOLERANCE = 0; +TEST(ONNX, AddBroadcast2) +{ + SofieReference ref = readReference("AddBroadcast2"); - // Preparing the standard input - std::vector input1({ - 1.0, 2.0, 3.0 - }); - std::vector input2({ - 4.0, 2.0, 6.0 - }); + ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast2", ref.f32("input0"), ref.f32("input1")); - ASSERT_INCLUDE_AND_RUN(std::vector, "Less", input1, input2); - // Checking output size - EXPECT_EQ(output.size(), std::size(Less_ExpectedOutput::outputs)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - bool *correct = Less_ExpectedOutput::outputs; +TEST(ONNX, AddBroadcast3) +{ + SofieReference ref = readReference("AddBroadcast3"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(((correct[i]==output[i])?0:1), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast3", ref.f32("input0"), ref.f32("input1")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, ExpandSameSize) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, AddBroadcast4) +{ + SofieReference ref = readReference("AddBroadcast4"); - // input - std::vector input({0., 1., 2.}); - ASSERT_INCLUDE_AND_RUN(std::vector, "ExpandSameSize", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast4", ref.f32("input0"), ref.f32("input1")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(ExpandSameSize_ExpectedOutput::output)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - float* correct = ExpandSameSize_ExpectedOutput::output; +TEST(ONNX, AddBroadcast5) +{ + SofieReference ref = readReference("AddBroadcast5"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast5", ref.f32("input0"), ref.f32("input1")); + + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, ExpandDiffSize) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, AddBroadcast6) +{ + SofieReference ref = readReference("AddBroadcast6"); - // input - std::vector input({0., 1., 2.}); - ASSERT_INCLUDE_AND_RUN(std::vector, "ExpandDiffSize", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast6", ref.f32("input0"), ref.f32("input1")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(ExpandDiffSize_ExpectedOutput::output)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - float* correct = ExpandDiffSize_ExpectedOutput::output; +TEST(ONNX, AddBroadcast7) +{ + SofieReference ref = readReference("AddBroadcast7"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "AddBroadcast7", ref.f32("input0"), ref.f32("input1")); + + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, GatherAxis0) { +TEST(ONNX, Concat0D) { constexpr float TOLERANCE = DEFAULT_TOLERANCE; // input - std::vector input(120); - std::iota(input.begin(), input.end(), 0.); - ASSERT_INCLUDE_AND_RUN(std::vector, "GatherAxis0", input); + std::vector input({1.40519865e+00, -2.87660856e-01}); + std::vector expected_output({1.40519865e+00, -2.87660856e-01, 1.40519865e+00, -2.87660856e-01}); + ASSERT_INCLUDE_AND_RUN(std::vector, "Concat_0D", input); // Checking the output size - EXPECT_EQ(output.size(), std::size(GatherAxis0_ExpectedOutput::output)); + EXPECT_EQ(expected_output.size(), expected_output.size()); - float* correct = GatherAxis0_ExpectedOutput::output; + float* correct = expected_output.data(); // Checking every output value, one by one for (size_t i = 0; i < output.size(); i++) { @@ -2546,232 +930,212 @@ TEST(ONNX, GatherAxis0) { } } -TEST(ONNX, GatherAxis1) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, LayerNormalization2d) +{ + SofieReference ref = readReference("LayerNormalization2d"); - // input - std::vector input(120); - std::iota(input.begin(), input.end(), 0.); - ASSERT_INCLUDE_AND_RUN(std::vector, "GatherAxis1", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "LayerNormalization2d", ref.f32("input0")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(GatherAxis1_ExpectedOutput::output)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - float* correct = GatherAxis1_ExpectedOutput::output; +TEST(ONNX, LayerNormalization4d) +{ + SofieReference ref = readReference("LayerNormalization4d"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "LayerNormalization4d", ref.f32("input0")); + + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, GatherAxis2) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, Equal) +{ + SofieReference ref = readReference("Equal"); - // input - std::vector input(120); - std::iota(input.begin(), input.end(), 0.); - ASSERT_INCLUDE_AND_RUN(std::vector, "GatherAxis2", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "Equal", ref.f32("input0"), ref.f32("input1")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(GatherAxis2_ExpectedOutput::output)); + expectEqual(output, ref.u8("output0")); +} - float* correct = GatherAxis2_ExpectedOutput::output; +TEST(ONNX, LessOrEqual) +{ + SofieReference ref = readReference("LessOrEqual"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "LessOrEqual", ref.f32("input0"), ref.f32("input1")); + + expectEqual(output, ref.u8("output0")); } -TEST(ONNX, GatherAxis3) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, GreaterOrEqual) +{ + SofieReference ref = readReference("GreaterOrEqual"); - // input - std::vector input(120); - std::iota(input.begin(), input.end(), 0.); - ASSERT_INCLUDE_AND_RUN(std::vector, "GatherAxis3", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "GreaterOrEqual", ref.f32("input0"), ref.f32("input1")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(GatherAxis3_ExpectedOutput::output)); + expectEqual(output, ref.u8("output0")); +} + +TEST(ONNX, Greater) +{ + SofieReference ref = readReference("Greater"); - float* correct = GatherAxis3_ExpectedOutput::output; + ASSERT_INCLUDE_AND_RUN(std::vector, "Greater", ref.f32("input0"), ref.f32("input1")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectEqual(output, ref.u8("output0")); } -TEST(ONNX, Gather2d) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, Less) +{ + SofieReference ref = readReference("Less"); - // input - std::vector input(9); - std::iota(input.begin(), input.end(), 0.); - ASSERT_INCLUDE_AND_RUN(std::vector, "Gather2d", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "Less", ref.f32("input0"), ref.f32("input1")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(Gather2d_ExpectedOutput::output)); + expectEqual(output, ref.u8("output0")); +} - float* correct = Gather2d_ExpectedOutput::output; +TEST(ONNX, ExpandSameSize) +{ + SofieReference ref = readReference("ExpandSameSize"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "ExpandSameSize", ref.f32("input0")); + + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, GatherNegativeIndices) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, ExpandDiffSize) +{ + SofieReference ref = readReference("ExpandDiffSize"); - // input - std::vector input(10); - std::iota(input.begin(), input.end(), 0.); - ASSERT_INCLUDE_AND_RUN(std::vector, "GatherNegativeIndices", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "ExpandDiffSize", ref.f32("input0")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(GatherNegativeIndices_ExpectedOutput::output)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - float* correct = GatherNegativeIndices_ExpectedOutput::output; +TEST(ONNX, GatherAxis0) +{ + SofieReference ref = readReference("GatherAxis0"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + ASSERT_INCLUDE_AND_RUN(std::vector, "GatherAxis0", ref.f32("input0")); + + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Slice) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, GatherAxis1) +{ + SofieReference ref = readReference("GatherAxis1"); - std::vector input = Slice::input; - ASSERT_INCLUDE_AND_RUN(std::vector, "Slice", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "GatherAxis1", ref.f32("input0")); - EXPECT_EQ(output.size(), std::size(Slice::output)); - float *correct = Slice::output; + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - for (size_t i=0; i, "GatherAxis2", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Slice_Default_Axis) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, GatherAxis3) +{ + SofieReference ref = readReference("GatherAxis3"); - std::vector input = Slice_Default_Axis::input; - ASSERT_INCLUDE_AND_RUN(std::vector, "Slice_Default_Axis", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "GatherAxis3", ref.f32("input0")); - EXPECT_EQ(output.size(), std::size(Slice_Default_Axis::output)); - float *correct = Slice_Default_Axis::output; + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - for (size_t i=0; i, "Gather2d", ref.f32("input0")); + + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Slice_Default_Steps) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, GatherNegativeIndices) +{ + SofieReference ref = readReference("GatherNegativeIndices"); + + ASSERT_INCLUDE_AND_RUN(std::vector, "GatherNegativeIndices", ref.f32("input0")); - std::vector input = Slice_Default_Steps::input; - ASSERT_INCLUDE_AND_RUN(std::vector, "Slice_Default_Steps", input); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - EXPECT_EQ(output.size(), std::size(Slice_Default_Steps::output)); - float *correct = Slice_Default_Steps::output; +TEST(ONNX, Slice) +{ + SofieReference ref = readReference("Slice"); - for (size_t i=0; i, "Slice", ref.f32("input0")); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } -TEST(ONNX, Slice_Neg) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; +TEST(ONNX, Slice_Default_Axis) +{ + SofieReference ref = readReference("Slice_Default_Axis"); - std::vector input = Slice_Neg::input; - ASSERT_INCLUDE_AND_RUN(std::vector, "Slice_Neg", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "Slice_Default_Axis", ref.f32("input0")); - EXPECT_EQ(output.size(), std::size(Slice_Neg::output)); - float *correct = Slice_Neg::output; + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - for (size_t i=0; i, "Slice_Default_Steps", ref.f32("input0")); - // inputs - std::vector start{1.}; - std::vector limit{10.}; - std::vector delta{2.}; - ASSERT_INCLUDE_AND_RUN_SESSION_ARGS(std::vector, "RangeFloat", "\"RangeFloat_FromONNX.dat\", 5", start, limit, delta); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - // Checking the output size - EXPECT_EQ(output.size(), std::size(RangeFloat_ExpectedOutput::outputs)); +TEST(ONNX, Slice_Neg) +{ + SofieReference ref = readReference("Slice_Neg"); - float* correct = RangeFloat_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Slice_Neg", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } +TEST(ONNX, RangeFloat) +{ + SofieReference ref = readReference("RangeFloat"); -TEST(ONNX, RangeInt) { - // inputs - std::vector start{1}; - std::vector limit{10}; - std::vector delta{2}; - ASSERT_INCLUDE_AND_RUN_SESSION_ARGS(std::vector, "RangeInt", "\"RangeInt_FromONNX.dat\", 5", start, limit, delta); + ASSERT_INCLUDE_AND_RUN_SESSION_ARGS( + std::vector, + "RangeFloat", + "\"RangeFloat_FromONNX.dat\", 5", + ref.f32("input0"), + ref.f32("input1"), + ref.f32("input2")); - // Checking the output size - EXPECT_EQ(output.size(), std::size(RangeInt_ExpectedOutput::outputs)); + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); +} - int64_t* correct = RangeInt_ExpectedOutput::outputs; +TEST(ONNX, RangeInt) +{ + SofieReference ref = readReference("RangeInt"); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); i++) { - EXPECT_EQ(output[i], correct[i]); - } + ASSERT_INCLUDE_AND_RUN_SESSION_ARGS( + std::vector, + "RangeInt", + "\"RangeInt_FromONNX.dat\", 5", + ref.i64("input0"), + ref.i64("input1"), + ref.i64("input2")); + + expectEqual(output, ref.i64("output0")); } -TEST(ONNX, Tile5D) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input_data({ - 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, 0.5724563598632812, -0.6596977710723877, - 0.17560836672782898, 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, 0.2705111503601074, - 1.42119562625885, 0.032626643776893616, -1.212586522102356, -0.5129594802856445, -0.43296414613723755, - -0.1606937050819397, 1.1884371042251587, -0.662174642086029, -2.291109323501587, -0.6852569580078125, - 2.325223922729492, -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, 0.2831517457962036, - 0.4496127665042877, -0.2029038816690445, 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, - 1.90426504611969, -0.4861580729484558, 0.9139055013656616, -0.5031066536903381, 0.9583520293235779, - -0.23210509121418, 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, -0.14444805681705475, - -0.8829464912414551, 1.725736141204834, 0.45657631754875183, 0.4920198321342468, -1.088847041130066, - 0.49437597393989563, -0.006085286382585764, 2.475630760192871, 0.12170185893774033, -0.8953945636749268, - 1.1430096626281738, 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, 0.05180325731635094, - 0.2802475392818451, 0.5289335250854492, 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, - 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, 0.5463842153549194, -0.7782878875732422, - -0.8570080399513245, -2.593783378601074, -0.11392943561077118, 0.5637082457542419, 2.075004816055298, - -1.0598397254943848, 1.0823975801467896 - }); - // std::vector repetitions({2, 1, 2, 1, 3}); - - ASSERT_INCLUDE_AND_RUN(std::vector, "Tile5D", input_data); - - // EXPECT_EQ(output.size(), expected_output.size()); - EXPECT_EQ(output.size(), std::size(Tile5D_ExpectedOutput::output)); - - - float* correct = Tile5D_ExpectedOutput::output; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } +TEST(ONNX, Tile5D) +{ + SofieReference ref = readReference("Tile5D"); + + ASSERT_INCLUDE_AND_RUN(std::vector, "Tile5D", ref.f32("input0")); + + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, Pad) { // add constant pad values of zeros @@ -3297,82 +1661,38 @@ TEST(ONNX, Clip) TEST(ONNX, Gelu) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input{1.0, -2.0, 3.0, 0.5, -1.0, 2.0}; - - ASSERT_INCLUDE_AND_RUN(std::vector, "Gelu", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(Gelu_ExpectedOutput::outputs)); + SofieReference ref = readReference("Gelu"); - float *correct = Gelu_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Gelu", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, Swish) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Input spanning negative and positive values - std::vector input{1.0, -2.0, 3.0, 0.5, -1.0, 2.0}; - - ASSERT_INCLUDE_AND_RUN(std::vector, "Swish", input); + SofieReference ref = readReference("Swish"); - // Checking output size - EXPECT_EQ(output.size(), std::size(Swish_ExpectedOutput::outputs)); - - float *correct = Swish_ExpectedOutput::outputs; + ASSERT_INCLUDE_AND_RUN(std::vector, "Swish", ref.f32("input0")); - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, HardSigmoid) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; - - // Preparing the standard input - std::vector input{1.0, -2.0, 3.0, 0.5, -1.0, 2.0}; + SofieReference ref = readReference("HardSigmoid"); - ASSERT_INCLUDE_AND_RUN(std::vector, "HardSigmoid", input); + ASSERT_INCLUDE_AND_RUN(std::vector, "HardSigmoid", ref.f32("input0")); - // Checking output size - EXPECT_EQ(output.size(), std::size(HardSigmoid_ExpectedOutput::outputs)); - - float *correct = HardSigmoid_ExpectedOutput::outputs; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, HardSwish) { - constexpr float TOLERANCE = DEFAULT_TOLERANCE; + SofieReference ref = readReference("HardSwish"); - // Preparing the standard input - std::vector input{1.0, -2.0, 3.0, 0.5, -1.0, 2.0}; + ASSERT_INCLUDE_AND_RUN(std::vector, "HardSwish", ref.f32("input0")); - ASSERT_INCLUDE_AND_RUN(std::vector, "HardSwish", input); - - // Checking output size - EXPECT_EQ(output.size(), std::size(HardSwish_ExpectedOutput::outputs)); - - float *correct = HardSwish_ExpectedOutput::outputs; - - // Checking every output value, one by one - for (size_t i = 0; i < output.size(); ++i) { - EXPECT_LE(std::abs(output[i] - correct[i]), TOLERANCE); - } + expectNear(output, ref.f32("output0"), DEFAULT_TOLERANCE); } TEST(ONNX, ComparisonBroadcast) diff --git a/tmva/sofie/test/generate_input_models.py b/tmva/sofie/test/generate_input_models.py new file mode 100644 index 0000000000000..cc4f82527ac33 --- /dev/null +++ b/tmva/sofie/test/generate_input_models.py @@ -0,0 +1,5286 @@ +#!/usr/bin/env python3 +"""Generator for the ONNX input models of the SOFIE tests. + +Each make_() function below builds one of the models in a +human-readable way with the onnx helper API. Large weight tensors whose +values carry no meaning (e.g. the weights of the Linear_* models) are +seeded-random via _random_tensor(). + +The script also computes the expected outputs for the value-based unit tests +(see TEST_INPUTS further below) and writes them to references/.ref in +the output directory, from where TestCustomModelsFromONNX.cxx reads them at +runtime. + +This script is run as the SofieGenerateModels_ONNX unit test, which the +other SOFIE ONNX tests depend on (see CMakeLists.txt). To (re)generate the +models and reference files manually: + + python3 generate_input_models.py --outdir [model names...] + +Listing the available model names does not require the onnx package: + + python3 generate_input_models.py --list +""" + +import argparse +import os +import sys + +try: + import numpy as np + import onnx + from onnx import TensorProto, helper, numpy_helper + from onnx.reference import ReferenceEvaluator +except ImportError: + onnx = None + +inf = float("inf") +nan = float("nan") + + +def _vi(name, dtype, shape): + """Shorthand for a tensor value info (graph/node input or output).""" + return helper.make_tensor_value_info(name, dtype, shape) + + +def _tensor(name, dtype, dims, vals): + """Shorthand for a constant tensor with explicit values.""" + return helper.make_tensor(name, dtype, dims, vals) + + +def _random_tensor(name, dims, seed): + """Uniform random float32 weight tensor in [-k, k] with k = 1/sqrt(fan_in), + mimicking the default pytorch initialization that the original models were + exported with. The fixed per-tensor seed keeps the generated model - and + with it the reference outputs computed further below - reproducible.""" + rng = np.random.RandomState(seed) + k = 1.0 / np.sqrt(dims[-1]) + vals = rng.uniform(-k, k, int(np.prod(dims))).astype(np.float32) + return helper.make_tensor(name, TensorProto.FLOAT, dims, vals) + + +def _model(graph, opset, ir_version, **kwargs): + """Wrap a graph into a ModelProto with the given opset and IR version.""" + model = helper.make_model(graph, opset_imports=[helper.make_opsetid("", opset)], **kwargs) + model.ir_version = ir_version + return model + + +if onnx is not None: + BOOL = TensorProto.BOOL + DOUBLE = TensorProto.DOUBLE + FLOAT = TensorProto.FLOAT + INT64 = TensorProto.INT64 + UINT8 = TensorProto.UINT8 + + +def make_Abs(): + """Ops: Abs""" + nodes = [ + helper.make_node('Abs', ['input'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'Abs', + inputs=[ + _vi('input', FLOAT, [2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Add(): + """Ops: Add""" + nodes = [ + helper.make_node('Add', ['onnx::Add_0', 'onnx::Add_1'], ['2'], name='Add_0'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Add_0', FLOAT, [2]), + _vi('onnx::Add_1', FLOAT, [2]), + ], + outputs=[ + _vi('2', FLOAT, [2]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_AddBroadcast1(): + """Ops: Add""" + nodes = [ + helper.make_node('Add', ['A', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Add', + inputs=[ + _vi('A', FLOAT, [5]), + _vi('B', FLOAT, [4, 5]), + ], + outputs=[ + _vi('Y', FLOAT, [4, 5]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_AddBroadcast2(): + """Ops: Add""" + nodes = [ + helper.make_node('Add', ['A', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Add', + inputs=[ + _vi('A', FLOAT, [5]), + _vi('B', FLOAT, [2, 3, 4, 5]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 3, 4, 5]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_AddBroadcast3(): + """Ops: Add""" + nodes = [ + helper.make_node('Add', ['A', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Add', + inputs=[ + _vi('A', FLOAT, [2, 1, 1, 5]), + _vi('B', FLOAT, [2, 3, 4, 5]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 3, 4, 5]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_AddBroadcast4(): + """Ops: Add""" + nodes = [ + helper.make_node('Add', ['A', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Add', + inputs=[ + _vi('A', FLOAT, [2, 1]), + _vi('B', FLOAT, [2, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 4]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_AddBroadcast5(): + """Ops: Add""" + nodes = [ + helper.make_node('Add', ['A', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Add', + inputs=[ + _vi('A', FLOAT, [2, 1, 4]), + _vi('B', FLOAT, [2, 3, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 3, 4]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_AddBroadcast6(): + """Ops: Add""" + nodes = [ + helper.make_node('Add', ['A', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Add', + inputs=[ + _vi('A', FLOAT, [2, 1, 3, 1, 2]), + _vi('B', FLOAT, [2, 2, 3, 2, 2]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 2, 3, 2, 2]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_AddBroadcast7(): + """Ops: Add""" + nodes = [ + helper.make_node('Add', ['A', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Add', + inputs=[ + _vi('A', FLOAT, [2, 1, 3, 1]), + _vi('B', FLOAT, [1, 1, 3, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 1, 3, 4]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_AvgPool(): + """Ops: AveragePool""" + nodes = [ + helper.make_node( + 'AveragePool', + ['onnx::Pad_0'], + ['2'], + name='AveragePool_1', + kernel_shape=[3, 2], + pads=[0, 0, 0, 0], + strides=[2, 1], + ), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Pad_0', FLOAT, [1, 1, 5, 10]), + ], + outputs=[ + _vi('2', FLOAT, [1, 1, 2, 9]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_Cast(): + """Ops: Cast""" + nodes = [ + helper.make_node('Cast', ['onnx::Cast_0'], ['1'], name='Cast_0', to=11), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Cast_0', INT64, [2, 3]), + ], + outputs=[ + _vi('1', DOUBLE, [2, 3]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_Clip(): + """Ops: Clip""" + nodes = [ + helper.make_node('Clip', ['X', 'min', 'max'], ['Y'], name='clip_node'), + helper.make_node('Clip', ['X', 'min'], ['Y2'], name='clip_node'), + ] + graph = helper.make_graph( + nodes, + 'ClipGraph', + inputs=[ + _vi('X', FLOAT, ['N', 2, 2]), + ], + outputs=[ + _vi('Y', FLOAT, ['N', 2, 2]), + _vi('Y2', FLOAT, ['N', 2, 2]), + ], + initializer=[ + _tensor('min', FLOAT, [], [-1.0]), + _tensor('max', FLOAT, [], [1.0]), + ], + ) + return _model(graph, opset=13, ir_version=8, producer_name='onnx-example') + + +def make_Comparison_broadcast(): + """Ops: Greater, Equal, Less""" + nodes = [ + helper.make_node('Greater', ['A', 'B'], ['OutGreater']), + helper.make_node('Equal', ['A', 'B'], ['OutEqual']), + helper.make_node('Less', ['A', 'B'], ['OutLess']), + ] + graph = helper.make_graph( + nodes, + 'ComparisonOpsWithBroadcast', + inputs=[ + _vi('A', FLOAT, [1, 4]), + _vi('B', FLOAT, [4]), + ], + outputs=[ + _vi('OutGreater', BOOL, [1, 4]), + _vi('OutEqual', BOOL, [1, 4]), + _vi('OutLess', BOOL, [1, 4]), + ], + ) + return _model(graph, opset=23, ir_version=11, producer_name='comparison_broadcast_demo') + + +def make_Comparison_broadcast_3d(): + """Ops: Greater, Equal, Less""" + nodes = [ + helper.make_node('Greater', ['A', 'B'], ['OutGreater']), + helper.make_node('Equal', ['A', 'B'], ['OutEqual']), + helper.make_node('Less', ['A', 'B'], ['OutLess']), + ] + graph = helper.make_graph( + nodes, + 'ComparisonOpsBroadcast', + inputs=[ + _vi('A', FLOAT, [2, 2, 4]), + _vi('B', FLOAT, [1, 4]), + ], + outputs=[ + _vi('OutGreater', BOOL, [2, 2, 4]), + _vi('OutEqual', BOOL, [2, 2, 4]), + _vi('OutLess', BOOL, [2, 2, 4]), + ], + ) + return _model(graph, opset=23, ir_version=11, producer_name='comparison_broadcast_demo') + + +def make_ComplexTopK(): + """Ops: Constant, TopK""" + nodes = [ + helper.make_node( + 'Constant', + [], + ['/Constant_output_0'], + name='/Constant', + value=_tensor('', INT64, [1], [3]), + ), + helper.make_node( + 'TopK', + ['onnx::TopK_0', '/Constant_output_0'], + ['4', '5'], + name='/TopK', + axis=1, + largest=1, + sorted=1, + ), + ] + graph = helper.make_graph( + nodes, + 'main_graph', + inputs=[ + _vi('onnx::TopK_0', FLOAT, [2, 3, 9]), + ], + outputs=[ + _vi('4', FLOAT, [2, 3, 9]), + _vi('5', INT64, [2, 3, 9]), + ], + ) + return _model(graph, opset=17, ir_version=8, producer_name='pytorch', producer_version='2.3.0') + + +def make_Concat_0D(): + """Ops: Concat""" + nodes = [ + helper.make_node( + 'Concat', + ['onnx::Concat_0', 'onnx::Concat_0'], + ['1'], + name='Concat_0', + axis=0, + ), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::Concat_0', FLOAT, [2]), + ], + outputs=[ + _vi('1', FLOAT, [4]), + ], + ) + return _model(graph, opset=13, ir_version=7, producer_name='pytorch', producer_version='1.12.1') + + +def make_Constant(): + """Ops: Constant, Add""" + nodes = [ + helper.make_node( + 'Constant', + [], + ['constant_output'], + value=_tensor('constant_tensor', FLOAT, [2, 2], [1.0, 2.0, 3.0, 4.0]), + ), + helper.make_node('Add', ['constant_output', 'constant_output'], ['add_output']), + ] + graph = helper.make_graph( + nodes, + 'constant_addition_graph', + inputs=[ + ], + outputs=[ + _vi('add_output', FLOAT, [2, 2]), + ], + ) + return _model(graph, opset=19, ir_version=9, producer_name='onnx_constant_model') + + +def make_ConvAddRelu(): + """Ops: Conv, Add, Relu""" + nodes = [ + helper.make_node( + 'Conv', + ['x', 'w'], + ['conv_out'], + kernel_shape=[3, 3], + pads=[0, 0, 0, 0], + strides=[1, 1], + ), + helper.make_node('Add', ['conv_out', 'b'], ['add_out']), + helper.make_node('Relu', ['add_out'], ['y']), + ] + graph = helper.make_graph( + nodes, + 'ConvAddRelu', + inputs=[ + _vi('x', FLOAT, [1, 1, 4, 4]), + ], + outputs=[ + _vi('y', FLOAT, [1, 1, 2, 2]), + ], + initializer=[ + _tensor('w', FLOAT, [1, 1, 3, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + _tensor('b', FLOAT, [1], [0.5]), + ], + ) + return _model(graph, opset=13, ir_version=13) + + +def make_ConvTranspose1d(): + """Ops: ConvTranspose""" + nodes = [ + helper.make_node('ConvTranspose', ['X', 'W'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'ConvTranspose1d', + inputs=[ + _vi('X', FLOAT, [1, 1, 3]), + _vi('W', FLOAT, [1, 2, 3]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 2, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 2, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_ConvTranspose2d(): + """Ops: ConvTranspose""" + nodes = [ + helper.make_node('ConvTranspose', ['X', 'W'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'ConvTranspose2d', + inputs=[ + _vi('X', FLOAT, [1, 1, 3, 3]), + _vi('W', FLOAT, [1, 2, 3, 3]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 2, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 2, 3, 3], [ + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, + ]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_ConvTransposeBias2d(): + """Ops: ConvTranspose""" + nodes = [ + helper.make_node('ConvTranspose', ['X', 'W', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'ConvTranspose2d', + inputs=[ + _vi('X', FLOAT, [1, 1, 3, 3]), + _vi('W', FLOAT, [1, 2, 3, 3]), + _vi('B', FLOAT, [2]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 2, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 2, 3, 3], [ + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, + ]), + _tensor('B', FLOAT, [2], [1.0, 2.0]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_ConvTransposeBias2dBatched(): + """Ops: ConvTranspose""" + nodes = [ + helper.make_node('ConvTranspose', ['X', 'W', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'ConvTranspose2d', + inputs=[ + _vi('X', FLOAT, [2, 1, 3, 3]), + _vi('W', FLOAT, [1, 2, 3, 3]), + _vi('B', FLOAT, [2]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 2, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 2, 3, 3], [ + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + 1.0, 1.0, + ]), + _tensor('B', FLOAT, [2], [1.0, 2.0]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_ConvWithAsymmetricPadding(): + """Ops: Conv""" + nodes = [ + helper.make_node( + 'Conv', + ['x', 'W'], + ['y'], + kernel_shape=[3, 3], + pads=[1, 0, 1, 0], + strides=[2, 2], + ), + ] + graph = helper.make_graph( + nodes, + 'ConvWithAsymmetricPadding', + inputs=[ + _vi('x', FLOAT, [1, 1, 7, 5]), + _vi('W', FLOAT, [1, 1, 3, 3]), + ], + outputs=[ + _vi('y', FLOAT, [1, 1, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='python_script') + + +def make_ConvWithAutopadSameLower(): + """Ops: Conv""" + nodes = [ + helper.make_node( + 'Conv', + ['x', 'W'], + ['y'], + auto_pad='SAME_LOWER', + kernel_shape=[3, 3], + strides=[2, 2], + ), + ] + graph = helper.make_graph( + nodes, + 'ConvWithAutopadSameLower', + inputs=[ + _vi('x', FLOAT, [1, 1, 5, 5]), + _vi('W', FLOAT, [1, 1, 3, 3]), + ], + outputs=[ + _vi('y', FLOAT, [1, 1, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='python_script') + + +def make_ConvWithAutopadSameUpper(): + """Ops: Conv""" + nodes = [ + helper.make_node( + 'Conv', + ['x', 'W'], + ['y'], + auto_pad='SAME_UPPER', + kernel_shape=[3, 3], + strides=[1, 1], + ), + ] + graph = helper.make_graph( + nodes, + 'ConvSameUpper', + inputs=[ + _vi('x', FLOAT, [1, 1, 5, 5]), + ], + outputs=[ + _vi('y', FLOAT, [1, 1, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=11, ir_version=13) + + +def make_ConvWithDilation(): + """Ops: Conv""" + nodes = [ + helper.make_node( + 'Conv', + ['input', 'W'], + ['output'], + dilations=[2, 2], + group=1, + kernel_shape=[3, 3], + pads=[0, 0, 0, 0], + strides=[1, 1], + ), + ] + graph = helper.make_graph( + nodes, + 'ConvWithDilation', + inputs=[ + _vi('input', FLOAT, [1, 1, 7, 7]), + ], + outputs=[ + _vi('output', FLOAT, [1, 1, 3, 3]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3, 3], [ + 0.10000000149011612, 0.20000000298023224, 0.30000001192092896, 0.4000000059604645, + 0.5, 0.6000000238418579, 0.699999988079071, 0.800000011920929, 0.9000000357627869, + ]), + ], + ) + return _model(graph, opset=13, ir_version=8) + + +def make_ConvWithDynShapeStride(): + """Ops: Conv""" + nodes = [ + helper.make_node('Conv', ['X', 'W'], ['Y'], kernel_shape=[3], pads=[0, 0], strides=[2]), + ] + graph = helper.make_graph( + nodes, + 'ConvWithDynShapeStride', + inputs=[ + _vi('X', FLOAT, [1, 1, 'W']), + ], + outputs=[ + _vi('Y', FLOAT, [1, 1, 'out_W']), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3], [1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=13, ir_version=13) + + +def make_ConvWithPadding(): + """Ops: Conv""" + nodes = [ + helper.make_node('Conv', ['x', 'W'], ['y'], kernel_shape=[3, 3], pads=[1, 1, 1, 1]), + ] + graph = helper.make_graph( + nodes, + 'ConvWithPadding', + inputs=[ + _vi('x', FLOAT, [1, 1, 5, 5]), + _vi('W', FLOAT, [1, 1, 3, 3]), + ], + outputs=[ + _vi('y', FLOAT, [1, 1, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='python_script') + + +def make_ConvWithStridesNoPadding(): + """Ops: Conv""" + nodes = [ + helper.make_node( + 'Conv', + ['x', 'W'], + ['y'], + kernel_shape=[3, 3], + pads=[0, 0, 0, 0], + strides=[2, 2], + ), + ] + graph = helper.make_graph( + nodes, + 'ConvWithStridesNoPadding', + inputs=[ + _vi('x', FLOAT, [1, 1, 7, 5]), + _vi('W', FLOAT, [1, 1, 3, 3]), + ], + outputs=[ + _vi('y', FLOAT, [1, 1, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='python_script') + + +def make_ConvWithStridesPadding(): + """Ops: Conv""" + nodes = [ + helper.make_node( + 'Conv', + ['x', 'W'], + ['y'], + kernel_shape=[3, 3], + pads=[1, 1, 1, 1], + strides=[2, 2], + ), + ] + graph = helper.make_graph( + nodes, + 'ConvWithStridesPadding', + inputs=[ + _vi('x', FLOAT, [1, 1, 7, 5]), + _vi('W', FLOAT, [1, 1, 3, 3]), + ], + outputs=[ + _vi('y', FLOAT, [1, 1, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='python_script') + + +def make_ConvWithoutPadding(): + """Ops: Conv""" + nodes = [ + helper.make_node('Conv', ['x', 'W'], ['y'], kernel_shape=[3, 3], pads=[0, 0, 0, 0]), + ] + graph = helper.make_graph( + nodes, + 'ConvWithoutPadding', + inputs=[ + _vi('x', FLOAT, [1, 1, 5, 5]), + _vi('W', FLOAT, [1, 1, 3, 3]), + ], + outputs=[ + _vi('y', FLOAT, [1, 1, 5, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 1, 3, 3], [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='python_script') + + +def make_Cos(): + """Ops: Cos""" + nodes = [ + helper.make_node('Cos', ['input'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'CosGraph', + inputs=[ + _vi('input', FLOAT, [3, 4]), + ], + outputs=[ + _vi('output', FLOAT, [3, 4]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='cos_example') + + +def make_Div(): + """Ops: Div""" + nodes = [ + helper.make_node('Div', ['onnx::Div_0', 'onnx::Div_1'], ['2'], name='Div_0'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Div_0', FLOAT, [2]), + _vi('onnx::Div_1', FLOAT, [2]), + ], + outputs=[ + _vi('2', FLOAT, [2]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_Einsum_3(): + """Ops: Einsum""" + nodes = [ + helper.make_node('Einsum', ['inputA', 'inputB'], ['output'], equation='abc,abd->ad'), + ] + graph = helper.make_graph( + nodes, + 'EinsumGraph', + inputs=[ + _vi('inputA', FLOAT, [2, 2, 3]), + _vi('inputB', FLOAT, [2, 2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Einsum_4(): + """Ops: Einsum""" + nodes = [ + helper.make_node('Einsum', ['inputA', 'inputB'], ['output'], equation='abcd,abed->abce'), + ] + graph = helper.make_graph( + nodes, + 'EinsumGraph', + inputs=[ + _vi('inputA', FLOAT, [2, 1, 2, 3]), + _vi('inputB', FLOAT, [2, 1, 3, 3]), + ], + outputs=[ + _vi('output', FLOAT, [2, 1, 2, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Einsum_dotprod(): + """Ops: Einsum""" + nodes = [ + helper.make_node('Einsum', ['inputA', 'inputB'], ['output'], equation='i,i->'), + ] + graph = helper.make_graph( + nodes, + 'EinsumGraph', + inputs=[ + _vi('inputA', FLOAT, [3]), + _vi('inputB', FLOAT, [3]), + ], + outputs=[ + _vi('output', FLOAT, [0]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Einsum_matmul(): + """Ops: Einsum""" + nodes = [ + helper.make_node('Einsum', ['inputA', 'inputB'], ['output'], equation='ik,kj->ij'), + ] + graph = helper.make_graph( + nodes, + 'EinsumGraph', + inputs=[ + _vi('inputA', FLOAT, [2, 2]), + _vi('inputB', FLOAT, [2, 2]), + ], + outputs=[ + _vi('output', FLOAT, [2, 2]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Elu(): + """Ops: Elu""" + nodes = [ + helper.make_node('Elu', ['input'], ['output'], name='/elu/Elu', alpha=1.0), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('input', FLOAT, [2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='pytorch', producer_version='2.0.1') + + +def make_EluAlpha(): + """Ops: Elu""" + nodes = [ + helper.make_node('Elu', ['input'], ['output'], name='/elu/Elu', alpha=0.5), + ] + graph = helper.make_graph( + nodes, + 'EluAlpha', + inputs=[ + _vi('input', FLOAT, [2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=11, ir_version=13) + + +def make_Equal(): + """Ops: Equal""" + nodes = [ + helper.make_node('Equal', ['onnx::Equal_0', 'onnx::Equal_1'], ['2'], name='/Equal'), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::Equal_0', FLOAT, [3]), + _vi('onnx::Equal_1', FLOAT, [3]), + ], + outputs=[ + _vi('2', BOOL, [3]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='pytorch', producer_version='1.13.1') + + +def make_Erf(): + """Ops: Erf""" + nodes = [ + helper.make_node('Erf', ['onnx::Erf_0'], ['1'], name='/Erf'), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::Erf_0', FLOAT, [12]), + ], + outputs=[ + _vi('1', FLOAT, [12]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='pytorch', producer_version='1.13.1') + + +def make_Exp(): + """Ops: Exp""" + nodes = [ + helper.make_node('Exp', ['X'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Exp', + inputs=[ + _vi('X', FLOAT, [10]), + ], + outputs=[ + _vi('Y', FLOAT, [10]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_ExpandDiffSize(): + """Ops: Expand""" + nodes = [ + helper.make_node('Expand', ['X', 'Shape'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Expand', + inputs=[ + _vi('X', FLOAT, [3, 1]), + _vi('Shape', INT64, [4]), + ], + outputs=[ + _vi('Y', FLOAT, []), + ], + initializer=[ + _tensor('Shape', INT64, [4], [3, 2, 1, 4]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_ExpandSameSize(): + """Ops: Expand""" + nodes = [ + helper.make_node('Expand', ['X', 'Shape'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Expand', + inputs=[ + _vi('X', FLOAT, [3, 1]), + _vi('Shape', INT64, [2]), + ], + outputs=[ + _vi('Y', FLOAT, []), + ], + initializer=[ + _tensor('Shape', INT64, [2], [3, 4]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_EyeLike(): + """Ops: EyeLike""" + nodes = [ + helper.make_node('EyeLike', ['x'], ['y']), + ] + graph = helper.make_graph( + nodes, + 'eyelike_model', + inputs=[ + _vi('x', FLOAT, [3, 3]), + ], + outputs=[ + _vi('y', FLOAT, [3, 3]), + ], + ) + return _model(graph, opset=19, ir_version=9, producer_name='EyeLikeModel') + + +def make_FMod_ConstantFolding(): + """Ops: Constant, Mod""" + nodes = [ + helper.make_node('Constant', [], ['X'], value=_tensor('X', FLOAT, [3], [10.0, 7.0, 5.0])), + helper.make_node('Constant', [], ['D'], value=_tensor('D', FLOAT, [3], [3.0, 3.0, 3.0])), + helper.make_node('Mod', ['X', 'D'], ['Y'], fmod=1), + ] + graph = helper.make_graph( + nodes, + 'FMod_ConstantFolding', + inputs=[ + ], + outputs=[ + _vi('Y', FLOAT, [3]), + ], + ) + return _model(graph, opset=13, ir_version=13) + + +def make_GRUBatchwise(): + """Ops: GRU""" + nodes = [ + helper.make_node( + 'GRU', + ['X', 'W', 'R'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh'], + clip=0.0, + direction='forward', + hidden_size=6, + layout=1, + ), + ] + graph = helper.make_graph( + nodes, + 'GRUBatchwise', + inputs=[ + _vi('X', FLOAT, [3, 1, 2]), + _vi('W', FLOAT, [1, 18, 2]), + _vi('R', FLOAT, [1, 18, 6]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 1, 1, 6]), + _vi('Y_h', FLOAT, [3, 1, 6]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 18, 2], [ + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + ]), + _random_tensor('R', [1, 18, 6], seed=101), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_GRUBidirectional(): + """Ops: GRU""" + nodes = [ + helper.make_node( + 'GRU', + ['X', 'W', 'R'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh', 'Sigmoid', 'Tanh'], + clip=0.0, + direction='bidirectional', + hidden_size=5, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'GRUBidirectional', + inputs=[ + _vi('X', FLOAT, [1, 3, 2]), + _vi('W', FLOAT, [2, 15, 2]), + _vi('R', FLOAT, [2, 15, 5]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 2, 3, 5]), + _vi('Y_h', FLOAT, [2, 3, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [2, 15, 2], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, + ]), + _random_tensor('R', [2, 15, 5], seed=102), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_GRUDefaults(): + """Ops: GRU""" + nodes = [ + helper.make_node( + 'GRU', + ['X', 'W', 'R'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh'], + clip=0.0, + direction='forward', + hidden_size=5, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'GRUDefaults', + inputs=[ + _vi('X', FLOAT, [1, 3, 2]), + _vi('W', FLOAT, [1, 15, 2]), + _vi('R', FLOAT, [1, 15, 5]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 1, 3, 5]), + _vi('Y_h', FLOAT, [1, 3, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 15, 2], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, + ]), + _random_tensor('R', [1, 15, 5], seed=103), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_GRUInitialBias(): + """Ops: GRU""" + nodes = [ + helper.make_node( + 'GRU', + ['X', 'W', 'R', 'B'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh'], + clip=0.0, + direction='forward', + hidden_size=3, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'GRUInitialBias', + inputs=[ + _vi('X', FLOAT, [1, 3, 3]), + _vi('W', FLOAT, [1, 9, 3]), + _vi('R', FLOAT, [1, 9, 3]), + _vi('B', FLOAT, [1, 18]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 1, 3, 3]), + _vi('Y_h', FLOAT, [1, 3, 3]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 9, 3], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _tensor('R', FLOAT, [1, 9, 3], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _tensor('B', FLOAT, [1, 18], [ + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_GRUSeqLength(): + """Ops: GRU""" + nodes = [ + helper.make_node( + 'GRU', + ['X', 'W', 'R', 'B'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh'], + clip=0.0, + direction='forward', + hidden_size=5, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'GRUSeqLength', + inputs=[ + _vi('X', FLOAT, [2, 3, 3]), + _vi('W', FLOAT, [1, 15, 3]), + _vi('R', FLOAT, [1, 15, 5]), + _vi('B', FLOAT, [1, 30]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 1, 3, 5]), + _vi('Y_h', FLOAT, [1, 3, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 15, 3], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, + ]), + _random_tensor('R', [1, 15, 5], seed=104), + _tensor('B', FLOAT, [1, 30], [ + 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_Gather2d(): + """Ops: Gather""" + nodes = [ + helper.make_node('Gather', ['X', 'I'], ['Y'], axis=0), + ] + graph = helper.make_graph( + nodes, + 'Gather', + inputs=[ + _vi('X', FLOAT, [3, 3]), + _vi('I', INT64, [3, 2]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 2, 3]), + ], + initializer=[ + _tensor('I', INT64, [3, 2], [0, 2, 0, 1, 2, 2]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_GatherAxis0(): + """Ops: Gather""" + nodes = [ + helper.make_node('Gather', ['X', 'I'], ['Y'], axis=0), + ] + graph = helper.make_graph( + nodes, + 'Gather', + inputs=[ + _vi('X', FLOAT, [5, 4, 3, 2]), + _vi('I', INT64, [3]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 4, 3, 2]), + ], + initializer=[ + _tensor('I', INT64, [3], [0, 1, 3]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_GatherAxis1(): + """Ops: Gather""" + nodes = [ + helper.make_node('Gather', ['X', 'I'], ['Y'], axis=1), + ] + graph = helper.make_graph( + nodes, + 'Gather', + inputs=[ + _vi('X', FLOAT, [5, 4, 3, 2]), + _vi('I', INT64, [3]), + ], + outputs=[ + _vi('Y', FLOAT, [5, 3, 3, 2]), + ], + initializer=[ + _tensor('I', INT64, [3], [0, 1, 3]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_GatherAxis2(): + """Ops: Gather""" + nodes = [ + helper.make_node('Gather', ['X', 'I'], ['Y'], axis=2), + ] + graph = helper.make_graph( + nodes, + 'Gather', + inputs=[ + _vi('X', FLOAT, [5, 4, 3, 2]), + _vi('I', INT64, [2]), + ], + outputs=[ + _vi('Y', FLOAT, [5, 4, 2, 2]), + ], + initializer=[ + _tensor('I', INT64, [2], [1, 2]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_GatherAxis3(): + """Ops: Gather""" + nodes = [ + helper.make_node('Gather', ['X', 'I'], ['Y'], axis=3), + ] + graph = helper.make_graph( + nodes, + 'Gather', + inputs=[ + _vi('X', FLOAT, [5, 4, 3, 2]), + _vi('I', INT64, [1]), + ], + outputs=[ + _vi('Y', FLOAT, [5, 4, 3, 1]), + ], + initializer=[ + _tensor('I', INT64, [1], [1]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_GatherND_1(): + """Ops: GatherND""" + nodes = [ + helper.make_node('GatherND', ['data', 'indices'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + _vi('data', FLOAT, [2, 3, 3]), + _vi('indices', INT64, [2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [2]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_GatherND_2(): + """Ops: GatherND""" + nodes = [ + helper.make_node('GatherND', ['data', 'indices'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + _vi('data', FLOAT, [2, 3, 3]), + _vi('indices', INT64, [2, 2]), + ], + outputs=[ + _vi('output', FLOAT, [2, 2]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_GatherND_3(): + """Ops: GatherND""" + nodes = [ + helper.make_node('GatherND', ['data', 'indices'], ['output'], batch_dims=1), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + _vi('data', FLOAT, [2, 3, 2, 2]), + _vi('indices', INT64, [2, 2, 1]), + ], + outputs=[ + _vi('output', FLOAT, [2, 2, 2, 2]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_GatherNegativeIndices(): + """Ops: Gather""" + nodes = [ + helper.make_node('Gather', ['X', 'I'], ['Y'], axis=0), + ] + graph = helper.make_graph( + nodes, + 'Gather', + inputs=[ + _vi('X', FLOAT, [10]), + _vi('I', INT64, [3]), + ], + outputs=[ + _vi('Y', FLOAT, [3]), + ], + initializer=[ + _tensor('I', INT64, [3], [0, -9, -10]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Gelu(): + """Ops: Gelu""" + nodes = [ + helper.make_node('Gelu', ['x'], ['y']), + ] + graph = helper.make_graph( + nodes, + 'Gelu', + inputs=[ + _vi('x', FLOAT, [6]), + ], + outputs=[ + _vi('y', FLOAT, [6]), + ], + ) + return _model(graph, opset=20, ir_version=13) + + +def make_Greater(): + """Ops: Greater""" + nodes = [ + helper.make_node( + 'Greater', + ['onnx::Greater_0', 'onnx::Greater_1'], + ['2'], + name='/Greater', + ), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::Greater_0', FLOAT, [3]), + _vi('onnx::Greater_1', FLOAT, [3]), + ], + outputs=[ + _vi('2', BOOL, [3]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='pytorch', producer_version='2.0.1') + + +def make_GreaterOrEqual(): + """Ops: GreaterOrEqual""" + nodes = [ + helper.make_node( + 'GreaterOrEqual', + ['onnx::GreaterOrEqual_0', 'onnx::GreaterOrEqual_1'], + ['2'], + name='/GreaterOrEqual', + ), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::GreaterOrEqual_0', FLOAT, [3]), + _vi('onnx::GreaterOrEqual_1', FLOAT, [3]), + ], + outputs=[ + _vi('2', BOOL, [3]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='pytorch', producer_version='2.0.1') + + +def make_HardSigmoid(): + """Ops: HardSigmoid""" + nodes = [ + helper.make_node( + 'HardSigmoid', + ['input'], + ['output'], + alpha=0.20000000298023224, + beta=0.5, + ), + ] + graph = helper.make_graph( + nodes, + 'HardSigmoidGraph', + inputs=[ + _vi('input', FLOAT, [6]), + ], + outputs=[ + _vi('output', FLOAT, [6]), + ], + ) + return _model(graph, opset=6, ir_version=13) + + +def make_HardSwish(): + """Ops: HardSwish""" + nodes = [ + helper.make_node('HardSwish', ['input'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'HardSwishGraph', + inputs=[ + _vi('input', FLOAT, [6]), + ], + outputs=[ + _vi('output', FLOAT, [6]), + ], + ) + return _model(graph, opset=14, ir_version=13) + + +def make_IsInf(): + """Ops: IsInf""" + nodes = [ + helper.make_node('IsInf', ['input'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'Test', + inputs=[ + _vi('input', FLOAT, [1, 'N']), + ], + outputs=[ + _vi('output', BOOL, [1, 'N']), + ], + ) + return _model(graph, opset=25, ir_version=13, producer_name='onnx-example') + + +def make_LSTMBatchwise(): + """Ops: LSTM""" + nodes = [ + helper.make_node( + 'LSTM', + ['X', 'W', 'R'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh', 'Tanh'], + clip=0.0, + direction='forward', + hidden_size=7, + layout=1, + ), + ] + graph = helper.make_graph( + nodes, + 'LSTMBatchwise', + inputs=[ + _vi('X', FLOAT, [3, 1, 2]), + _vi('W', FLOAT, [1, 28, 2]), + _vi('R', FLOAT, [1, 28, 7]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 1, 1, 7]), + _vi('Y_h', FLOAT, [3, 1, 7]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 28, 2], [ + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, 0.30000001192092896, + ]), + _random_tensor('R', [1, 28, 7], seed=105), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_LSTMBidirectional(): + """Ops: LSTM""" + nodes = [ + helper.make_node( + 'LSTM', + ['X', 'W', 'R'], + ['Y', 'Y_h', 'Y_c'], + activations=['Sigmoid', 'Tanh', 'Tanh', 'Sigmoid', 'Tanh', 'Tanh'], + clip=0.0, + direction='bidirectional', + hidden_size=3, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'LSTMBidirectional', + inputs=[ + _vi('X', FLOAT, [3, 1, 2]), + _vi('W', FLOAT, [2, 12, 2]), + _vi('R', FLOAT, [2, 12, 3]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 2, 1, 3]), + _vi('Y_h', FLOAT, [2, 1, 3]), + _vi('Y_c', FLOAT, [2, 1, 3]), + ], + initializer=[ + _tensor('W', FLOAT, [2, 12, 2], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _random_tensor('R', [2, 12, 3], seed=106), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_LSTMDefaults(): + """Ops: LSTM""" + nodes = [ + helper.make_node( + 'LSTM', + ['X', 'W', 'R'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh', 'Tanh'], + clip=0.0, + direction='forward', + hidden_size=3, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'LSTMDefaults', + inputs=[ + _vi('X', FLOAT, [3, 1, 2]), + _vi('W', FLOAT, [1, 12, 2]), + _vi('R', FLOAT, [1, 12, 3]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 1, 1, 3]), + _vi('Y_h', FLOAT, [1, 1, 3]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 12, 2], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _tensor('R', FLOAT, [1, 12, 3], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_LSTMInitialBias(): + """Ops: LSTM""" + nodes = [ + helper.make_node( + 'LSTM', + ['X', 'W', 'R', 'B'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh', 'Tanh'], + clip=0.0, + direction='forward', + hidden_size=4, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'LSTMInitialBias', + inputs=[ + _vi('X', FLOAT, [3, 1, 3]), + _vi('W', FLOAT, [1, 16, 3]), + _vi('R', FLOAT, [1, 16, 4]), + _vi('B', FLOAT, [1, 32]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 1, 1, 4]), + _vi('Y_h', FLOAT, [1, 1, 4]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 16, 3], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _tensor('R', FLOAT, [1, 16, 4], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _tensor('B', FLOAT, [1, 32], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_LSTMPeepholes(): + """Ops: LSTM""" + nodes = [ + helper.make_node( + 'LSTM', + ['X', 'W', 'R', 'B', 'sequence_lens', 'initial_h', 'initial_c', 'P'], + ['Y', 'Y_h'], + activations=['Sigmoid', 'Tanh', 'Tanh'], + clip=0.0, + direction='forward', + hidden_size=3, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'LSTMPeepholes', + inputs=[ + _vi('X', FLOAT, [1, 2, 4]), + _vi('W', FLOAT, [1, 12, 4]), + _vi('R', FLOAT, [1, 12, 3]), + _vi('B', FLOAT, [1, 24]), + _vi('sequence_lens', FLOAT, [2]), + _vi('initial_h', FLOAT, [1, 2, 3]), + _vi('initial_c', FLOAT, [1, 2, 3]), + _vi('P', FLOAT, [1, 9]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 1, 2, 3]), + _vi('Y_h', FLOAT, [1, 2, 3]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 12, 4], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _tensor('R', FLOAT, [1, 12, 3], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _tensor('B', FLOAT, [1, 24], [ + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + _tensor('sequence_lens', FLOAT, [2], [1.0, 1.0]), + _tensor('initial_h', FLOAT, [1, 2, 3], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + _tensor('initial_c', FLOAT, [1, 2, 3], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + _tensor('P', FLOAT, [1, 9], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_LayerNormalization2d(): + """Ops: LayerNormalization""" + nodes = [ + helper.make_node('LayerNormalization', ['X', 'Scale', 'B'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'LayerNormalization', + inputs=[ + _vi('X', FLOAT, [3, 4]), + _vi('Scale', FLOAT, [4]), + _vi('B', FLOAT, [4]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 4]), + ], + initializer=[ + _tensor('Scale', FLOAT, [4], [0.5, -0.20000000298023224, 0.30000001192092896, 1.0]), + _tensor('B', FLOAT, [4], [0.20000000298023224, -0.10000000149011612, 0.10000000149011612, 0.0]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_LayerNormalization4d(): + """Ops: LayerNormalization""" + nodes = [ + helper.make_node('LayerNormalization', ['X', 'Scale', 'B'], ['Y'], axis=2), + ] + graph = helper.make_graph( + nodes, + 'LayerNormalization', + inputs=[ + _vi('X', FLOAT, [2, 3, 4, 5]), + _vi('Scale', FLOAT, [4, 5]), + _vi('B', FLOAT, [4, 5]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 3, 4, 5]), + ], + initializer=[ + _tensor('Scale', FLOAT, [4, 5], [ + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, 0.10000000149011612, + ]), + _tensor('B', FLOAT, [4, 5], [ + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, 0.20000000298023224, + ]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Less(): + """Ops: Less""" + nodes = [ + helper.make_node('Less', ['onnx::Less_0', 'onnx::Less_1'], ['2'], name='/Less'), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::Less_0', FLOAT, [3]), + _vi('onnx::Less_1', FLOAT, [3]), + ], + outputs=[ + _vi('2', BOOL, [3]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='pytorch', producer_version='2.0.1') + + +def make_LessOrEqual(): + """Ops: LessOrEqual""" + nodes = [ + helper.make_node( + 'LessOrEqual', + ['onnx::LessOrEqual_0', 'onnx::LessOrEqual_1'], + ['2'], + name='/LessOrEqual', + ), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::LessOrEqual_0', FLOAT, [3]), + _vi('onnx::LessOrEqual_1', FLOAT, [3]), + ], + outputs=[ + _vi('2', BOOL, [3]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='pytorch', producer_version='2.0.1') + + +def make_LinearWithLeakyRelu(): + """Ops: LeakyRelu""" + nodes = [ + helper.make_node( + 'LeakyRelu', + ['input'], + ['1'], + name='LeakyRelu_0', + alpha=0.10000000149011612, + ), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('input', FLOAT, [24]), + ], + outputs=[ + _vi('1', FLOAT, [24]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_LinearWithSelu(): + """Ops: Gemm, Selu, Gemm, Selu""" + nodes = [ + helper.make_node( + 'Gemm', + ['input.1', '0.weight', '0.bias'], + ['5'], + name='Gemm_0', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Selu', ['5'], ['6'], name='Selu_1'), + helper.make_node( + 'Gemm', + ['6', '2.weight', '2.bias'], + ['7'], + name='Gemm_2', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Selu', ['7'], ['8'], name='Selu_3'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('input.1', FLOAT, [2, 24]), + ], + outputs=[ + _vi('8', FLOAT, [2, 12]), + ], + initializer=[ + _random_tensor('0.weight', [8, 24], seed=107), + _tensor('0.bias', FLOAT, [8], [ + -0.02950236387550831, 0.1598697304725647, 0.0748923048377037, -0.07833899557590485, + -0.1760983020067215, 0.230862095952034, 0.1015596091747284, -0.049189355224370956, + ]), + _random_tensor('2.weight', [12, 8], seed=108), + _tensor('2.bias', FLOAT, [12], [ + -0.17583288252353668, 0.30308830738067627, -0.027203908190131187, + 0.037800826132297516, 0.08170158416032791, 0.3773317337036133, + -0.17529195547103882, -0.37161365151405334, -0.1841122955083847, + 0.22103063762187958, -0.10950803756713867, -0.10128439217805862, + ]), + ], + ) + return _model(graph, opset=9, ir_version=6, producer_name='pytorch', producer_version='1.9') + + +def make_LinearWithSigmoid(): + """Ops: Gemm, Sigmoid, Gemm, Sigmoid""" + nodes = [ + helper.make_node( + 'Gemm', + ['input.1', '0.weight', '0.bias'], + ['5'], + name='Gemm_0', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Sigmoid', ['5'], ['6'], name='Sigmoid_1'), + helper.make_node( + 'Gemm', + ['6', '2.weight', '2.bias'], + ['7'], + name='Gemm_2', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Sigmoid', ['7'], ['8'], name='Sigmoid_3'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('input.1', FLOAT, [2, 24]), + ], + outputs=[ + _vi('8', FLOAT, [2, 12]), + ], + initializer=[ + _random_tensor('0.weight', [8, 24], seed=109), + _tensor('0.bias', FLOAT, [8], [ + 0.1170196384191513, -0.05893150717020035, 0.11833080649375916, 0.1336972713470459, + -0.08772247284650803, 0.16479122638702393, 0.05615559592843056, 0.059780675917863846, + ]), + _random_tensor('2.weight', [12, 8], seed=110), + _tensor('2.bias', FLOAT, [12], [ + 0.06870245188474655, -0.015492145903408527, 0.46931853890419006, + -0.4815196692943573, -0.23028719425201416, -0.24661526083946228, + -0.22366689145565033, -0.6485911011695862, -0.011641554534435272, + -0.8092096447944641, -0.737714409828186, -0.17296408116817474, + ]), + ], + ) + return _model(graph, opset=9, ir_version=6, producer_name='pytorch', producer_version='1.9') + + +def make_Linear_16(): + """Ops: Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm""" + nodes = [ + helper.make_node( + 'Gemm', + ['input.1', '0.weight', '0.bias'], + ['21'], + name='Gemm_0', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['21'], ['22'], name='Relu_1'), + helper.make_node( + 'Gemm', + ['22', '2.weight', '2.bias'], + ['23'], + name='Gemm_2', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['23'], ['24'], name='Relu_3'), + helper.make_node( + 'Gemm', + ['24', '4.weight', '4.bias'], + ['25'], + name='Gemm_4', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['25'], ['26'], name='Relu_5'), + helper.make_node( + 'Gemm', + ['26', '6.weight', '6.bias'], + ['27'], + name='Gemm_6', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['27'], ['28'], name='Relu_7'), + helper.make_node( + 'Gemm', + ['28', '8.weight', '8.bias'], + ['29'], + name='Gemm_8', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['29'], ['30'], name='Relu_9'), + helper.make_node( + 'Gemm', + ['30', '10.weight', '10.bias'], + ['31'], + name='Gemm_10', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['31'], ['32'], name='Relu_11'), + helper.make_node( + 'Gemm', + ['32', '12.weight', '12.bias'], + ['33'], + name='Gemm_12', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['33'], ['34'], name='Relu_13'), + helper.make_node( + 'Gemm', + ['34', '14.weight', '14.bias'], + ['35'], + name='Gemm_14', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['35'], ['36'], name='Relu_15'), + helper.make_node( + 'Gemm', + ['36', '16.weight', '16.bias'], + ['37'], + name='Gemm_16', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['37'], ['38'], name='Relu_17'), + helper.make_node( + 'Gemm', + ['38', '18.weight', '18.bias'], + ['39'], + name='Gemm_18', + alpha=1.0, + beta=1.0, + transB=1, + ), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('input.1', FLOAT, [16, 100]), + ], + outputs=[ + _vi('39', FLOAT, [16, 10]), + ], + initializer=[ + _tensor('0.bias', FLOAT, [50], [ + 0.06874362379312515, 0.1215260922908783, -0.03796323388814926, + -0.047220371663570404, 0.0851314440369606, 0.09796275943517685, + 0.12071841955184937, 0.07664817571640015, 0.11198078840970993, 0.02310258150100708, + 0.07579555362462997, 0.05929337441921234, -0.036450356245040894, + 0.11803308129310608, -0.011961907148361206, -0.08527068793773651, + -0.057033807039260864, 0.1044885590672493, -0.018882740288972855, + -0.008054572157561779, 0.10694648325443268, -0.022059820592403412, + 0.09017779678106308, 0.1540471315383911, 0.1271747350692749, 0.06436201930046082, + 0.1194877177476883, -0.010833785869181156, 0.1089724600315094, + -0.044143423438072205, 0.06858711689710617, -0.03810128942131996, + 0.0594230554997921, 0.011302107945084572, 0.16360539197921753, + -0.03886178508400917, 0.06342087686061859, 0.10477621853351593, + 0.07790201157331467, 0.025975681841373444, 0.15242689847946167, + -0.07979436218738556, -0.015697987750172615, 0.16126343607902527, + 0.058438144624233246, -0.007473993580788374, 0.09990260750055313, + 0.06640422344207764, -0.02770175412297249, 0.049512993544340134, + ]), + _random_tensor('0.weight', [50, 100], seed=111), + _tensor('10.bias', FLOAT, [50], [ + 0.12787356972694397, 0.01754315197467804, 0.12297597527503967, 0.07300411909818649, + 0.05101786553859711, -0.009935596957802773, 0.13993382453918457, + 0.15092433989048004, 0.06841301918029785, -0.03337057679891586, + -0.18426062166690826, -0.13440611958503723, 0.10937852412462234, + 0.11137652397155762, -0.10483825951814651, -0.02507081814110279, + 0.12054929882287979, 0.0411001481115818, 0.1838451772928238, 0.13574835658073425, + -0.0077139283530414104, -0.12025056034326553, 0.0854426920413971, + -0.05131257325410843, 0.13684552907943726, -0.014523052610456944, + -0.08954862505197525, -0.025241060182452202, -0.008962735533714294, + 0.09331826120615005, -0.10867604613304138, -0.10423946380615234, + 0.17008665204048157, -0.03412630781531334, 0.07280059158802032, + -0.04532545059919357, -0.10004503279924393, -0.11012918502092361, + -0.0077126519754529, -0.1191520020365715, 0.12147060036659241, 0.10113030672073364, + 0.03328618407249451, 0.014212618581950665, -0.010599344968795776, + 0.10923430323600769, -0.01827055774629116, 0.17716272175312042, + 0.06910598278045654, -0.07394197583198547, + ]), + _random_tensor('10.weight', [50, 50], seed=112), + _tensor('12.bias', FLOAT, [50], [ + -0.06509873270988464, 0.05613470822572708, -0.05249607563018799, + -0.060684677213430405, 0.055331166833639145, 0.08404038101434708, + 0.0655064731836319, 0.13225528597831726, 0.035152286291122437, -0.0857200175523758, + 0.04633798822760582, -0.13850943744182587, -0.030993010848760605, + 0.07260533422231674, -0.0611225962638855, 0.04004671797156334, 0.03332715854048729, + -0.13936835527420044, -0.11538780480623245, 0.03552905097603798, + -0.07537106424570084, -0.10834012180566788, -0.16588839888572693, + 0.058801423758268356, 0.0744016021490097, 0.07377104461193085, + -0.16663652658462524, 0.13944970071315765, -0.10723331570625305, + 0.16675545275211334, 0.11190473288297653, 0.1424584835767746, -0.10559768974781036, + 0.17358238995075226, 0.024868786334991455, -0.008324883878231049, + -0.009020783007144928, 0.09669970721006393, 0.1663464903831482, + 0.051099903881549835, -0.11830130964517593, -0.13791216909885406, + -0.054981157183647156, -0.14046736061573029, 0.024868272244930267, + -0.0492456778883934, 0.13240450620651245, -0.1366450935602188, + -0.006306866183876991, -0.06659865379333496, + ]), + _random_tensor('12.weight', [50, 50], seed=113), + _tensor('14.bias', FLOAT, [50], [ + 0.016014426946640015, 0.06593047082424164, -0.1345161348581314, + -0.1251203864812851, -0.12696857750415802, 0.011852066963911057, + 0.1119963675737381, -0.0366256982088089, -0.07817808538675308, + -0.0018910560756921768, -0.07488702237606049, 0.11818061023950577, + -0.04405388981103897, -0.014389574527740479, 0.072415791451931, + -0.040516626089811325, -0.06337642669677734, -0.038087353110313416, + 0.06708531081676483, 0.060243379324674606, 0.09579991549253464, + -0.0834713950753212, -0.04309255629777908, -0.039707157760858536, + -0.02101474069058895, -0.004626616835594177, 0.09738843142986298, + -0.15382537245750427, -0.14784333109855652, 0.012172728776931763, + 0.18078944087028503, 0.018331220373511314, -0.1306842863559723, + -0.1078730896115303, -0.049283646047115326, -0.04442322626709938, + -0.05975477397441864, -0.03484858572483063, -0.1593368649482727, + 0.04525914043188095, -0.028948737308382988, 0.09824682772159576, + -0.017328474670648575, -0.10201127827167511, 0.021711774170398712, + 0.02649231068789959, 0.1379029005765915, 0.0019947874825447798, + -0.09130772948265076, 0.07110419124364853, + ]), + _random_tensor('14.weight', [50, 50], seed=114), + _tensor('16.bias', FLOAT, [50], [ + -0.14252740144729614, 0.16887430846691132, -0.0887828916311264, + -0.06314415484666824, -0.06602327525615692, 0.05441824719309807, + 0.06415509432554245, 0.06069942191243172, -0.0223076269030571, 0.10297013819217682, + 0.025865202769637108, -0.08093931525945663, -0.027676187455654144, + 0.05468316376209259, 0.1288861781358719, -0.0795307531952858, + -0.018913164734840393, -0.1207500547170639, 0.17368493974208832, + -0.049284402281045914, -0.05787952244281769, 0.06717755645513535, + 0.012359170243144035, 0.13264226913452148, -0.05257987976074219, + 0.017382705584168434, 0.06598390638828278, -0.09585361182689667, + 0.07884091138839722, 0.010707235895097256, 0.04929834231734276, + -0.025524809956550598, 0.051943808794021606, 0.13757683336734772, + -0.11596449464559555, -0.07238765060901642, 0.11116628348827362, + -0.11908264458179474, -0.08664168417453766, 0.09629549086093903, + 0.11060114204883575, -0.013693519867956638, -0.1386561542749405, + -0.06237578019499779, 0.08550456911325455, -0.12340494990348816, + 0.06833907216787338, -0.017610615119338036, -0.04134988784790039, + 0.02336009591817856, + ]), + _random_tensor('16.weight', [50, 50], seed=115), + _tensor('18.bias', FLOAT, [10], [ + -0.028683319687843323, 0.031511370092630386, -0.015858041122555733, + 0.04559389129281044, 0.09545835852622986, -0.10511715710163116, + -0.07386839389801025, -0.11918522417545319, -0.06869250535964966, + 0.09922939538955688, + ]), + _random_tensor('18.weight', [10, 50], seed=116), + _tensor('2.bias', FLOAT, [50], [ + -0.044733885675668716, 0.053787779062986374, 0.07859575748443604, + -0.06343381106853485, 0.15348155796527863, 0.14867684245109558, + 0.02656984142959118, -0.026198450475931168, -0.07519230246543884, + -0.03524557128548622, 0.09328898042440414, 0.11387166380882263, + -0.019346164539456367, 0.17526762187480927, -0.07706878334283829, + 0.15751178562641144, 0.019623270258307457, -0.07372663915157318, + 0.08727440983057022, 0.11638835817575455, 0.16839821636676788, 0.04258020967245102, + -0.10223003476858139, 0.06937894970178604, -0.0855393335223198, + 0.12638899683952332, 0.020591460168361664, 0.1405806839466095, + -0.0023452509194612503, -0.029579175636172295, 0.019782187417149544, + 0.06618925929069519, 0.16647274792194366, 0.14933745563030243, + 0.051312513649463654, 0.0006887729396112263, -0.07575076073408127, + -0.054050710052251816, 0.13494345545768738, 0.025651181116700172, + -0.09433789551258087, -0.02612384594976902, 0.030958404764533043, + 0.11118845641613007, 0.16908417642116547, 0.1360965222120285, 0.0985386073589325, + 0.048001762479543686, -0.047142088413238525, 0.12221584469079971, + ]), + _random_tensor('2.weight', [50, 50], seed=117), + _tensor('4.bias', FLOAT, [50], [ + 0.04200629144906998, -0.05310118943452835, -0.04059197008609772, + 0.1476421356201172, -0.044893037527799606, -0.0946018248796463, + 0.03687572851777077, 0.08952753245830536, -0.0013579304795712233, + -0.04650532454252243, 0.10455886274576187, 0.04649180546402931, + -0.09281352907419205, 0.14577698707580566, -0.04373973235487938, + 0.07441886514425278, -0.09758659452199936, 0.07919350266456604, + -0.07836516946554184, 0.03809545934200287, -0.06411395221948624, + 0.0319918617606163, 0.051943857222795486, 0.00847010500729084, 0.12449851632118225, + 0.18247577548027039, -0.05370906740427017, 0.058310382068157196, + -0.04016480967402458, 0.008250949904322624, -0.06189260259270668, + -0.12295297533273697, 0.07729160040616989, 0.014789585024118423, + 0.10187598317861557, 0.0958903431892395, 0.06446435302495956, 0.012280937284231186, + 0.14996418356895447, -0.1411341279745102, -0.08492119610309601, + -0.011174597777426243, -0.06453771144151688, -0.0344211682677269, + 0.0628582313656807, 0.0434207059442997, -0.04334687814116478, + -0.029960226267576218, 0.15525946021080017, -0.04480167105793953, + ]), + _random_tensor('4.weight', [50, 50], seed=118), + _tensor('6.bias', FLOAT, [50], [ + -0.1301494687795639, -0.016671590507030487, 0.09305505454540253, + -0.0024569956585764885, -0.10665174573659897, 0.049031224101781845, + -0.022929606959223747, 0.02805551514029503, -0.1490677148103714, + 0.1025087982416153, 0.00938428845256567, 0.15098121762275696, -0.11440007388591766, + -0.06450272351503372, 0.016750779002904892, -0.08418712019920349, + -0.14083871245384216, 0.03546612709760666, -0.12778249382972717, + -0.10786302387714386, 0.0691528245806694, 0.04630193114280701, 0.09610986709594727, + 0.06807758659124374, -0.11870553344488144, -0.07684986293315887, + 0.17632094025611877, 0.11957243084907532, -0.018469832837581635, + 0.061927877366542816, 0.09733913093805313, 0.06544090062379837, + 0.08407261222600937, -0.09821699559688568, -0.02714831940829754, + 0.11982957273721695, -0.05582385137677193, 0.08686035871505737, 0.1096935048699379, + -0.12632803618907928, 0.16949345171451569, -0.1535651534795761, + -0.07482590526342392, 0.013653061352670193, 0.007351913955062628, + 0.12195851653814316, 0.002472013235092163, -0.03045388124883175, + -0.06886417418718338, 0.053352996706962585, + ]), + _random_tensor('6.weight', [50, 50], seed=119), + _tensor('8.bias', FLOAT, [50], [ + 0.0448136180639267, -0.029453275725245476, 0.005919584538787603, + -0.011282878927886486, 0.05477000027894974, 0.10227928310632706, + 0.005549189634621143, 0.09336987882852554, 0.1386832445859909, 0.15307164192199707, + -0.02468901313841343, -0.0662059560418129, 0.0102847283706069, + -0.02171068638563156, -0.11153922975063324, -0.08330245316028595, + 0.06905094534158707, 0.057425979524850845, 0.03267614543437958, + 0.04805871099233627, 0.09321744740009308, 0.1732863485813141, 0.043798334896564484, + 0.06929294764995575, -0.14251939952373505, 0.016439231112599373, + -0.052573300898075104, -0.09261982887983322, 0.015587260015308857, + 0.12414858490228653, 0.15976372361183167, -0.1122899278998375, 0.12213458120822906, + -0.03298468515276909, 0.12397517263889313, 0.008843302726745605, + -0.12524719536304474, -0.10820302367210388, -0.09638859331607819, + 0.12722527980804443, 0.10527792572975159, -0.08983974158763885, + 0.10839671641588211, 0.13300462067127228, 0.11159244924783707, + -0.054800763726234436, 0.1124715581536293, 0.09525484591722488, + -0.04181470349431038, 0.049590643495321274, + ]), + _random_tensor('8.weight', [50, 50], seed=120), + ], + ) + return _model(graph, opset=9, ir_version=6, producer_name='pytorch', producer_version='1.5') + + +def make_Linear_32(): + """Ops: Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm""" + nodes = [ + helper.make_node( + 'Gemm', + ['input.1', '0.weight', '0.bias'], + ['21'], + name='Gemm_0', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['21'], ['22'], name='Relu_1'), + helper.make_node( + 'Gemm', + ['22', '2.weight', '2.bias'], + ['23'], + name='Gemm_2', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['23'], ['24'], name='Relu_3'), + helper.make_node( + 'Gemm', + ['24', '4.weight', '4.bias'], + ['25'], + name='Gemm_4', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['25'], ['26'], name='Relu_5'), + helper.make_node( + 'Gemm', + ['26', '6.weight', '6.bias'], + ['27'], + name='Gemm_6', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['27'], ['28'], name='Relu_7'), + helper.make_node( + 'Gemm', + ['28', '8.weight', '8.bias'], + ['29'], + name='Gemm_8', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['29'], ['30'], name='Relu_9'), + helper.make_node( + 'Gemm', + ['30', '10.weight', '10.bias'], + ['31'], + name='Gemm_10', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['31'], ['32'], name='Relu_11'), + helper.make_node( + 'Gemm', + ['32', '12.weight', '12.bias'], + ['33'], + name='Gemm_12', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['33'], ['34'], name='Relu_13'), + helper.make_node( + 'Gemm', + ['34', '14.weight', '14.bias'], + ['35'], + name='Gemm_14', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['35'], ['36'], name='Relu_15'), + helper.make_node( + 'Gemm', + ['36', '16.weight', '16.bias'], + ['37'], + name='Gemm_16', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['37'], ['38'], name='Relu_17'), + helper.make_node( + 'Gemm', + ['38', '18.weight', '18.bias'], + ['39'], + name='Gemm_18', + alpha=1.0, + beta=1.0, + transB=1, + ), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('input.1', FLOAT, [32, 100]), + ], + outputs=[ + _vi('39', FLOAT, [32, 10]), + ], + initializer=[ + _tensor('0.bias', FLOAT, [50], [ + 0.11124264448881149, 0.09824328124523163, 0.008467835374176502, + -0.06339164823293686, -0.04812309890985489, 0.07819465547800064, + 0.04600067436695099, 0.12569192051887512, -0.006026973016560078, + 0.042687151581048965, 0.054539717733860016, 0.03256354108452797, + 0.1459706425666809, 0.011990390717983246, 0.11928670108318329, + -0.035920701920986176, -0.01965402625501156, 0.01519996952265501, + -0.020567703992128372, 0.006464967038482428, -0.040367837995290756, + 0.1230701357126236, 0.10814201086759567, 0.032152947038412094, 0.0349125899374485, + 0.09016934037208557, -0.0026081986725330353, 0.08004175126552582, + 0.08260804414749146, -0.030275214463472366, -0.017403658479452133, + 0.06508535891771317, 0.07616975903511047, 0.12453043460845947, 0.05175986513495445, + -0.034277405589818954, -0.001854078029282391, 0.07586805522441864, + -0.03652631491422653, -0.033068954944610596, -0.04171779379248619, + 0.01669793576002121, 0.11060179024934769, 0.07502856105566025, + -0.009946250356733799, 0.11157600581645966, 0.11138223856687546, + 0.0743454173207283, 0.05090726912021637, -0.05379515886306763, + ]), + _random_tensor('0.weight', [50, 100], seed=121), + _tensor('10.bias', FLOAT, [50], [ + 0.023677507415413857, 0.01546807587146759, 0.12556889653205872, + -0.025954080745577812, 0.13634377717971802, 0.022078335285186768, + 0.044483307749032974, 0.06803391128778458, -0.1336556077003479, + -0.02744845300912857, -0.07780878245830536, 0.060131218284368515, + 0.08147525042295456, -0.1075383722782135, 0.038635917007923126, + 0.04753212630748749, 0.007815081626176834, -0.091900534927845, + -0.040418289601802826, 0.12894690036773682, 0.04103463888168335, + 0.05978541821241379, -0.01061064749956131, -0.11792825162410736, + -0.03278864547610283, 0.11842191964387894, -0.0180479995906353, + -0.10795165598392487, 0.08416201174259186, 0.13871043920516968, + -0.09923344850540161, 0.0004032762080896646, -0.01704275608062744, + -0.09447328001260757, 0.02773180603981018, 0.03783107176423073, + 0.11792910844087601, -0.10673742741346359, 0.0416945181787014, 0.14280104637145996, + 0.08878400176763535, -0.08478271961212158, 0.14648577570915222, 0.1269282102584839, + 0.07769495993852615, -0.09769672155380249, -0.12921839952468872, + -0.08971879631280899, 0.13251297175884247, -0.05491340905427933, + ]), + _random_tensor('10.weight', [50, 50], seed=122), + _tensor('12.bias', FLOAT, [50], [ + -0.06826256215572357, 0.0388849675655365, 0.07320192456245422, 0.08387485146522522, + -0.07019667327404022, 0.12242702394723892, -0.09621168673038483, + 0.11204088479280472, -0.13937069475650787, -0.0626523569226265, + 0.056398920714855194, 0.1534673422574997, -0.001662513823248446, + -0.10726587474346161, 0.15035594999790192, -0.014129229821264744, + 0.11882692575454712, 0.015099582262337208, 0.1413463056087494, + 0.0007984754047356546, 0.08997610211372375, -0.07151174545288086, + 0.11034654080867767, -0.07181119918823242, 0.09321177005767822, + -0.042380593717098236, -0.10582658648490906, 0.10396461933851242, + 0.045979660004377365, 0.12390460819005966, -0.01176830567419529, + 0.1260722577571869, -0.004162704572081566, 0.032158028334379196, + 0.05012675002217293, 0.010814670473337173, 0.061898116022348404, + 0.02869694121181965, 0.06419070810079575, -0.05789436399936676, + -0.08914010971784592, 0.07718385756015778, -0.11866763234138489, + 0.046556998044252396, 0.010457875207066536, -0.11218304932117462, + 0.03364101052284241, -0.050707247108221054, -0.04438620060682297, 0.1124512255191803, + ]), + _random_tensor('12.weight', [50, 50], seed=123), + _tensor('14.bias', FLOAT, [50], [ + -0.042912423610687256, -0.08314505219459534, 0.010369965806603432, + 0.10941207408905029, -0.06298284977674484, 0.0006218135822564363, + -0.046892426908016205, 0.14291897416114807, -0.1065610870718956, + 0.12685929238796234, -0.06573846936225891, -0.08174490928649902, + -0.12673887610435486, 0.11660975217819214, -0.13191364705562592, + 0.1266399770975113, 0.10539578646421432, -0.03997437655925751, 0.08274240791797638, + -0.05659307911992073, -0.016876066103577614, -0.0644751563668251, + 0.09650067239999771, -0.1165977269411087, 0.02729981020092964, 0.1455359309911728, + 0.03180919587612152, -0.1552070677280426, 0.12558980286121368, + 0.018251288682222366, 0.03671560436487198, 0.08113941550254822, 0.0933469608426094, + 0.12075929343700409, -0.1378369927406311, 0.03614622354507446, 0.11320675164461136, + -0.008757159113883972, -0.11563608795404434, 0.08717223256826401, + -0.1610676348209381, 0.058534447103738785, 0.13570138812065125, + 0.09963928163051605, 0.015034488402307034, 0.05861431732773781, 0.1055833026766777, + -0.051912613213062286, -0.013903460465371609, 0.11571002751588821, + ]), + _random_tensor('14.weight', [50, 50], seed=124), + _tensor('16.bias', FLOAT, [50], [ + 0.13645648956298828, 0.10871178656816483, -0.04361168295145035, + 0.06587550044059753, 0.0516870953142643, -0.012960155494511127, + 0.10853584110736847, -0.010951125994324684, -0.1266385167837143, + -0.1094653308391571, 0.12544943392276764, -0.08655308932065964, + 0.024057991802692413, 0.0033439581748098135, 0.10357099026441574, + -0.042763128876686096, 0.13817517459392548, -0.06586167216300964, + -0.14774498343467712, -0.10796114802360535, -0.02931831032037735, + -0.09633642435073853, 0.09680622816085815, -0.05977587401866913, + 0.06083926931023598, -0.04657533019781113, 0.06506074219942093, + -0.15826131403446198, -0.0730171725153923, -0.006507332436740398, + 0.12966391444206238, 0.031853556632995605, 0.05254780873656273, + 0.08588340133428574, 0.12415903806686401, 0.11529742181301117, + -0.10537046194076538, -0.13778118789196014, -0.10065561532974243, + -0.02065938338637352, 0.0062689147889614105, -0.17919579148292542, + -0.1153501570224762, 0.10259155184030533, 0.02723391354084015, 0.08433964848518372, + 0.007203978020697832, 0.07054678350687027, 0.07516984641551971, -0.13919509947299957, + ]), + _random_tensor('16.weight', [50, 50], seed=125), + _tensor('18.bias', FLOAT, [10], [ + -0.0845300629734993, 0.06066350266337395, -0.0744476318359375, + -0.11339960992336273, 0.07592877745628357, -0.07158249616622925, + 0.030116315931081772, -0.13125865161418915, 0.02029414474964142, + -0.02809321880340576, + ]), + _random_tensor('18.weight', [10, 50], seed=126), + _tensor('2.bias', FLOAT, [50], [ + 0.09465888142585754, -0.04027128964662552, 0.08556117117404938, + 9.81339908321388e-05, 0.10296808928251266, 0.031810734421014786, + 0.12633393704891205, -0.04990290105342865, -0.051970064640045166, + 0.08027298748493195, 0.10882756114006042, 0.062105171382427216, + 0.008045201189815998, 0.08600206673145294, 0.06580343842506409, + 0.15130916237831116, -0.08689317107200623, -0.07181258499622345, + 0.11189711093902588, -0.017252318561077118, -0.11066558957099915, + 0.07146942615509033, -0.005338592920452356, 0.09884057939052582, + 0.08768560737371445, 0.06407410651445389, -0.03988203778862953, + -0.06665781140327454, 0.039171550422906876, 0.054918356239795685, + -0.04876664653420448, -0.020347272977232933, 0.0013799254084005952, + 0.09394200146198273, -0.03622853010892868, -0.0942491963505745, + 0.05046489089727402, 0.02834177017211914, -0.04078937694430351, + -0.01767958141863346, 0.12003850191831589, -0.10315573215484619, + -0.042500488460063934, 0.15254095196723938, 0.09979313611984253, + 0.03916972875595093, -0.007253315299749374, -0.0852055475115776, + 0.0820893943309784, 0.1186923235654831, + ]), + _random_tensor('2.weight', [50, 50], seed=127), + _tensor('4.bias', FLOAT, [50], [ + 0.024598661810159683, 0.08616624027490616, 0.038595184683799744, + 0.08363842964172363, 0.09489761292934418, -0.04017442837357521, + 0.06529752165079117, 0.10095158964395523, 0.14577096700668335, 0.06753067672252655, + -0.0175277441740036, 0.030973171815276146, 0.03054368868470192, + -0.08081741631031036, 0.08830731362104416, 0.0858900398015976, 0.06582188606262207, + -0.08109358698129654, 0.11148745566606522, 0.07020239531993866, 0.146789088845253, + 0.14938125014305115, 0.006371157709509134, -0.08334558457136154, + 0.14391906559467316, 0.03840988501906395, 0.11901327967643738, 0.10867060720920563, + 0.034775227308273315, 0.11030173301696777, 0.024303283542394638, + -0.11603455990552902, -0.03790628910064697, 0.13132940232753754, + -0.13394464552402496, -0.04722129553556442, 0.03803771734237671, + 0.03392547369003296, 0.06807977706193924, -0.042708538472652435, + 0.1414441466331482, -0.06422796100378036, -0.05185883864760399, + -0.050145845860242844, -0.06538667529821396, -0.1171017587184906, + 0.09188596159219742, 0.11895687878131866, -0.09153135120868683, 0.09006752818822861, + ]), + _random_tensor('4.weight', [50, 50], seed=128), + _tensor('6.bias', FLOAT, [50], [ + -0.1229783222079277, 0.11139104515314102, -0.10524418950080872, + 0.0016380425076931715, 0.07938187569379807, 0.003908644896000624, + -0.028028862550854683, -0.03216879814863205, -0.031408797949552536, + -0.04045102000236511, 0.09041076898574829, 0.015676679089665413, + -0.002135281218215823, -0.11499056965112686, -0.007753490470349789, + 0.025194739922881126, 0.13036774098873138, 0.11130959540605545, + -0.09819938987493515, 0.040943779051303864, 0.03980429843068123, + 0.08250012993812561, 0.14428070187568665, 0.041119564324617386, + -0.02864460088312626, -0.01911313831806183, -0.03500247001647949, + -0.0062780012376606464, -0.11006780713796616, -0.011378481984138489, + 0.09277238696813583, 0.017135074362158775, -0.1253904551267624, + -0.02176308073103428, -0.10329070687294006, 0.151449516415596, 0.133637934923172, + 0.056119631975889206, 0.005917373578995466, -0.07999040931463242, + -0.04148922860622406, 0.009720489382743835, 0.031680550426244736, + 0.13133378326892853, 0.0069076018407940865, 0.15768522024154663, + -0.011727947741746902, 0.032221000641584396, -0.03057415783405304, + 0.08015977591276169, + ]), + _random_tensor('6.weight', [50, 50], seed=129), + _tensor('8.bias', FLOAT, [50], [ + -0.08394850790500641, -0.08946047723293304, 0.0023817981127649546, + 0.08956918865442276, 0.11502696573734283, 0.1312992125749588, -0.10089538991451263, + 0.06887184828519821, -0.05314618721604347, -0.11070530861616135, + -0.10399400442838669, -0.09465840458869934, -0.07996507734060287, + -0.055972978472709656, -0.0011011596070602536, -0.11151980608701706, + -0.01033539418131113, 0.08838698267936707, -0.013264666311442852, + 0.1253567337989807, 0.028946250677108765, 0.08221150189638138, 0.08310119807720184, + 0.11621533334255219, -0.008178315125405788, -0.08422097563743591, + 0.014766180887818336, 0.09799371659755707, 0.05157942697405815, + 0.08685771375894547, -0.1275632679462433, 0.11424566060304642, + -0.04376813769340515, -0.08646500110626221, 0.07470041513442993, + -0.001382552902214229, 0.06231479346752167, 0.03777238354086876, + -0.03722120448946953, 0.06540307402610779, 0.023184368386864662, + -0.05114809796214104, -0.04856577143073082, -0.059934988617897034, + 0.1061999574303627, 0.1266958862543106, 0.009567365981638432, -0.03149254247546196, + 0.10635311156511307, -0.1022690087556839, + ]), + _random_tensor('8.weight', [50, 50], seed=130), + ], + ) + return _model(graph, opset=9, ir_version=6, producer_name='pytorch', producer_version='1.5') + + +def make_Linear_64(): + """Ops: Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm, Relu, Gemm""" + nodes = [ + helper.make_node( + 'Gemm', + ['input.1', '0.weight', '0.bias'], + ['21'], + name='Gemm_0', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['21'], ['22'], name='Relu_1'), + helper.make_node( + 'Gemm', + ['22', '2.weight', '2.bias'], + ['23'], + name='Gemm_2', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['23'], ['24'], name='Relu_3'), + helper.make_node( + 'Gemm', + ['24', '4.weight', '4.bias'], + ['25'], + name='Gemm_4', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['25'], ['26'], name='Relu_5'), + helper.make_node( + 'Gemm', + ['26', '6.weight', '6.bias'], + ['27'], + name='Gemm_6', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['27'], ['28'], name='Relu_7'), + helper.make_node( + 'Gemm', + ['28', '8.weight', '8.bias'], + ['29'], + name='Gemm_8', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['29'], ['30'], name='Relu_9'), + helper.make_node( + 'Gemm', + ['30', '10.weight', '10.bias'], + ['31'], + name='Gemm_10', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['31'], ['32'], name='Relu_11'), + helper.make_node( + 'Gemm', + ['32', '12.weight', '12.bias'], + ['33'], + name='Gemm_12', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['33'], ['34'], name='Relu_13'), + helper.make_node( + 'Gemm', + ['34', '14.weight', '14.bias'], + ['35'], + name='Gemm_14', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['35'], ['36'], name='Relu_15'), + helper.make_node( + 'Gemm', + ['36', '16.weight', '16.bias'], + ['37'], + name='Gemm_16', + alpha=1.0, + beta=1.0, + transB=1, + ), + helper.make_node('Relu', ['37'], ['38'], name='Relu_17'), + helper.make_node( + 'Gemm', + ['38', '18.weight', '18.bias'], + ['39'], + name='Gemm_18', + alpha=1.0, + beta=1.0, + transB=1, + ), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('input.1', FLOAT, [64, 100]), + ], + outputs=[ + _vi('39', FLOAT, [64, 10]), + ], + initializer=[ + _tensor('0.bias', FLOAT, [50], [ + 0.09159639477729797, -0.006669722031801939, 0.13838760554790497, + 0.007312551606446505, 0.050098199397325516, 0.15664000809192657, + 0.1113118976354599, -0.01220855861902237, 0.04115782678127289, 0.09007082134485245, + 0.04722576215863228, 0.050395555794239044, 0.04292930290102959, + -0.0252480898052454, 0.038219235837459564, 0.15084995329380035, 0.1120382621884346, + 0.04777619615197182, 0.04694032296538353, 0.03356737643480301, 0.14677441120147705, + 0.005037274677306414, -0.013039053417742252, 0.005265332292765379, + -0.036055635660886765, -0.03629482164978981, 0.08636198192834854, + 0.06236021965742111, -0.06167418509721756, -0.05445173755288124, + 0.06576776504516602, -0.004990452900528908, 0.051186129450798035, + 0.003741896478459239, -0.06545235961675644, -0.05202485993504524, + 0.07194308191537857, 0.13038986921310425, 0.016981661319732666, + -0.04673358425498009, 0.11374427378177643, -0.025251995772123337, + 0.014630576595664024, 0.0005040550604462624, 0.10728251188993454, + 0.008620365522801876, 0.0760183185338974, 0.07534903287887573, + 0.018748648464679718, -0.09183405339717865, + ]), + _random_tensor('0.weight', [50, 100], seed=131), + _tensor('10.bias', FLOAT, [50], [ + 0.023598425090312958, -0.13623277842998505, 0.07419407367706299, + -0.05104606971144676, -0.011362170800566673, 0.06712517142295837, + 0.08822090178728104, -0.0020764917135238647, 0.11936502158641815, + -0.06489405781030655, -0.10444420576095581, 0.037246569991111755, + -0.08549445867538452, 0.13663238286972046, -0.13414929807186127, + 0.0032362418714910746, -0.12991856038570404, 0.005575540475547314, + 0.08955343067646027, 0.08483952283859253, 0.1431363821029663, 0.048573967069387436, + -0.1422257423400879, 0.04993279650807381, 0.11434306204319, -0.0134720578789711, + 0.004054172430187464, -0.14051389694213867, 0.04162381589412689, + -0.15304715931415558, 0.0083013866096735, -0.03706217184662819, + 0.010971440933644772, -0.06586533039808273, 0.018230563029646873, + 0.030368328094482422, 0.13547532260417938, -0.07951928675174713, + 0.13427899777889252, 0.02883337251842022, -0.06782680749893188, + 0.07169642299413681, -0.007853972725570202, -0.0510685108602047, + -0.11296464502811432, -0.027279041707515717, 0.13714829087257385, + 0.07250010967254639, -0.0007291536312550306, -0.06502445042133331, + ]), + _random_tensor('10.weight', [50, 50], seed=132), + _tensor('12.bias', FLOAT, [50], [ + -0.0801251232624054, -0.05511970445513725, 0.03490331768989563, + 0.02558317594230175, 0.05685405805706978, -0.0002709181571844965, + 0.020529454573988914, 0.16004309058189392, -0.0037057101726531982, + 0.021892093122005463, 0.0422116257250309, 0.13861492276191711, 0.04279313609004021, + -0.06523241847753525, 0.025549277663230896, -0.11060528457164764, + -0.11546116322278976, 0.05192999541759491, -0.12274068593978882, + -0.047401707619428635, -0.09217683970928192, -0.05534840375185013, + 0.12988485395908356, 0.06574156880378723, -0.0901506319642067, + 0.049082305282354355, 0.021567750722169876, -0.03045421838760376, + -0.04347901791334152, -0.02055964060127735, -0.13669030368328094, + 0.08841653913259506, 0.06565003842115402, 0.029235024005174637, + 0.04059187322854996, -0.06516950577497482, 0.07286635041236877, + 0.027074089273810387, 0.05025995522737503, 0.046343252062797546, + 0.13113434612751007, -0.040170587599277496, 0.0747847706079483, + 0.14416146278381348, -0.07301327586174011, -0.13885334134101868, + 0.061743613332509995, 0.015627363696694374, -0.14226868748664856, + -0.040349800139665604, + ]), + _random_tensor('12.weight', [50, 50], seed=133), + _tensor('14.bias', FLOAT, [50], [ + 0.06647215783596039, 0.09063264727592468, -0.13074101507663727, + -0.13949799537658691, 0.004678502678871155, -0.016874082386493683, + -0.0011929124593734741, 0.03477223217487335, -0.14273054897785187, + -0.12513236701488495, -0.1137811541557312, -0.10309846699237823, + 0.08320702612400055, -0.17264628410339355, -0.1673404425382614, + -0.02677275612950325, 0.13770265877246857, -0.12795111536979675, + 0.11456170678138733, -0.01058092713356018, -0.04381580278277397, + -0.14236316084861755, 0.04663165286183357, 0.09976256638765335, + -0.016420619562268257, -0.03107152134180069, -0.11892712116241455, + -0.14145000278949738, -0.09588667750358582, -0.10125806927680969, + -0.07667424529790878, 0.08648142218589783, 0.13760849833488464, + 0.020085202530026436, -0.1349070966243744, -0.05883036181330681, + 0.06423906236886978, 0.021977975964546204, 0.004053518176078796, + -0.11900798976421356, 0.09760946035385132, -0.07316134124994278, + -0.12477194517850876, 0.05623914301395416, -0.1079934686422348, + 0.15659739077091217, 0.06688092648983002, -0.020453844219446182, + -0.06655491888523102, 0.042102597653865814, + ]), + _random_tensor('14.weight', [50, 50], seed=134), + _tensor('16.bias', FLOAT, [50], [ + 0.12710162997245789, -0.11911947280168533, -0.07807320356369019, + -0.035091958940029144, -0.1217832863330841, 0.07629904896020889, + 0.03150901570916176, 0.050709955394268036, 0.0009314765920862556, + 0.01097114384174347, 0.08148525655269623, 0.12900851666927338, 0.0837954506278038, + -0.10252774506807327, 0.026486115530133247, 0.12476948648691177, + 0.11806709319353104, -0.06699508428573608, -0.06001771613955498, + 0.025374993681907654, -0.16904965043067932, 0.07055971026420593, + -0.087677963078022, -0.06734836846590042, 0.09914802014827728, + -0.02004489302635193, 0.021534450352191925, -0.1340482234954834, + 0.10110945254564285, 0.11758943647146225, -0.1362207531929016, -0.0481615886092186, + -0.012928187847137451, -0.0925549864768982, -0.06118923798203468, + -0.1054878681898117, -0.11407053470611572, -0.07652084529399872, + -0.015235151164233685, 0.030054721981287003, -0.13776032626628876, + -0.07530069351196289, -0.06638159602880478, -0.14768138527870178, + -0.015214302577078342, -0.125348299741745, 0.0817929357290268, 0.12177981436252594, + -0.09903938323259354, 0.004565980285406113, + ]), + _random_tensor('16.weight', [50, 50], seed=135), + _tensor('18.bias', FLOAT, [10], [ + 0.09701453149318695, 0.03215126693248749, -0.0013841761974617839, + -0.03331436961889267, 0.059485986828804016, -0.09943024069070816, + 0.06851242482662201, 0.022922510281205177, 0.06729692965745926, + -0.051858361810445786, + ]), + _random_tensor('18.weight', [10, 50], seed=136), + _tensor('2.bias', FLOAT, [50], [ + -0.057317283004522324, 0.05470332130789757, -0.00017579866107553244, + 0.025761187076568604, 0.004599941428750753, -0.1244237944483757, + 0.08218210935592651, 0.09337401390075684, 0.13487280905246735, + 0.007681787014007568, 0.17570124566555023, 0.14757677912712097, 0.1500885784626007, + -0.0012366429436951876, -0.08663220703601837, 0.02858916111290455, + -0.06410738825798035, 0.032137297093868256, -0.1023068055510521, + -0.01723470538854599, 0.0846070945262909, 0.014609461650252342, + -0.05716143921017647, 0.10196615755558014, 0.15495315194129944, + 0.012524719350039959, -0.051979098469018936, -0.001390553079545498, + -0.014226754195988178, 0.05362191051244736, 0.12925197184085846, + -0.02208387665450573, 0.17744328081607819, -0.046732302755117416, + -0.018103472888469696, 0.0403139665722847, 0.09309444576501846, + 0.07387915998697281, 0.0640542134642601, 0.06046606972813606, -0.12276843190193176, + 0.06488797813653946, 0.1577167510986328, 0.07812289893627167, 0.11168011277914047, + 0.0024907258339226246, -0.07085540145635605, -0.09919169545173645, + 0.1299211084842682, 0.14291509985923767, + ]), + _random_tensor('2.weight', [50, 50], seed=137), + _tensor('4.bias', FLOAT, [50], [ + -0.1099703386425972, 0.07785989344120026, -0.05281399190425873, + -0.03463250771164894, 0.029007652774453163, -0.054168153554201126, + 0.022841189056634903, 0.1798921525478363, 0.03891337290406227, 0.04181481525301933, + -0.011574423871934414, -0.07251907885074615, 0.1228223443031311, + 0.10927148163318634, -0.007268114946782589, -0.10726579278707504, + -0.019819920882582664, 0.13857461512088776, 0.11483220756053925, + 0.12228760123252869, -0.07547355443239212, 0.14420607686042786, + -0.033190470188856125, -0.019701037555933, -0.01583164744079113, + 0.12164537608623505, 0.05813533440232277, 0.0008929441100917757, + 0.14075720310211182, 0.019338877871632576, -0.016825949773192406, + 0.14181609451770782, 0.01773025095462799, 0.06352683901786804, + -0.07688445597887039, 0.15308715403079987, -0.03269578516483307, + 0.019046491011977196, -0.10575303435325623, 0.10171069949865341, + 0.11624108999967575, 0.07952452450990677, 0.07676685601472855, + -0.09268729388713837, -0.09515844285488129, 0.08966265618801117, + 0.12256971001625061, 0.09974833577871323, -0.0020852594170719385, + 0.07005017250776291, + ]), + _random_tensor('4.weight', [50, 50], seed=138), + _tensor('6.bias', FLOAT, [50], [ + -0.038818925619125366, 0.06811299920082092, 0.1118309274315834, + 0.07874610275030136, 0.05133644491434097, 0.01601332612335682, + -0.08843040466308594, -0.018260041251778603, 0.021909251809120178, + 0.03044956363737583, 0.09717729687690735, 0.14612819254398346, + 0.033583976328372955, 0.07662538439035416, 0.07066786289215088, 0.1253795325756073, + 0.006381378974765539, 0.02676522172987461, 0.11174061894416809, + -0.015764767304062843, -0.11681172251701355, -0.050747837871313095, + 0.0873001366853714, 0.019174877554178238, -0.12318209558725357, + -0.011137604713439941, -0.10481218248605728, 0.01928110420703888, + 0.16160382330417633, 0.13084180653095245, 0.05665783956646919, + -0.12876908481121063, -0.02381623350083828, 0.05391921475529671, + 0.12290484458208084, 0.14049169421195984, 0.06409084051847458, + -0.09369882196187973, 0.10229893773794174, 0.026894323527812958, + 0.09336742758750916, 0.10093056410551071, -0.0749121680855751, 0.080393485724926, + -0.07547304034233093, 0.10684267431497574, 0.04369564354419708, + -0.07769715040922165, -0.07865709811449051, -0.02007412724196911, + ]), + _random_tensor('6.weight', [50, 50], seed=139), + _tensor('8.bias', FLOAT, [50], [ + 0.03757968917489052, 0.044984981417655945, -0.10111311078071594, + 0.058455660939216614, 0.01773645728826523, -0.07982795685529709, + 0.0912586972117424, -0.09884101152420044, -0.039294760674238205, + 0.04224107041954994, 0.06647494435310364, -0.10234533250331879, + -0.019759902730584145, -0.07916851341724396, 0.11428356915712357, + 0.007246797904372215, 0.08650056272745132, -0.11538772284984589, + -0.03382350504398346, 0.04845535755157471, -0.011813861317932606, + -0.06618679314851761, 0.03560318797826767, -0.060869812965393066, + -0.1252366602420807, 0.10331248492002487, -0.12572361528873444, + 0.14386624097824097, 0.10191508382558823, 0.14575746655464172, + -0.07625168561935425, 0.13770657777786255, 0.05900927633047104, + -0.0907086580991745, 0.02626039646565914, 0.12620759010314941, 0.03937942162156105, + 0.12115412205457687, 0.10908836126327515, -0.13738510012626648, + -0.10638768970966339, -0.03824464604258537, -0.11428388208150864, + 0.023384658619761467, -0.07685241103172302, 0.025741903111338615, + -0.07088501751422882, 0.07981190085411072, 0.10838404297828674, 0.05189177393913269, + ]), + _random_tensor('8.weight', [50, 50], seed=140), + ], + ) + return _model(graph, opset=9, ir_version=6, producer_name='pytorch', producer_version='1.5') + + +def make_Log(): + """Ops: Log""" + nodes = [ + helper.make_node('Log', ['onnx::Log_0'], ['1'], name='/Log'), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::Log_0', FLOAT, [4]), + ], + outputs=[ + _vi('1', FLOAT, [4]), + ], + ) + return _model(graph, opset=14, ir_version=7, producer_name='pytorch', producer_version='1.13.1') + + +def make_MatMul_Stacked(): + """Ops: MatMul""" + nodes = [ + helper.make_node('MatMul', ['input1', 'input2'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'AddGraph', + inputs=[ + _vi('input1', FLOAT, ['N', 2, 2]), + _vi('input2', FLOAT, [2, 1]), + ], + outputs=[ + _vi('output', FLOAT, ['N', 2, 1]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_MatMul_Stacked2(): + """Ops: MatMul""" + nodes = [ + helper.make_node('MatMul', ['input1', 'input2'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'AddGraph', + inputs=[ + _vi('input1', FLOAT, ['N', 2, 2]), + _vi('input2', FLOAT, ['N', 2, 1]), + ], + outputs=[ + _vi('output', FLOAT, ['N', 2, 1]), + ], + ) + return _model(graph, opset=25, ir_version=13, producer_name='onnx-example') + + +def make_Max(): + """Ops: Max""" + nodes = [ + helper.make_node('Max', ['X1', 'X2'], ['Y'], name='Max'), + ] + graph = helper.make_graph( + nodes, + 'test-model', + inputs=[ + _vi('X1', FLOAT, [1, 3]), + _vi('X2', FLOAT, [1, 3]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 3]), + ], + ) + return _model(graph, opset=13, ir_version=8, producer_name='onnx-example') + + +def make_MaxMultidirectionalBroadcast(): + """Ops: Max""" + nodes = [ + helper.make_node('Max', ['A', 'B', 'C'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Max', + inputs=[ + _vi('A', FLOAT, [3, 1]), + _vi('B', FLOAT, [2, 3, 1]), + _vi('C', FLOAT, [1, 4]), + ], + outputs=[ + _vi('Y', FLOAT, []), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_MaxPool1d(): + """Ops: MaxPool""" + nodes = [ + helper.make_node( + 'MaxPool', + ['onnx::MaxPool_0'], + ['1'], + name='MaxPool_0', + kernel_shape=[3], + pads=[0, 0], + strides=[1], + ), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::MaxPool_0', FLOAT, [1, 6, 10]), + ], + outputs=[ + _vi('1', FLOAT, [1, 6, 8]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_MaxPool2d(): + """Ops: MaxPool""" + nodes = [ + helper.make_node( + 'MaxPool', + ['onnx::MaxPool_0'], + ['1'], + name='MaxPool_0', + kernel_shape=[3, 2], + pads=[0, 0, 0, 0], + strides=[1, 1], + ), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::MaxPool_0', FLOAT, [1, 1, 5, 10]), + ], + outputs=[ + _vi('1', FLOAT, [1, 1, 3, 9]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_MaxPool2d_AsymPad(): + """Ops: MaxPool""" + nodes = [ + helper.make_node( + 'MaxPool', + ['X'], + ['Y'], + kernel_shape=[2, 2], + pads=[0, 1, 0, 1], + strides=[1, 1], + ), + ] + graph = helper.make_graph( + nodes, + 'MaxPool2d_AsymPad', + inputs=[ + _vi('X', FLOAT, [1, 1, 4, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 1, 3, 5]), + ], + ) + return _model(graph, opset=13, ir_version=13) + + +def make_MaxPool2d_CeilMode(): + """Ops: MaxPool""" + nodes = [ + helper.make_node( + 'MaxPool', + ['X'], + ['Y'], + ceil_mode=1, + kernel_shape=[2, 2], + strides=[2, 2], + ), + ] + graph = helper.make_graph( + nodes, + 'maxpool_ceil', + inputs=[ + _vi('X', FLOAT, [1, 1, 5, 5]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 1, 3, 3]), + ], + ) + return _model(graph, opset=11, ir_version=6) + + +def make_MaxPool3d(): + """Ops: MaxPool""" + nodes = [ + helper.make_node( + 'MaxPool', + ['onnx::MaxPool_0'], + ['1'], + name='MaxPool_0', + kernel_shape=[3, 2, 2], + pads=[0, 0, 0, 0, 0, 0], + strides=[1, 1, 1], + ), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::MaxPool_0', FLOAT, [1, 1, 3, 3, 3]), + ], + outputs=[ + _vi('1', FLOAT, [1, 1, 1, 2, 2]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_MeanMultidirectionalBroadcast(): + """Ops: Mean""" + nodes = [ + helper.make_node('Mean', ['A', 'B', 'C'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Mean', + inputs=[ + _vi('A', FLOAT, [3, 1]), + _vi('B', FLOAT, [2, 3, 1]), + _vi('C', FLOAT, [1, 4]), + ], + outputs=[ + _vi('Y', FLOAT, []), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_MinMultidirectionalBroadcast(): + """Ops: Min""" + nodes = [ + helper.make_node('Min', ['A', 'B', 'C'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Min', + inputs=[ + _vi('A', FLOAT, [3, 1]), + _vi('B', FLOAT, [2, 3, 1]), + _vi('C', FLOAT, [1, 4]), + ], + outputs=[ + _vi('Y', FLOAT, []), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Mod_ConstantFolding(): + """Ops: Constant, Mod""" + nodes = [ + helper.make_node('Constant', [], ['X'], value=_tensor('X', INT64, [3], [10, 7, 5])), + helper.make_node('Constant', [], ['D'], value=_tensor('D', INT64, [3], [3, 3, 3])), + helper.make_node('Mod', ['X', 'D'], ['Y'], fmod=0), + ] + graph = helper.make_graph( + nodes, + 'Mod_ConstantFolding', + inputs=[ + ], + outputs=[ + _vi('Y', INT64, [3]), + ], + ) + return _model(graph, opset=13, ir_version=13) + + +def make_Mul(): + """Ops: Mul""" + nodes = [ + helper.make_node('Mul', ['onnx::Mul_0', 'onnx::Mul_1'], ['2'], name='Mul_0'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Mul_0', FLOAT, [2]), + _vi('onnx::Mul_1', FLOAT, [2]), + ], + outputs=[ + _vi('2', FLOAT, [2]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_Neg(): + """Ops: Neg""" + nodes = [ + helper.make_node('Neg', ['onnx::Neg_0'], ['1'], name='Neg_0'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Neg_0', FLOAT, [12]), + ], + outputs=[ + _vi('1', FLOAT, [12]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_NonZero(): + """Ops: NonZero""" + nodes = [ + helper.make_node('NonZero', ['data'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + _vi('data', UINT8, [2, 2, 3]), + ], + outputs=[ + _vi('output', INT64, [3, 'N']), + ], + ) + return _model(graph, opset=25, ir_version=13, producer_name='onnx-example') + + +def make_NonZero_Constant(): + """Ops: Constant, NonZero""" + nodes = [ + helper.make_node( + 'Constant', + [], + ['constant_data'], + value=_tensor('const_tensor', BOOL, [2, 2, 3], [False, True, False, True, True, False, False, False, True, False, True, True]), + ), + helper.make_node('NonZero', ['constant_data'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + ], + outputs=[ + _vi('output', INT64, [3, 6]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_NotIsNaN(): + """Ops: IsNaN, Not""" + nodes = [ + helper.make_node('IsNaN', ['input'], ['temp_result']), + helper.make_node('Not', ['temp_result'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'Test', + inputs=[ + _vi('input', FLOAT, [1, 'N']), + ], + outputs=[ + _vi('output', BOOL, [1, 'N']), + ], + ) + return _model(graph, opset=25, ir_version=13, producer_name='onnx-example') + + +def make_Pad(): + """Ops: Constant, Pad""" + nodes = [ + helper.make_node( + 'Constant', + [], + ['pad_values'], + value=_tensor('const_tensor', INT64, [6], [1, 0, 1, 0, 1, 2]), + ), + helper.make_node('Pad', ['input', 'pad_values'], ['output'], mode='constant'), + ] + graph = helper.make_graph( + nodes, + 'PadGraph', + inputs=[ + _vi('input', FLOAT, [1, 2, 2]), + ], + outputs=[ + _vi('output', FLOAT, [2, 3, 5]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Pow(): + """Ops: Pow""" + nodes = [ + helper.make_node('Pow', ['onnx::Pow_0', 'onnx::Pow_1'], ['2'], name='Pow_0'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Pow_0', FLOAT, [3]), + _vi('onnx::Pow_1', FLOAT, [3]), + ], + outputs=[ + _vi('2', FLOAT, [3]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_Pow_broadcast(): + """Ops: Pow""" + nodes = [ + helper.make_node('Pow', ['onnx::Pow_0', 'onnx::Pow_1'], ['2'], name='Pow_0'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Pow_0', FLOAT, [1, 2, 3]), + _vi('onnx::Pow_1', FLOAT, [2, 3]), + ], + outputs=[ + _vi('2', FLOAT, [1, 2, 3]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_RNNBatchwise(): + """Ops: RNN""" + nodes = [ + helper.make_node( + 'RNN', + ['X', 'W', 'R'], + ['Y', 'Y_h'], + activations=['Tanh'], + clip=0.0, + direction='forward', + hidden_size=4, + layout=1, + ), + ] + graph = helper.make_graph( + nodes, + 'RNNBatchwise', + inputs=[ + _vi('X', FLOAT, [3, 1, 2]), + _vi('W', FLOAT, [1, 4, 2]), + _vi('R', FLOAT, [1, 4, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 1, 1, 4]), + _vi('Y_h', FLOAT, [3, 1, 4]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 4, 2], [ + 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, + 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, + ]), + _tensor('R', FLOAT, [1, 4, 4], [ + 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, + 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, + 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, + 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, 0.05000000074505806, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_RNNBidirectional(): + """Ops: RNN""" + nodes = [ + helper.make_node( + 'RNN', + ['X', 'W', 'R', 'B', 'sequence_lens', 'initial_h'], + ['Y', 'Y_h'], + activations=['Tanh', 'Tanh'], + clip=0.0, + direction='bidirectional', + hidden_size=4, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'RNNBidirectional', + inputs=[ + _vi('X', FLOAT, [3, 3, 2]), + _vi('W', FLOAT, [2, 4, 2]), + _vi('R', FLOAT, [2, 4, 4]), + _vi('B', FLOAT, [2, 8]), + _vi('sequence_lens', FLOAT, [3]), + _vi('initial_h', FLOAT, [2, 3, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 2, 3, 4]), + _vi('Y_h', FLOAT, [2, 3, 4]), + ], + initializer=[ + _tensor('W', FLOAT, [2, 4, 2], [ + 1.1630799770355225, 2.212209939956665, 0.48380500078201294, 0.7740039825439453, + 0.2995629906654358, 1.0434399843215942, 0.15302500128746033, 1.1839300394058228, + -1.1688100099563599, 1.8917100429534912, 1.5580699443817139, -1.2347400188446045, + -0.5459449887275696, -1.7710299491882324, -2.3556299209594727, -0.4513840079307556, + ]), + _tensor('R', FLOAT, [2, 4, 4], [ + -0.264847993850708, -1.3031100034713745, 0.07120870053768158, 0.641979992389679, + -2.7653799057006836, -0.6520739793777466, -0.7842749953269958, -1.767490029335022, + -0.45067301392555237, -0.9179289937019348, -0.9666540026664734, 0.6508560180664062, + 0.285537987947464, -0.9098479747772217, -1.9045900106430054, -0.14092600345611572, + -1.3713099956512451, 0.7806439995765686, 0.4410090148448944, 1.158560037612915, + 0.31329798698425293, 1.9676599502563477, -1.1199100017547607, + -0.004409589804708958, 0.40762200951576233, 2.6056900024414062, + -0.8409860134124756, 0.5856580138206482, 0.8232920169830322, -0.6968179941177368, + 1.1511499881744385, 0.15026900172233582, + ]), + _tensor('B', FLOAT, [2, 8], [ + -0.16102899610996246, -2.5899100303649902, 0.3397209942340851, -0.3166399896144867, + 0.049052998423576355, -1.8979500532150269, -0.32712098956108093, + -0.1596280038356781, -0.18305400013923645, -0.9774590134620667, + -1.0830899477005005, -0.01658809930086136, 1.9934899806976318, 1.3551299571990967, + -0.6979780197143555, -0.7086179852485657, + ]), + _tensor('sequence_lens', FLOAT, [3], [3.0, 3.0, 3.0]), + _tensor('initial_h', FLOAT, [2, 3, 4], [ + -0.37107500433921814, 0.2525329887866974, -1.4219499826431274, 0.39302998781204224, + -0.4631119966506958, -1.0243799686431885, -0.5383989810943604, -2.2150800228118896, + -1.4220999479293823, -0.14936499297618866, 1.2587000131607056, 1.3829400539398193, + -0.0841611996293068, 1.456969976425171, 0.06793870031833649, 2.1154799461364746, + -1.510509967803955, 1.5094799995422363, 0.20635099709033966, -0.9814450144767761, + -0.22147700190544128, -0.2304839938879013, 0.4533129930496216, 0.7954760193824768, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_RNNBidirectionalBatchwise(): + """Ops: RNN""" + nodes = [ + helper.make_node( + 'RNN', + ['X', 'W', 'R', 'B', 'sequence_lens', 'initial_h'], + ['Y', 'Y_h'], + activations=['Tanh', 'Tanh'], + clip=0.0, + direction='bidirectional', + hidden_size=4, + layout=1, + ), + ] + graph = helper.make_graph( + nodes, + 'RNNBidirectionalBatchwise', + inputs=[ + _vi('X', FLOAT, [3, 3, 2]), + _vi('W', FLOAT, [2, 4, 2]), + _vi('R', FLOAT, [2, 4, 4]), + _vi('B', FLOAT, [2, 8]), + _vi('sequence_lens', FLOAT, [3]), + _vi('initial_h', FLOAT, [3, 2, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 3, 2, 4]), + _vi('Y_h', FLOAT, [3, 2, 4]), + ], + initializer=[ + _tensor('W', FLOAT, [2, 4, 2], [ + 1.1630799770355225, 2.212209939956665, 0.48380500078201294, 0.7740039825439453, + 0.2995629906654358, 1.0434399843215942, 0.15302500128746033, 1.1839300394058228, + -1.1688100099563599, 1.8917100429534912, 1.5580699443817139, -1.2347400188446045, + -0.5459449887275696, -1.7710299491882324, -2.3556299209594727, -0.4513840079307556, + ]), + _tensor('R', FLOAT, [2, 4, 4], [ + -0.264847993850708, -1.3031100034713745, 0.07120870053768158, 0.641979992389679, + -2.7653799057006836, -0.6520739793777466, -0.7842749953269958, -1.767490029335022, + -0.45067301392555237, -0.9179289937019348, -0.9666540026664734, 0.6508560180664062, + 0.285537987947464, -0.9098479747772217, -1.9045900106430054, -0.14092600345611572, + -1.3713099956512451, 0.7806439995765686, 0.4410090148448944, 1.158560037612915, + 0.31329798698425293, 1.9676599502563477, -1.1199100017547607, + -0.004409589804708958, 0.40762200951576233, 2.6056900024414062, + -0.8409860134124756, 0.5856580138206482, 0.8232920169830322, -0.6968179941177368, + 1.1511499881744385, 0.15026900172233582, + ]), + _tensor('B', FLOAT, [2, 8], [ + -0.16102899610996246, -2.5899100303649902, 0.3397209942340851, -0.3166399896144867, + 0.049052998423576355, -1.8979500532150269, -0.32712098956108093, + -0.1596280038356781, -0.18305400013923645, -0.9774590134620667, + -1.0830899477005005, -0.01658809930086136, 1.9934899806976318, 1.3551299571990967, + -0.6979780197143555, -0.7086179852485657, + ]), + _tensor('sequence_lens', FLOAT, [3], [3.0, 3.0, 3.0]), + _tensor('initial_h', FLOAT, [2, 3, 4], [ + -0.37107500433921814, 0.2525329887866974, -1.4219499826431274, 0.39302998781204224, + -0.0841611996293068, 1.456969976425171, 0.06793870031833649, 2.1154799461364746, + -0.4631119966506958, -1.0243799686431885, -0.5383989810943604, -2.2150800228118896, + -1.510509967803955, 1.5094799995422363, 0.20635099709033966, -0.9814450144767761, + -1.4220999479293823, -0.14936499297618866, 1.2587000131607056, 1.3829400539398193, + -0.22147700190544128, -0.2304839938879013, 0.4533129930496216, 0.7954760193824768, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_RNNDefaults(): + """Ops: RNN""" + nodes = [ + helper.make_node( + 'RNN', + ['X', 'W', 'R', 'B'], + ['Y', 'Y_h'], + activations=['Tanh'], + clip=0.0, + direction='forward', + hidden_size=5, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'RNNDefaults', + inputs=[ + _vi('X', FLOAT, [3, 1, 3]), + _vi('W', FLOAT, [1, 5, 3]), + _vi('R', FLOAT, [1, 5, 5]), + _vi('B', FLOAT, [1, 10]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 1, 1, 5]), + _vi('Y_h', FLOAT, [1, 1, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 5, 3], [ + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + ]), + _tensor('R', FLOAT, [1, 5, 5], [ + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, + ]), + _tensor('B', FLOAT, [1, 10], [ + 0.009999999776482582, 0.009999999776482582, 0.009999999776482582, + 0.009999999776482582, 0.009999999776482582, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_RNNSeqLength(): + """Ops: RNN""" + nodes = [ + helper.make_node( + 'RNN', + ['X', 'W', 'R', 'B'], + ['Y', 'Y_h'], + activations=['Tanh'], + clip=0.0, + direction='forward', + hidden_size=5, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'RNNSeqLength', + inputs=[ + _vi('X', FLOAT, [2, 3, 3]), + _vi('W', FLOAT, [1, 5, 3]), + _vi('R', FLOAT, [1, 5, 5]), + _vi('B', FLOAT, [1, 10]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 1, 3, 5]), + _vi('Y_h', FLOAT, [1, 3, 5]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 5, 3], [ + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + ]), + _tensor('R', FLOAT, [1, 5, 5], [ + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, 0.019999999552965164, 0.019999999552965164, + 0.019999999552965164, + ]), + _tensor('B', FLOAT, [1, 10], [ + 0.03099999949336052, 0.03099999949336052, 0.03099999949336052, 0.03099999949336052, + 0.03099999949336052, 0.020999999716877937, 0.020999999716877937, + 0.020999999716877937, 0.020999999716877937, 0.020999999716877937, + ]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_RNNSequence(): + """Ops: RNN""" + nodes = [ + helper.make_node( + 'RNN', + ['X', 'W', 'R', 'B', 'sequence_lens'], + ['Y', 'Y_h'], + activations=['Tanh'], + clip=0.0, + direction='forward', + hidden_size=6, + layout=0, + ), + ] + graph = helper.make_graph( + nodes, + 'RNNSequence', + inputs=[ + _vi('X', FLOAT, [3, 3, 5]), + _vi('W', FLOAT, [1, 6, 5]), + _vi('R', FLOAT, [1, 6, 6]), + _vi('B', FLOAT, [1, 12]), + _vi('sequence_lens', FLOAT, [3]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 1, 3, 6]), + _vi('Y_h', FLOAT, [1, 3, 6]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 6, 5], [ + 0.23690000176429749, 0.13459999859333038, 0.33169999718666077, -0.4821999967098236, + -0.1362999975681305, 0.9419999718666077, -0.45019999146461487, -2.8173999786376953, + 0.2888999879360199, 1.6714999675750732, 0.29670000076293945, 1.679900050163269, + -0.8342999815940857, 0.44929999113082886, 0.03700000047683716, -0.5325999855995178, + 1.1545000076293945, -1.6477999687194824, 0.777899980545044, -0.9257000088691711, + -1.482200026512146, -0.8716999888420105, -0.017400000244379044, 2.06850004196167, + -0.7620000243186951, 0.010499999858438969, -2.9377999305725098, 0.888700008392334, + -0.9477999806404114, -1.5724999904632568, + ]), + _tensor('R', FLOAT, [1, 6, 6], [ + 1.0134999752044678, -0.2632000148296356, -0.678600013256073, -1.017899990081787, + -2.1319000720977783, -0.003599999938160181, 1.9585000276565552, 1.1375000476837158, + 2.121000051498413, 0.6409000158309937, -2.050299882888794, -2.4921000003814697, + 0.5932000279426575, 1.5161000490188599, -0.7768999934196472, 0.2849000096321106, + 0.20720000565052032, -0.3086000084877014, -0.965499997138977, 0.9178000092506409, + -0.4291999936103821, -1.5053999423980713, -0.7396000027656555, 0.8928999900817871, + -0.18359999358654022, -1.6291999816894531, 1.0712000131607056, 0.37700000405311584, + 0.17790000140666962, -1.1167000532150269, -0.6861000061035156, 1.2390999794006348, + -0.5447999835014343, -0.3880999982357025, -0.5164999961853027, 0.012799999676644802, + ]), + _tensor('B', FLOAT, [1, 12], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + _tensor('sequence_lens', FLOAT, [3], [3.0, 2.0, 1.0]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_RNNSequenceBatchwise(): + """Ops: RNN""" + nodes = [ + helper.make_node( + 'RNN', + ['X', 'W', 'R', 'B', 'sequence_lens'], + ['Y', 'Y_h'], + activations=['Tanh'], + clip=0.0, + direction='forward', + hidden_size=6, + layout=1, + ), + ] + graph = helper.make_graph( + nodes, + 'RNNSequenceBatchwise', + inputs=[ + _vi('X', FLOAT, [3, 3, 5]), + _vi('W', FLOAT, [1, 6, 5]), + _vi('R', FLOAT, [1, 6, 6]), + _vi('B', FLOAT, [1, 12]), + _vi('sequence_lens', FLOAT, [3]), + ], + outputs=[ + _vi('Y', FLOAT, [3, 3, 1, 6]), + _vi('Y_h', FLOAT, [3, 1, 6]), + ], + initializer=[ + _tensor('W', FLOAT, [1, 6, 5], [ + 0.23690000176429749, 0.13459999859333038, 0.33169999718666077, -0.4821999967098236, + -0.1362999975681305, 0.9419999718666077, -0.45019999146461487, -2.8173999786376953, + 0.2888999879360199, 1.6714999675750732, 0.29670000076293945, 1.679900050163269, + -0.8342999815940857, 0.44929999113082886, 0.03700000047683716, -0.5325999855995178, + 1.1545000076293945, -1.6477999687194824, 0.777899980545044, -0.9257000088691711, + -1.482200026512146, -0.8716999888420105, -0.017400000244379044, 2.06850004196167, + -0.7620000243186951, 0.010499999858438969, -2.9377999305725098, 0.888700008392334, + -0.9477999806404114, -1.5724999904632568, + ]), + _tensor('R', FLOAT, [1, 6, 6], [ + 1.0134999752044678, -0.2632000148296356, -0.678600013256073, -1.017899990081787, + -2.1319000720977783, -0.003599999938160181, 1.9585000276565552, 1.1375000476837158, + 2.121000051498413, 0.6409000158309937, -2.050299882888794, -2.4921000003814697, + 0.5932000279426575, 1.5161000490188599, -0.7768999934196472, 0.2849000096321106, + 0.20720000565052032, -0.3086000084877014, -0.965499997138977, 0.9178000092506409, + -0.4291999936103821, -1.5053999423980713, -0.7396000027656555, 0.8928999900817871, + -0.18359999358654022, -1.6291999816894531, 1.0712000131607056, 0.37700000405311584, + 0.17790000140666962, -1.1167000532150269, -0.6861000061035156, 1.2390999794006348, + -0.5447999835014343, -0.3880999982357025, -0.5164999961853027, 0.012799999676644802, + ]), + _tensor('B', FLOAT, [1, 12], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + _tensor('sequence_lens', FLOAT, [3], [3.0, 2.0, 1.0]), + ], + ) + return _model(graph, opset=14, ir_version=7) + + +def make_RandomNormal(): + """Ops: RandomNormal""" + nodes = [ + helper.make_node( + 'RandomNormal', + [], + ['output'], + mean=1.0, + scale=3.0, + seed=111, + shape=[2, 3], + ), + ] + graph = helper.make_graph( + nodes, + 'RandomNormal', + inputs=[ + ], + outputs=[ + _vi('output', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_RandomUniform(): + """Ops: RandomUniform""" + nodes = [ + helper.make_node( + 'RandomUniform', + [], + ['output'], + high=20.0, + low=10.0, + seed=111, + shape=[2, 3], + ), + ] + graph = helper.make_graph( + nodes, + 'RandomUniform', + inputs=[ + ], + outputs=[ + _vi('output', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_RangeFloat(): + """Ops: Range""" + nodes = [ + helper.make_node('Range', ['start', 'limit', 'delta'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Range', + inputs=[ + _vi('start', FLOAT, [1]), + _vi('limit', FLOAT, [1]), + _vi('delta', FLOAT, [1]), + ], + outputs=[ + _vi('Y', FLOAT, ['output_size']), + ], + ) + return _model(graph, opset=19, ir_version=9) + + +def make_RangeInt(): + """Ops: Range""" + nodes = [ + helper.make_node('Range', ['start', 'limit', 'delta'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Range', + inputs=[ + _vi('start', INT64, [1]), + _vi('limit', INT64, [1]), + _vi('delta', INT64, [1]), + ], + outputs=[ + _vi('Y', INT64, ['output_size']), + ], + ) + return _model(graph, opset=19, ir_version=9) + + +def make_Reciprocal(): + """Ops: Reciprocal""" + nodes = [ + helper.make_node('Reciprocal', ['X'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Reciprocal', + inputs=[ + _vi('X', FLOAT, [2, 3]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_ReduceMean(): + """Ops: ReduceMean""" + nodes = [ + helper.make_node( + 'ReduceMean', + ['onnx::ReduceMean_0'], + ['1'], + name='ReduceMean_0', + axes=[1], + keepdims=0, + ), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::ReduceMean_0', FLOAT, [1, 2, 3]), + ], + outputs=[ + _vi('1', FLOAT, [1, 3]), + ], + ) + return _model(graph, opset=13, ir_version=7, producer_name='pytorch', producer_version='1.12.1') + + +def make_ReduceMean_kFirst(): + """Ops: ReduceMean""" + nodes = [ + helper.make_node('ReduceMean', ['X'], ['Y'], axes=[0], keepdims=0), + ] + graph = helper.make_graph( + nodes, + 'ReduceMean_kFirst', + inputs=[ + _vi('X', FLOAT, [3, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [4]), + ], + ) + return _model(graph, opset=13, ir_version=13) + + +def make_ReduceProd(): + """Ops: ReduceProd""" + nodes = [ + helper.make_node( + 'ReduceProd', + ['onnx::ReduceProd_0'], + ['1'], + name='ReduceProd_0', + axes=[1], + keepdims=0, + ), + ] + graph = helper.make_graph( + nodes, + 'torch_jit', + inputs=[ + _vi('onnx::ReduceProd_0', FLOAT, [1, 2, 3]), + ], + outputs=[ + _vi('1', FLOAT, [1, 3]), + ], + ) + return _model(graph, opset=13, ir_version=7, producer_name='pytorch', producer_version='1.12.1') + + +def make_ReduceSum(): + """Ops: ReduceSum""" + nodes = [ + helper.make_node('ReduceSum', ['input'], ['output'], axes=[0, 1, 2], keepdims=1), + ] + graph = helper.make_graph( + nodes, + 'ReduceSumGraph', + inputs=[ + _vi('input', FLOAT, [1, 2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [1, 1, 1]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_ReduceSumSquare(): + """Ops: ReduceSumSquare""" + nodes = [ + helper.make_node('ReduceSumSquare', ['input'], ['output'], axes=[2], keepdims=0), + ] + graph = helper.make_graph( + nodes, + 'ReduceSumSquareGraph', + inputs=[ + _vi('input', FLOAT, [1, 2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [1, 2]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_ScatterElements(): + """Ops: ScatterElements""" + nodes = [ + helper.make_node('ScatterElements', ['data', 'indices', 'updates'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + _vi('data', FLOAT, [3, 3]), + _vi('indices', INT64, [2, 3]), + _vi('updates', FLOAT, [2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [3, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_ScatterND_1(): + """Ops: ScatterND""" + nodes = [ + helper.make_node('ScatterND', ['data', 'indices', 'updates'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + _vi('data', FLOAT, [5]), + _vi('indices', INT64, [3, 1]), + _vi('updates', FLOAT, [3]), + ], + outputs=[ + _vi('output', FLOAT, [5]), + ], + ) + return _model(graph, opset=25, ir_version=13, producer_name='onnx-example') + + +def make_ScatterND_2(): + """Ops: ScatterND""" + nodes = [ + helper.make_node('ScatterND', ['data', 'indices', 'updates'], ['output'], reduction='add'), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + _vi('data', FLOAT, [3, 2]), + _vi('indices', INT64, [2, 1]), + _vi('updates', FLOAT, [2, 2]), + ], + outputs=[ + _vi('output', FLOAT, [3, 2]), + ], + ) + return _model(graph, opset=25, ir_version=13, producer_name='onnx-example') + + +def make_ScatterND_3(): + """Ops: ScatterND""" + nodes = [ + helper.make_node('ScatterND', ['data', 'indices', 'updates'], ['output'], reduction='mul'), + ] + graph = helper.make_graph( + nodes, + 'TestGraph', + inputs=[ + _vi('data', FLOAT, [2, 2]), + _vi('indices', INT64, [2, 2]), + _vi('updates', FLOAT, [2]), + ], + outputs=[ + _vi('output', FLOAT, [2, 2]), + ], + ) + return _model(graph, opset=25, ir_version=13, producer_name='onnx-example') + + +def make_Shape(): + """Ops: Shape, ConstantOfShape, Mul""" + nodes = [ + helper.make_node('Shape', ['input'], ['out_shape']), + helper.make_node( + 'ConstantOfShape', + ['out_shape'], + ['scale_values'], + value=_tensor('value', FLOAT, [1], [2.0]), + ), + helper.make_node('Mul', ['input', 'scale_values'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'ShapeGraph', + inputs=[ + _vi('input', FLOAT, [1, 2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [1, 2, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Sin(): + """Ops: Sin""" + nodes = [ + helper.make_node('Sin', ['input'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'sin_test', + inputs=[ + _vi('input', FLOAT, [3, 4]), + ], + outputs=[ + _vi('output', FLOAT, [3, 4]), + ], + ) + return _model(graph, opset=7, ir_version=10, producer_name='onnx-example') + + +def make_Slice(): + """Ops: Slice""" + nodes = [ + helper.make_node('Slice', ['x', 'starts', 'ends', 'axes', 'steps'], ['y']), + ] + graph = helper.make_graph( + nodes, + 'Slice', + inputs=[ + _vi('x', FLOAT, [20, 10, 5]), + ], + outputs=[ + _vi('y', FLOAT, [3, 10, 5]), + ], + initializer=[ + _tensor('starts', INT64, [2], [0, 0]), + _tensor('ends', INT64, [2], [3, 10]), + _tensor('axes', INT64, [2], [0, 1]), + _tensor('steps', INT64, [2], [1, 1]), + ], + ) + return _model(graph, opset=19, ir_version=9, producer_name='Slice') + + +def make_Slice_Default_Axis(): + """Ops: Slice""" + nodes = [ + helper.make_node('Slice', ['x', 'starts', 'ends'], ['y']), + ] + graph = helper.make_graph( + nodes, + 'Slice', + inputs=[ + _vi('x', FLOAT, [20, 10, 5]), + ], + outputs=[ + _vi('y', FLOAT, [20, 10, 1]), + ], + initializer=[ + _tensor('starts', INT64, [3], [0, 0, 3]), + _tensor('ends', INT64, [3], [20, 10, 4]), + ], + ) + return _model(graph, opset=19, ir_version=9, producer_name='Slice_Default_Axis') + + +def make_Slice_Default_Steps(): + """Ops: Slice""" + nodes = [ + helper.make_node('Slice', ['x', 'starts', 'ends', 'axes'], ['y']), + ] + graph = helper.make_graph( + nodes, + 'Slice', + inputs=[ + _vi('x', FLOAT, [20, 10, 5]), + ], + outputs=[ + _vi('y', FLOAT, [20, 10, 1]), + ], + initializer=[ + _tensor('starts', INT64, [3], [0, 0, 3]), + _tensor('ends', INT64, [3], [20, 10, 4]), + _tensor('axes', INT64, [3], [0, 1, 2]), + ], + ) + return _model(graph, opset=19, ir_version=9, producer_name='Slice_Default_Steps') + + +def make_Slice_Neg(): + """Ops: Slice""" + nodes = [ + helper.make_node('Slice', ['x', 'starts', 'ends', 'axes', 'steps'], ['y']), + ] + graph = helper.make_graph( + nodes, + 'Slice', + inputs=[ + _vi('x', FLOAT, [20, 10, 5]), + ], + outputs=[ + _vi('y', FLOAT, [20, 9, 5]), + ], + initializer=[ + _tensor('starts', INT64, [1], [0]), + _tensor('ends', INT64, [1], [-1]), + _tensor('axes', INT64, [1], [1]), + _tensor('steps', INT64, [1], [1]), + ], + ) + return _model(graph, opset=19, ir_version=9, producer_name='Slice_Neg') + + +def make_Softmax1d(): + """Ops: Softmax""" + nodes = [ + helper.make_node('Softmax', ['X'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Softmax', + inputs=[ + _vi('X', FLOAT, [3]), + ], + outputs=[ + _vi('Y', FLOAT, [3]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Softmax2d(): + """Ops: Softmax""" + nodes = [ + helper.make_node('Softmax', ['X'], ['Y'], axis=1), + ] + graph = helper.make_graph( + nodes, + 'Softmax', + inputs=[ + _vi('X', FLOAT, [1, 3]), + ], + outputs=[ + _vi('Y', FLOAT, [1, 3]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Softmax3d(): + """Ops: Softmax""" + nodes = [ + helper.make_node('Softmax', ['X'], ['Y'], axis=1), + ] + graph = helper.make_graph( + nodes, + 'Softmax', + inputs=[ + _vi('X', FLOAT, [2, 3, 4]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 3, 4]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Softmax4d(): + """Ops: Softmax""" + nodes = [ + helper.make_node('Softmax', ['X'], ['Y'], axis=-2), + ] + graph = helper.make_graph( + nodes, + 'Softmax', + inputs=[ + _vi('X', FLOAT, [2, 3, 4, 2]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 3, 4, 2]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Softplus(): + """Ops: Softplus""" + nodes = [ + helper.make_node('Softplus', ['input'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'Abs', + inputs=[ + _vi('input', FLOAT, [2, 3]), + ], + outputs=[ + _vi('output', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=25, ir_version=13, producer_name='onnx-example') + + +def make_Split_0(): + """Ops: Constant, Split""" + nodes = [ + helper.make_node( + 'Constant', + [], + ['split_values'], + value=_tensor('split', INT64, [2], [1, 1]), + ), + helper.make_node('Split', ['input', 'split_values'], ['output1', 'output2']), + ] + graph = helper.make_graph( + nodes, + 'SplitGraph', + inputs=[ + _vi('input', FLOAT, [2, 2, 3]), + ], + outputs=[ + _vi('output1', FLOAT, [1, 2, 3]), + _vi('output2', FLOAT, [1, 2, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Split_1(): + """Ops: Constant, Split""" + nodes = [ + helper.make_node( + 'Constant', + [], + ['split_values'], + value=_tensor('split', INT64, [2], [1, 1]), + ), + helper.make_node('Split', ['input', 'split_values'], ['output1', 'output2'], axis=1), + ] + graph = helper.make_graph( + nodes, + 'SplitGraph', + inputs=[ + _vi('input', FLOAT, [2, 2, 3]), + ], + outputs=[ + _vi('output1', FLOAT, [2, 1, 3]), + _vi('output2', FLOAT, [2, 1, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Split_2(): + """Ops: Split""" + nodes = [ + helper.make_node('Split', ['input'], ['output1', 'output2'], axis=2, num_outputs=2), + ] + graph = helper.make_graph( + nodes, + 'SplitGraph', + inputs=[ + _vi('input', FLOAT, [2, 2, 3]), + ], + outputs=[ + _vi('output1', FLOAT, [2, 2, 2]), + _vi('output2', FLOAT, [2, 2, 1]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +def make_Sqrt(): + """Ops: Sqrt""" + nodes = [ + helper.make_node('Sqrt', ['X'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Sqrt', + inputs=[ + _vi('X', FLOAT, [2, 3]), + ], + outputs=[ + _vi('Y', FLOAT, [2, 3]), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Sub(): + """Ops: Sub""" + nodes = [ + helper.make_node('Sub', ['onnx::Sub_0', 'onnx::Sub_1'], ['2'], name='Sub_0'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Sub_0', FLOAT, [2]), + _vi('onnx::Sub_1', FLOAT, [2]), + ], + outputs=[ + _vi('2', FLOAT, [2]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_SumMultidirectionalBroadcast(): + """Ops: Sum""" + nodes = [ + helper.make_node('Sum', ['A', 'B', 'C'], ['Y']), + ] + graph = helper.make_graph( + nodes, + 'Sum', + inputs=[ + _vi('A', FLOAT, [3, 1]), + _vi('B', FLOAT, [2, 3, 1]), + _vi('C', FLOAT, [1, 4]), + ], + outputs=[ + _vi('Y', FLOAT, []), + ], + ) + return _model(graph, opset=17, ir_version=8) + + +def make_Swish(): + """Ops: Swish""" + nodes = [ + helper.make_node('Swish', ['input'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'Swish', + inputs=[ + _vi('input', FLOAT, [6]), + ], + outputs=[ + _vi('output', FLOAT, [6]), + ], + ) + return _model(graph, opset=24, ir_version=13) + + +def make_Tanh(): + """Ops: Tanh""" + nodes = [ + helper.make_node('Tanh', ['onnx::Tanh_0'], ['1'], name='Tanh_0'), + ] + graph = helper.make_graph( + nodes, + 'torch-jit-export', + inputs=[ + _vi('onnx::Tanh_0', FLOAT, [24]), + ], + outputs=[ + _vi('1', FLOAT, [24]), + ], + ) + return _model(graph, opset=9, ir_version=4, producer_name='pytorch', producer_version='1.11.0') + + +def make_Tile5D(): + """Ops: Tile""" + nodes = [ + helper.make_node('Tile', ['input', 'repeats'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'TileGraph', + inputs=[ + _vi('input', FLOAT, [2, 2, 2, 3, 3]), + ], + outputs=[ + _vi('output', FLOAT, [4, 2, 4, 3, 9]), + ], + initializer=[ + _tensor('repeats', INT64, [5], [2, 1, 2, 1, 3]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='tile-model') + + +def make_TopK(): + """Ops: Constant, TopK""" + nodes = [ + helper.make_node( + 'Constant', + [], + ['/Constant_output_0'], + name='/Constant', + value=_tensor('', INT64, [1], [5]), + ), + helper.make_node( + 'TopK', + ['onnx::TopK_0', '/Constant_output_0'], + ['4', '5'], + name='/TopK', + axis=-1, + largest=1, + sorted=1, + ), + ] + graph = helper.make_graph( + nodes, + 'main_graph', + inputs=[ + _vi('onnx::TopK_0', FLOAT, [9]), + ], + outputs=[ + _vi('4', FLOAT, [5]), + _vi('5', INT64, [5]), + ], + ) + return _model(graph, opset=17, ir_version=8, producer_name='pytorch', producer_version='2.3.0') + + +def make_Where(): + """Ops: Where""" + nodes = [ + helper.make_node('Where', ['cond', 'inputA', 'inputB'], ['output']), + ] + graph = helper.make_graph( + nodes, + 'PadGraph', + inputs=[ + _vi('inputA', FLOAT, [1, 2]), + _vi('inputB', FLOAT, [3, 2]), + _vi('cond', BOOL, [3, 1]), + ], + outputs=[ + _vi('output', FLOAT, [3, 2]), + ], + ) + return _model(graph, opset=21, ir_version=10, producer_name='onnx-example') + + +MODELS = { + 'Abs': make_Abs, + 'Add': make_Add, + 'AddBroadcast1': make_AddBroadcast1, + 'AddBroadcast2': make_AddBroadcast2, + 'AddBroadcast3': make_AddBroadcast3, + 'AddBroadcast4': make_AddBroadcast4, + 'AddBroadcast5': make_AddBroadcast5, + 'AddBroadcast6': make_AddBroadcast6, + 'AddBroadcast7': make_AddBroadcast7, + 'AvgPool': make_AvgPool, + 'Cast': make_Cast, + 'Clip': make_Clip, + 'Comparison_broadcast': make_Comparison_broadcast, + 'Comparison_broadcast_3d': make_Comparison_broadcast_3d, + 'ComplexTopK': make_ComplexTopK, + 'Concat_0D': make_Concat_0D, + 'Constant': make_Constant, + 'ConvAddRelu': make_ConvAddRelu, + 'ConvTranspose1d': make_ConvTranspose1d, + 'ConvTranspose2d': make_ConvTranspose2d, + 'ConvTransposeBias2d': make_ConvTransposeBias2d, + 'ConvTransposeBias2dBatched': make_ConvTransposeBias2dBatched, + 'ConvWithAsymmetricPadding': make_ConvWithAsymmetricPadding, + 'ConvWithAutopadSameLower': make_ConvWithAutopadSameLower, + 'ConvWithAutopadSameUpper': make_ConvWithAutopadSameUpper, + 'ConvWithDilation': make_ConvWithDilation, + 'ConvWithDynShapeStride': make_ConvWithDynShapeStride, + 'ConvWithPadding': make_ConvWithPadding, + 'ConvWithStridesNoPadding': make_ConvWithStridesNoPadding, + 'ConvWithStridesPadding': make_ConvWithStridesPadding, + 'ConvWithoutPadding': make_ConvWithoutPadding, + 'Cos': make_Cos, + 'Div': make_Div, + 'Einsum_3': make_Einsum_3, + 'Einsum_4': make_Einsum_4, + 'Einsum_dotprod': make_Einsum_dotprod, + 'Einsum_matmul': make_Einsum_matmul, + 'Elu': make_Elu, + 'EluAlpha': make_EluAlpha, + 'Equal': make_Equal, + 'Erf': make_Erf, + 'Exp': make_Exp, + 'ExpandDiffSize': make_ExpandDiffSize, + 'ExpandSameSize': make_ExpandSameSize, + 'EyeLike': make_EyeLike, + 'FMod_ConstantFolding': make_FMod_ConstantFolding, + 'GRUBatchwise': make_GRUBatchwise, + 'GRUBidirectional': make_GRUBidirectional, + 'GRUDefaults': make_GRUDefaults, + 'GRUInitialBias': make_GRUInitialBias, + 'GRUSeqLength': make_GRUSeqLength, + 'Gather2d': make_Gather2d, + 'GatherAxis0': make_GatherAxis0, + 'GatherAxis1': make_GatherAxis1, + 'GatherAxis2': make_GatherAxis2, + 'GatherAxis3': make_GatherAxis3, + 'GatherND_1': make_GatherND_1, + 'GatherND_2': make_GatherND_2, + 'GatherND_3': make_GatherND_3, + 'GatherNegativeIndices': make_GatherNegativeIndices, + 'Gelu': make_Gelu, + 'Greater': make_Greater, + 'GreaterOrEqual': make_GreaterOrEqual, + 'HardSigmoid': make_HardSigmoid, + 'HardSwish': make_HardSwish, + 'IsInf': make_IsInf, + 'LSTMBatchwise': make_LSTMBatchwise, + 'LSTMBidirectional': make_LSTMBidirectional, + 'LSTMDefaults': make_LSTMDefaults, + 'LSTMInitialBias': make_LSTMInitialBias, + 'LSTMPeepholes': make_LSTMPeepholes, + 'LayerNormalization2d': make_LayerNormalization2d, + 'LayerNormalization4d': make_LayerNormalization4d, + 'Less': make_Less, + 'LessOrEqual': make_LessOrEqual, + 'LinearWithLeakyRelu': make_LinearWithLeakyRelu, + 'LinearWithSelu': make_LinearWithSelu, + 'LinearWithSigmoid': make_LinearWithSigmoid, + 'Linear_16': make_Linear_16, + 'Linear_32': make_Linear_32, + 'Linear_64': make_Linear_64, + 'Log': make_Log, + 'MatMul_Stacked': make_MatMul_Stacked, + 'MatMul_Stacked2': make_MatMul_Stacked2, + 'Max': make_Max, + 'MaxMultidirectionalBroadcast': make_MaxMultidirectionalBroadcast, + 'MaxPool1d': make_MaxPool1d, + 'MaxPool2d': make_MaxPool2d, + 'MaxPool2d_AsymPad': make_MaxPool2d_AsymPad, + 'MaxPool2d_CeilMode': make_MaxPool2d_CeilMode, + 'MaxPool3d': make_MaxPool3d, + 'MeanMultidirectionalBroadcast': make_MeanMultidirectionalBroadcast, + 'MinMultidirectionalBroadcast': make_MinMultidirectionalBroadcast, + 'Mod_ConstantFolding': make_Mod_ConstantFolding, + 'Mul': make_Mul, + 'Neg': make_Neg, + 'NonZero': make_NonZero, + 'NonZero_Constant': make_NonZero_Constant, + 'NotIsNaN': make_NotIsNaN, + 'Pad': make_Pad, + 'Pow': make_Pow, + 'Pow_broadcast': make_Pow_broadcast, + 'RNNBatchwise': make_RNNBatchwise, + 'RNNBidirectional': make_RNNBidirectional, + 'RNNBidirectionalBatchwise': make_RNNBidirectionalBatchwise, + 'RNNDefaults': make_RNNDefaults, + 'RNNSeqLength': make_RNNSeqLength, + 'RNNSequence': make_RNNSequence, + 'RNNSequenceBatchwise': make_RNNSequenceBatchwise, + 'RandomNormal': make_RandomNormal, + 'RandomUniform': make_RandomUniform, + 'RangeFloat': make_RangeFloat, + 'RangeInt': make_RangeInt, + 'Reciprocal': make_Reciprocal, + 'ReduceMean': make_ReduceMean, + 'ReduceMean_kFirst': make_ReduceMean_kFirst, + 'ReduceProd': make_ReduceProd, + 'ReduceSum': make_ReduceSum, + 'ReduceSumSquare': make_ReduceSumSquare, + 'ScatterElements': make_ScatterElements, + 'ScatterND_1': make_ScatterND_1, + 'ScatterND_2': make_ScatterND_2, + 'ScatterND_3': make_ScatterND_3, + 'Shape': make_Shape, + 'Sin': make_Sin, + 'Slice': make_Slice, + 'Slice_Default_Axis': make_Slice_Default_Axis, + 'Slice_Default_Steps': make_Slice_Default_Steps, + 'Slice_Neg': make_Slice_Neg, + 'Softmax1d': make_Softmax1d, + 'Softmax2d': make_Softmax2d, + 'Softmax3d': make_Softmax3d, + 'Softmax4d': make_Softmax4d, + 'Softplus': make_Softplus, + 'Split_0': make_Split_0, + 'Split_1': make_Split_1, + 'Split_2': make_Split_2, + 'Sqrt': make_Sqrt, + 'Sub': make_Sub, + 'SumMultidirectionalBroadcast': make_SumMultidirectionalBroadcast, + 'Swish': make_Swish, + 'Tanh': make_Tanh, + 'Tile5D': make_Tile5D, + 'TopK': make_TopK, + 'Where': make_Where, +} + + +# =========================================================================== +# Reference data for the value-based unit tests +# =========================================================================== +# +# TEST_INPUTS defines the inputs that TestCustomModelsFromONNX.cxx (and +# TestCladAutodiff.cxx) feed to each model, one numpy array per graph input. +# The expected outputs are computed here with onnx's ReferenceEvaluator (or +# with the numpy fallbacks in EXPECTED_OVERRIDES below) and written next to +# the generated models as references/.ref, from where the tests read +# both the inputs and the expected outputs at runtime. Models without an +# entry have their expectations hardcoded in the test source instead. + + +def f32(vals, shape=None): + a = np.asarray(vals, np.float32) + return a.reshape(shape) if shape is not None else a + + +def i64(vals, shape=None): + a = np.asarray(vals, np.int64) + return a.reshape(shape) if shape is not None else a + + +def rand_f32(seed, shape): + """Deterministic standard-normal random tensor.""" + return np.random.RandomState(seed).randn(*shape).astype(np.float32) + + +TEST_INPUTS = { + 'Add': [ + f32([1.0, 2.0], (2,)), + f32([0.0, 1.0], (2,)), + ], + 'AddBroadcast1': [ + f32([-0.7802330255508423, -1.3402948379516602, -3.014829397201538, 0.5364136099815369, -1.2259478569030762], (5,)), + f32([1.0626695156097412, 0.43842875957489014, 1.2247647047042847, 0.7976327538490295, 0.9868820905685425, 0.2526761293411255, 0.4487488269805908, 0.31516772508621216, -0.7877119779586792, 0.6456566452980042, 0.5045059323310852, -0.41265228390693665, -0.22474539279937744, -0.22362373769283295, 0.005096740089356899, 0.16927210986614227, 1.0675697326660156, -0.8163477182388306, 0.8846774697303772, 0.7890205979347229], (4, 5)), + ], + 'AddBroadcast2': [ + f32([0.6008180379867554, 0.565757691860199, -0.5840851068496704, -1.5082775354385376, 1.2396254539489746], (5,)), + f32([-1.2251673936843872, -2.503737449645996, -0.614517331123352, 0.44316595792770386, 0.004092322196811438, 1.4352006912231445, -0.8375269174575806, 1.1876263618469238, -1.42122220993042, 0.3771233558654785, -0.616450846195221, 1.966413140296936, -2.035682201385498, -0.53670334815979, -2.2214934825897217, -1.5829707384109497, -1.2514921426773071, 0.6506291031837463, 2.06339693069458, 0.6022816300392151, -0.5390340089797974, -1.2628082036972046, 0.7877674698829651, 0.10825152695178986, 2.3282978534698486, -1.5089000463485718, -0.5955929160118103, -0.0920059084892273, 1.6322861909866333, 1.946860671043396, 0.7456556558609009, 0.3869551122188568, -1.832051157951355, -1.1573481559753418, 0.03800858184695244, -0.21694916486740112, -0.23516549170017242, 0.2181714028120041, 0.061358895152807236, -0.8570862412452698, -2.0186426639556885, -1.6137357950210571, -2.0205025672912598, -0.32505208253860474, -0.10711464285850525, 0.46847009658813477, 0.19955800473690033, -1.9463766813278198, 0.24790054559707642, 0.7761988043785095, -0.19873686134815216, -2.00885009765625, 1.4684786796569824, 0.9610288143157959, -0.008149653673171997, 0.4633333384990692, -0.1113162413239479, 1.8204692602157593, -0.10051906853914261, 2.405775308609009, 2.5781426429748535, -1.5141286849975586, -0.06480903923511505, 0.9229392409324646, -1.314860463142395, 0.36738714575767517, -0.002170204883441329, -0.47474405169487, -0.6289427280426025, -1.317047357559204, -0.6206338405609131, -0.49025020003318787, -0.21248511970043182, -0.023678667843341827, 0.028880996629595757, -0.7447777986526489, 0.013009180314838886, -1.6810555458068848, 0.08222470432519913, -1.1493949890136719, -1.575654149055481, -0.7993866801261902, -0.4064111113548279, 1.0935839414596558, 1.5832337141036987, -0.08151749521493912, -0.0909925028681755, 2.3559670448303223, -0.06853648275136948, 0.4128839373588562, 0.500495433807373, -1.484426498413086, -0.5193490386009216, 0.3810258209705353, -0.10618859529495239, 0.2839215397834778, 1.1321500539779663, 1.2155804634094238, -1.0466749668121338, -0.9411510825157166, -0.04043630510568619, 1.455543041229248, 0.16402567923069, -0.33469337224960327, 1.2770131826400757, 0.8647446036338806, 1.0962142944335938, -1.0656343698501587, -1.5563756227493286, 2.143430471420288, 0.4696103632450104, 0.9091355800628662, -0.6206033825874329, -1.0423543453216553, -1.329746961593628, -0.13596804440021515, 0.9624383449554443, 1.134135127067566, -0.9246122241020203, -2.2613234519958496], (2, 3, 4, 5)), + ], + 'AddBroadcast3': [ + f32([0.13225243985652924, -0.4780140519142151, -1.470346212387085, 0.8778636455535889, -0.5138850212097168, 0.7701201438903809, 0.994074821472168, -0.4101419746875763, 1.7650624513626099, 1.241428017616272], (2, 1, 1, 5)), + f32([-0.7990003824234009, 1.2677446603775024, 0.10287351161241531, -0.007047129794955254, 0.19927170872688293, 1.7712593078613281, 0.2339390069246292, -0.751605749130249, -0.4098702073097229, 0.02957325056195259, 2.487703800201416, 2.724266767501831, 0.16116267442703247, 0.13580884039402008, -1.3455098867416382, 1.0834174156188965, -0.5723267793655396, -0.27434247732162476, 2.2975919246673584, 0.7250648140907288, -0.3598426282405853, -1.4755396842956543, 0.46544721722602844, 0.4530450701713562, 0.393509179353714, 0.2533503770828247, -2.154552698135376, 0.5859283208847046, 0.09075859934091568, 1.328303575515747, 2.1687653064727783, -1.315091609954834, -0.7790181636810303, 1.7297074794769287, 0.8941051959991455, 1.1889108419418335, 0.5837250351905823, -0.6117035150527954, -0.8382923007011414, 0.6391794681549072, 0.6662607789039612, -1.0766762495040894, 0.014115190133452415, -0.6708264946937561, -0.04556865990161896, -0.049491479992866516, -1.8707592487335205, 0.255876362323761, 0.1471511423587799, -0.7458451390266418, -1.1937352418899536, -1.5214205980300903, -0.9252294301986694, -0.9812653064727783, -0.07535745948553085, -1.4692507982254028, -0.08861242234706879, 0.6495186686515808, -0.1691899448633194, 0.8701536059379578, 0.5768899321556091, 1.3629382848739624, 1.282568335533142, 0.3924553692340851, 0.43308472633361816, 0.8452982902526855, -0.5668654441833496, -0.8479184508323669, -0.11286944150924683, 0.6085797548294067, -0.7951951026916504, -0.2049192488193512, -1.529517412185669, -0.3903006315231323, -2.7616076469421387, 0.09055905789136887, -0.991420328617096, 0.3348078429698944, -1.0999988317489624, 1.3614935874938965, 0.18557575345039368, 0.554069995880127, 1.2316406965255737, -0.23469014465808868, -1.3727471828460693, 1.80717933177948, 1.429667592048645, 0.7207739353179932, -0.09774938970804214, 1.1206538677215576, -0.5151561498641968, -0.9527944922447205, 0.8764696717262268, -0.5944010019302368, -0.12440208345651627, -0.710966944694519, -0.630127489566803, 0.5172616839408875, 1.2372664213180542, 1.5625547170639038, -0.9446976184844971, -0.381147563457489, -0.4202176034450531, -0.5892148613929749, -0.7143963575363159, 0.04793575033545494, -2.042145252227783, -0.45765405893325806, -1.1230720281600952, 0.9072713851928711, 0.9627283215522766, 0.5430320501327515, -0.8497303128242493, 0.2878032922744751, 0.17027853429317474, -0.11893711239099503, -1.2241463661193848, -1.6274759769439697, 0.5326449871063232, 0.5348359942436218], (2, 3, 4, 5)), + ], + 'AddBroadcast4': [ + f32([1.9430140256881714, 0.40606817603111267], (2, 1)), + f32([0.5089889168739319, -0.2782992124557495, -0.6876162886619568, 0.3318638205528259, 0.5791553258895874, 0.40685799717903137, 1.420383334159851, 0.19857093691825867], (2, 4)), + ], + 'AddBroadcast5': [ + f32([-0.45616137981414795, -0.05853134021162987, 1.0956422090530396, 0.9588031768798828, 0.9499531984329224, -0.3586410582065582, 1.0857089757919312, 0.6028053164482117], (2, 1, 4)), + f32([1.6978745460510254, 1.1064167022705078, 2.197551727294922, 0.06709206104278564, 0.0457230806350708, -2.1450436115264893, -0.4773070216178894, 0.15205423533916473, -0.2515922486782074, -0.07529807090759277, 0.517436683177948, 0.08267594873905182, 0.3401562571525574, 0.0946023091673851, -1.166089653968811, -0.2346605807542801, -0.5520268082618713, -0.13844847679138184, 0.5305575728416443, 0.1706864833831787, -0.4949127733707428, -1.4246270656585693, -0.9997391104698181, -0.257132887840271], (2, 3, 4)), + ], + 'AddBroadcast6': [ + f32([1.0549867153167725, -1.6431103944778442, 0.11925146728754044, -1.597557783126831, -0.014453129842877388, -0.6944054365158081, -0.12011280655860901, 0.005393229890614748, -0.16923530399799347, 2.3453359603881836, 1.302680492401123, 0.4569944441318512], (2, 1, 3, 1, 2)), + f32([0.03162163123488426, 1.363404393196106, -0.347364604473114, -0.7185632586479187, 0.40669968724250793, -0.3759573996067047, 0.22234952449798584, 1.6956379413604736, 0.9145916700363159, -0.020812150090932846, -1.6489421129226685, -0.011892610229551792, 0.5803133845329285, -0.11880190670490265, 0.7009931802749634, -0.3742424249649048, -0.23980526626110077, -0.031784068793058395, -0.27969110012054443, 0.018956879153847694, 1.3211175203323364, 0.021139059215784073, 0.514503002166748, -1.4176076650619507, -0.1922055333852768, 0.23529522120952606, 0.9519990682601929, -1.3897144794464111, -0.7583696246147156, -0.9095695614814758, -0.13006828725337982, -0.6439045667648315, -0.0808228999376297, 0.7913475632667542, 1.006848692893982, -1.438180923461914, -0.14550620317459106, -0.3363551199436188, -0.6185612082481384, -0.4928140640258789, -1.1294726133346558, 1.6181882619857788, -0.05826431140303612, -1.4780218601226807, 0.2563738226890564, -0.15478579699993134, 2.507887840270996, 0.3089805841445923], (2, 2, 3, 2, 2)), + ], + 'AddBroadcast7': [ + f32([-0.4216483533382416, -0.6176707744598389, -0.6877889633178711, -1.1417591571807861, 0.6320437788963318, -0.6063031554222107], (2, 1, 3, 1)), + f32([1.4051986932754517, -0.2876608669757843, 0.0749375969171524, 1.2207484245300293, -0.48621267080307007, -0.688210129737854, -0.6774346828460693, 0.3670888841152191, 0.0008057440281845629, -0.2080310881137848, 0.9697791337966919, 0.7583738565444946], (1, 1, 3, 4)), + ], + 'AvgPool': [f32([0.4763999879360199, -0.19760000705718994, 1.6505999565124512, -0.24210000038146973, 0.6412000060081482, 1.9984999895095825, 0.3937999904155731, 0.1347000002861023, 0.22040000557899475, -0.7502999901771545, 0.21389999985694885, 0.7285000085830688, -0.020999999716877937, -0.4584999978542328, -1.5333000421524048, -0.4772000014781952, 0.5559999942779541, 0.6323000192642212, -2.5371999740600586, 1.4905999898910522, -1.1061999797821045, -0.970300018787384, 0.23659999668598175, -0.91839998960495, 0.30140000581741333, 0.7985000014305115, -0.6840999722480774, -2.285399913787842, -2.7727999687194824, -1.2805999517440796, -1.0946999788284302, -0.5989999771118164, -0.30329999327659607, -1.9041999578475952, -0.5403000116348267, 0.23319999873638153, 0.921500027179718, -0.15489999949932098, 0.05570000037550926, -0.5566999912261963, -1.4970999956130981, 0.5386000275611877, -0.2921999990940094, 0.4860000014305115, -0.39730000495910645, -0.46239998936653137, 0.4514000117778778, 0.23849999904632568, 0.3783000111579895, -1.0499999523162842], (1, 1, 5, 10))], + 'Cast': [i64([1, 2, 3, 4, 5, 6], (2, 3))], + 'ComplexTopK': [f32([9.0, 8.0, 4.5, 1.7000000476837158, 2.9000000953674316, 3.200000047683716, 4.0, 2.5999999046325684, 7.400000095367432, 3.5, 5.599999904632568, 7.099999904632568, 9.800000190734863, 1.100000023841858, 3.299999952316284, 6.199999809265137, 8.399999618530273, 0.699999988079071, 2.200000047683716, 3.299999952316284, 4.400000095367432, 5.5, 6.599999904632568, 7.699999809265137, 8.800000190734863, 9.899999618530273, 1.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 5.0, 4.0, 3.0, 2.0, 1.0, 6.0, 7.0, 8.0, 9.0], (2, 3, 9))], + 'Constant': [ + ], + 'ConvAddRelu': [f32(np.arange(-7.0, 9.0), (1, 1, 4, 4))], + 'ConvTranspose1d': [f32(np.arange(0.0, 3.0), (1, 1, 3))], + 'ConvTranspose2d': [f32(np.arange(0.0, 9.0), (1, 1, 3, 3))], + 'ConvTransposeBias2d': [f32(np.arange(0.0, 9.0), (1, 1, 3, 3))], + 'ConvTransposeBias2dBatched': [f32(np.arange(0.0, 18.0), (2, 1, 3, 3))], + 'ConvWithAsymmetricPadding': [f32(np.arange(0.0, 35.0), (1, 1, 7, 5))], + 'ConvWithAutopadSameLower': [f32(np.arange(0.0, 25.0), (1, 1, 5, 5))], + 'ConvWithAutopadSameUpper': [f32(np.arange(0.0, 25.0), (1, 1, 5, 5))], + 'ConvWithDilation': [f32(np.arange(0.0, 49.0), (1, 1, 7, 7))], + 'ConvWithPadding': [f32(np.arange(0.0, 25.0), (1, 1, 5, 5))], + 'ConvWithStridesNoPadding': [f32(np.arange(0.0, 35.0), (1, 1, 7, 5))], + 'ConvWithStridesPadding': [f32(np.arange(0.0, 35.0), (1, 1, 7, 5))], + 'ConvWithoutPadding': [f32(np.arange(0.0, 25.0), (1, 1, 5, 5))], + 'Div': [ + f32([4.0, 2.0], (2,)), + f32([2.0, 2.0], (2,)), + ], + 'Elu': [f32([1.0, -2.0, 3.0, 0.5, -1.0, 2.0], (2, 3))], + 'EluAlpha': [f32([1.0, -2.0, 3.0, 0.5, -1.0, 2.0], (2, 3))], + 'Equal': [ + f32([1.0, 2.0, 3.0], (3,)), + f32([4.0, 2.0, 6.0], (3,)), + ], + 'Erf': [f32([-1.041200041770935, 0.19179999828338623, 0.9984999895095825, -0.5958999991416931, 0.6841999888420105, -2.4718000888824463, 0.18039999902248383, 0.6851000189781189, 1.5645999908447266, -1.4981000423431396, 0.42480000853538513, -0.8503999710083008], (12,))], + 'Exp': [f32([1.4656645059585571, 0.6333451271057129, 2.4048163890838623, 0.5446845293045044, -1.4127167463302612, -0.18609187006950378, 0.275448203086853, 1.106152057647705, 0.884743869304657, 0.47531232237815857], (10,))], + 'ExpandDiffSize': [f32([0.0, 1.0, 2.0], (3, 1))], + 'ExpandSameSize': [f32([0.0, 1.0, 2.0], (3, 1))], + 'EyeLike': [f32([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (3, 3))], + 'GRUBatchwise': [f32(np.arange(1.0, 7.0), (3, 1, 2))], + 'GRUBidirectional': [f32(np.arange(1.0, 7.0), (1, 3, 2))], + 'GRUDefaults': [f32(np.arange(1.0, 7.0), (1, 3, 2))], + 'GRUInitialBias': [f32(np.arange(1.0, 10.0), (1, 3, 3))], + 'GRUSeqLength': [f32(np.arange(1.0, 19.0), (2, 3, 3))], + 'Gather2d': [f32(np.arange(0.0, 9.0), (3, 3))], + 'GatherAxis0': [f32(np.arange(0.0, 120.0), (5, 4, 3, 2))], + 'GatherAxis1': [f32(np.arange(0.0, 120.0), (5, 4, 3, 2))], + 'GatherAxis2': [f32(np.arange(0.0, 120.0), (5, 4, 3, 2))], + 'GatherAxis3': [f32(np.arange(0.0, 120.0), (5, 4, 3, 2))], + 'GatherNegativeIndices': [f32(np.arange(0.0, 10.0), (10,))], + 'Gelu': [f32([1.0, -2.0, 3.0, 0.5, -1.0, 2.0], (6,))], + 'Greater': [ + f32([1.0, 2.0, 3.0], (3,)), + f32([4.0, 2.0, 6.0], (3,)), + ], + 'GreaterOrEqual': [ + f32([1.0, 2.0, 3.0], (3,)), + f32([4.0, 2.0, 6.0], (3,)), + ], + 'HardSigmoid': [f32([1.0, -2.0, 3.0, 0.5, -1.0, 2.0], (6,))], + 'HardSwish': [f32([1.0, -2.0, 3.0, 0.5, -1.0, 2.0], (6,))], + 'LSTMBatchwise': [f32(np.arange(1.0, 7.0), (3, 1, 2))], + 'LSTMBidirectional': [f32(np.arange(1.0, 7.0), (3, 1, 2))], + 'LSTMDefaults': [f32(np.arange(1.0, 7.0), (3, 1, 2))], + 'LSTMInitialBias': [f32(np.arange(1.0, 10.0), (3, 1, 3))], + 'LSTMPeepholes': [f32(np.arange(1.0, 9.0), (1, 2, 4))], + 'LayerNormalization2d': [f32(np.arange(0.0, 12.0), (3, 4))], + 'LayerNormalization4d': [f32(np.arange(0.0, 120.0), (2, 3, 4, 5))], + 'Less': [ + f32([1.0, 2.0, 3.0], (3,)), + f32([4.0, 2.0, 6.0], (3,)), + ], + 'LessOrEqual': [ + f32([1.0, 2.0, 3.0], (3,)), + f32([4.0, 2.0, 6.0], (3,)), + ], + 'LinearWithLeakyRelu': [f32([0.43689998984336853, -0.6881999969482422, 1.030900001525879, -1.0262999534606934, -0.15189999341964722, 1.2237000465393066, -0.7053999900817871, -0.1762000024318695, -0.6811000108718872, -2.259700059890747, 1.0388000011444092, -0.7993000149726868, 0.1467999964952469, 1.325700044631958, -0.4713999927043915, -0.0957999974489212, 0.7056999802589417, -0.3749000132083893, -0.3310000002384186, 0.09860000014305115, -0.13699999451637268, 0.08320000022649765, -1.6464999914169312, -0.2793000042438507], (24,))], + 'LinearWithSelu': [f32(np.full(48, 1.0), (2, 24))], + 'LinearWithSigmoid': [f32(np.full(48, 1.0), (2, 24))], + 'Linear_16': [f32(np.full(1600, 1.0), (16, 100))], + 'Linear_32': [f32(np.full(3200, 1.0), (32, 100))], + 'Linear_64': [f32(np.full(6400, 1.0), (64, 100))], + 'Log': [f32([1.0, 2.0, 3.0, 4.0], (4,))], + 'Max': [ + f32([1.0, 2.0, -1.0], (1, 3)), + f32([3.0, 0.0, 4.0], (1, 3)), + ], + 'MaxMultidirectionalBroadcast': [ + f32([0.35974153876304626, -2.2087337970733643, 0.957462728023529], (3, 1)), + f32([0.7590198516845703, -0.4654446244239807, -0.34920576214790344, -0.14607539772987366, 0.08269050717353821, -0.700456976890564], (2, 3, 1)), + f32([-0.4146898090839386, -0.46591925621032715, 0.5617253184318542, 0.056169308722019196], (1, 4)), + ], + 'MaxPool1d': [f32([0.09070000052452087, 0.10289999842643738, 0.814300000667572, 1.4496999979019165, -0.7785000205039978, 0.3824999928474426, -0.3763999938964844, 1.5785000324249268, -0.08349999785423279, 0.16220000386238098, 1.5866999626159668, 0.9822999835014343, -0.882099986076355, 0.4438999891281128, -0.13779999315738678, -0.2273000031709671, -0.01979999989271164, -2.0230000019073486, 0.09049999713897705, 0.6674000024795532, -1.4290000200271606, -1.309999942779541, -0.9438999891281128, -0.08330000191926956, -0.19189999997615814, 0.6886000037193298, 0.9388999938964844, -1.2913999557495117, -1.3583999872207642, -2.03410005569458, -0.32690000534057617, 0.1703999936580658, 1.1776000261306763, 1.3971999883651733, -1.8874000310897827, -1.533400058746338, 1.154099941253662, 0.3010999858379364, 0.6568999886512756, -2.350399971008301, 0.4032999873161316, 0.11420000344514847, 2.284600019454956, -1.3947999477386475, -0.8572999835014343, 0.5756000280380249, -1.086400032043457, 0.22830000519752502, 0.8946999907493591, 1.7626999616622925, -0.1657000035047531, 0.0649000033736229, -1.606600046157837, 0.41620001196861267, -1.152500033378601, -0.8184000253677368, 1.1324000358581543, -1.1086000204086304, 0.10610000044107437, 1.007099986076355], (1, 6, 10))], + 'MaxPool2d': [f32([0.6266000270843506, 0.1656000018119812, 0.275299996137619, -0.45579999685287476, -1.4592000246047974, 0.9284999966621399, -1.340999960899353, 1.3222999572753906, -0.5935999751091003, -1.364799976348877, -0.2989000082015991, 0.5900999903678894, -0.8845000267028809, -0.043299999088048935, 0.8313999772071838, -1.71589994430542, -0.5764999985694885, 0.8677999973297119, 1.0256999731063843, 0.7846999764442444, -0.34209999442100525, -1.2364000082015991, -0.5805000066757202, 0.44209998846054077, 1.218400001525879, 0.5042999982833862, 1.6822999715805054, -1.04830002784729, -2.2797999382019043, -1.892699956893921, 0.7716000080108643, 0.04050000011920929, 0.31209999322891235, -0.3010999858379364, -0.32659998536109924, -1.965999960899353, 1.0836999416351318, 0.23170000314712524, 0.9083999991416931, -0.32850000262260437, -0.9398000240325928, -0.20649999380111694, -0.9498999714851379, -0.9739000201225281, -0.12880000472068787, -0.13750000298023224, -1.261199951171875, 0.8809999823570251, 0.850600004196167, 0.445499986410141], (1, 1, 5, 10))], + 'MaxPool2d_AsymPad': [f32([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0], (1, 1, 4, 4))], + 'MaxPool2d_CeilMode': [f32(np.arange(25), (1, 1, 5, 5))], + 'MaxPool3d': [f32([-2.649600028991699, 1.0476000308990479, -0.5152999758720398, 0.37709999084472656, 0.41290000081062317, -0.3077000081539154, -0.8716999888420105, -0.8040000200271606, -0.35249999165534973, -0.17649999260902405, -0.33640000224113464, 0.8737000226974487, -0.23810000717639923, -0.8296999931335449, 0.4666000008583069, 0.6984000205993652, -0.6759999990463257, 0.629800021648407, 1.3832999467849731, 0.11010000109672546, 0.20389999449253082, -0.5476999878883362, 0.23409999907016754, 0.9180999994277954, 0.38420000672340393, 0.24279999732971191, 1.7924000024795532], (1, 1, 3, 3, 3))], + 'MeanMultidirectionalBroadcast': [ + f32([0.35974154, -2.20873388, 0.95746274], (3, 1)), + f32([0.75901985, -0.46544461, -0.34920575, -0.1460754, 0.08269051, -0.70045695], (2, 3, 1)), + f32([-0.41468981, -0.46591926, 0.56172534, 0.05616931], (1, 4)), + ], + 'MinMultidirectionalBroadcast': [ + f32([0.35974153876304626, -2.2087337970733643, 0.957462728023529], (3, 1)), + f32([0.7590198516845703, -0.4654446244239807, -0.34920576214790344, -0.14607539772987366, 0.08269050717353821, -0.700456976890564], (2, 3, 1)), + f32([-0.4146898090839386, -0.46591925621032715, 0.5617253184318542, 0.056169308722019196], (1, 4)), + ], + 'Mul': [ + f32([1.0, 2.0], (2,)), + f32([0.0, 1.0], (2,)), + ], + 'Neg': [f32([-1.909999966621399, 1.881100058555603, -1.7268999814987183, -0.10939999669790268, -0.014499999582767487, 0.250900000333786, 0.5892999768257141, -2.2732999324798584, -0.7077000141143799, 1.0644999742507935, -0.8607000112533569, 0.2084999978542328], (12,))], + 'Pow': [ + f32([1.0, 2.0, 3.0], (3,)), + f32([4.0, 5.0, 6.0], (3,)), + ], + 'Pow_broadcast': [ + f32([1.0, 2.0, 3.0, 3.0, 4.0, 5.0], (1, 2, 3)), + f32([2.0, 3.0, 4.0, 2.0, 3.0, 4.0], (2, 3)), + ], + 'RNNBatchwise': [f32(np.arange(1.0, 7.0), (3, 1, 2))], + 'RNNBidirectional': [f32([0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17], (3, 3, 2))], + 'RNNBidirectionalBatchwise': [f32([0.0, 0.01, 0.06, 0.07, 0.12, 0.13, 0.02, 0.03, 0.08, 0.09, 0.14, 0.15, 0.04, 0.05, 0.1, 0.11, 0.16, 0.17], (3, 3, 2))], + 'RNNDefaults': [f32(np.arange(1.0, 10.0), (3, 1, 3))], + 'RNNSeqLength': [f32(np.arange(1.0, 19.0), (2, 3, 3))], + 'RNNSequence': [f32([0.01, -0.01, 0.08, 0.09, 0.001, 0.09, -0.7, -0.35, 0.0, 0.001, 0.16, -0.19, 0.003, 0.0, 0.0001, 0.05, -0.09, 0.013, 0.5, 0.005, 0.2, -0.05, 0.062, -0.04, -0.04, 0.0, 0.0, 0.0, 0.0, 0.0, 0.06, 0.087, 0.01, 0.3, -0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (3, 3, 5))], + 'RNNSequenceBatchwise': [f32([0.01, -0.01, 0.08, 0.09, 0.001, 0.05, -0.09, 0.013, 0.5, 0.005, 0.06, 0.087, 0.01, 0.3, -0.001, 0.09, -0.7, -0.35, 0.0, 0.001, 0.2, -0.05, 0.062, -0.04, -0.04, 0.0, 0.0, 0.0, 0.0, 0.0, 0.16, -0.19, 0.003, 0.0, 0.0001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (3, 3, 5))], + 'RangeFloat': [ + f32([1.0], (1,)), + f32([10.0], (1,)), + f32([2.0], (1,)), + ], + 'RangeInt': [ + i64([1], (1,)), + i64([10], (1,)), + i64([2], (1,)), + ], + 'Reciprocal': [f32([1.2690999507904053, -1.215999960899353, 0.6392999887466431, -0.4438000023365021, 0.8065000176429749, 0.20110000669956207], (2, 3))], + 'ReduceMean': [f32([5.0, 2.0, 3.0, 5.0, 5.0, 4.0], (1, 2, 3))], + 'ReduceProd': [f32([5.0, 2.0, 3.0, 5.0, 5.0, 4.0], (1, 2, 3))], + 'Shape': [f32([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], (1, 2, 3))], + 'Slice': [rand_f32(1, (20, 10, 5))], + 'Slice_Default_Axis': [rand_f32(2, (20, 10, 5))], + 'Slice_Default_Steps': [rand_f32(3, (20, 10, 5))], + 'Slice_Neg': [rand_f32(4, (20, 10, 5))], + 'Softmax1d': [f32([-1.0, 0.0, 1.0], (3,))], + 'Softmax2d': [f32([-1.0, 0.0, 1.0], (1, 3))], + 'Softmax3d': [f32([-0.8938999772071838, -0.36739999055862427, 0.17630000412464142, 1.580399990081787, -0.46869999170303345, 1.2252999544143677, -1.3487999439239502, -0.10000000149011612, -0.12620000541210175, 0.49619999527931213, 1.0870000123977661, 0.690500020980835, -0.3450999855995178, -1.698099970817566, -0.46880000829696655, 0.44679999351501465, -0.5479000210762024, 0.06499999761581421, 1.044600009918213, -1.624899983406067, -0.718999981880188, -1.7519999742507935, 3.7753000259399414, -1.493899941444397], (2, 3, 4))], + 'Softmax4d': [f32([-0.586899995803833, -1.4271999597549438, -0.15459999442100525, 0.009600000455975533, 0.17059999704360962, 0.03880000114440918, -0.3483999967575073, -0.7828999757766724, 1.113800048828125, -0.5644000172615051, -0.6263999938964844, -1.1890000104904175, 1.6741000413894653, -0.7129999995231628, 0.9592000246047974, 1.7476999759674072, -0.47749999165534973, 1.3407000303268433, -0.3882000148296356, -0.4560000002384186, 1.0384999513626099, -0.16689999401569366, 0.5540000200271606, -1.0789999961853027, -0.6152999997138977, -0.6273999810218811, -1.2303999662399292, -0.6757000088691711, 1.017799973487854, -0.2379000037908554, -0.7911999821662903, -0.016499999910593033, -0.5422999858856201, 0.14589999616146088, 1.3585000038146973, -0.5005000233650208, -0.21870000660419464, -1.8180999755859375, -0.6642000079154968, 0.028699999675154686, -1.9103000164031982, 0.7983999848365784, -0.7860000133514404, 1.5133999586105347, 1.3873000144958496, -0.6462000012397766, -0.6353999972343445, -0.13349999487400055], (2, 3, 4, 2))], + 'Sqrt': [f32([0.8343999981880188, 0.4715999960899353, 0.6226000189781189, 0.8447999954223633, 0.2483000010251999, 0.9466999769210815], (2, 3))], + 'Sub': [ + f32([1.0, 2.0], (2,)), + f32([0.0, 1.0], (2,)), + ], + 'SumMultidirectionalBroadcast': [ + f32([0.35974153876304626, -2.2087337970733643, 0.957462728023529], (3, 1)), + f32([0.7590198516845703, -0.4654446244239807, -0.34920576214790344, -0.14607539772987366, 0.08269050717353821, -0.700456976890564], (2, 3, 1)), + f32([-0.4146898090839386, -0.46591925621032715, 0.5617253184318542, 0.056169308722019196], (1, 4)), + ], + 'Swish': [f32([1.0, -2.0, 3.0, 0.5, -1.0, 2.0], (6,))], + 'Tanh': [f32([-0.38960000872612, -0.3521000146865845, 0.03629999980330467, 1.0961999893188477, 0.5084999799728394, -0.8522999882698059, -0.6765999794006348, 0.24210000038146973, 1.597100019454956, 1.3873000144958496, -0.21119999885559082, -0.6894999742507935, -0.5069000124931335, -2.1394999027252197, -0.7087000012397766, 1.1657999753952026, 1.3493000268936157, 0.8131999969482422, 1.7156000137329102, -0.8636999726295471, -0.19709999859333038, 0.041099999099969864, -0.5662000179290771, -0.2515999972820282], (24,))], + 'Tile5D': [f32([0.2386120855808258, 0.5549510717391968, -1.8190287351608276, 0.5724563598632812, -0.6596977710723877, 0.17560836672782898, 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, 0.2705111503601074, 1.42119562625885, 0.032626643776893616, -1.212586522102356, -0.5129594802856445, -0.43296414613723755, -0.1606937050819397, 1.1884371042251587, -0.662174642086029, -2.291109323501587, -0.6852569580078125, 2.325223922729492, -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, 0.2831517457962036, 0.4496127665042877, -0.2029038816690445, 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, 1.90426504611969, -0.4861580729484558, 0.9139055013656616, -0.5031066536903381, 0.9583520293235779, -0.23210509121418, 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, -0.14444805681705475, -0.8829464912414551, 1.725736141204834, 0.45657631754875183, 0.4920198321342468, -1.088847041130066, 0.49437597393989563, -0.006085286382585764, 2.475630760192871, 0.12170185893774033, -0.8953945636749268, 1.1430096626281738, 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, 0.05180325731635094, 0.2802475392818451, 0.5289335250854492, 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, 0.5463842153549194, -0.7782878875732422, -0.8570080399513245, -2.593783378601074, -0.11392943561077118, 0.5637082457542419, 2.075004816055298, -1.0598397254943848, 1.0823975801467896], (2, 2, 2, 3, 3))], + 'TopK': [f32([9.0, 8.0, 4.5, 1.7000000476837158, 2.9000000953674316, 3.200000047683716, 4.0, 2.5999999046325684, 7.400000095367432], (9,))], +} + + +def _recurrent_reference(model, feeds): + """Expected outputs for the RNN/LSTM/GRU models that onnx's + ReferenceEvaluator cannot evaluate (bidirectional recurrence, batchwise + layout or per-batch sequence lengths). Implements the ONNX operator + definitions directly with numpy, reading the weights from the model.""" + node = model.graph.node[0] + op = node.op_type + init = {t.name: numpy_helper.to_array(t) for t in model.graph.initializer} + + def operand(idx): + if idx < len(node.input) and node.input[idx]: + name = node.input[idx] + return feeds[name] if name in feeds else init[name] + return None + + attrs = {a.name: a for a in node.attribute} + hidden = attrs["hidden_size"].i + layout = attrs["layout"].i if "layout" in attrs else 0 + direction = attrs["direction"].s.decode() if "direction" in attrs else "forward" + linear_before_reset = ( + attrs["linear_before_reset"].i if "linear_before_reset" in attrs else 0 + ) + if "activations" in attrs: + acts = [s.decode() for s in attrs["activations"].strings] + defaults = {"RNN": ["Tanh"], "GRU": ["Sigmoid", "Tanh"], "LSTM": ["Sigmoid", "Tanh", "Tanh"]}[op] + num_dir_acts = 2 if direction == "bidirectional" else 1 + if acts != defaults * num_dir_acts: + raise RuntimeError(f"{op}: non-default activations {acts} not implemented") + + X, W, R = operand(0), operand(1), operand(2) + if op == "LSTM": + B, seq_lens, initial_h, initial_c, P = (operand(i) for i in range(3, 8)) + else: + B, seq_lens, initial_h = (operand(i) for i in range(3, 6)) + initial_c = P = None + + if layout == 1: + X = X.transpose(1, 0, 2) + seq_length, batch, _ = X.shape + num_dir = 2 if direction == "bidirectional" else 1 + ngates = {"RNN": 1, "GRU": 3, "LSTM": 4}[op] + if layout == 1: + # With layout=1, initial_h/initial_c hold [batch, num_dir, hidden]. + # The pytorch exporter kept the layout-0 dims on the initializer, so + # reinterpret the raw buffer instead of transposing the array. + if initial_h is not None: + initial_h = initial_h.flatten().reshape(batch, num_dir, hidden).transpose(1, 0, 2) + if initial_c is not None: + initial_c = initial_c.flatten().reshape(batch, num_dir, hidden).transpose(1, 0, 2) + if B is None: + B = np.zeros((num_dir, 2 * ngates * hidden), np.float32) + if seq_lens is None: + seq_lens = np.full(batch, seq_length) + seq_lens = np.asarray(seq_lens).astype(np.int64) + if direction != "forward" and not np.all(seq_lens == seq_length): + raise RuntimeError("per-batch sequence lengths only implemented for direction=forward") + if initial_h is None: + initial_h = np.zeros((num_dir, batch, hidden), np.float32) + if op == "LSTM" and initial_c is None: + initial_c = np.zeros((num_dir, batch, hidden), np.float32) + + def sigmoid(v): + return 1.0 / (1.0 + np.exp(-v)) + + Y = np.zeros((seq_length, num_dir, batch, hidden), np.float32) + Y_h = np.zeros((num_dir, batch, hidden), np.float32) + Y_c = np.zeros((num_dir, batch, hidden), np.float32) + for d in range(num_dir): + reverse = direction == "reverse" or d == 1 + Wd, Rd = W[d], R[d] + Wb, Rb = B[d][: ngates * hidden], B[d][ngates * hidden :] + h = initial_h[d].astype(np.float32) + c = initial_c[d].astype(np.float32) if op == "LSTM" else None + for step in range(seq_length): + t = seq_length - 1 - step if reverse else step + x = X[t] + pre = x @ Wd.T + h @ Rd.T + Wb + Rb + if op == "RNN": + h_new = np.tanh(pre) + elif op == "GRU": + z = sigmoid(pre[:, :hidden]) + r = sigmoid(pre[:, hidden : 2 * hidden]) + Wpre_h = x @ Wd[2 * hidden :].T + Wb[2 * hidden :] + if linear_before_reset: + h_tilde = np.tanh(Wpre_h + r * (h @ Rd[2 * hidden :].T + Rb[2 * hidden :])) + else: + h_tilde = np.tanh(Wpre_h + (r * h) @ Rd[2 * hidden :].T + Rb[2 * hidden :]) + h_new = (1 - z) * h_tilde + z * h + else: # LSTM: gate order in W/R/B is i, o, f, c + pc = P[d] if P is not None else np.zeros(3 * hidden, np.float32) + i_g = sigmoid(pre[:, :hidden] + pc[:hidden] * c) + f_g = sigmoid(pre[:, 2 * hidden : 3 * hidden] + pc[2 * hidden :] * c) + c_tilde = np.tanh(pre[:, 3 * hidden :]) + c_new = f_g * c + i_g * c_tilde + o_g = sigmoid(pre[:, hidden : 2 * hidden] + pc[hidden : 2 * hidden] * c_new) + h_new = o_g * np.tanh(c_new) + valid = (seq_lens > t).reshape(batch, 1) + if op == "LSTM": + c = np.where(valid, c_new, c) + h = np.where(valid, h_new, h) + Y[t, d] = np.where(valid, h_new, 0) + Y_h[d] = h + if op == "LSTM": + Y_c[d] = c + + if layout == 1: + Y = Y.transpose(2, 0, 1, 3) + Y_h = Y_h.transpose(1, 0, 2) + Y_c = Y_c.transpose(1, 0, 2) + outs = {"Y": Y, "Y_h": Y_h, "Y_c": Y_c} + return [outs[name] for name in ("Y", "Y_h", "Y_c")[: len(node.output)] if name] + + +def _maxpool2d_reference(model, feeds): + """MaxPool with asymmetric padding; the ReferenceEvaluator computes a + wrong output shape for that case.""" + node = model.graph.node[0] + attrs = {a.name: (list(a.ints) if a.type == onnx.AttributeProto.INTS else a.i) + for a in node.attribute} + kh, kw = attrs["kernel_shape"] + sh, sw = attrs.get("strides", [1, 1]) + pt, pl, pb, pr = attrs.get("pads", [0, 0, 0, 0]) + if attrs.get("ceil_mode", 0) != 0: + raise RuntimeError("ceil_mode not implemented") + x = feeds[node.input[0]] + n, c, h, w = x.shape + xp = np.full((n, c, h + pt + pb, w + pl + pr), -np.inf, np.float32) + xp[:, :, pt : pt + h, pl : pl + w] = x + h_out = (h + pt + pb - kh) // sh + 1 + w_out = (w + pl + pr - kw) // sw + 1 + out = np.empty((n, c, h_out, w_out), np.float32) + for i in range(h_out): + for j in range(w_out): + out[:, :, i, j] = xp[:, :, i * sh : i * sh + kh, j * sw : j * sw + kw].max(axis=(2, 3)) + return [out] + + +def _mean_reference(model, feeds): + """Mean with multidirectional broadcasting; the ReferenceEvaluator fails + to broadcast the inputs to a common shape.""" + return [np.mean(np.broadcast_arrays(*feeds.values()), axis=0, dtype=np.float32)] + + +# Models whose expected outputs the ReferenceEvaluator cannot compute. +EXPECTED_OVERRIDES = { + "GRUBidirectional": _recurrent_reference, + "LSTMBidirectional": _recurrent_reference, + "RNNBidirectional": _recurrent_reference, + "RNNBidirectionalBatchwise": _recurrent_reference, + "RNNSequence": _recurrent_reference, + "RNNSequenceBatchwise": _recurrent_reference, + "MaxPool2d_AsymPad": _maxpool2d_reference, + "MeanMultidirectionalBroadcast": _mean_reference, +} + + +def compute_reference(name): + """Return (feeds, outputs) for the test inputs of the given model.""" + model = MODELS[name]() + init_names = {t.name for t in model.graph.initializer} + graph_inputs = [vi for vi in model.graph.input if vi.name not in init_names] + arrays = TEST_INPUTS[name] + if len(arrays) != len(graph_inputs): + raise RuntimeError( + f"{name}: {len(arrays)} test inputs for {len(graph_inputs)} graph inputs" + ) + feeds = {vi.name: arr for vi, arr in zip(graph_inputs, arrays)} + if name in EXPECTED_OVERRIDES: + outputs = EXPECTED_OVERRIDES[name](model, feeds) + else: + outputs = ReferenceEvaluator(model).run(None, feeds) + return feeds, [np.asarray(o) for o in outputs] + + +def _write_reference_file(path, feeds, outputs): + """Text format, one entry per graph input/output: + \n\n""" + + def entry(f, key, arr): + if arr.dtype == np.bool_: + arr = arr.astype(np.uint8) + code = {"float32": "f32", "float64": "f64", "int64": "i64", + "int32": "i64", "uint8": "u8"}[arr.dtype.name] + flat = arr.flatten() + if code in ("f32", "f64"): + vals = " ".join(repr(float(v)) for v in flat) + else: + vals = " ".join(str(int(v)) for v in flat) + f.write(f"{key} {code} {arr.size}\n{vals}\n") + + with open(path, "w") as f: + for k, (name, arr) in enumerate(feeds.items()): + entry(f, f"input{k}", np.asarray(arr)) + for k, arr in enumerate(outputs): + entry(f, f"output{k}", arr) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument("models", nargs="*", metavar="MODEL", + help="models to generate (default: all)") + parser.add_argument("--outdir", default=".", help="output directory") + parser.add_argument("--list", action="store_true", dest="list_models", + help="only print the available model names") + parser.add_argument("--no-references", action="store_true", + help="only generate the models, without the reference data files") + args = parser.parse_args() + + if args.list_models: + print("\n".join(MODELS)) + return 0 + + if onnx is None: + print("error: the onnx python package is required to generate the models", file=sys.stderr) + return 1 + + names = args.models or list(MODELS) + unknown = [n for n in names if n not in MODELS] + if unknown: + print(f"error: unknown model(s): {', '.join(unknown)}", file=sys.stderr) + return 1 + + os.makedirs(args.outdir, exist_ok=True) + ref_dir = os.path.join(args.outdir, "references") + if not args.no_references: + os.makedirs(ref_dir, exist_ok=True) + n_refs = 0 + for name in names: + onnx.save(MODELS[name](), os.path.join(args.outdir, name + ".onnx")) + if name in TEST_INPUTS and not args.no_references: + feeds, outputs = compute_reference(name) + _write_reference_file(os.path.join(ref_dir, name + ".ref"), feeds, outputs) + n_refs += 1 + print(f"generated {len(names)} models and {n_refs} reference files in {args.outdir}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tmva/sofie/test/input_models/Abs.onnx b/tmva/sofie/test/input_models/Abs.onnx deleted file mode 100644 index ffaa3dad62eee..0000000000000 --- a/tmva/sofie/test/input_models/Abs.onnx +++ /dev/null @@ -1,12 +0,0 @@ - - onnx-example:N - -inputoutput"AbsAbsZ -input -  - -b -output -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Add.onnx b/tmva/sofie/test/input_models/Add.onnx deleted file mode 100644 index c1773f247ae7e..0000000000000 --- a/tmva/sofie/test/input_models/Add.onnx +++ /dev/null @@ -1,16 +0,0 @@ -pytorch1.11.0:� -) - onnx::Add_0 - onnx::Add_12Add_0"Addtorch-jit-exportZ - onnx::Add_0 - - -Z - onnx::Add_1 - - -b -2 - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/AddBroadcast1.onnx b/tmva/sofie/test/input_models/AddBroadcast1.onnx deleted file mode 100644 index 330479fd8eb49..0000000000000 --- a/tmva/sofie/test/input_models/AddBroadcast1.onnx +++ /dev/null @@ -1,16 +0,0 @@ -:P - -A -BY"AddAddZ -A - - -Z -B -  - -b -Y -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/AddBroadcast2.onnx b/tmva/sofie/test/input_models/AddBroadcast2.onnx deleted file mode 100644 index 27f1eed0ff82d..0000000000000 --- a/tmva/sofie/test/input_models/AddBroadcast2.onnx +++ /dev/null @@ -1,20 +0,0 @@ -:` - -A -BY"AddAddZ -A - - -Z -B - - - - -b -Y - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/AddBroadcast3.onnx b/tmva/sofie/test/input_models/AddBroadcast3.onnx deleted file mode 100644 index 27773525d2b1e..0000000000000 --- a/tmva/sofie/test/input_models/AddBroadcast3.onnx +++ /dev/null @@ -1,22 +0,0 @@ -:l - -A -BY"AddAddZ -A - - - - -Z -B - - - - -b -Y - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/AddBroadcast4.onnx b/tmva/sofie/test/input_models/AddBroadcast4.onnx deleted file mode 100644 index 069a6aeabb5f0..0000000000000 --- a/tmva/sofie/test/input_models/AddBroadcast4.onnx +++ /dev/null @@ -1,16 +0,0 @@ -:T - -A -BY"AddAddZ -A -  - -Z -B -  - -b -Y -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/AddBroadcast5.onnx b/tmva/sofie/test/input_models/AddBroadcast5.onnx deleted file mode 100644 index 38e89196f6c22..0000000000000 --- a/tmva/sofie/test/input_models/AddBroadcast5.onnx +++ /dev/null @@ -1,19 +0,0 @@ -:` - -A -BY"AddAddZ -A - - - -Z -B - - - -b -Y - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/AddBroadcast6.onnx b/tmva/sofie/test/input_models/AddBroadcast6.onnx deleted file mode 100644 index 831eb4a66457f..0000000000000 --- a/tmva/sofie/test/input_models/AddBroadcast6.onnx +++ /dev/null @@ -1,25 +0,0 @@ -:x - -A -BY"AddAddZ -A - - - - - -Z -B - - - - - -b -Y - - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/AddBroadcast7.onnx b/tmva/sofie/test/input_models/AddBroadcast7.onnx deleted file mode 100644 index 77f1d9fa1592e..0000000000000 --- a/tmva/sofie/test/input_models/AddBroadcast7.onnx +++ /dev/null @@ -1,22 +0,0 @@ -:l - -A -BY"AddAddZ -A - - - - -Z -B - - - - -b -Y - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/AvgPool.onnx b/tmva/sofie/test/input_models/AvgPool.onnx deleted file mode 100644 index bb0c140ce21b546917afad7e0fe32509740cb57b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmd;J5n?Z>EXglQ&X8g=)H5{HGq5_q$d$pxou8LiVPzGNm=bRw#AqbN>sXdrl$f3x zke{CuZ>YqL#MKhz;>k`e%1h0OFV09TNOfR#U|PV)t|iFDQjnNZ?7#qlARz%R_TrMF z%#_q(2POwbpoowF*lyjd%o5$yih}&2k|;j*u{yAP1um iFBh{AqaPO&2NMV<0c9ew%Sdto?ZhhO#KOfOzzYCn{3jm( diff --git a/tmva/sofie/test/input_models/Comparison_broadcast.onnx b/tmva/sofie/test/input_models/Comparison_broadcast.onnx deleted file mode 100644 index 4c08d5715ee1a..0000000000000 --- a/tmva/sofie/test/input_models/Comparison_broadcast.onnx +++ /dev/null @@ -1,32 +0,0 @@ - comparison_broadcast_demo:� - -A -B -OutGreater"Greater - -A -BOutEqual"Equal - -A -BOutLess"LessComparisonOpsWithBroadcastZ -A -  - -Z -B - - -b - -OutGreater -   - -b -OutEqual -   - -b -OutLess -   - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Comparison_broadcast_3d.onnx b/tmva/sofie/test/input_models/Comparison_broadcast_3d.onnx deleted file mode 100644 index e75e4173a9cd1..0000000000000 --- a/tmva/sofie/test/input_models/Comparison_broadcast_3d.onnx +++ /dev/null @@ -1,36 +0,0 @@ - comparison_broadcast_demo:� - -A -B -OutGreater"Greater - -A -BOutEqual"Equal - -A -BOutLess"LessComparisonOpsBroadcastZ -A - - - -Z -B -  - -b - -OutGreater -  - - -b -OutEqual -  - - -b -OutLess -  - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/ComplexTopK.onnx b/tmva/sofie/test/input_models/ComplexTopK.onnx deleted file mode 100644 index 8912e9d7839c06345e63f034f84dd6bc9d4f3488..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmdjD?I2Z-ky*QW|AYcI_3s)i+Pkvrrg_TuEet~zq0T&iSg&0kQ7)_;E z^+8IMSU{u}Hy2A{MP{)C;{rw|Ej}*xoW!E^)Z!8dpO=fRIKQYQH3iHS;>u0T%!^Mi uN-W5TQbM&(NQg^-gHecwi;05?h?#+yGfA8aXdw;>Q?LX(stzY60YLzg!ak4y diff --git a/tmva/sofie/test/input_models/Concat_0D.onnx b/tmva/sofie/test/input_models/Concat_0D.onnx deleted file mode 100644 index 95a41fe002dac1fe2bdad585a8dcf75da25c0ff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmd;J7h*4{EXglQ&X8g=)H5{FGqkGXa^m94&&#W@vU1MPOHM3_H$dkLF&av7z$BH} zAS^9zE|$cK%wh?K1&mBWoM1!avocGfWH7XIadB`k3bAl8aWEzEb1@nUAp}^Qm;`tM D5&R>@ diff --git a/tmva/sofie/test/input_models/Constant.onnx b/tmva/sofie/test/input_models/Constant.onnx deleted file mode 100644 index 9436a2f13f91a98460a61b552a9bbaec08aa6b92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmd=8V@isUINTXPnaq;R{Ji+|qQruXBpEIwwL*McJRFQd99%&6fUpyjfG_}&2SVEb diff --git a/tmva/sofie/test/input_models/ConvAddRelu.onnx b/tmva/sofie/test/input_models/ConvAddRelu.onnx deleted file mode 100644 index f4cffe37ff7080306bf5d753cb88c43ce7add8fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283 zcmah^%L>9U5X>flhSfq1>cv~})T=iy#`*^yy+~^UiqeW{ecb#6KfzCR>+2-QFzn9E zvdgM)eB(GrI3t|2T9w6dS=Lo7XVfJ>ztog7E+X$S6q-^oGQeR!Zl3MQsrReVB%mFU{sP| zU}&(%hMgG0qr`zG3JGxua4-t-a4~T(LNPN)A{>ztog7E+X$S6q-^oGQeR!Zk|K3g=+tVB%orU>0Ch z@?cj8x)v&d)0gDN4*MF32xV72-$X8l`B3b1-r+aWHc* z3ot5qFfcUOQv*9OhHD9OFaeF^fEdT%;Kb+@1#+2?7?%hKqmTd>69*#{GXrU6kYqTT kBojyiEXfb@4Hp*&P$vsefGG*6IueU&R-h!S6O(`-06!Kbq5uE@ diff --git a/tmva/sofie/test/input_models/ConvTransposeBias2dBatched.onnx b/tmva/sofie/test/input_models/ConvTransposeBias2dBatched.onnx deleted file mode 100644 index e9cc74409335fc79f440e1d9d5b41517e07fba36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmdj8x)v&d)0gDN4*MF32xV72-$X8l`B3b1-r+aWHc* z3ot5qFfcUOQv*9OhHD9OFaeF^fEdT%;Kb+@1#+2?7?%hKqmTd>69*FzGXgO)2!kZU nkt9J9AO#RfevogtxHy11SwIp=K-G~*szEA2m=%Pbm;?j?KZ7Nt diff --git a/tmva/sofie/test/input_models/ConvWithAsymmetricPadding.onnx b/tmva/sofie/test/input_models/ConvWithAsymmetricPadding.onnx deleted file mode 100644 index da614cdb476f6f03be561a5e8edb417b9990f3f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmd;J7ve3bEXl~vi!V+t$}A|c`ohTN&Ba*3#TYKcSgFL~oS#>wCCbH(pNDU diff --git a/tmva/sofie/test/input_models/ConvWithAutopadSameLower.onnx b/tmva/sofie/test/input_models/ConvWithAutopadSameLower.onnx deleted file mode 100644 index ba5343cc9b8594ca00fa21194be058cdc10aba5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmd;J7ve3bEXl~vi!V+t$}A|c`pw7{%*9y2#TYKcSgFL~oS#>wCCSB+SXz=FUyzuh z#1-u5>l*LlAMP5ofRR~Cl#3@jwJ0w&C%!l%u^`of*@1ZhBfFLW7khC@QD#bNu>+F> z6Hr7*0%THnW=V!4&?KNi!HK!4KKbRTMOwxjj6lfD!7RYD_S!objAPY6dz1KlVj p#wEhRC?vqe#K8!~tU#I-BpHrHk{Kw;oCK7t#3BjS>BJYOw>O10zsGh!rkFbgm$sW31!*b~A|jNwtzK!*v5afxs+3JGvAaWFzLE0AVQ0!miml5}F> IVi4d40LMxwiU0rr diff --git a/tmva/sofie/test/input_models/ConvWithDilation.onnx b/tmva/sofie/test/input_models/ConvWithDilation.onnx deleted file mode 100644 index c49707afa5be0b363b34f128e695f65d18bbfb2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmZus!AiqG6x_F)y6dCDx>V7VBA#;1O)$IEp2T~=i$s#PizNx!O+UcDNKgHs^q;!H z9A$XCVVK9v6XNBU;vQ$VYC4aQsf)Vvfj&iVb+wNbUKVzjds|n|P(zQv<2lYYZQV6@ za0D9P;QXg-t8(|{ws}(;X4q)D#;C~)XUHE$Ng{W?wMFR+m~hLL95XWOx2q{5P6Pxn z!6Ympdw)I+!|Q4INDqCV2A&c^^r64kNs{QG>&<$tKOd(0>J}FQlte0E8Xh+Pe#Ggk Ne;h10*fK&Qug>tKKQ{mX diff --git a/tmva/sofie/test/input_models/ConvWithDynShapeStride.onnx b/tmva/sofie/test/input_models/ConvWithDynShapeStride.onnx deleted file mode 100644 index 69864d933ef01ba193a2b4758bfdc2486664cdc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmd;+&sXrX|e9lbu?Wmzon_oRL_N>cG5!kzI?Ii=`kj zrPzVNfdRzj<6R$dGF&S2fY=|T< diff --git a/tmva/sofie/test/input_models/ConvWithPadding.onnx b/tmva/sofie/test/input_models/ConvWithPadding.onnx deleted file mode 100644 index 351c856f0d2c3408026294daddea1d9c807afdc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmd;J7ve3bEXl~vi!V+t$}A|cy1~e0$;DW~#TYKcSgFL~oS#>wCCbHGniV7&jzy9gD9M}zl&r)e3D)VvB)|s% Dn^-7K diff --git a/tmva/sofie/test/input_models/ConvWithStridesNoPadding.onnx b/tmva/sofie/test/input_models/ConvWithStridesNoPadding.onnx deleted file mode 100644 index bede9ea95dd87db53521856a2319bc04785e1dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267 zcmd;J7ve3bEXl~vi!V+t$}A|c`pn4X&Ba*3#TYKcSgFL~oS#>wCCbHgrlT^ZW9vY65(JJ65wLuV1#0JAk7Mr Z496nL43uO}0!mh5kz@twbYc?V0{~%SFp&TN diff --git a/tmva/sofie/test/input_models/ConvWithStridesPadding.onnx b/tmva/sofie/test/input_models/ConvWithStridesPadding.onnx deleted file mode 100644 index ee79d59845dd0a366aa7ac985b60f757bef1da7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmd;J7ve3bEXl~vi!V+t$}A|c`pC%T&Ba*3#TYKcSgFL~oS#>wCCbHvNJE# diff --git a/tmva/sofie/test/input_models/ConvWithoutPadding.onnx b/tmva/sofie/test/input_models/ConvWithoutPadding.onnx deleted file mode 100644 index fe00fa8fe8f9e5ac677a3609c884fa6754e219e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmd;J7ve3bEXl~vi!V+t$}A|cy3NRC$;DW~#TYKcSgFL~oS#>wCCbH=DW?Dc diff --git a/tmva/sofie/test/input_models/Cos.onnx b/tmva/sofie/test/input_models/Cos.onnx deleted file mode 100644 index 31877b49bba14..0000000000000 --- a/tmva/sofie/test/input_models/Cos.onnx +++ /dev/null @@ -1,12 +0,0 @@ - - cos_example:S - -inputoutput"CosCosGraphZ -input -  - -b -output -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Div.onnx b/tmva/sofie/test/input_models/Div.onnx deleted file mode 100644 index c76721b368f48..0000000000000 --- a/tmva/sofie/test/input_models/Div.onnx +++ /dev/null @@ -1,16 +0,0 @@ -pytorch1.11.0:� -) - onnx::Div_0 - onnx::Div_12Div_0"Divtorch-jit-exportZ - onnx::Div_0 - - -Z - onnx::Div_1 - - -b -2 - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Einsum_3.onnx b/tmva/sofie/test/input_models/Einsum_3.onnx deleted file mode 100644 index e8212d60107bc..0000000000000 --- a/tmva/sofie/test/input_models/Einsum_3.onnx +++ /dev/null @@ -1,20 +0,0 @@ - - onnx-example:� -< -inputA -inputBoutput"Einsum* -equation" abc,abd->ad� EinsumGraphZ -inputA - - - -Z -inputB - - - -b -output -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Einsum_4.onnx b/tmva/sofie/test/input_models/Einsum_4.onnx deleted file mode 100644 index b03ee64ec6daa..0000000000000 --- a/tmva/sofie/test/input_models/Einsum_4.onnx +++ /dev/null @@ -1,24 +0,0 @@ - - onnx-example:� -@ -inputA -inputBoutput"Einsum* -equation"abcd,abed->abce� EinsumGraphZ -inputA - - - - -Z -inputB - - - - -b -output - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Einsum_dotprod.onnx b/tmva/sofie/test/input_models/Einsum_dotprod.onnx deleted file mode 100644 index ea5ee8f9e03139e91331c866970c7a50bb2f45dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmd(oRBb`K2X50VOuq%)H{#TrCkU zj?}`^#FEVXJSEmlolIT31&qu>+z?s!qQruXC=r+;LR?%N9E?INTudCya8V~@(IlW+ Nhy_TZ3{Fe}q5zC%C58Y1 diff --git a/tmva/sofie/test/input_models/Einsum_matmul.onnx b/tmva/sofie/test/input_models/Einsum_matmul.onnx deleted file mode 100644 index c2bd6b284a56c..0000000000000 --- a/tmva/sofie/test/input_models/Einsum_matmul.onnx +++ /dev/null @@ -1,18 +0,0 @@ - - onnx-example:� -: -inputA -inputBoutput"Einsum* -equation" ik,kj->ij� EinsumGraphZ -inputA -  - -Z -inputB -  - -b -output -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Elu.onnx b/tmva/sofie/test/input_models/Elu.onnx deleted file mode 100644 index f010190ff3b4452a22ae91f37a3152d9ad0e213d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1551 zcmchX-%7(U6vp?5Y0YFxL6lvIS1Q=7>pHt33W6`;O~|@zt)@xHQn%d+zKAd3t9fmb z&YO8xIxpHn3cv51?>jlpzPm5hipx0Zw)$Sr^T*$9@YM#bl!;uqdpuYA+jStJIeen| zMN_}7k3b7kk>HbB?fv1iUhjXjVZt*486gy6hGWjAIDj;rK#fm03%m#}QbleAj$iSd zET9#IjKNvXVwG}+sVCN#emID(#^+iNlt*TKnp3TTHTVr1xIu^httQX7Tw*z`fL^HB zq6d*F8Z9VaqMZnYJ>Lk#m{OExf&v|bRW`>vQT+dwO6L8NDu|TCF)0i&Nh~E6g2=KV zZz20To0~teR^vf`Xvc9*RACI7Yd?~*Zg9p{FjpyE7=xoxU?$NTjxd`dqhk4JCV7VR ztst}-sZlhtLoW$d1nE$!?8Enc+lZ|fDPAeNSYn8*1edBBGs50bo3SBoZhz3zM|Z^@ ox(Duo-KoZ?=hNQ}-T{YB-E~02Y3QdpIRl%W?r!~gY#euf06C%(rvLx| diff --git a/tmva/sofie/test/input_models/EluAlpha.onnx b/tmva/sofie/test/input_models/EluAlpha.onnx deleted file mode 100644 index 7ae34fe27e3a01da27c9409afe846d1a83c3565e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmd{l+3*JBz`W&NFgpR4h}{k7A__ZW+xUd1_53GOQ$4% diff --git a/tmva/sofie/test/input_models/GRUBatchwise.onnx b/tmva/sofie/test/input_models/GRUBatchwise.onnx deleted file mode 100644 index 57a5ad83d7e7a9ae1f7b2a1792fb03a22a668c77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 898 zcmd;JxBAJ()y&An7{SFD&czrc#26{W92uXX#OxjvswL0GotRvbS(aFmnV(ne#U7lQ zo|~VU;>8k@n3u7Dkwc4*izPWHvp|#q2o^9hYKe1kreqeS0`=tQDY2*J7nLU#r7U1% z))M04&d5wjNzIEd&a6t6U|Yb*q{Yj{mXlbSUs@u;2;>U!0Bv+iEJ@BN&n!;Wn#ah& z$RWhRB*3UNf${7aAG^VXofyNl_A!GU$Od%a2Ij%!xKXzdPApE0K~dtsL@y-7CBVTb z#KXnJ!3@NVK+FV^2uG3t2@1g^g0M)iB}sDuvyB*+2+$}2ph}ogAf0SUl3bt+g`^KA K&E~`;zy|>BifTdt diff --git a/tmva/sofie/test/input_models/GRUBidirectional.onnx b/tmva/sofie/test/input_models/GRUBidirectional.onnx deleted file mode 100644 index 844e4b574d462648572f732264bb375abf1090db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1187 zcmd;Jx0=PtHG`3hF@lRRoQp9?h%r)#IWj&&iP=3UR7;PGJ2AN=vn;VBGe57`i#<3q zJvToy#fv2*F)ss+yMU2Hi;s&XIVZC~lmQ49FfwY%a&e|)7Nr7>$j?*aP0ECG5_1+X zGHVHOac5+vq@?D>7iU(bO0X_qWYXg0V#`Ua%r7mG0GhxgBmi`V6S6+7e~cVV9Q+(i z0*p!@7|)(LV>=L->$xFIB5F7Qcg?)d;pT&Ki~iW diff --git a/tmva/sofie/test/input_models/GRUDefaults.onnx b/tmva/sofie/test/input_models/GRUDefaults.onnx deleted file mode 100644 index bc4c80676bdc7f3dbfbac2c5a84b358c64f75d42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 740 zcmd;Jx4O;B)y&An7{SFD&czrc#26{W92uXX#OxjvswL0GotRvbS(aFmnV(ne#U7lQ zo|~VU;>8k@n3u7Dkwc4*izPWHvp|#q2o^9hYKe1kreqeS0`=tQDY2*J7nLU#r7U1% z))M04&d5wjNzIEd&a6t6U|qn-q{Yj{mXlbSUs@so)XOBq4YbiEH7&6;r=(b`m63yy zgP(&*fKjR9?3pvR1A(0w!?kuXf!)ChbjKQ|fpEl7wbO|)C`ufdtb~NP1UMLlc({N8 z3B=4m%mk7MN0Z=(Nd#e$U`>+d0wzo`E)k$n0#Ku1#<3qjddgdF!L2qNr7?J-qiy_9Ve%|c8hiAp_r@^|D1)qmu{ ziBu0o^ri#vGLLzWnR(njd~@&x5H1m7ga|?-x-n%@kKD1j zxh+jHa?W*;wZNs1&OA4FI~G+7AP49rrb=n1EJF9XtR8ihw7{gmUS^UcEvB`3N{6fk zTW;b;t{3HfGo)Et_~dw2n8xT_8C}Z-2kvneK$yQSmq&jE1@Zq`M{-PC3)=bAvYwBB zM|b$2OM$u?(2Iq@fP?6x&4Iu=bVR&Hc%MY{EwR;w#K%5K@s*UA?IXoz7q_VyteRgQ QvpwtrwI=pquk65o2ZIdGO8@`> diff --git a/tmva/sofie/test/input_models/GRUSeqLength.onnx b/tmva/sofie/test/input_models/GRUSeqLength.onnx deleted file mode 100644 index 8fb191cc847505bcca36299081a5702aef6b75c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 960 zcmdT@%SyvQ6z!cfX1tAQ7$2<&6}p^H5JbpED6Uc^wwsbRu^Fg|rm3%$Aov~m0GEQ` z(slhO?-T?PSKUZ2oXtIRA7{9STL*6zJ_EuzLV(~ScmjID=nay#aqOSTeXNC}LfwRg z%F=1a>Zra z>0qiJ;-*;wlN-1;3GcI6(WF`?Y?|1OuTSE1TqN=XIPf|*Txh?-=X`#+YVaVC?`$E$ zBoQxc)dc+Kz8?7UNnb#VzV5D4c|2Mk`Zkvf54?VZ+#v+I9E6RGGlHR^iQoqTl&pUf v{vU+d-_-tc(560DvVrF1u zc4G95k_PG$65|r#U=$MIV&Y&0Viq7~24bctevo-wTpS$iLSVrppz25@)gV=H)lN(T Ff&hQ`561ui diff --git a/tmva/sofie/test/input_models/GatherAxis1.onnx b/tmva/sofie/test/input_models/GatherAxis1.onnx deleted file mode 100644 index c92abebccbc00f2a1d42d327cb4cb40f4221754f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmd0DvVrF1u zc4G95k_PG$65|r#U=$MIV&Y&0Viq7~24bctevo-wTpS$iLSVrppz268)gYB%)lN(T Ff&hSa56J)k diff --git a/tmva/sofie/test/input_models/GatherAxis2.onnx b/tmva/sofie/test/input_models/GatherAxis2.onnx deleted file mode 100644 index e34778ec86da3..0000000000000 --- a/tmva/sofie/test/input_models/GatherAxis2.onnx +++ /dev/null @@ -1,21 +0,0 @@ -:� - -X -IY"Gather* -axis�Gather* :BIZ -X - - - - -Z -I - - -b -Y - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/GatherAxis3.onnx b/tmva/sofie/test/input_models/GatherAxis3.onnx deleted file mode 100644 index be36f82c92ed6..0000000000000 --- a/tmva/sofie/test/input_models/GatherAxis3.onnx +++ /dev/null @@ -1,22 +0,0 @@ -: - -X -IY"Gather* -axis�Gather* -:BIZ -X - - - - -Z -I - - -b -Y - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/GatherND_1.onnx b/tmva/sofie/test/input_models/GatherND_1.onnx deleted file mode 100644 index a8cd7ecbb1c5d..0000000000000 --- a/tmva/sofie/test/input_models/GatherND_1.onnx +++ /dev/null @@ -1,18 +0,0 @@ - - onnx-example:{ -! -data -indicesoutput"GatherND TestGraphZ -data - - - -Z -indices -  - -b -output - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/GatherND_2.onnx b/tmva/sofie/test/input_models/GatherND_2.onnx deleted file mode 100644 index 5717c8554238e..0000000000000 --- a/tmva/sofie/test/input_models/GatherND_2.onnx +++ /dev/null @@ -1,18 +0,0 @@ - - onnx-example: -! -data -indicesoutput"GatherND TestGraphZ -data - - - -Z -indices -  - -b -output -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/GatherND_3.onnx b/tmva/sofie/test/input_models/GatherND_3.onnx deleted file mode 100644 index 43d9098621646..0000000000000 --- a/tmva/sofie/test/input_models/GatherND_3.onnx +++ /dev/null @@ -1,24 +0,0 @@ - - onnx-example:� -4 -data -indicesoutput"GatherND* - -batch_dims� TestGraphZ -data - - - - -Z -indices - - - -b -output - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/GatherNegativeIndices.onnx b/tmva/sofie/test/input_models/GatherNegativeIndices.onnx deleted file mode 100644 index 6c6723a9998d8b09b265f375318047cafc965073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 zcmd5=jNK6O(`-0ItL!+5i9m diff --git a/tmva/sofie/test/input_models/Gelu.onnx b/tmva/sofie/test/input_models/Gelu.onnx deleted file mode 100644 index b5cd46b4b51782c37da20c426dd0186d69cc48ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64 zcmd1VyskRaZk-D6#|n{{2(zdE)EVxAr>ws4z?tqKqaz(6AKrEfCvCW C38w;$qFrD<~}yV#_Zr0n$pG9*IRM!R4978A5z;rh8FhK}M7?Of44|2M41N X3l|dyTapMDRHqP^2DN) z1&qvELR{P#nJFo$dGW=WRjCr}3mBQSc)8ee5-amdOC%V9Tp?bN#ZHMO$r&)NjK(G1DS`ofw0n#DRsC zkPw#u2cr-V7ZV3F5HkWX6G$Q)NdhD&1Ct2CBEg;{%>^v(#JEI&MhO5_!i)mxWKWXh Q0u_Wv`e4%RPD}!P0M;QpQ~&?~ diff --git a/tmva/sofie/test/input_models/LSTMBidirectional.onnx b/tmva/sofie/test/input_models/LSTMBidirectional.onnx deleted file mode 100644 index 1cc4d6805533397d3b0cacb8263caddb849a4caf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 873 zcmd;Jw|c^2DN) z1&qvELR{P#nJFo$dGW=WRjCrp3mBQSc)8ee5-amdOC*4LnS^*i7Q3XTC6?xt6l>*j zFmmv4FbOa!C7eBT#+H`Yi7{Mj9wXR3W}tl&7-?x4Ic7UC21SVjV@gPfOMrt>h=+@b zgBge!ftU#-5soAQ5(Fs#O9Ww&U`~?e0>-r%mk7`(0ia5lQ6QbnNs?TkRDh-rEak)` Gzy|<@lhuX* diff --git a/tmva/sofie/test/input_models/LSTMInitialBias.onnx b/tmva/sofie/test/input_models/LSTMInitialBias.onnx deleted file mode 100644 index 45f0caea13a257975c953cd66f39b3d2da1cb25f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 947 zcmdT@OHRWu5M>gJm}v=-`Lu{l6^V_HfW*c-D%hlzLc6KlCJ;*@K}i6?iUR;=$eL4d zfWn!uLy-_-S2i7KY-yg}v&Z8{ougL=p8??G_%;xJ(ETS5bh+wZl^z#^)DhK6um5ncR_?bib81%wY}6dSxXDaqpCsJ{WIUVc1 z_M%QW`t%X199rCNb;63XQ*Z2wRm^*SU!Qw@oy6&OwyqD46CG?j4KEJg_5m$iCzH66JxF>NUN0DcEjZ>w9Rw=wr20y^_5dtV#Hq-;OwRf)owaz; z5LcBt36n^r;t3eA0&~hxxrfJxht2;S5}M-nts$Ely7_YrNvMegNb1XC91+*AY zSQL&)G{+LA;5AX3kg(g+WJ+Gb0zt7Ml-ph$vnfYpRNxq%_VUQ7;TWV5VSg;}Cl(NA gb&NCDT|~0{9L^9=c_`$)FT1;d=4UVoOj_mA3v)nX<^TWy diff --git a/tmva/sofie/test/input_models/LayerNormalization2d.onnx b/tmva/sofie/test/input_models/LayerNormalization2d.onnx deleted file mode 100644 index c3693c7a896a62713c570dffb7dde590de31cc34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmdlH21?nTJ#%I+5ZeNkGB`0hMF|7#6yoFJ r;b0Wv;9}xn24WVVAVi}O7Z(Rmf(0zd4{{TdKoU@EB)V27CILYJp&cvX diff --git a/tmva/sofie/test/input_models/LayerNormalization4d.onnx b/tmva/sofie/test/input_models/LayerNormalization4d.onnx deleted file mode 100644 index a6b5dea2abb74..0000000000000 --- a/tmva/sofie/test/input_models/LayerNormalization4d.onnx +++ /dev/null @@ -1,26 +0,0 @@ -:� -1 -X -Scale -BY"LayerNormalization* -axis�LayerNormalization*_"P���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=BScale*["P��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>��L>BBZ -X - - - - -Z -Scale -  - -Z -B -  - -b -Y - - - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Less.onnx b/tmva/sofie/test/input_models/Less.onnx deleted file mode 100644 index a1c5698caacdb..0000000000000 --- a/tmva/sofie/test/input_models/Less.onnx +++ /dev/null @@ -1,16 +0,0 @@ -pytorch2.0.1:� -, - onnx::Less_0 - onnx::Less_12/Less"Less torch_jitZ - onnx::Less_0 - - -Z - onnx::Less_1 - - -b -2 - -  -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/LessOrEqual.onnx b/tmva/sofie/test/input_models/LessOrEqual.onnx deleted file mode 100644 index 443afed2d5586..0000000000000 --- a/tmva/sofie/test/input_models/LessOrEqual.onnx +++ /dev/null @@ -1,16 +0,0 @@ -pytorch2.0.1:� -H -onnx::LessOrEqual_0 -onnx::LessOrEqual_12 /LessOrEqual" LessOrEqual torch_jitZ! -onnx::LessOrEqual_0 - - -Z! -onnx::LessOrEqual_1 - - -b -2 - -  -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/LinearWithLeakyRelu.onnx b/tmva/sofie/test/input_models/LinearWithLeakyRelu.onnx deleted file mode 100644 index 7950ac7a36fc6..0000000000000 --- a/tmva/sofie/test/input_models/LinearWithLeakyRelu.onnx +++ /dev/null @@ -1,12 +0,0 @@ -pytorch1.11.0:m -3 -input1 LeakyRelu_0" LeakyRelu* -alpha���=�torch-jit-exportZ -input - - -b -1 - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/LinearWithSelu.onnx b/tmva/sofie/test/input_models/LinearWithSelu.onnx deleted file mode 100644 index a55f84e646fec0a963f2b397a0d2aa3a14d456a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1623 zcmbW2X-t%75XblBSk_lW3W^+_pdc$Ou&{Ey&!~U`>&YT`Es_Pd%gPEXE@za(11hTs zrJ#aUJW)~6s`cP~2DB=v5Ur>fL`1FDBdvf*G%zs8Cw6V}< z8&cB}lN?QbB!NLqmaLMs(5C3q4H6$#jqh7nt_W(jJ;zwrQ8Xh>6~EDNz`Y8VrC5X;DHnDLInXtgdq z-pASOqi17TW;`pBexXS})BHcvr2n7hZ^Hz9ruqIuv$6ivu;*f}!Bd^3Pfat3%Y`D5 z$ljU>`O>jGUnqOL9fn@pNLeo#%$JmsC4D2I{CqaKF-8Mv3kPEuYXVaPhd@Rtq1TpG z(89_zWpBOQR_zJ?LnB?W=kh{d1CC$Jk(vtrNK{ZX`rKQww zSRPHXD}ab#q&YAiIs%vA?zmoVZ}C8G!SZ9JQdH2Zs z5I4+FHW4sZkn~+Xpveh`(M9{ooG=S?b2LZg6)jh<$RS;I8c0lch5DB{5SMd|4_sQu z7o>FiD)UjT)w$UHD)~fNF`}QPue*hJ{S`B_O9j%B_LZ#Lh13Y}W zPUjJThb*~)o`o=Jm=kw@V-NkdB#I_y*}>~GVUQd;4?>665zpQnG!0>Ri_|jGSMZn| zoYlxZ-D-~6wa9Oq&m!I1O@EGU;(U5llpZkBwrc}GED?!5NaC~f1|;jkf8Z zP?O|duD&oGGGCtMUL`yrAw?gyykIDv(uv`2Llw-m8w1Mkjd1f`1t>??(vDVFR7&n} z!%x`KcGVfYn&ytVb(5jKSw=?RJdC@`i(p0T6MF78;PLF$XzF?dy5wJD_{9}8ag2`4 z^(%#=#ho~0gDb@U?o2W}UAU_wr(l`P34J!5C!3Q?a7t7)F5J;LeF%(aW5y1bFp#uh=wvuti@I7G%mN5*zMzRMMx!`5KS(}VcdX(u%M20`^N`6O|A4ZfY^gxPXoX%==I2!t(eW68`nv1G?jO7Ji~r*BFwV&}Y7@UXLw zu8mqve^g$^0oyfXfALu8&J6-Fh%7%&@t>0__g*`|4;M+Qq2cCjp1tl!+@otrjn5h2 z^L%kk7~-=c4m)EKplR|Q>XUMr&Ug6o4{WShOA%uuVogLQAIv_%mSqC|le7#mvF`Ub DTVA4< diff --git a/tmva/sofie/test/input_models/LinearWithSigmoid.onnx b/tmva/sofie/test/input_models/LinearWithSigmoid.onnx deleted file mode 100644 index ee4868ee05feadfc247ce296ee4537ab5da94210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1635 zcmbW2dsK{h7{{AQGjH!sw<(KJh{R6QY)vbM`8`$`8qUFSjY271l#+2fq)=@aDJq>> zw$PO&_pEt;&+EEUv2sa5ZV9=ikXu@IJ2_|n+&`Z4T+VsU=RD^*-{)aOQgOs8eR$-8 zAephNQa!v%!g{mf;KdQk^h#HjaZ#=a2o4O=vmzIzU$E~|sbGjqG%g@4Y@SR1ZeP9J zf;I6CjR^AXZe$cQGEX3oo3q{g0`%W_5-7zqm7GXRrcymQi&vRh`VColMpLXAYGLhJ9nYbup!u{|xUO60CO)SQ!x>sh6jV z7>4O-De&l;UKb-;>s5*asx{zNok7-3h$Hda3!v{F3mPYNrkP8$*qUtuhZpAz_i%O~ zNfWP7@v@7Y>j?$0q@G48L+M*;iSs%F!8x@DhUNs)v4uXE-#8M+rQarPr5;%HGDX9u zTGR4}^RXdy5$WH}3DZU$H{^^d)6AW6hk|DtnH*t`a~LJr9-x432ZM1;i5305a=W2^ z-6N{d9)}f|4pYYw{h%SujDD!H$JehbG>)+=Xz@?4xaO^`^y(QcOi-C|c`Kii^2$LV zcC6;)4brDcUm2;8v(-+7&;c@MThc(0=u+__M#5@HWn3NsJr-qVU)W)QcZdOi0#}F0V^|?mKp?{f8E|D%DK)u}MjNK~!O8CD zsatdiTBMp`t)hvm+1&#h%~?40bS7x7w{n|%e+8XcsE!Y5WrMq%M$@sO_NEUxT~7w$c}I`FJk+2UOIb zrCBx)$=PXn^vAn8uxjIIyN3on%|md&P)A61_k{hrcFOKs02v={Q~xXL!8*Zq#Od53 za_jC`*dL$49Y|k84~H5-Ec79blil#a968Q-kU_nj>d2m^AS|yi2U{~1hs4*Aiza7@ zLx~l5_&Z@z@-4%wlR^-xvuN|gRN|lc!cd<5oZ86dQc;T?+@0GU%`D~ANhqSHQ%grY z>s>>BPI*uLUs_;Rg)Njc_r_zTODQ|v(GV%$%^fj}hX?tSa8Kqmlq(tLizGVFfUe)? zqL)POw}ghyY$45$7`R?^h%)?O2sU0wGH>aLJl&X){L|8vO?T#qiu&oF)-xP2@)f=GC89Qp0y$5P)b-49?CKQ{hF#gtc@Dymco|SK)ZyyCz zneKp?NPlRYZh&~UJM`{Ig6Dyk!E(wL8smQs7p91*xl0b(cW7~T%t$58{Ir2VMjke;qRes0cYx{&p*Q`Ib>XQnZ%I)Ff@-U3-TYz(( ziTU%ShHGBmov1@5qFuvA%xROMz1=H%-gPJ75^s2H_$aQ6l(2S)OBi~k;0oy(m=8_C(rQCys^8TiDv z7<6e79!*$-FPQ+eVjcNm9B@8^C-HT48a~?26=(PA`VCTZR>BCR3@c=WU#zE}H7gkQ LpQ6M=XleR4c%H`( diff --git a/tmva/sofie/test/input_models/Linear_16.onnx b/tmva/sofie/test/input_models/Linear_16.onnx deleted file mode 100644 index 8e65190bba494c426c103f53870e21e0e6df335f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105481 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

7KbVv@cB5_UEvpYY{gAXqnJnQ` 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 diff --git a/tmva/sofie/test/input_models/Linear_32.onnx b/tmva/sofie/test/input_models/Linear_32.onnx deleted file mode 100644 index 9c9f7d84e624dd0bbb290445bf577d1f1d3cc3a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105481 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 BlD_}| diff --git a/tmva/sofie/test/input_models/Log.onnx b/tmva/sofie/test/input_models/Log.onnx deleted file mode 100644 index a1bfce7ba847b..0000000000000 --- a/tmva/sofie/test/input_models/Log.onnx +++ /dev/null @@ -1,11 +0,0 @@ -pytorch1.13.1:T - - onnx::Log_01/Log"Log torch_jitZ - onnx::Log_0 - - -b -1 - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/MatMul_Stacked.onnx b/tmva/sofie/test/input_models/MatMul_Stacked.onnx deleted file mode 100644 index 19c39ee2adddd..0000000000000 --- a/tmva/sofie/test/input_models/MatMul_Stacked.onnx +++ /dev/null @@ -1,19 +0,0 @@ - - onnx-example:� - -input1 -input2output"MatMulAddGraphZ -input1 - -N - -Z -input2 -  - -b -output - -N - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/MatMul_Stacked2.onnx b/tmva/sofie/test/input_models/MatMul_Stacked2.onnx deleted file mode 100644 index 6c86f5849d1a0..0000000000000 --- a/tmva/sofie/test/input_models/MatMul_Stacked2.onnx +++ /dev/null @@ -1,19 +0,0 @@ -  onnx-example:� - -input1 -input2output"MatMulAddGraphZ -input1 - -N - -Z -input2 - -N - -b -output - -N - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Max.onnx b/tmva/sofie/test/input_models/Max.onnx deleted file mode 100644 index 70943526f6ccd..0000000000000 --- a/tmva/sofie/test/input_models/Max.onnx +++ /dev/null @@ -1,17 +0,0 @@ - onnx-example:d - -X1 -X2YMax"Max -test-modelZ -X1 -  - -Z -X2 -  - -b -Y -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/MaxMultidirectionalBroadcast.onnx b/tmva/sofie/test/input_models/MaxMultidirectionalBroadcast.onnx deleted file mode 100644 index dd802b29237fa572f1979b9933a3a4ae9dc16f31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmdPVszqSbQWTaRATl`tPlbbQNloRAwDi14n`pkE+!6UAZCmb2dWej n;t~J~@&E;x;1WR9&Pb{mff6i9++2*2LTp?tK-COROag)cq>l;$ diff --git a/tmva/sofie/test/input_models/MaxPool1d.onnx b/tmva/sofie/test/input_models/MaxPool1d.onnx deleted file mode 100644 index 1fa4e59401cb61acd22facb9d9cb3678fad7f75a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmd;J5n?Z>EXglQ&X8g=)H5{HGqBpg$Q8rIpP!dkVP)l;SP_t)pA&B&#AqnR3Fj%X zLz!B_Ts+ySMR}X51*s0q3mDn8c)3^#5>tvD7#tWtTs|)L;*z4wl+ diff --git a/tmva/sofie/test/input_models/MaxPool2d.onnx b/tmva/sofie/test/input_models/MaxPool2d.onnx deleted file mode 100644 index 6427d59ce6e9d460a99ec9b4a93d1bc86727bc98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 218 zcmd;J5n?Z>EXglQ&X8g=)H5{HGq5_q$d$sypP!dkVP)l;SP_t)pA&B&#AqnR3Fj%X zLz!BlTs+ySMR}X51*s0q4onLe*|h|@SPBwTiX9jr5F{kP#a>)el$nxR?7-;2 z2ow<#0NbmZm06;jT2YW+R1&3$X|EWU2nVB(02dPnBNVd&X|5z`E=EHkOi5;-B&QRT G04D%6a4+%z diff --git a/tmva/sofie/test/input_models/MaxPool2d_AsymPad.onnx b/tmva/sofie/test/input_models/MaxPool2d_AsymPad.onnx deleted file mode 100644 index bacb19d2886a18ae643bca33d97a94f74d37e168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmdcHf{w1AOaOOT7D zATg!bfx&?hgh4_AT#%E5TlfM$KuM|fW(w2X^{D1Tp}EdLIPY& b9E?!R0;E}zfRd3|B$|fs)KlEL;o%+yGjR9ZvuN diff --git a/tmva/sofie/test/input_models/MaxPool3d.onnx b/tmva/sofie/test/input_models/MaxPool3d.onnx deleted file mode 100644 index e88616c9d94e99d0b49e8d1dc270b79424487ab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmd;J5n?Z>EXglQ&X8g=)H5{HGqAeA$d$vzpP!dkVP)l;SP_t)pA&B&#AqnR3Fj%X zLz!CQTs+ySMR}X51*s0q4onVA3mDn8M7dZB5>tvD7!VL7EX2iLTvC*ol3MJ* z2!cQ{Apx-cx>=bex~UZf`9&pBx|sG$aY=A63W;zraWFzLGmr-3BzZ1ILm^BBAcagI J?8GF%2>>fnF;D;i diff --git a/tmva/sofie/test/input_models/MeanMultidirectionalBroadcast.onnx b/tmva/sofie/test/input_models/MeanMultidirectionalBroadcast.onnx deleted file mode 100644 index 656211ad55a3632f4ea23c2a0d152b13c22ec14a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmdP0SMllTpGz86iF{9u7t!4lX7RW*}ya5(lak o65c>(=+` mWL$ejfeM{?8|rMODhGqnfcu2i`B%e4I69(e%V2er+%P_)K?(i< diff --git a/tmva/sofie/test/input_models/Mod_ConstantFolding.onnx b/tmva/sofie/test/input_models/Mod_ConstantFolding.onnx deleted file mode 100644 index 193273b63126bfc77c91edd3514467919f480349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmd6YeVjNoE)5n_x~V)o5X(cEA0U@&hrxp(bBLgEN0|S_H;sNW7FGwehgI$P&3up%rvpF#dhynnXuq(v? diff --git a/tmva/sofie/test/input_models/NotIsNaN.onnx b/tmva/sofie/test/input_models/NotIsNaN.onnx deleted file mode 100644 index 1f0fb2596ecf1..0000000000000 --- a/tmva/sofie/test/input_models/NotIsNaN.onnx +++ /dev/null @@ -1,13 +0,0 @@ -  onnx-example:t - -input temp_result"IsNaN - - temp_resultoutput"NotTestZ -input -  - -Nb -output -   - -NB \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Pad.onnx b/tmva/sofie/test/input_models/Pad.onnx deleted file mode 100644 index 3e2c0d8af8b0cce9edbc4d6136812ddb4fa23d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmdQ<_?=#NnKuS6q^qSE8lH#R?YF zlHy#)3_vQCA9p8!vfu5apLHgvD`XA>>L8Px0u)w* n-~!Z-q5=LDAU4lPO%AX}s~j?$Rp-gg6V@GH%r#he%<29CkgH?{ diff --git a/tmva/sofie/test/input_models/RNNBidirectional.onnx b/tmva/sofie/test/input_models/RNNBidirectional.onnx deleted file mode 100644 index 48f2f0a7a002ac3b484c7c536bf900bdab4e8844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmZuwZAep581`&8cX#Gw+;UBHR!$}Ej|d@uD7$A|qD<3h1)C$7n;Y)Nn5mnQePEwL zf@ayLBuhs@q^6-iD(~4^6qZRpG73a%g&AUoLj5qaGqW`5zlnWlgE7;st7XykIX_3{HDm4}svdK_kEAa|d zHm^|Tsm!DH+B~k`vmelGJfuq8!hwVsGW-CrS}1o26;47Z^Q0>6!rz6>?FUkpfeM%4 za5z2IN}<}Rq5MF?Dq*bKcBstf)er>JDFQmcNsM{U&QsgY4qCj6n#^)U}ac=le;1~@JJmTO!_49z{J*r z1wD%B)qsuHYQ}ysD=t5mJ3NcBiW;!-*trKo_g-@TaE4(x z&xAWC6VTSM5#6?D;)wYIN_m&a@xaLD6F+qHcKsjIM0F@V_<5?GYfEVr2PSg$vai#) z^vEsoj87+?sK^mR+10qK^(=n;q4r@1JCDY^?dWbtCY~$Zf_cER8)zw!ii?Rc82%Lh z?@O~j(oaf9?_XRu*C&FV$2p&*7iZ`6bCh;cjHH~zr(VhNXjmDv%6hSGMk6L@Z=g+7 z7wXw}r|;*{`=~-!r;l~W3=VS$2eLw_yJ|f;lVCZf!!5z3wfN$S;b4PmGjH^S;mfzMSXKs_fB7 z*ajddg1`uY009rxZn4}ex@@A^DZ1P+N^(ga$>KCS7*Nb8i_MM{rBGPNCc zJW`p1fh@_y*m7=yve*%ls2b3%WqaBjn zF1pNasan)gKA>RLFw$u`SmyQU0126R(v)9b$6Gu$N0sCj*#cTYQ?x<@QVc_5P3TRN z+K|`tja#3-4GASzxblWm=wf#wx2or-dYE7ueBHM#|>`=fDUR|xwbY6C+F zA7vgG*?O?3M-jamu<>fGyle0V9vyDfKQBr{-{&?5gwGimJe*Dmssn-^O!15ZHV&4;|ia;6s|M4W zWUgNIWd@fXzA2yfrpm`Fa^zrkHSTIXgCD)GebB)!pm9$-y3>(~=S#O>9`Ni2T1lj0 zA|eci-{4n1IqN0;lyrFilDhdm8SFg9c@@1lJ7<9F*>}6|$B}!eBDGE*X;&Gjq$xR+ zd;*_*8HLCC)d71^5c{)&sJ&nhH-`>kv#J-T&g$g2r0ZxC)rCf%TIB_$Q}*j7xZVDI z#Q(LIX)UoK!$1uUm>5VVSb`!<7?%+WLQn*Ygzz7NGOZ>?W@2Fsk)p$y1hgsPA8RuZ v(j*})r8KQuZuFHyEcUY|Kw^I_Ttg}};ff{vBI9BBV=NmbOfOQrLKFKF-gy>O diff --git a/tmva/sofie/test/input_models/RNNDefaults.onnx b/tmva/sofie/test/input_models/RNNDefaults.onnx deleted file mode 100644 index c829c14c8282aa0702dc80c406f7905a7a8ff510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmbu6&q~8U5XPPSvFoIUuxeZJ7B8|_Z{lg`MGrj$A-0#YZBnuj5=~M?!RPRrxAJv5 z8!AZYL3ChPm~X$|2Q#d9^XcFR!XrYA5FtnoQ*KY^S!hR-i5Q@#mW_T{#UgAs diff --git a/tmva/sofie/test/input_models/RNNSeqLength.onnx b/tmva/sofie/test/input_models/RNNSeqLength.onnx deleted file mode 100644 index 84ea9ddd190749033bd9e18305a285aafaecd809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545 zcmbtR!AiqG6!axoyS~N{R&6WZa+1A?H_2&liu4eL*j`H7M6*y5n?^;!|L_>_>e*lM zLp%$)WK(WwAVQ z&XXcp9qt01k=H$yJ*&Kg{>rI`Q9gc)Q(>O diff --git a/tmva/sofie/test/input_models/RNNSequence.onnx b/tmva/sofie/test/input_models/RNNSequence.onnx deleted file mode 100644 index 6a0ff84e84f58a660f1b62f1722d50f11ddcaa19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 739 zcmd;Jx4Om3)x*fe7{SFD&cztS#puMvTbx>0nwpoK8lRJzS1iOBDa0HZpP|GYJhOT#{LqSdy8aSM0?Sl9-pVfRRIskBcQaC$m750SFc_GHQu)ai(Mzr2>`a=P9wL zy;nO|BW0o2PR#0|7480rMA zRz?m+4mJ)}0Y;^YS5u4Zre5I$;+1xr4AfRNU>?{>s_Ed&l1WyVc|O z7j^aR@k?TH$QN?nZ^)rz^NPjhz>UUad)CE8``5Xj-0#E~t~C$h4mO}WCNReBYP45B z)V6Q;4&D7dUQPRX3poz_dYiplalh=+@bgBglhK@#Ce z5{y6zHXsH|1Ywb2ixLK=G9f-L9-vViK$RdJJW5hww1E_!nD9M~8%>_(_Vq79X a0RfNzR2PV5OOoUQrB5`Qz*0_30(<}qK*#g| diff --git a/tmva/sofie/test/input_models/RNNSequenceBatchwise.onnx b/tmva/sofie/test/input_models/RNNSequenceBatchwise.onnx deleted file mode 100644 index f29d3e71d3d716cf0ef65c6eedc762f7a7820aba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmd;Jw|dOV)x*fe7{SFD&cztS#puMvTbx>0nwpoK8lRJzS1iOBDa0HZpP|GYJhOT#{LqSdy8aSM0?Sl9-pVfRRIskBcQaC$m750SFc_GHQu)ai(Mzr2>`a=P9wL zy;nO|BW!3g9Ei2yAMhC0D1 zu_QU8JhM1etCf+1k%NtcRe({c;?>k5yQx<=fq13e>qp=ASxw^J_foCUes06FeI5ZO z2R6T&Y`5+6ReOP#)9t>qUAJF9C3OEXu4i@uz2df&5ghwh9Gh$}^ZL^M5*2s*wZC%q z@7}R@|8Dj8{Y71Ud;F4E9P)*n_ZxEP*t}w~IdG#f*`9TA(f)PrC-*xshHK4(xPuMo zjtPu$yBh7)54G*vy+e0@k5|)v-a?K8zuso=R^0H*e%8#1_T~H79oU3a>}4&O4@|6+ zKk)Uoxcx-_L-wy9x$V!oH_^^kC&ca&!@PY=+U5H{e#x?zI&gd6rws@8=Z4wtmzbJj zznIZx--6By`$c6t?N!+h+GT5-*|C4<+wZVMfB%(P^X!=`xc75!J+?2xl4Za6_COma z#vms%9(Mj;L^CJrVbW_Dr{5Cs6us3dIw diff --git a/tmva/sofie/test/input_models/RandomUniform.onnx b/tmva/sofie/test/input_models/RandomUniform.onnx deleted file mode 100644 index 46e1e4f5ed9cba700eb13317cd6396db10ef4bfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmdqyPW_ diff --git a/tmva/sofie/test/input_models/RangeFloat.onnx b/tmva/sofie/test/input_models/RangeFloat.onnx deleted file mode 100644 index 1b0abbe476320..0000000000000 --- a/tmva/sofie/test/input_models/RangeFloat.onnx +++ /dev/null @@ -1,20 +0,0 @@ - :� - -start -limit -deltaY"RangeRangeZ -start - - -Z -limit - - -Z -delta - - -b -Y - -  output_sizeB \ No newline at end of file diff --git a/tmva/sofie/test/input_models/RangeInt.onnx b/tmva/sofie/test/input_models/RangeInt.onnx deleted file mode 100644 index 47d257d66289b..0000000000000 --- a/tmva/sofie/test/input_models/RangeInt.onnx +++ /dev/null @@ -1,20 +0,0 @@ - :� - -start -limit -deltaY"RangeRangeZ -start - - -Z -limit - - -Z -delta - - -b -Y - -  output_sizeB \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Reciprocal.onnx b/tmva/sofie/test/input_models/Reciprocal.onnx deleted file mode 100644 index 5a9504a760eec..0000000000000 --- a/tmva/sofie/test/input_models/Reciprocal.onnx +++ /dev/null @@ -1,13 +0,0 @@ -:J - -XY" -Reciprocal -ReciprocalZ -X -  - -b -Y -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/ReduceMean.onnx b/tmva/sofie/test/input_models/ReduceMean.onnx deleted file mode 100644 index 48b62512bfc584793ba16616181a882466549156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmd;J7h*4{EXglQ&X8g=)H5{FGqjq`$mP!^l%JPZVPzGRno^pa>YJLF7jGcMXeh;l zETF`N;AwGlu_RWc7CSI5U}V?g=iDNy1!=hC+N?JU|H!s06bUlK?LOLAWW! diff --git a/tmva/sofie/test/input_models/ReduceMean_kFirst.onnx b/tmva/sofie/test/input_models/ReduceMean_kFirst.onnx deleted file mode 100644 index 7d5e7bad145f69eed0f9ccb98e13e65bc4d00262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmdv<5^o^HXeh;l zETF`N;AwGlu_RWc7CSI5U}V?g=iDNy1!=hC+N?JU|H!s06bUlK?LOV@xU) diff --git a/tmva/sofie/test/input_models/ReduceSum.onnx b/tmva/sofie/test/input_models/ReduceSum.onnx deleted file mode 100644 index c5ded0381b03e20e7ed17d6d20ce0fbdae6aa78a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmdk}0qq3Zt;FnGnj^#oHp#sxu^=N#8s;h?E&&ckAs#L!4n`nm0%GPQ87`}l^}|t zdbH#?m;~6JpgOz+7|?*03|Jm)l9vE8RF(@$!(>4=AoMcAWM#p6AvSvnz=UCRlsM3> iLPA^u9E?IdTudAyK+FZitVuwLN+bzpn1mCPfG_|T#vvmB diff --git a/tmva/sofie/test/input_models/Slice_Default_Axis.onnx b/tmva/sofie/test/input_models/Slice_Default_Axis.onnx deleted file mode 100644 index d159e75eb456108f30d170d3282208cd5ac1627a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmdw7 diff --git a/tmva/sofie/test/input_models/Slice_Neg.onnx b/tmva/sofie/test/input_models/Slice_Neg.onnx deleted file mode 100644 index d4bd677deaa1ea7956acd4e407b6ce40e7757ac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmd} zl~} - -XY"SqrtSqrtZ -X -  - -b -Y -  - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Sub.onnx b/tmva/sofie/test/input_models/Sub.onnx deleted file mode 100644 index 3b86b93723c14..0000000000000 --- a/tmva/sofie/test/input_models/Sub.onnx +++ /dev/null @@ -1,16 +0,0 @@ -pytorch1.11.0:� -) - onnx::Sub_0 - onnx::Sub_12Sub_0"Subtorch-jit-exportZ - onnx::Sub_0 - - -Z - onnx::Sub_1 - - -b -2 - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/SumMultidirectionalBroadcast.onnx b/tmva/sofie/test/input_models/SumMultidirectionalBroadcast.onnx deleted file mode 100644 index 77383b8ecc8d278a3a1a2685d273cbf1ea73dfad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmYj{Ar62r5Cqw_A(y2ga0oolz|lSd)k+iw$^SVFLF|f|5m`@;#6~0{E6U>c`_lL7 mWL$ejfeM{?8|rMODhGqnfcu2i`B%e4I69(e%V2er+%P_`5DFjw diff --git a/tmva/sofie/test/input_models/Swish.onnx b/tmva/sofie/test/input_models/Swish.onnx deleted file mode 100644 index c2eff9dfdd845221ab3082b739d26b8011687a83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmd$N*E^1#l^wFD8$0W#KD#%!Ua_< Nge2<3!o?sU0RUj(5k&w1 diff --git a/tmva/sofie/test/input_models/Tanh.onnx b/tmva/sofie/test/input_models/Tanh.onnx deleted file mode 100644 index d4ef42058a120..0000000000000 --- a/tmva/sofie/test/input_models/Tanh.onnx +++ /dev/null @@ -1,11 +0,0 @@ -pytorch1.11.0:` - - onnx::Tanh_01Tanh_0"Tanhtorch-jit-exportZ - onnx::Tanh_0 - - -b -1 - - -B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/Tile5D.onnx b/tmva/sofie/test/input_models/Tile5D.onnx deleted file mode 100644 index 0c60fbce1d67c..0000000000000 --- a/tmva/sofie/test/input_models/Tile5D.onnx +++ /dev/null @@ -1,20 +0,0 @@ - - -tile-model:� - -input -repeatsoutput"Tile TileGraph*:BrepeatsZ# -input - - - - - -b$ -output - - - - - - B \ No newline at end of file diff --git a/tmva/sofie/test/input_models/TopK.onnx b/tmva/sofie/test/input_models/TopK.onnx deleted file mode 100644 index 1e6081e68ba3db6d48ac9480aeb838df88da012d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmZvVKM#U16vQo|QeOPqIFOEv3_?^EMvaTEPA;S>L5;QqiqUVw7d0vvG$!8glKb7| z9U;_6Zc3)xJ;S5nc<2Rp1anH=nG~7gLWMF{Nv=YVnIC48I&~P}3qR$N(;=v5EC_DA zRUjRX(2_!2gJ30-W$3}5rxZ;n@)>r^imjK|8Gz2Ohs=7^LIu*C4j3n%#!;rM%D17J t$y7zV%2GJ input = {0.16892381, -0.92159724, 0.64389044, 1.8697567, -0.8018371, -1.2693683, -2.093365, 1.8541908, -0.26340157, 0.9572909, 0.34671152, -1.7053558, -0.36417124, -2.3248599, -0.13200487, 2.3006496, 0.46386284, -2.1614797, -1.3742889, -0.40108228, -0.5511143, 0.35275838, -0.70952916, -0.41565117, 0.15577549, -0.8660324, -0.31523043, -1.43095, -0.62599516, -1.2735285, 0.74245137, 0.5401528, 1.2080778, 1.9445739, 0.5149316, 0.5683389, 1.6830992, -1.5869702, -0.9276118, -1.8208988, -0.52550256, 0.082054906, -1.0242202, 0.640871, -0.50823563, -0.13035983, -0.7713898, -1.1191769, 0.59570795, -0.06568418, -1.1858853, -0.085937336, 1.0237325, 0.32681447, -1.3751194, -0.28284678, -2.5314686, -0.36053106, 1.3408105, 0.46642232, -0.7184956, -0.5716407, -0.29177785, -0.29941186, -0.08443816, 0.054849386, -0.582217, 0.5512954, -1.2351213, 1.0514443, 0.2601373, 0.2979866, 1.1088992, -0.41123372, 1.2637646, 0.18790472, -0.16448955, -0.61922485, 0.72030956, -1.8054826, 2.739959, 1.515231, -1.1871477, -0.72046477, -0.49725538, -0.3599622, -2.4750538, -0.11285576, -1.1877617, -0.28629062, -0.5285716, 1.9786791, 2.2289317, -1.2789943, 1.3801973, -1.2113228, 0.16036053, -0.4714372, -1.1011868, 1.4348198, -0.15923952, 1.4626329, -0.7119883, 0.7440471, -1.8418623, 0.2772118, -1.2898343, 0.8006727, -0.47921824, 0.35204977, -0.23730946, -0.9184093, -0.44745374, 1.7422614, -1.2565724, 2.1967077, 0.31261623, -0.89821947, 1.8867549, 0.45231855, 0.8269342, 0.032707807, 0.025322068, 1.1288303, -1.4889454, 1.3964689, -1.5560274, -2.1302202, 0.7437271, 1.5007018, -1.3589836, -0.955504, 0.32147405, -1.4642475, -0.12817268, -0.030474393, 1.7738372, -0.38548046, -1.0957392, 1.3144948, 0.2697103, 1.8592813, 0.4777307, -0.6822411, 1.0501494, -0.87983644, -1.7267572, -0.3565207, -1.1379921, 0.7837413, 0.43398347, -0.30728853, -0.00026109006, -2.0815682, -1.1233135, 1.200373, 1.1735791, 0.80191934, -0.40204743, 0.60110134, 1.0514777, 0.71647906, 1.6119534, -0.7692411, -0.13165821, 1.076266, -0.58777434, 2.1273491, 0.5979284, -0.74737847, -0.16932407, -2.6000056, -0.18568534, -1.7186687, 0.38444906, -1.2328393, -1.166593, -0.749837, 0.6540508, -0.48843417, 0.105534576, -0.19924901, 0.39926815, 0.5520011, 0.78686863, -0.88527286, -0.39068756, 0.800181, 1.0539882, 0.82253766, -0.29349077, -0.95323867, -0.7239985, 0.4156427, 0.054603174, 0.46671128, 0.12290481, -0.9419718, -0.9518065, 0.6800318, 0.7334219, -1.4501665, 0.72601205, -0.009272683, -1.5702912, 2.6023812, -2.550537, 0.41290838, -0.0004515256, 0.7949585, 0.10386975, 1.9759881, -0.88904214, -0.20765586, 0.15403232, 0.090678096, -0.20895411, 0.9813557, 1.4583536, 0.08779892, 1.2651963, 0.34579468, 0.70687234, -1.1209601, 1.0646888, 0.20993355, 0.8882366, -0.4729274, -0.84709066, 0.2017297, -1.216628, 0.13039826, -0.61262065, 1.6169266, -0.1344048, -0.62242454, -0.6336179, 0.39012757, -0.826561, 0.008478365, 1.0602465, -1.0957131, -1.5973436, 1.2533009, 1.632353, -1.3100505, 0.51999503, -0.93459845, -1.1390812, 1.7102306, 0.08346745, 1.533848, -0.14334835, -1.1145127, -0.3083682, 0.08911435, 0.8270216, 0.66675997, -1.434103, 0.055906765, 0.18895805, -0.12091928, -0.07631843, -1.1277905, 0.56415355, -0.42068058, -0.43619972, -0.33488145, 0.46014947, 0.060450263, 0.6036779, 2.9487398, 0.14211768, -1.0608279, -0.5405822, 0.6854363, 0.051226616, -0.006617631, 0.27221313, 0.8168545, -1.4345047, 0.15883587, -1.0407009, -1.0776329, -1.4761366, 0.5077002, -0.18065284, -1.3203033, 1.2343279, 1.0788544, 0.95910555, -0.45996368, -1.1551211, -1.0516672, 0.75456, 0.5729106, 2.0468712, 0.95701927, -0.39028248, 0.7682253, -0.32310373, -0.25830054, 0.79827476, 0.64777404, -0.7693852, 0.13818592, -0.21603993, -0.13035135, 0.36271432, -1.3548849, 0.631066, -0.35979733, 2.012173, 0.5632781, -1.5559843, -1.0903429, -1.7130791, 0.6116188, -0.08399546, -0.28317407, 1.5286123, 0.34003162, 0.13574599, 1.8278462, 0.68333685, 1.5154774, 1.0113451, 2.3652873, -0.48571086, 0.16396068, 0.7627067, 0.64387697, 1.0480355, -1.8542932, 0.3824617, 0.2613266, -0.99953574, -0.51782006, -0.6157211, 1.3795184, 0.7554518, 0.95089144, -0.4212272, -1.2846807, -1.3833915, 0.4969849, 0.43599954, 0.83426636, -0.24071422, -0.41247413, 0.1387651, -0.4410387, -1.0201113, -1.0151287, -0.30920383, -0.8524633, -0.78186303, 1.4333282, -0.14950007, -0.089015275, -0.08387725, 1.1056882, -0.1740884, -1.9291706, 0.38982868, 0.6995906, 1.4180859, 0.75444674, -0.95499, 1.1255932, 0.84249365, 0.3965257, -0.91656125, 0.30407417, 0.04821479, -1.7198461, 0.2624329, -0.4283524, -1.4282044, -0.06547159, 0.80487037, 1.1919813, -1.157512, 0.82863224, -0.42936045, -0.28821445, 1.4708856, -1.4182036, 1.0695099, -0.98250604, -0.2871269, -0.30628875, 1.0268122, 0.1077968, 0.3942135, 2.5741844, -0.22341488, -1.2882922, -0.92537004, -0.29827946, -0.8657189, -1.3523725, 1.2271954, -0.97767305, -1.5279788, -2.1684647, -0.8809741, -1.7020837, -0.77671313, -0.30759412, 0.95844865, 0.1201042, -0.35956126, -0.6732596, -0.66489315, -0.23282625, -2.199095, 0.015637554, 0.9093451, 0.6256771, -1.0440992, -1.2953913, -1.1988038, 0.57272595, 1.3343319, 1.5685514, 0.79896367, -0.33781642, 0.108379155, 0.69055647, -0.17776953, 1.1198257, 1.4672221, -0.25398532, -0.1565034, 1.6918836, -0.8700688, -1.1308992, -1.1974417, -1.1137329, 0.83902305, -0.21537443, -0.3621372, -0.56612146, -0.23607141, 0.06558742, 1.5528702, 0.6764845, -0.9899203, -0.24187809, -0.43976098, -0.17901607, 0.39272916, 0.6076459, -0.7449423, -1.1412064, -0.600098, 0.1454072, 0.68503654, 0.5873987, 0.7652769, 0.912399, -0.58995295, -0.07652284, -0.5957174, 0.1472433, 0.5542278, -1.115277, 0.44539738, -0.039799254, -1.5118825, -0.23560798, 1.2844542, -0.02893157, -1.1343006, -0.3527552, -0.9586529, 0.7139522, -1.7368245, 0.2557312, -0.70883536, -0.41837376, -1.4177307, -1.2666334, 0.59642404, -1.461725, 0.029051205, 1.4515164, 1.2521093, 1.2121066, -0.46119824, -0.42757216, 0.21424922, 0.34615174, -0.4361925, 0.90037245, -0.8620516, 0.37771982, 1.0740494, -0.35472628, -1.7184305, -0.10192693, -0.49839312, -1.2606971, 0.898541, 1.611125, -1.8196648, 1.1042156, -0.90353936, -0.042169813, 0.88219213, -1.8153738, 1.0310693, -1.8895094, -0.3627731, 0.73769325, -0.29475728, 0.20184469, -1.0428863, 0.60270995, 1.2704183, -0.061668225, -0.29045984, -0.1823551, 0.26992062, 0.55780077, 0.03529894, -0.7468571, 0.9940811, -0.61718744, -0.8993642, -0.4772598, 0.58771855, -0.8835732, -1.031474, -0.7897231, 0.99002546, -1.3488675, -0.08344488, -1.6553906, -0.49131376, 0.046392173, -0.5849192, -0.93096536, 0.34290412, 0.056457043, 1.3271558, 0.16145127, -1.6025941, 0.8305644, 0.015047411, -0.7772031, 2.4478736, 1.360108, 0.9110892, 1.506102, -0.45487866, -0.060103003, -0.15757999, -0.3803988, 1.4101455, -0.30708334, 1.0538982, -0.8294986, 0.047576066, -1.3256047, 0.45925236, 1.080683, -0.40040824, 1.111924, 0.5593369, -1.3896682, 1.9023105, 0.39116186, -1.1850232, -2.5139296, 1.7266207, -0.25787568, 0.8259598, 0.18016069, -0.49573916, -0.04785415, -0.04976653, 0.18465424, 0.7601481, 0.11443199, 1.3491508, 1.0334013, 0.51608413, -0.54822063, 1.0440209, 0.95839494, 0.35903192, 1.0515867, -0.69485205, 0.1259807, 0.5945902, 0.93981904, 0.8042134, 0.15225424, -1.1134514, -0.14319238, -0.3946564, 1.5849768, 0.32735464, -1.6741558, -1.2463093, -0.53212994, -0.5394611, 0.96027434, -0.03620187, -1.0707031, 0.0770781, 0.73527884, -0.2964921, -0.9622408, 2.6329126, 0.3759397, -0.6592005, 1.1139793, -0.14716254, -0.045174014, -0.6791271, 0.03255666, -1.0424751, 0.9587916, -0.08317592, 0.31456205, 0.1654861, 0.7260626, -0.58481413, 2.1518521, -0.09424311, -0.341701, -1.6353136, -0.17042917, 0.40579286, -0.019979922, -1.0232186, -0.35566926, 1.1416146, 1.2195485, 2.077471, -0.43837976, -0.540069, 0.7379818, -0.19262947, -1.4484813, 0.83212805, -0.74113214, -0.9538223, -0.05834837, 0.44041303, -0.745651, -0.17320694, 0.49808195, -1.5061892, -1.4944872, 0.8008681, -0.9398744, -0.6182817, -0.30942512, 0.36129692, -2.318599, 0.54687035, 0.56182396, -0.06872349, -1.4240448, -0.9996982, 2.5200498, -2.1654541, 0.47496814, 0.39391482, 0.1450314, 1.4216573, -0.04379695, 0.26455754, -1.5143254, -0.85161084, 1.3674622, 0.070562564, -0.07321006, 0.29007795, -1.1730325, 0.7077345, 0.17599413, -1.507193, 0.033037208, 0.6345246, -0.026505666, -1.3673415, -1.175768, -1.11894, -1.1722083, 0.650109, 0.32472748, 0.77097934, -0.91142863, -1.6627023, 0.23963581, -0.34835646, 1.4858739, -0.17808837, -1.4222599, 0.42851982, 0.91185176, -3.1663878, -1.9458324, 0.17138235, 2.7273235, 0.48435047, 1.4257667, -0.39429623, -0.25928524, -0.6969385, 0.27237153, 0.9719653, -0.94499624, -0.93431616, 0.3313879, 0.5322593, -1.0736529, 1.0660676, -0.3857444, 0.24826482, 1.3510975, -0.29179078, -0.48444024, 0.754738, 0.0317517, 0.88101363, -1.43013, 0.19301237, 0.62407196, 2.5889156, -0.35503194, -1.3965347, 1.492098, 1.0243834, 0.2891013, 0.7667233, 1.203408, -0.3896164, 1.1657643, 2.0440407, -0.03122957, -0.44319737, -0.11672504, -0.41915283, 1.3281194, 0.685727, 0.75879604, -0.073904574, -0.33132726, 1.257834, -0.45057672, -0.6296975, -0.9192257, 1.0221746, 0.9291648, -0.94363177, 1.5092527, 0.34648833, -1.2825301, -1.0486758, 1.5055352, 1.8865529, -0.6334556, -0.024593918, -1.1252753, 0.5185867, 0.6124192, -0.037293382, -1.1181691, -2.355505, 0.63034916, -1.0368301, 0.036144637, -1.3204461, -0.8474016, -0.48407465, 0.87706107, -1.6368544, -0.59363234, -0.27536315, -1.3947005, 0.6367079, 0.080906734, 1.6612034, -1.1942811, -1.3962767, -0.3492455, -0.3317619, 0.8585051, -0.6099857, 0.9731934, -0.33863986, -1.1859555, 2.1923492, -0.20945679, -0.019335553, -0.43917775, 0.17868017, 0.0638598, 0.6821277, -0.52001894, 0.29006997, 1.3569279, 0.04126053, -0.3513845, 1.2705727, 0.61468333, -0.51229066, -0.943082, 0.123694554, 0.08704179, -0.85914665, -1.2665237, 0.120996974, 0.5872544, -0.6498738, -0.7558008, 2.0874078, -1.0826503, 1.2161089, -1.1158899, -0.6995301, 1.5182605, 0.9212444, 0.19732377, -0.49805963, 1.5307648, -0.09824258, -0.17579414, 0.3059942, 0.29013804, 1.6369693, 0.68866324, -0.41122213, 1.6944041, 0.84453344, 0.3998347, -0.632812, 0.09177586, -0.7140142, -0.25561154, 0.6781396, 1.4335965, -0.92604005, 0.47844896, -0.48447236, -0.26535156, 0.5610667, -1.5414823, -1.1018133, 0.45464283, 0.8867224, 0.46265063, 0.13983822, 0.62714416, -0.47083634, -0.582377, -0.95651495, 1.4113004, -1.5234841, -0.54477, 1.0616144, 0.86381114, 0.03474352, 0.8896466, -0.76275426, -0.52808905, 1.6884556, 1.2545907, -0.44361708, 0.049262527, 1.7879602, -0.48884976, 0.62784165, 2.0904067, 0.6360781, -0.24506103, 1.8339422, -0.24874923, 0.31993455, 1.6265831, -0.5266883, 1.8444152, 1.0903536, -0.18320195, -0.67846495, 0.27813777, -1.0786334, 0.36553434, 0.18099804, -0.4765761, -0.47241208, -1.6986724, 0.3840502, 1.0583769, 0.9158794, -0.36690733, 1.0359205, 1.5035034, -1.8313702, 1.0422257, -0.0002647597, 1.6137222, -0.8129771, 1.7378803, 1.3767345, -3.097059, -0.23142079, -0.49518618, 0.07198295, -0.47360966, -0.14493094, -0.903153, -0.8566985, 0.35070956, 0.07519327, -0.8176252, -0.5011129, -2.0338905, 2.0791926, -0.9524556, -0.35013407, 0.69216543, 1.8425413, -0.7101777, 0.9166597, 1.373442, 0.8864508, -0.69209445, 0.722764, 1.6853193, 0.43362904, 0.15304323, 1.2292317, 0.571318, -0.03697805, 1.0155749, 0.017713238, 0.61617565, 0.6086641, 0.17308934, -1.0802362, -1.0679781, -0.17226323, -1.079547, 0.36464852, 2.0566635, -1.5955839, -0.708551, 1.0764654, 1.3606769, -2.1782458, 0.12521815, -1.4049494, -1.893154, -0.9671274, 0.20998928, -0.39094374, 0.41292644, 1.0094323, 0.7236309, 0.729022, -0.093239464, 1.331729, 0.12037584, -0.91795444, -2.681229, -0.06648174, 0.32202816, 0.25560144, -1.2391394, -0.5821641, -0.92049783, 0.08570945, -0.024655689, -1.1845642, 1.3647254, 0.90066713, -0.7882246, 0.11265421, -1.1675286, -1.4266101, 0.07994837, 0.22534218, -0.13602129, -0.37254322, -2.8944714, -0.091046974, -0.15506679, 0.5082102, -1.5789851, -0.2162176, -0.51339483, 0.5204938, 0.11788538}; - float output[] = {0.16892381, -0.92159724, 0.64389044, 1.8697567, -0.8018371, -1.2693683, -2.093365, 1.8541908, -0.26340157, 0.9572909, 0.34671152, -1.7053558, -0.36417124, -2.3248599, -0.13200487, 2.3006496, 0.46386284, -2.1614797, -1.3742889, -0.40108228, -0.5511143, 0.35275838, -0.70952916, -0.41565117, 0.15577549, -0.8660324, -0.31523043, -1.43095, -0.62599516, -1.2735285, 0.74245137, 0.5401528, 1.2080778, 1.9445739, 0.5149316, 0.5683389, 1.6830992, -1.5869702, -0.9276118, -1.8208988, -0.52550256, 0.082054906, -1.0242202, 0.640871, -0.50823563, -0.13035983, -0.7713898, -1.1191769, 0.59570795, -0.06568418, -1.1858853, -0.085937336, 1.0237325, 0.32681447, -1.3751194, -0.28284678, -2.5314686, -0.36053106, 1.3408105, 0.46642232, -0.7184956, -0.5716407, -0.29177785, -0.29941186, -0.08443816, 0.054849386, -0.582217, 0.5512954, -1.2351213, 1.0514443, 0.2601373, 0.2979866, 1.1088992, -0.41123372, 1.2637646, 0.18790472, -0.16448955, -0.61922485, 0.72030956, -1.8054826, 2.739959, 1.515231, -1.1871477, -0.72046477, -0.49725538, -0.3599622, -2.4750538, -0.11285576, -1.1877617, -0.28629062, -0.5285716, 1.9786791, 2.2289317, -1.2789943, 1.3801973, -1.2113228, 0.16036053, -0.4714372, -1.1011868, 1.4348198, -0.15923952, 1.4626329, -0.7119883, 0.7440471, -1.8418623, 0.2772118, -1.2898343, 0.8006727, -0.47921824, 0.35204977, -0.23730946, -0.9184093, -0.44745374, 1.7422614, -1.2565724, 2.1967077, 0.31261623, -0.89821947, 1.8867549, 0.45231855, 0.8269342, 0.032707807, 0.025322068, 1.1288303, -1.4889454, 1.3964689, -1.5560274, -2.1302202, 0.7437271, 1.5007018, -1.3589836, -0.955504, 0.32147405, -1.4642475, -0.12817268, -0.030474393, 1.7738372, -0.38548046, -1.0957392, 1.3144948, 0.2697103, 1.8592813, 0.4777307, -0.6822411, 1.0501494, -0.87983644, -1.7267572, -0.3565207, -1.1379921, 0.7837413}; -} diff --git a/tmva/sofie/test/input_models/references/Slice_Default_Axis.ref.hxx b/tmva/sofie/test/input_models/references/Slice_Default_Axis.ref.hxx deleted file mode 100644 index 09fe065ea53f5..0000000000000 --- a/tmva/sofie/test/input_models/references/Slice_Default_Axis.ref.hxx +++ /dev/null @@ -1,4 +0,0 @@ -namespace Slice_Default_Axis { - std::vector input = {-0.1461883, -0.016122868, 0.7906066, 1.0770687, 0.8330815, -0.10727052, -1.1016161, -0.6145062, -0.7690668, -1.0544336, -0.58136266, 0.6698605, 0.7147375, 0.0022958783, 0.51871574, 0.6482896, 0.3113063, -0.4734845, -0.5740597, -0.9168964, -0.41645914, -0.49598876, 0.09797197, -1.143795, -0.4667988, -0.63560325, -0.09921953, -0.6377913, -1.9445546, 0.28251606, -1.837604, -0.11723251, -0.2457299, -0.14956762, 0.24271688, 0.2885258, -0.41624215, -0.07236863, -0.88772, -0.22259605, -2.3600693, -0.6008399, -0.9242371, -0.7604781, 0.18364549, -1.8932725, -0.3934923, 0.9908918, -0.82707083, 0.037394904, 0.48888022, 0.35733646, -0.69646317, 0.14467147, 2.0875776, -2.1810489, -0.2571033, -0.55144024, 0.2959311, -0.19067906, -0.75172126, -1.2874966, -1.0975883, -0.9559576, -0.49447343, 1.9475956, 0.4257172, -1.0980548, -0.76810384, 0.58064747, -1.7632297, 0.26826766, 1.3453583, 1.2687472, -1.1958207, -0.16609953, -1.5563438, -0.4938013, 0.5151148, -0.091698416, 1.1415159, 0.426471, 0.6566607, 1.1295458, -0.28391364, 0.79970664, -1.5118104, 0.36721396, 1.7975253, -0.73840666, 0.4420629, -2.2546258, -0.061347473, -1.2929934, 0.5170257, -0.06677258, -0.48366687, -0.6352214, 0.3780832, 0.03586758, 0.3670747, 0.6627743, 0.5272325, -1.0584992, -1.4143002, 0.47498345, -0.8205925, -1.8733176, 1.8025477, 0.06656069, -0.7836851, 0.47841695, -1.2978657, -0.006346132, 0.51665795, -1.4770932, 1.0194303, -0.30320534, -1.2961298, -1.9114046, 1.0950881, -0.10367981, 0.23185624, -1.3055613, -0.5437395, 1.1283166, -1.3763173, 0.07796734, 0.14537609, -0.4749371, 0.6209849, 0.19354947, 0.7213671, 1.3833684, -0.15803675, 0.0047794804, -0.22178061, 1.9866813, 1.2574888, 1.8167769, -0.020589387, -1.9657744, 0.17520925, -1.238028, 0.18338954, 0.7720395, 0.28465885, -0.46973786, 0.09582084, 1.6777899, 0.16898789, 0.37088445, -1.0338578, -0.0052072485, -0.57036436, -1.1178404, 0.6796968, 1.6614155, 1.1149341, 0.7587031, 0.32500324, 0.8289195, -1.1860889, 0.552775, -1.5618576, 1.1355617, -0.019234084, -0.053850766, -0.21276851, 0.38202664, -0.92719686, 0.45522645, -1.4462421, 0.39298248, -0.08499029, -0.4432199, 0.7962805, 0.035947476, -1.159359, -0.60213226, 0.6608978, 0.25666326, -1.6058868, -0.14197825, 0.81879604, 0.06913617, -0.68283623, -0.6830012, 0.9924173, 0.738249, 1.4709839, -0.5562903, -0.45345142, 0.44788426, 1.3294722, -0.2009495, -0.47743958, 0.30325928, 0.28618523, -0.44166443, -1.2473358, 0.24071434, -0.07651104, 0.13556144, 0.6775791, 0.05754586, -0.37290746, 0.9709312, 0.40250617, 0.57110745, -0.4984228, 1.7988355, -0.16423433, -0.6757791, 0.6791431, 1.0340523, 1.9974663, -1.1417656, 0.15521769, -1.6735531, 1.2924621, -1.7712533, 0.31316996, -1.1286432, -0.16561612, 1.4077295, 1.7806652, 1.6394432, -0.26378694, 0.083979696, 1.0437967, -0.1325788, -0.09308595, -2.7445931, -0.9295771, -0.13040234, 0.39286298, -0.23240566, -0.15136135, -1.1185503, 1.5185101, -1.2777773, -1.0749928, -0.69080085, 0.039009497, 1.4085402, -0.45465285, 0.29640433, 2.3633902, 0.38267857, 0.0032249314, 1.0855026, -0.64048296, 0.124470204, 0.017325122, 0.695519, -1.0086539, -1.0865158, -1.5793724, -1.1726278, 1.1974345, -0.6120161, 1.3437238, 1.7283806, -1.3011041, -0.166229, 1.9684845, -1.2849504, -0.017190017, 0.5633989, -2.1813452, 0.19855276, 0.15585509, -0.2397429, -0.07259906, -0.18117818, -1.435192, 0.5535545, 0.91788614, 0.9611421, 0.27218357, -0.8193188, -1.6022354, 1.4913019, 0.07563583, 1.191209, 1.1098686, 1.4217767, -0.062174533, -1.0004618, 0.35559297, -0.29587275, 1.224246, 0.27928728, 1.4012953, 0.004571245, -0.004811227, 0.6884962, -0.31340042, 0.7118886, 0.8218903, -0.6128678, -0.49580857, 0.52445906, -0.15825763, 1.093557, 0.5337642, 0.9011482, -0.85576683, 0.345507, -0.10933566, 0.21388091, -0.7470893, 1.115657, -1.0193942, 1.3795731, 0.16783884, 0.4803627, 1.2138109, 1.762632, -0.55953956, 2.3835013, -0.07254272, 1.2885357, 0.6622172, -1.0122503, -1.8009477, 1.5157818, 0.8476051, 0.13299866, -2.3853347, -0.06983959, 0.49273565, -0.87671894, 0.12512384, -0.82879865, -0.9572407, -0.32495856, 0.06101727, -1.1533537, 0.020594995, -0.9918277, -0.81584674, 1.5852944, -0.5340633, -0.40271887, -0.3721054, -0.005816021, 0.6088237, -1.0743963, 0.88497263, -0.37899604, 0.50920826, -0.88503253, -0.673719, -0.92704546, -0.9064568, -0.5845781, -0.2365786, -0.97428477, -2.083304, -0.22934851, -0.5516302, -0.69631237, 0.36876953, 2.0252135, 0.74653697, 0.5618036, -0.44255832, -0.67436403, -1.0235599, 0.789049, -0.12523027, -2.2393558, 0.14112401, 1.3160639, 0.5901369, -0.008300025, 0.04022059, -0.6193368, 2.676356, 0.73500293, 0.8828043, 1.7149053, -1.2272266, -0.38595983, 0.9880927, 0.28173974, 0.09567761, -0.99841386, 0.55506814, 0.04364348, 3.0956612, -0.39753824, 0.6281927, -0.24912265, 1.2875627, -0.33991942, 0.080732696, 0.6423637, -0.4085811, -1.2270579, 0.27428335, -1.2284294, -1.7676984, -0.9863669, -0.60794735, 0.35996225, -0.83115405, -0.10226897, -1.1846787, -0.9867668, 0.09014541, -0.46956572, 2.334743, 1.1283133, 0.47274005, 0.7801183, 0.20632647, 0.53270394, 1.618369, -0.68861, 1.5393575, 1.0087231, 0.5578767, -1.1502749, 0.9704601, -0.58556443, -0.8638071, 1.6273997, -0.6914098, -1.1505114, 0.22683571, -0.3346126, -0.2779381, 0.44256505, -2.2296052, -1.1183658, -0.25026667, 1.5899142, -0.9656592, -0.52585506, -2.2984645, -0.913809, 0.809646, 1.3930463, 1.5980829, 0.5588279, -0.1415989, -1.0977601, 1.0027899, -0.8581, -1.4768612, -1.6114205, 0.55412006, 0.5285257, 0.07860353, 0.8938196, 1.3999463, 1.6992323, -0.88001025, -0.14953178, 2.8698957, 0.6424969, -0.41471675, -1.9350584, 1.3093637, -0.34622955, 0.35268912, -0.7348358, -0.1637814, -1.217533, 1.7498442, -1.3902655, 0.9558796, 2.215649, 0.4073312, -0.24630588, -0.4336063, -2.1483955, -0.9822753, -0.24802127, -1.9440368, -0.14923008, -0.106288746, 1.3390882, 0.29155636, -0.010580624, -1.6630732, 0.21212313, -0.9744938, -0.93469507, 1.5370817, 0.9331293, -0.6155238, 0.77781016, -1.360782, -0.02083951, 1.6073259, 0.8050398, 1.15108, -1.0778083, -0.29364675, -1.3154548, 1.3826702, 0.83120215, 0.3349555, 0.108244404, 0.0056229704, -1.2478333, -0.30873495, -0.15155567, 0.5545185, -0.17677861, 0.35164872, 0.20997967, 1.397111, -0.56422126, -1.5136795, -1.032756, -0.59829795, -0.392903, -2.4636624, 0.25544158, -0.59832823, -0.7234389, -0.6978005, -0.8573432, 0.12969226, 0.5464562, -0.16188233, 1.380535, -1.0571035, 0.51674634, -1.4579222, 1.5115775, -1.0869778, -0.13404822, -0.5940917, 1.2037292, -0.32398605, -0.29220906, 1.0000731, -0.63900346, 0.24358685, 0.65689164, -0.10265587, 0.6322214, -0.0917442, -0.3694211, 0.93206906, 0.45265195, -0.87861097, 1.6871637, -1.2518704, -2.3056078, 0.9769796, 0.038062252, -0.46498087, 0.8485326, -0.839546, 0.28043613, 2.573216, -0.29004475, 0.31579295, 0.7601751, -0.8611639, -1.9155579, -0.14570755, -0.4572656, -1.6403922, 1.269364, -1.2096163, -0.13851365, 1.0688369, -0.043349892, 0.97961247, -0.29044124, 1.324035, 0.4427559, -2.4195874, -0.05904026, -1.047782, 0.34742212, -0.59459364, 2.2101438, -0.6710455, -0.7346976, -0.19578286, -0.3006533, -0.4168783, 0.11194632, 0.4166033, 0.73106396, 1.5515249, -2.4722917, -0.7615553, 0.775932, 0.40671185, 0.92429924, 1.0650808, -1.5915896, 0.23377, -1.4564233, -0.5552662, 0.7849949, -0.052568533, 0.2778592, 1.3305982, -0.9056904, -1.0874093, 0.6774261, -1.4075345, -0.6792449, -1.9145862, -0.36068064, 0.9614725, 0.7049456, 0.85817826, 1.516153, 1.0643967, 1.2125771, 1.0095186, 0.18826225, 0.17524572, 0.9800971, -0.05518548, 0.76132685, -1.1523248, 0.95912564, -0.8287138, -0.230913, -1.9400084, -0.9241041, -0.4996432, -0.20880367, -0.58793384, 2.5016222, -0.5362384, 0.6342494, -1.6295053, 1.1614339, 0.3722488, -0.9641267, -0.4324223, 0.5987431, -0.09008133, -0.72262436, 0.34580615, 0.54369086, -0.04141991, 0.5681258, -0.024746062, -0.22176632, 1.6875525, -0.8856508, -0.5093772, 0.16131109, 0.13457753, -0.5028758, 0.48031703, 0.34559208, 0.40866286, -0.8627139, -0.43610817, 0.1370359, 0.71395236, 1.0733443, 0.9591038, -1.2339122, 0.51710594, 1.6181912, -1.1786822, -0.49682978, -0.73324996, -0.90021396, -0.917064, -0.82882273, 0.54618657, -0.35091722, 0.18635193, 0.28404334, 0.7419349, 0.22317982, 1.5418407, -0.59588146, -2.2045953, 0.5704977, -1.3579642, 0.6766229, -0.7265069, 1.1195977, -0.05751021, -0.88166755, 1.6513765, 0.83279973, -0.7335223, 0.77010125, 0.106006265, -0.50255, 0.500598, -0.8823614, -0.8286727, -0.7444291, -2.1645043, 0.15058456, 2.1300547, 1.3322825, 0.08238974, 0.47212347, 0.0971547, 0.34920275, 1.14977, 0.2660158, 0.14294139, -0.1682589, -0.2658644, -1.1637232, -0.8218067, 0.9199889, 1.0239819, -0.70528126, 0.0060127624, -0.24274509, -0.65451324, -0.38401487, 1.2616978, 0.3047205, 0.19565456, 0.9565755, -0.014404449, -0.42572787, -0.27978837, -0.86642414, 0.8405607, -0.15055239, -0.16638431, -1.9672482, -1.9616699, -0.058524407, 0.52005005, 1.6248668, -0.6036527, -1.1067222, 1.4944029, 0.21208148, -0.71202946, 0.08290248, -2.2786183, 0.04106648, -2.1124837, 0.11604868, -0.50486493, -1.7176164, 1.7939253, 0.9316365, 1.0395255, 1.3111675, -0.32554156, 2.610884, 1.0958631, -0.13374676, -0.88248503, -0.47524875, -0.5697381, 2.2536426, 0.57177734, 0.089711525, 0.09203127, -0.31630644, 1.4399436, 0.87644094, -0.9510531, 2.1558537, 0.7398341, -0.7479294, 1.6116168, 2.2608933, 0.6935909, 1.8886098, 1.4206983, 0.6459501, -1.4992285, -0.40028575, -1.397525, 1.4820021, 0.69096315, 1.040845, 0.7248607, -1.5581473, -1.163343, 1.0534998, -0.13074964, -1.3512405, 1.7234086, 3.1778047, -0.7669222, 0.2769623, 0.11744058, 2.13683, 0.21798563, -0.37044996, 0.38857397, -0.8483964, -0.38422018, 0.49951142, 0.028199164, 0.9054906, 1.4535757, 0.92591554, 0.53013515, -0.25900427, 0.5950167, 1.3598921, 0.006420622, 0.1600974, 0.0067178584, 0.16290559, 1.33563, -0.3311576, 0.7935676, -0.36323825, -0.18903373, -2.2316182, 0.28740197, 0.006179229, 0.71337485, 0.8837852, -0.20782436, -2.2476697, -0.5218193, -0.33238944, 0.2537466, -1.370611, -1.7223306, 1.5160371, 0.027803194, -0.32390642, 0.3986786, 1.1172193, 1.558993, -0.6832563, -0.20899004, 0.94750255, -0.38843265, 1.1702619, -0.5910523, 0.67201364, -0.23071921, -0.32311478, -0.29928425, -1.4202323, -1.0467842, -0.33493733, -0.06345067, -0.20013566, -0.5673482, 0.3535591, -0.5701964, -1.132469, 0.44864315, 0.28851375, -0.87927747, -1.0867138, 1.7710389, 0.99955666, 0.04848535, -0.6760312, -1.5226128, 0.17691953, -0.55969036, 1.5326198, -1.1423959, -1.0857098, -0.38307127, -0.108541355, 0.6333991, -0.67143476, -0.7309363, -0.8394637, -2.3495052, 0.4552111, 0.694442, 0.88670564, -0.8066063, -0.9832314, 0.5582432, -1.9541792, -0.44915298, -0.8806987, -2.1678388, -0.40057325, 1.402311, -0.749579, 0.9779166, -0.9725332, 0.93724334, 0.7930738, -0.3815982, 0.52829677, -0.59715456, 0.4632079, 0.09168929, -0.64770544, 1.789374, -0.4414639, 1.5570718, 1.2062063, 0.34104025, -0.34750745, 1.6979355, 1.7266192, 1.1891768, 1.5133071, 0.53370464, 1.5988535, -2.4613225, -1.6933792, -0.8667333, 0.7052899, -1.4491802, -0.015342939, -1.3674146, -1.56072, 0.16171443, -1.5806398, 0.4695208, 0.8821774, 0.5689583, 2.1032276, -0.5122946, -0.050347406, 0.3566521, -1.0292819, 0.8163361, 0.89640504, 0.86676586, -0.13297859, 0.24916588, -1.4969269, -0.118957415, 0.12848116, -0.825286, -0.6712518, 0.039900694, 0.19978356, 0.14676023, 0.74267155, 0.70510364, 0.22815554, -0.21663566, -0.80683714, -1.1868128, 0.9666372, 0.22554556, -0.86386347, -0.31636468, 0.8181482, -0.5027156, -1.053451, 1.7066551, -1.261419, 0.075614035, -0.24103126, -0.0016349248, 0.10319547, 0.9757924, 0.5693857, -1.2953516, 0.915416, 1.1547158, 0.56889296, 1.6462102, -0.6902782, -1.8096964, -1.3979508, 0.98242086, 1.4752377, 0.06406855, 0.20497032, -0.28602636, 1.7617588, -0.1947333, -0.011363344, 0.18868288, 0.8202959, 1.5982426, 0.02868123, 0.1815656, -0.6364113, -0.93385684, -1.7666136, 0.2698049, -1.2644852, -0.35387158, 0.93788034, -0.017734949, 0.74502975, -0.09487202, 0.6416881}; - float output[] = {1.0770687, -0.7690668, 0.0022958783, -0.5740597, -1.143795, -1.9445546, -0.14956762, -0.88772, -0.7604781, -0.82707083, 0.14467147, 0.2959311, -0.9559576, -0.76810384, 1.2687472, 0.5151148, 1.1295458, 1.7975253, -1.2929934, 0.3780832, -1.0584992, 1.8025477, -0.006346132, -1.2961298, -1.3055613, 0.14537609, 1.3833684, 1.2574888, -1.238028, 0.09582084, -0.0052072485, 1.1149341, 0.552775, -0.21276851, 0.39298248, -1.159359, -0.14197825, 0.9924173, 0.44788426, 0.28618523, 0.13556144, 0.40250617, -0.6757791, 0.15521769, -1.1286432, -0.26378694, -2.7445931, -0.15136135, -0.69080085, 2.3633902, 0.124470204, -1.5793724, 1.7283806, -0.017190017, -0.2397429, 0.91788614, 1.4913019, -0.062174533, 0.27928728, -0.31340042, 0.52445906, -0.85576683, 1.115657, 1.2138109, 1.2885357, 0.8476051, -0.87671894, 0.06101727, 1.5852944, 0.6088237, -0.88503253, -0.2365786, -0.69631237, -0.44255832, -2.2393558, 0.04022059, 1.7149053, 0.09567761, -0.39753824, 0.080732696, -1.2284294, -0.83115405, -0.46956572, 0.20632647, 1.0087231, -0.8638071, -0.3346126, -0.25026667, -0.913809, -0.1415989, -1.6114205, 1.3999463, 0.6424969, 0.35268912, -1.3902655, -0.4336063, -0.14923008, -1.6630732, 0.9331293, 1.6073259, -1.3154548, 0.0056229704, -0.17677861, -1.5136795, 0.25544158, 0.12969226, 0.51674634, -0.5940917, -0.63900346, -0.0917442, 1.6871637, -0.46498087, -0.29004475, -0.14570755, -0.13851365, 1.324035, 0.34742212, -0.19578286, 0.73106396, 0.40671185, -1.4564233, 1.3305982, -0.6792449, 0.85817826, 0.18826225, -1.1523248, -0.9241041, -0.5362384, -0.9641267, 0.34580615, -0.22176632, 0.13457753, -0.8627139, 0.9591038, -0.49682978, 0.54618657, 0.22317982, -1.3579642, -0.88166755, 0.106006265, -0.7444291, 0.08238974, 0.2660158, -0.8218067, -0.24274509, 0.19565456, -0.86642414, -1.9616699, -1.1067222, -2.2786183, -1.7176164, -0.32554156, -0.47524875, 0.09203127, 2.1558537, 0.6935909, -0.40028575, 0.7248607, -1.3512405, 0.11744058, -0.8483964, 1.4535757, 1.3598921, 1.33563, -2.2316182, -0.20782436, -1.370611, 0.3986786, 0.94750255, -0.23071921, -0.33493733, -0.5701964, -1.0867138, -1.5226128, -1.0857098, -0.7309363, 0.88670564, -0.44915298, -0.749579, -0.3815982, -0.64770544, 0.34104025, 1.5133071, -0.8667333, -1.56072, 0.5689583, -1.0292819, 0.24916588, -0.6712518, 0.70510364, 0.9666372, -0.5027156, -0.24103126, -1.2953516, -0.6902782, 0.06406855, -0.011363344, 0.1815656, -1.2644852, -0.09487202}; -} \ No newline at end of file diff --git a/tmva/sofie/test/input_models/references/Slice_Default_Steps.ref.hxx b/tmva/sofie/test/input_models/references/Slice_Default_Steps.ref.hxx deleted file mode 100644 index 15b88b5959627..0000000000000 --- a/tmva/sofie/test/input_models/references/Slice_Default_Steps.ref.hxx +++ /dev/null @@ -1,4 +0,0 @@ -namespace Slice_Neg { - std::vector input = {-0.8470076, -0.617558, 0.024568161, -0.54007053, -0.5732189, 1.0910312, 0.51959157, -0.073640585, -0.60885113, -1.8285086, -0.9326965, -0.3021695, 1.066226, 0.8134058, -1.5457271, 1.1948874, -0.04176423, -0.59385985, 0.011908118, 0.095879026, 0.6736443, -0.48068637, 0.11451639, 1.5323228, -0.8184595, -1.4535367, -0.06812811, 0.71712196, 2.4668334, 0.3803238, 1.5602548, -2.1309204, 2.8248832, -1.3176224, -0.6582828, 0.73314184, 1.8034855, -1.6781946, -0.23040803, -1.3201909, -0.24954909, -0.34502414, -0.7355865, -0.41729373, 0.5724887, 0.71088016, 0.8767546, 0.61704224, 0.25664437, 0.5908548, -0.60789496, 1.0349115, 0.46317944, 0.17278059, -0.78425044, -0.11165529, 0.7919961, 0.35827583, -1.9887244, 0.12787221, 1.095776, 0.28236288, 0.48224112, -0.5900752, 0.9498589, 0.5209434, -0.57806545, 1.3280295, -0.6969055, -2.539957, -0.0030387403, 1.871011, 0.13415621, -0.5734313, 0.09759699, -0.29701954, 0.9157297, -0.62670755, 1.2683886, -0.7024728, 0.6662447, 0.46600792, -0.494909, 0.8643152, -1.2757068, 0.8424522, 0.9383413, 0.49222285, 0.11790963, 0.57665557, -0.2206793, -1.2813573, -1.4700212, 1.9633232, 0.5646655, 0.04624529, 0.5216187, -0.8490203, 0.0040446366, 1.6275132, 0.15718703, -1.256212, 1.7298958, -0.4105028, 0.6821366, -0.72149056, -0.27424803, 0.19525297, 0.5027373, -1.0273383, -0.42891493, 0.31214187, 0.3240255, 0.6148003, -1.4785552, 0.79766524, -1.3977971, -1.9163635, -0.4596946, 0.4611778, 0.4615138, 0.57446766, -1.8127673, 1.0151784, 0.79838765, -0.16945624, -0.29454982, -0.22049658, 1.0656692, 1.9895301, -1.6840646, -0.0068151196, 0.29346943, 0.8048959, 0.50557023, -1.8385066, -0.4750251, 0.3583206, 0.41981372, -0.3146262, -0.79544896, 1.6337428, 1.4349604, -1.5252166, -0.91220444, -0.42145732, -1.4244072, -0.44793433, -1.494974, 0.074361734, 0.7527505, 0.6034745, 0.08402507, 1.0259006, -1.1905016, 0.52963644, -0.6864299, -0.15308455, 0.9455237, 1.000834, -1.828627, -0.5953371, 0.61878735, -2.7202675, -0.13529402, -1.1603078, -0.28340778, 1.6124189, 1.48123, -0.032326907, -1.5110354, -0.60052997, -0.98667, -0.026620502, 0.9869495, 0.9609994, 1.8000636, -0.39040756, 0.662662, -0.35303995, -0.10898638, -0.097712174, -0.13256012, -0.30892372, 0.9536066, 1.0131402, -0.21144608, 0.9224201, -1.2749323, 0.12289531, 0.6637511, 0.0252969, -0.058163885, 0.6347488, 0.13144295, 2.8548353, -1.0804298, 1.3999987, 0.18585795, 0.6911652, 0.29648793, 1.6838806, 1.4852757, -0.29899225, -2.699224, 0.22093739, -0.63045704, -2.3597014, -0.9839067, -1.0647969, 0.8293971, -0.7054954, 1.7537973, 0.22664751, -0.1311305, 0.50954145, -1.7052051, -0.42696014, -0.5314228, -0.56175625, 0.6429764, 1.3670748, 0.46155804, -0.7046119, 0.060639046, -0.113631465, 0.17838268, -0.084968045, 0.67876095, 0.6301664, 1.2548337, -0.2446083, -0.092792444, -0.42515463, -1.0051632, -0.5343044, -0.25070238, 1.3654076, -1.1015171, -1.5554606, 0.62512356, 0.36090285, 0.43128428, 0.097997755, -0.3924458, 1.1851805, 0.2851699, -1.9355323, -1.8260921, -0.57449347, 0.27789333, -1.1954387, 0.22248776, -1.6744449, -1.2109405, 1.0672655, 0.95568365, 0.8194465, 0.15550855, 0.3167771, 0.22519737, 1.2998043, -0.31728703, -0.5346176, 0.907684, -1.5638523, -1.1844252, -0.2738023, 0.051613424, 0.2711231, -2.3651042, -0.44602147, -0.44494528, 0.8535133, 0.24942228, -1.0080348, 0.85422933, -0.48436078, -1.3689119, -1.3511016, -0.48757446, -0.032849748, 0.22983012, -0.032983564, -0.71215105, 0.18651846, -2.0692394, -0.57982725, 0.2421949, -0.004737948, -0.90421754, -0.78182286, 0.12858658, -0.30840445, -1.2161031, 0.26198965, -0.39037564, 0.16168776, -0.4814354, 1.2001693, 0.6076416, -0.8430386, -1.486868, -0.18519744, -0.5284652, -0.5890602, -1.3699012, 0.3797034, -0.6210796, 0.34635258, 0.97299594, -0.73827547, 0.06458698, 0.118863635, 0.5199116, 1.0428258, -0.9279422, -0.86735195, -1.1641119, 0.7890661, -0.13334043, 0.965089, -0.38214856, -0.4918111, -0.5547398, 0.42891094, 1.3179172, 1.3215472, 0.6549405, -0.35108355, -0.053067066, 1.0250593, 0.56519455, 0.62243444, 0.94297016, 1.444416, -1.0421168, -1.2815233, 1.5802842, 1.058067, 1.5861386, 0.2678979, 0.611768, -0.9184742, -0.50267774, -0.18283916, -1.0322441, 0.49051848, 0.23566997, -0.42865896, 1.3114626, -0.8547099, -0.7508762, 0.97122836, 0.83569074, -0.8890005, -1.3588058, 0.52090734, 0.6599851, -1.1082011, 0.6431001, 0.20303106, 1.0637558, -1.6201593, -0.340904, 1.4634577, -0.8336172, -0.8939236, 1.6814111, -1.4717578, -0.10118986, -1.2259562, 1.5268134, 0.5433005, 0.22572087, -1.4068099, -0.4178259, 0.58685875, -0.05888392, 2.8919656, 1.6086674, 0.03694556, -1.1663972, 1.8105648, 0.29895756, 1.8874907, -0.7695107, 0.5690569, 0.030703884, 0.751468, 0.6750975, -1.3655664, 1.1141645, 0.7864459, 0.3947739, 0.03917306, 0.05810123, -0.11991168, -1.729456, -1.5321412, 1.1202441, -0.60260165, -0.47422236, -0.8188005, -0.9895167, 1.1552737, 1.0952479, 0.229527, 0.29695028, -1.6278256, -0.34756196, 0.40587282, -0.2820706, -0.7547495, -0.9610026, -1.7018858, -0.3924324, 1.079949, 0.8248382, 0.94413376, -1.1566157, -0.9842801, 1.6253854, -1.1643112, -0.031547185, -1.3878396, 1.7543691, -0.29027265, -0.013875638, -0.6859403, 0.6589252, -1.2933903, 0.1164802, 0.39297175, -0.11103736, 0.337499, 0.45827693, 1.8881621, -2.3753831, -0.53132796, 0.40727693, -0.2953328, -1.1905057, -1.7966558, 0.22342315, -0.9290645, 0.021880161, 0.13581035, 1.1365031, 0.6181001, 0.713041, 1.293023, 1.3513365, -0.6619178, 2.7537708, -0.43479046, 1.5873258, 0.6956605, -1.9825284, 0.4805659, -1.5420442, 0.08287144, 0.5063851, 0.40049914, 0.075521916, 0.046996634, -2.108652, -0.21822332, -1.1524743, 0.36947966, 0.9477517, -1.1086196, -0.88682616, 0.70022494, -0.986827, -0.1266721, 1.0552126, -0.032320406, 0.030530429, 0.3426037, -0.7678068, 1.5853431, -0.29916266, 0.16663021, 0.3103334, 0.5508472, -1.029247, -0.17085668, -1.2482865, 0.4678677, -0.7913232, -0.4546694, -0.3316058, -1.3343717, 0.015012662, 0.15274923, -0.9795487, -0.7544606, -0.5374836, 1.0032166, 1.3695817, 0.4196725, 0.9586006, -0.6572966, 0.92550796, -0.18838528, 0.03506735, -1.3085735, -1.8863217, 0.8283637, -0.049647644, -1.8473711, 1.2152774, 0.7069548, 0.57567924, -0.5769207, 0.004103885, 1.0740294, -0.6685727, 0.06981487, -0.442179, 1.2116009, -0.73983926, -1.0080059, -0.5856949, 1.263791, 0.75989074, -0.89122176, 0.4892265, -1.2846144, 1.6389104, -0.74073213, -2.5086443, 0.24558564, -2.191976, 0.9695048, -0.73659486, 0.4528519, 1.0352287, 0.91434026, -0.41227826, 1.1801821, -0.5871047, 1.2012802, -0.09350611, -0.65246624, -1.9699491, -0.88186216, -1.8445245, 0.600799, 0.9312934, -0.748986, 0.762986, 0.29536536, 1.5785195, 1.2566115, 0.6400792, -0.3231401, -0.54415464, 0.74289376, -0.5117031, 0.41670632, -0.75640124, 0.7170347, -1.2117789, -0.8108696, 0.6399255, -2.0755427, 0.7917815, -0.7693288, -0.11855151, 1.1035497, -0.7230254, 0.14678578, 2.1342237, 0.20335588, 1.6858623, 0.9036143, -1.3462288, 1.6330013, -0.23667838, -0.62839717, 0.5073823, -1.1040329, 1.8166281, -0.33216733, -1.1290957, -1.484877, -2.5237038, -0.13954702, -0.26784393, 0.31558135, -0.3871223, 0.64323556, 0.5781996, -0.24147224, -0.09671755, 1.8780855, -0.527801, 0.6255921, 0.3025445, -1.5513139, -0.38770792, -0.71166915, 0.9644843, 1.5589895, -0.41667962, 3.0079024, 0.21589102, 0.68024695, 1.0425457, 0.1675615, 1.2254218, -0.11186006, -0.21831718, 0.030340586, 0.6445724, 0.8555139, -0.30397046, -0.7371216, -0.3673983, -0.12570697, -0.63791007, 0.5487183, 0.3812071, -0.7880577, -0.07703689, 2.145892, 0.040550653, -1.1552556, 0.8339612, 0.35333186, 0.8113544, 0.9471309, 1.8389242, -2.1920223, -0.8024482, -0.75866145, -0.46682125, -0.291485, -0.56249285, -0.6120222, -1.3763278, -0.4043958, -0.167957, -2.0174806, 1.0753703, 1.4874343, -0.96017367, -1.1698335, -0.1857909, -0.67057425, 0.04790106, 1.3035606, 0.4013939, 0.84132683, -0.7301506, 0.03734765, 0.12839374, 0.59680045, -1.4596658, -1.9846171, -1.3339622, -0.928884, 1.0592812, -0.08096708, -0.3560848, 0.17055984, 0.44089505, 1.0143852, -1.2609717, 0.39403346, 0.15323427, -0.20655632, 0.2729617, -0.017258333, 0.21113883, -0.037135277, -0.3795276, 1.8731954, -0.95502555, -0.047084603, -1.8833874, -0.17380746, 0.53410834, -0.37984794, -0.83650166, 1.3657289, -0.9089595, 0.11723666, -0.691051, 0.058711946, -0.3596759, -0.5994914, -0.82318157, 0.4013819, -1.2878338, 1.4384826, -1.196757, 0.86787546, -0.8170519, 1.0645616, 0.35892066, 0.16686276, -0.020305071, -0.8255187, 0.39803553, 2.157575, -0.18023075, 1.1010606, 0.14643395, 1.1315295, 0.9770161, 0.42666945, 0.27146822, 0.732228, 0.39469486, -0.84413946, -0.90971494, 0.6502484, -0.16056834, 2.1572785, 0.24662192, 0.66400963, 0.14993827, -0.3131849, 0.6960484, 1.3728433, 0.2414029, 0.32461792, -0.25270006, -0.5310546, 0.44632587, 0.72279614, 1.0306181, 0.6859314, -0.9765316, -1.661137, 1.7164898, 0.2669273, -1.0952786, 0.10285393, -1.5112151, 1.3984389, -0.33049527, 0.086646505, 1.99051, -0.7867809, -0.02740572, -1.0844429, -0.38896164, -0.06757384, 1.1891596, -0.5182803, 1.4854476, 0.68765616, 0.05129343, 0.92384857, -0.04301777, -0.6649576, -0.41715017, 0.596572, -1.9418277, -1.151948, 0.07984562, 0.6323108, 0.63117504, 0.38132355, 0.76422507, -1.071917, 0.46144056, -1.1519856, 0.51360416, -1.2658279, -0.7383204, 1.1194702, 0.37442186, -0.59131896, -0.8329332, 0.41315868, 0.49044436, 1.4959744, -0.25459176, 1.9797194, -0.3676517, -0.7006123, -1.5376753, 2.7518427, 0.4352582, -1.1831497, -0.47213498, -0.53300947, 0.31342745, 1.1631571, 1.0107048, 0.43390697, -1.8759046, -0.74681604, -0.24300711, 0.9583661, 1.8207945, -0.8047002, 1.5142735, 0.06101127, -0.8167485, 1.341735, -1.9998361, -0.31037384, -1.9361457, 2.6424568, 1.7161232, -0.81243795, 1.4176836, 0.46120012, -0.10861592, -0.37943932, -0.53604156, 2.5376189, 1.9996238, 0.37519363, 1.3202821, -0.033361, -0.18681939, -0.64312565, 0.08054325, 0.22469059, 0.49264678, 1.2246869, -1.5528489, 0.7257059, -0.27520436, 1.1922318, 0.23851508, -0.29716906, 0.87747645, -0.26529908, 1.2344409, 2.0770943, 0.33405286, 1.5167257, -0.4284246, -0.6981646, -0.11194946, -0.2014947, -0.06963122, -0.06063814, -0.7429915, -1.9737889, -0.23421544, 0.32240874, -1.3905734, -0.02160562, 2.0077162, -0.70806885, 0.6858733, -0.073999576, 0.58822834, 1.0689219, 0.4202779, -1.8052489, 0.8980629, 1.0188261, 0.24025117, 1.1279254, -2.096736, 0.86583626, 1.0729425, -1.3586196, -0.43458986, 0.85325885, -1.3032721, 1.519603, -0.30039188, 0.011318408, -0.22466156, -0.004637025, 0.20317583, 0.101351805, 0.46223554, 1.6066155, -0.3497661, 0.31206778, -0.16919272, 2.5479598, 0.23946035, 1.0384718, -0.028765468, -0.7647152, -0.1882574, 0.39373857, -1.1616229, -0.15314704, -0.41924948, 0.31844574, -1.4991366, -0.6800134, -1.8221868, -0.13502005, 0.7068314, 1.4567363, -0.29855722, 0.05235714, 0.02478114, 0.13136047, 1.0196488, -0.779426, 0.020566413, -0.8152667, 0.32418823, -0.6030918, 1.3635833, 0.40278813, 0.0014983298, -0.05041781, 0.76405966, -0.6163368, -1.472155, -0.1951552, -0.32755968, -0.22645734, 1.4022243, -0.40418622, 0.7907749, -0.13738912, 0.420996, 0.03924503, 0.62669563, -0.06643237, -1.3050407, 0.16855282, -0.05330854, -0.34347278, -0.06536905, -1.7360572, -1.1509646, 1.3281381, -2.525531, 1.2429549, 0.14453362, 0.2398615, -0.6806504, 0.81042314, 1.4116533, -1.1112533, -0.2704999, 0.7653411, -0.16361058, -0.6862728, 0.9865363, 1.7095964, 1.1570653, -0.37491158, 0.45076278, -0.84477234, 0.48220462, 1.0266485, 0.9100105, -1.786471, 0.64672625, -0.9442402, 0.15980951, 0.2763099, -0.2563906, 0.48786116, 1.2707106, 0.40826705, -1.3636479, 0.59256256, -0.14769381, 0.22855996, -0.23195097, -0.46100956, 1.4071323, 0.588202, -0.063307635, 0.027076863, 0.42972392, -0.74118775, -0.7520948, 0.92107975, 0.3780131, 0.43948358, 1.7412065, -1.8292835, 1.4121022, 0.9102089, 0.2922569, -2.4068086, 0.82316643, 0.14709213, 0.76868147, 0.070829175, 0.5930173, 0.7329806, -0.25992763, 0.22328012, 1.8324057, -0.89981586, 1.4022714, -0.28445876}; - float output[] = {-0.8470076, -0.617558, 0.024568161, -0.54007053, -0.5732189, 1.0910312, 0.51959157, -0.073640585, -0.60885113, -1.8285086, -0.9326965, -0.3021695, 1.066226, 0.8134058, -1.5457271, 1.1948874, -0.04176423, -0.59385985, 0.011908118, 0.095879026, 0.6736443, -0.48068637, 0.11451639, 1.5323228, -0.8184595, -1.4535367, -0.06812811, 0.71712196, 2.4668334, 0.3803238, 1.5602548, -2.1309204, 2.8248832, -1.3176224, -0.6582828, 0.73314184, 1.8034855, -1.6781946, -0.23040803, -1.3201909, -0.24954909, -0.34502414, -0.7355865, -0.41729373, 0.5724887, -0.60789496, 1.0349115, 0.46317944, 0.17278059, -0.78425044, -0.11165529, 0.7919961, 0.35827583, -1.9887244, 0.12787221, 1.095776, 0.28236288, 0.48224112, -0.5900752, 0.9498589, 0.5209434, -0.57806545, 1.3280295, -0.6969055, -2.539957, -0.0030387403, 1.871011, 0.13415621, -0.5734313, 0.09759699, -0.29701954, 0.9157297, -0.62670755, 1.2683886, -0.7024728, 0.6662447, 0.46600792, -0.494909, 0.8643152, -1.2757068, 0.8424522, 0.9383413, 0.49222285, 0.11790963, 0.57665557, -0.2206793, -1.2813573, -1.4700212, 1.9633232, 0.5646655, 0.15718703, -1.256212, 1.7298958, -0.4105028, 0.6821366, -0.72149056, -0.27424803, 0.19525297, 0.5027373, -1.0273383, -0.42891493, 0.31214187, 0.3240255, 0.6148003, -1.4785552, 0.79766524, -1.3977971, -1.9163635, -0.4596946, 0.4611778, 0.4615138, 0.57446766, -1.8127673, 1.0151784, 0.79838765, -0.16945624, -0.29454982, -0.22049658, 1.0656692, 1.9895301, -1.6840646, -0.0068151196, 0.29346943, 0.8048959, 0.50557023, -1.8385066, -0.4750251, 0.3583206, 0.41981372, -0.3146262, -0.79544896, 1.6337428, 1.4349604, -1.5252166, -0.91220444, 0.7527505, 0.6034745, 0.08402507, 1.0259006, -1.1905016, 0.52963644, -0.6864299, -0.15308455, 0.9455237, 1.000834, -1.828627, -0.5953371, 0.61878735, -2.7202675, -0.13529402, -1.1603078, -0.28340778, 1.6124189, 1.48123, -0.032326907, -1.5110354, -0.60052997, -0.98667, -0.026620502, 0.9869495, 0.9609994, 1.8000636, -0.39040756, 0.662662, -0.35303995, -0.10898638, -0.097712174, -0.13256012, -0.30892372, 0.9536066, 1.0131402, -0.21144608, 0.9224201, -1.2749323, 0.12289531, 0.6637511, 0.0252969, -0.058163885, 0.6347488, 0.13144295, 0.29648793, 1.6838806, 1.4852757, -0.29899225, -2.699224, 0.22093739, -0.63045704, -2.3597014, -0.9839067, -1.0647969, 0.8293971, -0.7054954, 1.7537973, 0.22664751, -0.1311305, 0.50954145, -1.7052051, -0.42696014, -0.5314228, -0.56175625, 0.6429764, 1.3670748, 0.46155804, -0.7046119, 0.060639046, -0.113631465, 0.17838268, -0.084968045, 0.67876095, 0.6301664, 1.2548337, -0.2446083, -0.092792444, -0.42515463, -1.0051632, -0.5343044, -0.25070238, 1.3654076, -1.1015171, -1.5554606, 0.62512356, 0.36090285, 0.43128428, 0.097997755, -0.3924458, 0.27789333, -1.1954387, 0.22248776, -1.6744449, -1.2109405, 1.0672655, 0.95568365, 0.8194465, 0.15550855, 0.3167771, 0.22519737, 1.2998043, -0.31728703, -0.5346176, 0.907684, -1.5638523, -1.1844252, -0.2738023, 0.051613424, 0.2711231, -2.3651042, -0.44602147, -0.44494528, 0.8535133, 0.24942228, -1.0080348, 0.85422933, -0.48436078, -1.3689119, -1.3511016, -0.48757446, -0.032849748, 0.22983012, -0.032983564, -0.71215105, 0.18651846, -2.0692394, -0.57982725, 0.2421949, -0.004737948, -0.90421754, -0.78182286, 0.12858658, -0.30840445, -1.2161031, 0.6076416, -0.8430386, -1.486868, -0.18519744, -0.5284652, -0.5890602, -1.3699012, 0.3797034, -0.6210796, 0.34635258, 0.97299594, -0.73827547, 0.06458698, 0.118863635, 0.5199116, 1.0428258, -0.9279422, -0.86735195, -1.1641119, 0.7890661, -0.13334043, 0.965089, -0.38214856, -0.4918111, -0.5547398, 0.42891094, 1.3179172, 1.3215472, 0.6549405, -0.35108355, -0.053067066, 1.0250593, 0.56519455, 0.62243444, 0.94297016, 1.444416, -1.0421168, -1.2815233, 1.5802842, 1.058067, 1.5861386, 0.2678979, 0.611768, -0.9184742, -0.50267774, 1.3114626, -0.8547099, -0.7508762, 0.97122836, 0.83569074, -0.8890005, -1.3588058, 0.52090734, 0.6599851, -1.1082011, 0.6431001, 0.20303106, 1.0637558, -1.6201593, -0.340904, 1.4634577, -0.8336172, -0.8939236, 1.6814111, -1.4717578, -0.10118986, -1.2259562, 1.5268134, 0.5433005, 0.22572087, -1.4068099, -0.4178259, 0.58685875, -0.05888392, 2.8919656, 1.6086674, 0.03694556, -1.1663972, 1.8105648, 0.29895756, 1.8874907, -0.7695107, 0.5690569, 0.030703884, 0.751468, 0.6750975, -1.3655664, 1.1141645, 0.7864459, 0.3947739, 1.1202441, -0.60260165, -0.47422236, -0.8188005, -0.9895167, 1.1552737, 1.0952479, 0.229527, 0.29695028, -1.6278256, -0.34756196, 0.40587282, -0.2820706, -0.7547495, -0.9610026, -1.7018858, -0.3924324, 1.079949, 0.8248382, 0.94413376, -1.1566157, -0.9842801, 1.6253854, -1.1643112, -0.031547185, -1.3878396, 1.7543691, -0.29027265, -0.013875638, -0.6859403, 0.6589252, -1.2933903, 0.1164802, 0.39297175, -0.11103736, 0.337499, 0.45827693, 1.8881621, -2.3753831, -0.53132796, 0.40727693, -0.2953328, -1.1905057, -1.7966558, 0.22342315, 0.713041, 1.293023, 1.3513365, -0.6619178, 2.7537708, -0.43479046, 1.5873258, 0.6956605, -1.9825284, 0.4805659, -1.5420442, 0.08287144, 0.5063851, 0.40049914, 0.075521916, 0.046996634, -2.108652, -0.21822332, -1.1524743, 0.36947966, 0.9477517, -1.1086196, -0.88682616, 0.70022494, -0.986827, -0.1266721, 1.0552126, -0.032320406, 0.030530429, 0.3426037, -0.7678068, 1.5853431, -0.29916266, 0.16663021, 0.3103334, 0.5508472, -1.029247, -0.17085668, -1.2482865, 0.4678677, -0.7913232, -0.4546694, -0.3316058, -1.3343717, 0.015012662, 1.3695817, 0.4196725, 0.9586006, -0.6572966, 0.92550796, -0.18838528, 0.03506735, -1.3085735, -1.8863217, 0.8283637, -0.049647644, -1.8473711, 1.2152774, 0.7069548, 0.57567924, -0.5769207, 0.004103885, 1.0740294, -0.6685727, 0.06981487, -0.442179, 1.2116009, -0.73983926, -1.0080059, -0.5856949, 1.263791, 0.75989074, -0.89122176, 0.4892265, -1.2846144, 1.6389104, -0.74073213, -2.5086443, 0.24558564, -2.191976, 0.9695048, -0.73659486, 0.4528519, 1.0352287, 0.91434026, -0.41227826, 1.1801821, -0.5871047, 1.2012802, -0.09350611, 0.9312934, -0.748986, 0.762986, 0.29536536, 1.5785195, 1.2566115, 0.6400792, -0.3231401, -0.54415464, 0.74289376, -0.5117031, 0.41670632, -0.75640124, 0.7170347, -1.2117789, -0.8108696, 0.6399255, -2.0755427, 0.7917815, -0.7693288, -0.11855151, 1.1035497, -0.7230254, 0.14678578, 2.1342237, 0.20335588, 1.6858623, 0.9036143, -1.3462288, 1.6330013, -0.23667838, -0.62839717, 0.5073823, -1.1040329, 1.8166281, -0.33216733, -1.1290957, -1.484877, -2.5237038, -0.13954702, -0.26784393, 0.31558135, -0.3871223, 0.64323556, 0.5781996, 0.3025445, -1.5513139, -0.38770792, -0.71166915, 0.9644843, 1.5589895, -0.41667962, 3.0079024, 0.21589102, 0.68024695, 1.0425457, 0.1675615, 1.2254218, -0.11186006, -0.21831718, 0.030340586, 0.6445724, 0.8555139, -0.30397046, -0.7371216, -0.3673983, -0.12570697, -0.63791007, 0.5487183, 0.3812071, -0.7880577, -0.07703689, 2.145892, 0.040550653, -1.1552556, 0.8339612, 0.35333186, 0.8113544, 0.9471309, 1.8389242, -2.1920223, -0.8024482, -0.75866145, -0.46682125, -0.291485, -0.56249285, -0.6120222, -1.3763278, -0.4043958, -0.167957, -0.1857909, -0.67057425, 0.04790106, 1.3035606, 0.4013939, 0.84132683, -0.7301506, 0.03734765, 0.12839374, 0.59680045, -1.4596658, -1.9846171, -1.3339622, -0.928884, 1.0592812, -0.08096708, -0.3560848, 0.17055984, 0.44089505, 1.0143852, -1.2609717, 0.39403346, 0.15323427, -0.20655632, 0.2729617, -0.017258333, 0.21113883, -0.037135277, -0.3795276, 1.8731954, -0.95502555, -0.047084603, -1.8833874, -0.17380746, 0.53410834, -0.37984794, -0.83650166, 1.3657289, -0.9089595, 0.11723666, -0.691051, 0.058711946, -0.3596759, -0.5994914, -0.82318157, -0.8170519, 1.0645616, 0.35892066, 0.16686276, -0.020305071, -0.8255187, 0.39803553, 2.157575, -0.18023075, 1.1010606, 0.14643395, 1.1315295, 0.9770161, 0.42666945, 0.27146822, 0.732228, 0.39469486, -0.84413946, -0.90971494, 0.6502484, -0.16056834, 2.1572785, 0.24662192, 0.66400963, 0.14993827, -0.3131849, 0.6960484, 1.3728433, 0.2414029, 0.32461792, -0.25270006, -0.5310546, 0.44632587, 0.72279614, 1.0306181, 0.6859314, -0.9765316, -1.661137, 1.7164898, 0.2669273, -1.0952786, 0.10285393, -1.5112151, 1.3984389, -0.33049527, -0.38896164, -0.06757384, 1.1891596, -0.5182803, 1.4854476, 0.68765616, 0.05129343, 0.92384857, -0.04301777, -0.6649576, -0.41715017, 0.596572, -1.9418277, -1.151948, 0.07984562, 0.6323108, 0.63117504, 0.38132355, 0.76422507, -1.071917, 0.46144056, -1.1519856, 0.51360416, -1.2658279, -0.7383204, 1.1194702, 0.37442186, -0.59131896, -0.8329332, 0.41315868, 0.49044436, 1.4959744, -0.25459176, 1.9797194, -0.3676517, -0.7006123, -1.5376753, 2.7518427, 0.4352582, -1.1831497, -0.47213498, -0.53300947, 0.31342745, 1.1631571, 1.0107048, 1.8207945, -0.8047002, 1.5142735, 0.06101127, -0.8167485, 1.341735, -1.9998361, -0.31037384, -1.9361457, 2.6424568, 1.7161232, -0.81243795, 1.4176836, 0.46120012, -0.10861592, -0.37943932, -0.53604156, 2.5376189, 1.9996238, 0.37519363, 1.3202821, -0.033361, -0.18681939, -0.64312565, 0.08054325, 0.22469059, 0.49264678, 1.2246869, -1.5528489, 0.7257059, -0.27520436, 1.1922318, 0.23851508, -0.29716906, 0.87747645, -0.26529908, 1.2344409, 2.0770943, 0.33405286, 1.5167257, -0.4284246, -0.6981646, -0.11194946, -0.2014947, -0.06963122, -1.3905734, -0.02160562, 2.0077162, -0.70806885, 0.6858733, -0.073999576, 0.58822834, 1.0689219, 0.4202779, -1.8052489, 0.8980629, 1.0188261, 0.24025117, 1.1279254, -2.096736, 0.86583626, 1.0729425, -1.3586196, -0.43458986, 0.85325885, -1.3032721, 1.519603, -0.30039188, 0.011318408, -0.22466156, -0.004637025, 0.20317583, 0.101351805, 0.46223554, 1.6066155, -0.3497661, 0.31206778, -0.16919272, 2.5479598, 0.23946035, 1.0384718, -0.028765468, -0.7647152, -0.1882574, 0.39373857, -1.1616229, -0.15314704, -0.41924948, 0.31844574, -1.4991366, -0.29855722, 0.05235714, 0.02478114, 0.13136047, 1.0196488, -0.779426, 0.020566413, -0.8152667, 0.32418823, -0.6030918, 1.3635833, 0.40278813, 0.0014983298, -0.05041781, 0.76405966, -0.6163368, -1.472155, -0.1951552, -0.32755968, -0.22645734, 1.4022243, -0.40418622, 0.7907749, -0.13738912, 0.420996, 0.03924503, 0.62669563, -0.06643237, -1.3050407, 0.16855282, -0.05330854, -0.34347278, -0.06536905, -1.7360572, -1.1509646, 1.3281381, -2.525531, 1.2429549, 0.14453362, 0.2398615, -0.6806504, 0.81042314, 1.4116533, -1.1112533, -0.2704999, 1.1570653, -0.37491158, 0.45076278, -0.84477234, 0.48220462, 1.0266485, 0.9100105, -1.786471, 0.64672625, -0.9442402, 0.15980951, 0.2763099, -0.2563906, 0.48786116, 1.2707106, 0.40826705, -1.3636479, 0.59256256, -0.14769381, 0.22855996, -0.23195097, -0.46100956, 1.4071323, 0.588202, -0.063307635, 0.027076863, 0.42972392, -0.74118775, -0.7520948, 0.92107975, 0.3780131, 0.43948358, 1.7412065, -1.8292835, 1.4121022, 0.9102089, 0.2922569, -2.4068086, 0.82316643, 0.14709213, 0.76868147, 0.070829175, 0.5930173, 0.7329806, -0.25992763}; -} \ No newline at end of file diff --git a/tmva/sofie/test/input_models/references/Slice_Neg.ref.hxx b/tmva/sofie/test/input_models/references/Slice_Neg.ref.hxx deleted file mode 100644 index 092b8a2cabe60..0000000000000 --- a/tmva/sofie/test/input_models/references/Slice_Neg.ref.hxx +++ /dev/null @@ -1,4 +0,0 @@ -namespace Slice_Default_Steps { - std::vector input = {1.0451847, 0.6245613, 0.48420018, 2.1407738, 1.4023418, 0.6803044, 1.2552906, 0.23355322, 0.5949201, 0.665767, 0.7255075, 0.61573493, -0.22523554, 0.609465, -1.9059293, 1.3349898, -0.4083868, -0.30549952, 1.7568158, -0.09013642, 0.7510219, -0.052165933, 0.045655653, 0.6894599, 0.6663751, -0.13001254, -0.99388146, 1.1250099, 0.90145993, -3.4663842, 1.4765558, -0.8621666, -0.04465484, 0.51125, 0.8123038, -0.13915698, 1.2800659, 1.1580552, 1.8424264, -0.29321876, 0.031092152, 1.0013733, -0.7283629, 0.3382554, -1.8718901, -0.047066037, -1.9088744, 0.42447698, -0.3465933, -0.5751067, 1.5138085, -1.0871423, 0.6077587, 1.776671, 0.34022397, -0.03549139, -1.329498, 0.8371586, -1.4539177, 0.21200769, 0.76399386, -0.9069966, -0.0950934, 1.3569304, -0.29720822, 0.1822998, -1.1559794, 0.04441483, -1.4136242, 0.23844138, 1.0097063, 0.65586853, -2.0127554, -0.2072184, -0.4014769, -0.3000392, 0.8629856, -0.08507111, -1.1835829, -1.0837615, 0.50113016, -1.141945, 1.4552537, -0.36788568, -1.6010555, -0.15414086, -0.7613445, 1.6708724, 1.4167747, -0.096510775, -0.15186574, 0.4412115, -1.2044533, -0.044650316, -0.6854727, -1.4451612, -0.11577169, -1.2647926, -0.14461602, -0.47596788, 0.10738016, 0.06727146, 0.22507443, 1.2529004, -1.89923, 1.447481, 1.1985252, 0.3427861, -0.4630263, -0.65935296, 1.4358126, -2.2243154, 0.49377045, 1.4613236, -0.1912351, 1.8992213, -0.94443643, 0.6515869, 0.31404996, 0.074261054, 0.42852008, -0.19033097, -0.482317, -2.5970418, -1.2141722, 0.74168557, -0.91024095, 0.18518865, 0.20616573, 0.67188245, -1.9931237, 1.6288077, -0.1337348, -1.0095295, -0.292675, -2.8238084, 1.6436734, -0.66659415, 0.31128094, 0.25534976, -0.08932365, -0.24432416, -1.116715, 0.8437299, 1.5952227, -1.2897215, 0.5800979, -0.75728, 0.82642055, -0.20025311, -0.84525776, -0.4629382, 0.09837887, 0.8285737, 0.34570113, -0.4494489, -0.06607181, 1.880768, 0.95183575, 1.6169115, 0.2602527, -1.2811539, -0.12291974, -0.55588114, -2.4634414, -0.29807645, -0.32441446, -0.60882235, -0.6670523, -0.84318537, -1.1632277, -0.16034018, 0.8423004, 1.5689149, -1.378128, -1.9285303, -0.9074993, -0.25396672, -0.90653914, -1.0881042, 0.56759405, -1.4169359, -2.5133574, -0.96242374, -1.8407485, 0.21979266, -1.5453613, -0.400642, 0.3806829, 1.1271498, 1.1819715, 0.847391, -1.4687508, 0.74352884, -0.6923194, -1.4369518, 0.97722024, 1.0514591, -0.90551496, -0.79178625, 0.19880198, 0.6863783, 0.72862554, 1.763804, 0.2279675, 1.4966544, 0.7106558, -0.41115803, -0.21305746, 0.79997617, 0.7268194, 1.5965521, -1.4865237, -0.44435644, -0.36344638, -0.11310481, 1.4190954, 0.6319442, 0.745741, -0.5167261, -0.16796711, 1.5669242, -1.4218544, 0.61177474, -1.243831, -0.408289, 0.865704, -0.97820926, 1.053678, -1.9482862, 0.54905266, -0.9755587, -1.8869104, 0.0044822586, -1.1138756, -0.71788013, 0.7361194, -0.7153275, -1.6451069, 1.7545587, -0.75075376, -1.3882002, -0.5430022, -1.2329432, 0.21638516, -0.326573, 0.5647263, -1.8826942, -0.5760186, 0.51380414, -1.5062225, 0.3432146, 0.14499806, -1.1523787, 2.335982, -2.4507418, 0.5823965, 0.7784748, 1.2795119, -0.39526865, -0.74181443, 1.476051, -0.07681689, 0.0067599732, -0.98287404, -1.3786954, 0.4984134, 1.0468203, -0.7151032, -2.0332944, 0.05419711, -2.3168552, 1.122624, -0.53438026, -2.3934145, -0.49050105, -0.9205437, -0.15586168, 1.6762931, 0.5607007, 0.07048273, -0.7124037, -1.819932, 1.0152652, 1.8492514, 0.09532632, -0.47131425, 0.10136383, 1.6027571, -0.055490978, -0.53033817, 0.47595662, -0.124515995, 0.8248915, -0.50315917, -0.09490088, 2.1328678, 0.26436484, -0.3090177, 0.66534674, -1.2549512, -0.25315812, -1.0608811, 0.08174163, 2.3469543, 0.18253551, 1.4174005, 0.5833562, 0.7734026, 0.8875707, 0.46253937, -0.59789574, 0.3320457, 0.7252614, 0.2282751, 0.6393503, 0.3354368, -2.2898176, 0.08617805, -0.98621976, 1.4499558, -0.10378551, 1.4655052, 0.57472426, -0.8805005, -0.73588294, 0.6668061, 0.81059366, -0.59290576, -0.31642014, 0.5465175, -0.16706206, -0.68133485, 1.0575606, 0.415264, -1.7762902, 0.35459134, -0.036745973, 0.28332543, -0.0061813043, -0.8579742, -1.266533, -0.69849193, -1.4563639, 0.9827122, 0.7408832, -1.514766, -1.0668796, 0.1426218, -0.09352196, -1.4858966, -0.80005354, -0.731151, 0.5344746, 0.38867953, 0.5330557, 0.50632566, 0.6302994, -0.569997, 0.7838313, -0.28514034, -2.2912836, -0.6982049, 0.7933591, -1.1312126, 1.3734623, 1.100901, -0.7409093, 0.38863868, 0.24726652, -0.26152653, -1.6399634, 0.32046428, -0.06809312, 1.6628146, -2.0482807, -0.13053721, -1.700966, 0.3613013, 0.024943631, 0.73767537, 0.35799584, -1.1839654, -0.816691, 1.2237171, -1.9319222, -0.14407313, 1.75666, 1.7709233, 0.21359767, 0.9950233, -0.4615518, 0.44868615, 1.4312615, 1.3808835, -0.18940794, 1.0416954, -0.24796851, 0.48987696, 1.2978021, 0.05604007, -0.3529608, -1.3806872, 2.2423518, 0.38141087, 1.1842633, -0.3420007, -0.28834683, -0.52113175, -0.08655031, 0.66746104, 0.4264375, 0.08894845, 1.361398, -1.1102597, 0.8127054, -0.25339708, 0.7393206, 0.54270566, 0.72499883, 1.0655539, -0.43516365, 1.53332, -1.3317435, 0.9998057, 0.41541678, 0.98901755, -0.7852148, 1.9416982, -0.72119594, -0.034244604, -0.011740846, -0.25054318, -1.4232942, 0.9649547, 0.010748758, 0.13203041, 0.25134632, 1.7783864, 0.0403642, 2.4485521, -0.5401216, -0.3214275, -0.7718592, 1.0362864, -0.7257519, -0.53041863, 0.27436903, 0.08478759, 1.3883367, -0.66223633, 0.51782465, -1.1076697, 0.15442872, 1.6057725, -0.5522208, 0.6561317, 0.17577524, 0.4332249, -0.28804585, -0.5691257, 2.25104, -1.1636895, 0.22430561, 1.0721023, 0.792772, -0.47398332, -0.76994264, 1.0576593, 0.88267803, -1.4782726, 0.8926852, -0.46385735, -0.0716391, -1.665406, 0.11861658, 0.37563065, 0.85860866, -1.8741595, -0.5219604, -1.0582875, 1.7154264, 0.1313024, 1.4848208, 0.11640747, -1.7609112, 0.7769073, 0.48588625, -1.2146038, 0.73792857, -0.9774584, 0.07676499, -1.0037707, 0.015130967, -1.2565023, 1.7358211, 1.4210244, 0.053746346, -1.5248967, 1.1289326, -0.53315526, -1.3237956, -0.21802673, 0.5033034, -0.9388878, -2.9923463, 0.8051657, 0.9151123, 0.017421184, -1.4353907, 1.781005, 0.95736814, 1.1634779, 0.64479274, -0.23042154, -0.55330545, 0.41722617, -0.007924688, 1.9704095, -0.52791095, -0.25249967, 1.217987, -0.26531398, 0.31962937, -1.1676388, 0.17290594, -0.68421125, -0.34032997, -1.4233708, -0.9743128, 0.9177001, -0.14544213, -0.27916044, -1.4160591, 0.096208386, -1.4026262, -0.51816446, 0.9189864, 1.0548416, -0.8247552, -0.7701502, -0.98002684, 1.1631306, 0.8712015, -0.5758766, -1.6995598, 0.09796931, 0.27600157, -0.2175099, -1.2554561, -0.07213151, 2.4231257, 0.7729675, 0.030608136, -1.8162596, 0.7449758, 0.6113035, -0.22608364, -0.6480759, 0.4915602, 1.1545128, 0.35355297, 1.6369073, 0.411864, -1.0840435, -0.075121745, 2.2060554, -0.24247673, -1.1374276, 0.10677125, 1.9537716, -1.108019, -0.32708606, 0.5778413, 1.2812556, 0.21232277, 0.13396217, 0.80973107, 0.26933447, -0.20669563, 1.9351953, 0.7844493, 0.10339695, -1.7368128, 0.823303, 0.67611474, -0.14529933, -0.94407207, 0.6184946, -1.1973552, 0.94807374, -1.9689158, -0.95736796, -0.36089993, 0.97640216, -0.5079678, -0.13345084, -0.09096543, 1.6033889, 0.20670862, -0.27726498, 0.068673365, -0.1626727, 0.13826686, 0.55320334, -1.5936158, -0.82023424, 0.27161613, 0.41867435, -0.9805353, -0.4154204, 0.49877793, 0.0093282405, 0.59771943, 0.09775646, 0.58804435, -0.65016276, 0.73460424, 0.8446652, 2.0283346, 1.2307235, 1.1308593, -0.5006046, 0.334564, -0.97043395, -0.5636059, -1.4977788, 0.87005043, -1.1603388, 0.31635118, -1.8745527, 0.7862731, -1.041438, -0.9785689, -0.014248349, -1.222529, -0.5575574, 2.4933984, -0.064805016, 0.39413083, -1.2988446, 0.7563059, -0.79205245, -1.0542104, 0.5979833, 1.5992491, -1.7063024, -0.5771334, 1.6361665, -0.60626614, 0.44358745, 0.36404964, -0.17300287, -1.4895558, 0.93172455, -0.66854924, 0.4801032, 0.09470631, 0.19432715, -0.39213803, 0.23912194, 1.1788458, -0.20358092, 1.2247528, -1.7846833, 1.7758663, 0.87859154, -0.4107461, -0.32997409, -1.5755576, -1.4550736, -0.31620994, 0.81590563, 0.21436447, -0.0009418542, 0.3039241, -0.14782928, -0.779694, -0.26116168, -0.5875628, 1.064051, 1.520253, 0.68341565, -1.9807853, 0.74206716, -2.8454256, 1.2709564, 1.7051587, -0.23825008, 0.13465987, -0.25501144, 0.13449395, -0.08085852, -0.9345905, -0.9593099, 0.6859107, -1.1454093, -1.3381015, 0.2353102, -0.13322814, 0.11062508, 0.17510203, 0.00516871, -1.0370462, -0.32723942, 1.2823414, -0.042340446, -0.3114818, -8.870333e-05, -0.5615099, -0.20567372, -1.2969033, -0.18617158, 0.58420277, -0.9223417, -0.8050735, -0.36499628, -0.76930875, 1.4448764, -0.1731726, -0.19603184, -0.23324072, -0.109300986, 1.0571263, 1.178747, -0.5669078, -0.6129132, 0.2746348, -0.072358064, 0.3385931, -0.31736866, -0.4328864, 0.9560206, -0.44862372, -0.350604, 0.37914753, 0.76631945, 0.5211334, -1.1975573, -0.39863473, 1.7790956, 0.036023278, 0.85484296, -0.14574684, -2.1517622, 1.4256386, 0.07762644, 0.76923335, -1.452289, -0.44079757, 1.5147146, 0.057785936, 1.7878892, -0.61763746, -0.7521893, 0.7968369, 0.2493956, 0.23879473, 0.047723737, 0.45276004, -0.5033289, 0.84546775, 0.087485075, -0.29491672, -0.7279333, 1.047645, -1.5160652, -0.7238233, -1.4873251, -0.9596354, -0.09308696, 0.9633187, 0.17714372, 0.38465348, -0.13031037, -0.48849452, -0.5216643, -0.7692474, -0.4057824, 0.024406806, 0.33862096, -0.4138596, 0.4039324, 0.18644312, -0.61818093, 0.13876703, -2.164961, -0.31688243, 0.7040236, 0.59295374, -0.8303941, -0.9530634, -0.48112786, -1.3758682, 0.23894647, 0.44065222, -0.7498823, 0.4367827, -0.8626759, -0.819069, 0.6019, 0.40171462, -0.989695, 0.9679922, 0.60419935, 0.5596958, 0.5186218, 0.4689634, -0.28469092, 0.007876219, -0.017619386, 0.65712726, 0.28158224, 0.42113513, -0.5614362, 1.1735151, 0.2318658, -0.60902905, -0.83569163, 1.2109544, -1.7506728, 1.1711022, 0.18666989, -1.4357256, 1.7505751, 2.359068, -0.69469744, -0.17320465, -0.49060386, 1.9384009, -0.8286886, -1.9119048, -0.0867032, 1.675301, -0.15963833, 0.47802424, -0.93921524, 0.21669552, 0.5973385, -0.3897737, -0.96138793, -1.1460986, -0.6993545, 0.48859787, 0.49144292, 0.884664, -0.45526063, 0.06822358, 1.2684873, 1.2708554, 0.08385541, 0.788578, 0.038803414, -0.58519393, 1.4615723, 0.36900017, -0.8346276, 0.04170542, -0.41653165, 1.0975499, 2.0970829, 0.18264593, 1.5489473, 0.5285782, -1.0232004, 0.050813664, -1.0207909, -0.064489454, -1.2171016, -0.4630668, -0.4305054, 1.0489885, -0.3447226, 0.47696728, 0.085851595, 0.45969304, 0.9397857, 0.9925845, 0.84165156, 0.58367836, 0.44830862, 0.79763794, 1.1915636, 0.20407252, -1.1486843, 1.3992747, -0.76383877, 2.411353, 0.48628262, 0.3500077, -0.300855, 0.6324427, 0.34935966, 0.54504216, -1.1055669, -0.09944116, 0.95708686, 1.5737662, -0.5069417, -0.7603594, 0.16570005, 0.38484627, 0.7854822, -0.5289874, -0.20853232, -0.25366986, 0.93255436, 2.1678638, 2.5284173, 0.09104326, -0.25922984, 0.104944386, 0.46791264, -0.1947828, 0.2517247, -0.0018040794, -0.36763376, -2.4569225, 1.2765278, -0.96315217, -1.2554164, -0.2874503, 0.9034364, 0.6889874, -1.4450033, 1.6024436, 0.21677066, -0.008955182, -0.16781831, -1.0223466, -0.96528006, -2.1202044, 0.3416743, 0.021002049, -0.12881091, -1.4332885, -0.12481898, 0.93586546, -1.5900887, -1.0640641, 0.8249464, -0.47171867, 0.1742785, 0.6709329, -1.7259985, 0.78818256, -1.2866964, -1.4600148, -1.4257796, 0.34334445, -2.1116593, 0.25954735, -0.4888973, 0.19879743, -0.27516934, 1.6078179, 1.5662538, 0.14704464, -0.93423027, -0.6393435, -1.1420057, 0.9135534, 0.57406884, 0.1670467, 0.90328616, -1.3994925, -0.31774673, 0.46857116, 0.77330434, 0.45956635, -0.9270845, -1.0549059, -0.5243828, -0.85040414, -1.5719082, 1.0715257, 1.9476706, -1.4326566, 0.97081816, 0.7446318, -0.34977925, -0.9901644, 1.5866337, -0.97141254, -1.1351146, -0.09391565, 0.31912678, -0.13078365, 1.498845, 0.3680228, 0.76907545, 0.37397268, -0.56707764, -0.8323829, 1.3317215, -0.3441633, -2.1597042, -1.7520211, -0.47263923, -0.8540615}; - float output[] = {2.1407738, 0.5949201, 0.609465, 1.7568158, 0.6894599, 0.90145993, 0.51125, 1.8424264, 0.3382554, -0.3465933, 1.776671, -1.4539177, 1.3569304, -1.4136242, -0.2072184, -1.1835829, -0.36788568, 1.4167747, -0.044650316, -0.14461602, 1.2529004, -0.4630263, 1.4613236, 0.31404996, -2.5970418, 0.20616573, -1.0095295, 0.31128094, 0.8437299, 0.82642055, 0.8285737, 0.95183575, -0.55588114, -0.6670523, 1.5689149, -0.90653914, -0.96242374, 0.3806829, 0.74352884, -0.90551496, 1.763804, -0.21305746, -0.44435644, 0.745741, 0.61177474, 1.053678, 0.0044822586, -1.6451069, -1.2329432, -0.5760186, -1.1523787, 1.2795119, 0.0067599732, -0.7151032, -0.53438026, 1.6762931, 1.0152652, 1.6027571, 0.8248915, -0.3090177, 0.08174163, 0.7734026, 0.7252614, 0.08617805, 0.57472426, -0.59290576, 1.0575606, 0.28332543, -1.4563639, 0.1426218, 0.5344746, -0.569997, 0.7933591, 0.38863868, -0.06809312, 0.3613013, -0.816691, 1.7709233, 1.4312615, 0.48987696, 2.2423518, -0.52113175, 1.361398, 0.54270566, -1.3317435, 1.9416982, -1.4232942, 1.7783864, -0.7718592, 0.08478759, 0.15442872, 0.4332249, 0.22430561, 1.0576593, -0.0716391, -1.8741595, 1.4848208, -1.2146038, 0.015130967, -1.5248967, 0.5033034, 0.017421184, 0.64479274, 1.9704095, 0.31962937, -1.4233708, -1.4160591, 1.0548416, 0.8712015, -0.2175099, 0.030608136, -0.6480759, 0.411864, -1.1374276, 0.5778413, 0.26933447, -1.7368128, 0.6184946, -0.36089993, 1.6033889, 0.13826686, 0.41867435, 0.59771943, 0.8446652, 0.334564, -1.1603388, -0.9785689, -0.064805016, -1.0542104, 1.6361665, -1.4895558, 0.19432715, 1.2247528, -0.32997409, 0.21436447, -0.26116168, -1.9807853, -0.23825008, -0.9345905, 0.2353102, -1.0370462, -8.870333e-05, 0.58420277, 1.4448764, 1.0571263, -0.072358064, -0.44862372, -1.1975573, -0.14574684, -1.452289, -0.61763746, 0.047723737, -0.29491672, -1.4873251, 0.38465348, -0.4057824, 0.18644312, 0.7040236, -1.3758682, -0.8626759, 0.9679922, -0.28469092, 0.42113513, -0.83569163, -1.4357256, -0.49060386, 1.675301, 0.5973385, 0.48859787, 1.2684873, -0.58519393, -0.41653165, 0.5285782, -1.2171016, 0.47696728, 0.84165156, 0.20407252, 0.48628262, 0.54504216, -0.5069417, -0.5289874, 2.5284173, -0.1947828, 1.2765278, 0.6889874, -0.16781831, 0.021002049, -1.5900887, 0.6709329, -1.4257796, 0.19879743, -0.93423027, 0.1670467, 0.77330434, -0.85040414, 0.97081816, -0.97141254, 1.498845, -0.8323829, -0.47263923}; -} \ No newline at end of file diff --git a/tmva/sofie/test/input_models/references/Softmax1d.ref.hxx b/tmva/sofie/test/input_models/references/Softmax1d.ref.hxx deleted file mode 100644 index 44fb41382cb0c..0000000000000 --- a/tmva/sofie/test/input_models/references/Softmax1d.ref.hxx +++ /dev/null @@ -1,3 +0,0 @@ -namespace Softmax1d_ExpectedOutput{ - float output[] = {0.09003058, 0.24472848, 0.66524094}; -} diff --git a/tmva/sofie/test/input_models/references/Softmax2d.ref.hxx b/tmva/sofie/test/input_models/references/Softmax2d.ref.hxx deleted file mode 100644 index 68f3b6c64b8ff..0000000000000 --- a/tmva/sofie/test/input_models/references/Softmax2d.ref.hxx +++ /dev/null @@ -1,3 +0,0 @@ -namespace Softmax2d_ExpectedOutput{ - float output[] = {0.09003058, 0.24472848, 0.66524094}; -} diff --git a/tmva/sofie/test/input_models/references/Softmax3d.ref.hxx b/tmva/sofie/test/input_models/references/Softmax3d.ref.hxx deleted file mode 100644 index bbcb0c36310d0..0000000000000 --- a/tmva/sofie/test/input_models/references/Softmax3d.ref.hxx +++ /dev/null @@ -1,6 +0,0 @@ -namespace Softmax3d_ExpectedOutput{ - float output[] = { - 0.2135, 0.1206, 0.2700, 0.6262, 0.3266, 0.5932, 0.0588, 0.1167, 0.4600, - 0.2861, 0.6713, 0.2572, 0.3993, 0.1286, 0.0133, 0.7877, 0.3260, 0.7496, - 0.0604, 0.0992, 0.2747, 0.1218, 0.9263, 0.1131}; -} diff --git a/tmva/sofie/test/input_models/references/Softmax4d.ref.hxx b/tmva/sofie/test/input_models/references/Softmax4d.ref.hxx deleted file mode 100644 index 1043b215c9694..0000000000000 --- a/tmva/sofie/test/input_models/references/Softmax4d.ref.hxx +++ /dev/null @@ -1,9 +0,0 @@ -namespace Softmax4d_ExpectedOutput{ - float output[] = { - 0.1683, 0.0874, 0.2593, 0.3676, 0.3589, 0.3785, 0.2136, 0.1664, 0.2643, - 0.0800, 0.0464, 0.0429, 0.4629, 0.0690, 0.2264, 0.8081, 0.1058, 0.6774, - 0.1157, 0.1123, 0.4818, 0.1500, 0.2968, 0.0603, 0.1334, 0.1897, 0.0721, - 0.1808, 0.6827, 0.2801, 0.1118, 0.3495, 0.1004, 0.3916, 0.6719, 0.2052, - 0.1388, 0.0549, 0.0889, 0.3483, 0.0288, 0.2722, 0.0887, 0.5564, 0.7794, - 0.0642, 0.1031, 0.1072}; -} diff --git a/tmva/sofie/test/input_models/references/Sqrt.ref.hxx b/tmva/sofie/test/input_models/references/Sqrt.ref.hxx deleted file mode 100644 index e847a35d24e6b..0000000000000 --- a/tmva/sofie/test/input_models/references/Sqrt.ref.hxx +++ /dev/null @@ -1,3 +0,0 @@ -namespace Sqrt_ExpectedOutput{ - float output[] = {0.9135, 0.6868, 0.7891, 0.9191, 0.4983, 0.9730}; -} diff --git a/tmva/sofie/test/input_models/references/Sub.ref.hxx b/tmva/sofie/test/input_models/references/Sub.ref.hxx deleted file mode 100644 index bd2ac99126068..0000000000000 --- a/tmva/sofie/test/input_models/references/Sub.ref.hxx +++ /dev/null @@ -1,5 +0,0 @@ -namespace Sub_ExpectedOutput{ - float outputs[] = { - 1, 1 - }; -} // namespace Sub_ExpectedOutput \ No newline at end of file diff --git a/tmva/sofie/test/input_models/references/SumMultidirectionalBroadcast.ref.hxx b/tmva/sofie/test/input_models/references/SumMultidirectionalBroadcast.ref.hxx deleted file mode 100644 index 48ff0d9fe8c6a..0000000000000 --- a/tmva/sofie/test/input_models/references/SumMultidirectionalBroadcast.ref.hxx +++ /dev/null @@ -1,7 +0,0 @@ -namespace SumMultidirectionalBroadcast_ExpectedOutput { -float output[] = {0.7040715799999999, 0.65284213, 1.68048673, 1.1749307, -3.0888683, - -3.1400977500000002, -2.1124531500000003, -2.61800918, 0.19356718, 0.14233773, - 1.1699823299999998, 0.6644263, -0.20102366999999996, -0.25225312, 0.77539148, - 0.26983545000000003, -2.54073318, -2.5919626300000003, -1.5643180300000001, -2.06987406, - -0.15768401999999998, -0.20891347, 0.81873113, 0.31317510000000004}; -} diff --git a/tmva/sofie/test/input_models/references/Swish.ref.hxx b/tmva/sofie/test/input_models/references/Swish.ref.hxx deleted file mode 100644 index d7fc0427c4b49..0000000000000 --- a/tmva/sofie/test/input_models/references/Swish.ref.hxx +++ /dev/null @@ -1,3 +0,0 @@ -namespace Swish_ExpectedOutput { - float outputs[] = {0.731059f, -0.238406f, 2.857723f, 0.311230f, -0.268941f, 1.761594f}; -} // namespace Swish_ExpectedOutput diff --git a/tmva/sofie/test/input_models/references/Tanh.ref.hxx b/tmva/sofie/test/input_models/references/Tanh.ref.hxx deleted file mode 100644 index 2ba47d8a12e1c..0000000000000 --- a/tmva/sofie/test/input_models/references/Tanh.ref.hxx +++ /dev/null @@ -1,7 +0,0 @@ -namespace Tanh_ExpectedOutput{ - float outputs[] = { - -0.3710, -0.3382, 0.0363, 0.7991, 0.4688, -0.6923, -0.5893, 0.2375, - 0.9212, 0.8826, -0.2081, -0.5976, -0.4675, -0.9727, -0.6099, 0.8229, - 0.8739, 0.6714, 0.9373, -0.6982, -0.1946, 0.0411, -0.5125, -0.2464 - }; -} // namespace Tanh_ExpectedOutput \ No newline at end of file diff --git a/tmva/sofie/test/input_models/references/Tile5D.ref.hxx b/tmva/sofie/test/input_models/references/Tile5D.ref.hxx deleted file mode 100644 index 88c55c2ad39f9..0000000000000 --- a/tmva/sofie/test/input_models/references/Tile5D.ref.hxx +++ /dev/null @@ -1,177 +0,0 @@ -namespace Tile5D_ExpectedOutput { -float output[] = { - 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, 0.2386120855808258, 0.5549510717391968, - -1.8190287351608276, 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, 0.5724563598632812, - -0.6596977710723877, 0.17560836672782898, 0.5724563598632812, -0.6596977710723877, 0.17560836672782898, - 0.5724563598632812, -0.6596977710723877, 0.17560836672782898, 0.7608169317245483, 0.08603227883577347, - -0.049375515431165695, 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, 0.7608169317245483, - 0.08603227883577347, -0.049375515431165695, 0.2705111503601074, 1.42119562625885, 0.032626643776893616, - 0.2705111503601074, 1.42119562625885, 0.032626643776893616, 0.2705111503601074, 1.42119562625885, - 0.032626643776893616, -1.212586522102356, -0.5129594802856445, -0.43296414613723755, -1.212586522102356, - -0.5129594802856445, -0.43296414613723755, -1.212586522102356, -0.5129594802856445, -0.43296414613723755, - -0.1606937050819397, 1.1884371042251587, -0.662174642086029, -0.1606937050819397, 1.1884371042251587, - -0.662174642086029, -0.1606937050819397, 1.1884371042251587, -0.662174642086029, 0.2386120855808258, - 0.5549510717391968, -1.8190287351608276, 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, - 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, 0.5724563598632812, -0.6596977710723877, - 0.17560836672782898, 0.5724563598632812, -0.6596977710723877, 0.17560836672782898, 0.5724563598632812, - -0.6596977710723877, 0.17560836672782898, 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, - 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, 0.7608169317245483, 0.08603227883577347, - -0.049375515431165695, 0.2705111503601074, 1.42119562625885, 0.032626643776893616, 0.2705111503601074, - 1.42119562625885, 0.032626643776893616, 0.2705111503601074, 1.42119562625885, 0.032626643776893616, - -1.212586522102356, -0.5129594802856445, -0.43296414613723755, -1.212586522102356, -0.5129594802856445, - -0.43296414613723755, -1.212586522102356, -0.5129594802856445, -0.43296414613723755, -0.1606937050819397, - 1.1884371042251587, -0.662174642086029, -0.1606937050819397, 1.1884371042251587, -0.662174642086029, - -0.1606937050819397, 1.1884371042251587, -0.662174642086029, -2.291109323501587, -0.6852569580078125, - 2.325223922729492, -2.291109323501587, -0.6852569580078125, 2.325223922729492, -2.291109323501587, - -0.6852569580078125, 2.325223922729492, -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, - -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, -0.19389064610004425, -0.5784135460853577, - -0.39328137040138245, 0.2831517457962036, 0.4496127665042877, -0.2029038816690445, 0.2831517457962036, - 0.4496127665042877, -0.2029038816690445, 0.2831517457962036, 0.4496127665042877, -0.2029038816690445, - 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, 0.35477763414382935, 0.4266718924045563, - 0.24683749675750732, 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, 1.90426504611969, - -0.4861580729484558, 0.9139055013656616, 1.90426504611969, -0.4861580729484558, 0.9139055013656616, - 1.90426504611969, -0.4861580729484558, 0.9139055013656616, -0.5031066536903381, 0.9583520293235779, - -0.23210509121418, -0.5031066536903381, 0.9583520293235779, -0.23210509121418, -0.5031066536903381, - 0.9583520293235779, -0.23210509121418, -2.291109323501587, -0.6852569580078125, 2.325223922729492, - -2.291109323501587, -0.6852569580078125, 2.325223922729492, -2.291109323501587, -0.6852569580078125, - 2.325223922729492, -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, -0.19389064610004425, - -0.5784135460853577, -0.39328137040138245, -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, - 0.2831517457962036, 0.4496127665042877, -0.2029038816690445, 0.2831517457962036, 0.4496127665042877, - -0.2029038816690445, 0.2831517457962036, 0.4496127665042877, -0.2029038816690445, 0.35477763414382935, - 0.4266718924045563, 0.24683749675750732, 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, - 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, 1.90426504611969, -0.4861580729484558, - 0.9139055013656616, 1.90426504611969, -0.4861580729484558, 0.9139055013656616, 1.90426504611969, - -0.4861580729484558, 0.9139055013656616, -0.5031066536903381, 0.9583520293235779, -0.23210509121418, - -0.5031066536903381, 0.9583520293235779, -0.23210509121418, -0.5031066536903381, 0.9583520293235779, - -0.23210509121418, 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, 1.3183971643447876, - 1.7042455673217773, -0.3201166093349457, 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, - -0.14444805681705475, -0.8829464912414551, 1.725736141204834, -0.14444805681705475, -0.8829464912414551, - 1.725736141204834, -0.14444805681705475, -0.8829464912414551, 1.725736141204834, 0.45657631754875183, - 0.4920198321342468, -1.088847041130066, 0.45657631754875183, 0.4920198321342468, -1.088847041130066, - 0.45657631754875183, 0.4920198321342468, -1.088847041130066, 0.49437597393989563, -0.006085286382585764, - 2.475630760192871, 0.49437597393989563, -0.006085286382585764, 2.475630760192871, 0.49437597393989563, - -0.006085286382585764, 2.475630760192871, 0.12170185893774033, -0.8953945636749268, 1.1430096626281738, - 0.12170185893774033, -0.8953945636749268, 1.1430096626281738, 0.12170185893774033, -0.8953945636749268, - 1.1430096626281738, 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, 1.3278610706329346, - 0.3076854348182678, 0.036237504333257675, 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, - 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, 1.3183971643447876, 1.7042455673217773, - -0.3201166093349457, 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, -0.14444805681705475, - -0.8829464912414551, 1.725736141204834, -0.14444805681705475, -0.8829464912414551, 1.725736141204834, - -0.14444805681705475, -0.8829464912414551, 1.725736141204834, 0.45657631754875183, 0.4920198321342468, - -1.088847041130066, 0.45657631754875183, 0.4920198321342468, -1.088847041130066, 0.45657631754875183, - 0.4920198321342468, -1.088847041130066, 0.49437597393989563, -0.006085286382585764, 2.475630760192871, - 0.49437597393989563, -0.006085286382585764, 2.475630760192871, 0.49437597393989563, -0.006085286382585764, - 2.475630760192871, 0.12170185893774033, -0.8953945636749268, 1.1430096626281738, 0.12170185893774033, - -0.8953945636749268, 1.1430096626281738, 0.12170185893774033, -0.8953945636749268, 1.1430096626281738, - 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, 1.3278610706329346, 0.3076854348182678, - 0.036237504333257675, 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, 0.05180325731635094, - 0.2802475392818451, 0.5289335250854492, 0.05180325731635094, 0.2802475392818451, 0.5289335250854492, - 0.05180325731635094, 0.2802475392818451, 0.5289335250854492, 0.9356630444526672, 0.7863689064979553, - 0.4239695370197296, 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, 0.9356630444526672, - 0.7863689064979553, 0.4239695370197296, 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, - 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, 0.8723016977310181, -0.2248474359512329, - 0.3891502320766449, 0.5463842153549194, -0.7782878875732422, -0.8570080399513245, 0.5463842153549194, - -0.7782878875732422, -0.8570080399513245, 0.5463842153549194, -0.7782878875732422, -0.8570080399513245, - -2.593783378601074, -0.11392943561077118, 0.5637082457542419, -2.593783378601074, -0.11392943561077118, - 0.5637082457542419, -2.593783378601074, -0.11392943561077118, 0.5637082457542419, 2.075004816055298, - -1.0598397254943848, 1.0823975801467896, 2.075004816055298, -1.0598397254943848, 1.0823975801467896, - 2.075004816055298, -1.0598397254943848, 1.0823975801467896, 0.05180325731635094, 0.2802475392818451, - 0.5289335250854492, 0.05180325731635094, 0.2802475392818451, 0.5289335250854492, 0.05180325731635094, - 0.2802475392818451, 0.5289335250854492, 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, - 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, 0.9356630444526672, 0.7863689064979553, - 0.4239695370197296, 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, 0.8723016977310181, - -0.2248474359512329, 0.3891502320766449, 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, - 0.5463842153549194, -0.7782878875732422, -0.8570080399513245, 0.5463842153549194, -0.7782878875732422, - -0.8570080399513245, 0.5463842153549194, -0.7782878875732422, -0.8570080399513245, -2.593783378601074, - -0.11392943561077118, 0.5637082457542419, -2.593783378601074, -0.11392943561077118, 0.5637082457542419, - -2.593783378601074, -0.11392943561077118, 0.5637082457542419, 2.075004816055298, -1.0598397254943848, - 1.0823975801467896, 2.075004816055298, -1.0598397254943848, 1.0823975801467896, 2.075004816055298, - -1.0598397254943848, 1.0823975801467896, 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, - 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, 0.2386120855808258, 0.5549510717391968, - -1.8190287351608276, 0.5724563598632812, -0.6596977710723877, 0.17560836672782898, 0.5724563598632812, - -0.6596977710723877, 0.17560836672782898, 0.5724563598632812, -0.6596977710723877, 0.17560836672782898, - 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, 0.7608169317245483, 0.08603227883577347, - -0.049375515431165695, 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, 0.2705111503601074, - 1.42119562625885, 0.032626643776893616, 0.2705111503601074, 1.42119562625885, 0.032626643776893616, - 0.2705111503601074, 1.42119562625885, 0.032626643776893616, -1.212586522102356, -0.5129594802856445, - -0.43296414613723755, -1.212586522102356, -0.5129594802856445, -0.43296414613723755, -1.212586522102356, - -0.5129594802856445, -0.43296414613723755, -0.1606937050819397, 1.1884371042251587, -0.662174642086029, - -0.1606937050819397, 1.1884371042251587, -0.662174642086029, -0.1606937050819397, 1.1884371042251587, - -0.662174642086029, 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, 0.2386120855808258, - 0.5549510717391968, -1.8190287351608276, 0.2386120855808258, 0.5549510717391968, -1.8190287351608276, - 0.5724563598632812, -0.6596977710723877, 0.17560836672782898, 0.5724563598632812, -0.6596977710723877, - 0.17560836672782898, 0.5724563598632812, -0.6596977710723877, 0.17560836672782898, 0.7608169317245483, - 0.08603227883577347, -0.049375515431165695, 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, - 0.7608169317245483, 0.08603227883577347, -0.049375515431165695, 0.2705111503601074, 1.42119562625885, - 0.032626643776893616, 0.2705111503601074, 1.42119562625885, 0.032626643776893616, 0.2705111503601074, - 1.42119562625885, 0.032626643776893616, -1.212586522102356, -0.5129594802856445, -0.43296414613723755, - -1.212586522102356, -0.5129594802856445, -0.43296414613723755, -1.212586522102356, -0.5129594802856445, - -0.43296414613723755, -0.1606937050819397, 1.1884371042251587, -0.662174642086029, -0.1606937050819397, - 1.1884371042251587, -0.662174642086029, -0.1606937050819397, 1.1884371042251587, -0.662174642086029, - -2.291109323501587, -0.6852569580078125, 2.325223922729492, -2.291109323501587, -0.6852569580078125, - 2.325223922729492, -2.291109323501587, -0.6852569580078125, 2.325223922729492, -0.19389064610004425, - -0.5784135460853577, -0.39328137040138245, -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, - -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, 0.2831517457962036, 0.4496127665042877, - -0.2029038816690445, 0.2831517457962036, 0.4496127665042877, -0.2029038816690445, 0.2831517457962036, - 0.4496127665042877, -0.2029038816690445, 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, - 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, 0.35477763414382935, 0.4266718924045563, - 0.24683749675750732, 1.90426504611969, -0.4861580729484558, 0.9139055013656616, 1.90426504611969, - -0.4861580729484558, 0.9139055013656616, 1.90426504611969, -0.4861580729484558, 0.9139055013656616, - -0.5031066536903381, 0.9583520293235779, -0.23210509121418, -0.5031066536903381, 0.9583520293235779, - -0.23210509121418, -0.5031066536903381, 0.9583520293235779, -0.23210509121418, -2.291109323501587, - -0.6852569580078125, 2.325223922729492, -2.291109323501587, -0.6852569580078125, 2.325223922729492, - -2.291109323501587, -0.6852569580078125, 2.325223922729492, -0.19389064610004425, -0.5784135460853577, - -0.39328137040138245, -0.19389064610004425, -0.5784135460853577, -0.39328137040138245, -0.19389064610004425, - -0.5784135460853577, -0.39328137040138245, 0.2831517457962036, 0.4496127665042877, -0.2029038816690445, - 0.2831517457962036, 0.4496127665042877, -0.2029038816690445, 0.2831517457962036, 0.4496127665042877, - -0.2029038816690445, 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, 0.35477763414382935, - 0.4266718924045563, 0.24683749675750732, 0.35477763414382935, 0.4266718924045563, 0.24683749675750732, - 1.90426504611969, -0.4861580729484558, 0.9139055013656616, 1.90426504611969, -0.4861580729484558, - 0.9139055013656616, 1.90426504611969, -0.4861580729484558, 0.9139055013656616, -0.5031066536903381, - 0.9583520293235779, -0.23210509121418, -0.5031066536903381, 0.9583520293235779, -0.23210509121418, - -0.5031066536903381, 0.9583520293235779, -0.23210509121418, 1.3183971643447876, 1.7042455673217773, - -0.3201166093349457, 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, 1.3183971643447876, - 1.7042455673217773, -0.3201166093349457, -0.14444805681705475, -0.8829464912414551, 1.725736141204834, - -0.14444805681705475, -0.8829464912414551, 1.725736141204834, -0.14444805681705475, -0.8829464912414551, - 1.725736141204834, 0.45657631754875183, 0.4920198321342468, -1.088847041130066, 0.45657631754875183, - 0.4920198321342468, -1.088847041130066, 0.45657631754875183, 0.4920198321342468, -1.088847041130066, - 0.49437597393989563, -0.006085286382585764, 2.475630760192871, 0.49437597393989563, -0.006085286382585764, - 2.475630760192871, 0.49437597393989563, -0.006085286382585764, 2.475630760192871, 0.12170185893774033, - -0.8953945636749268, 1.1430096626281738, 0.12170185893774033, -0.8953945636749268, 1.1430096626281738, - 0.12170185893774033, -0.8953945636749268, 1.1430096626281738, 1.3278610706329346, 0.3076854348182678, - 0.036237504333257675, 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, 1.3278610706329346, - 0.3076854348182678, 0.036237504333257675, 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, - 1.3183971643447876, 1.7042455673217773, -0.3201166093349457, 1.3183971643447876, 1.7042455673217773, - -0.3201166093349457, -0.14444805681705475, -0.8829464912414551, 1.725736141204834, -0.14444805681705475, - -0.8829464912414551, 1.725736141204834, -0.14444805681705475, -0.8829464912414551, 1.725736141204834, - 0.45657631754875183, 0.4920198321342468, -1.088847041130066, 0.45657631754875183, 0.4920198321342468, - -1.088847041130066, 0.45657631754875183, 0.4920198321342468, -1.088847041130066, 0.49437597393989563, - -0.006085286382585764, 2.475630760192871, 0.49437597393989563, -0.006085286382585764, 2.475630760192871, - 0.49437597393989563, -0.006085286382585764, 2.475630760192871, 0.12170185893774033, -0.8953945636749268, - 1.1430096626281738, 0.12170185893774033, -0.8953945636749268, 1.1430096626281738, 0.12170185893774033, - -0.8953945636749268, 1.1430096626281738, 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, - 1.3278610706329346, 0.3076854348182678, 0.036237504333257675, 1.3278610706329346, 0.3076854348182678, - 0.036237504333257675, 0.05180325731635094, 0.2802475392818451, 0.5289335250854492, 0.05180325731635094, - 0.2802475392818451, 0.5289335250854492, 0.05180325731635094, 0.2802475392818451, 0.5289335250854492, - 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, 0.9356630444526672, 0.7863689064979553, - 0.4239695370197296, 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, 0.8723016977310181, - -0.2248474359512329, 0.3891502320766449, 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, - 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, 0.5463842153549194, -0.7782878875732422, - -0.8570080399513245, 0.5463842153549194, -0.7782878875732422, -0.8570080399513245, 0.5463842153549194, - -0.7782878875732422, -0.8570080399513245, -2.593783378601074, -0.11392943561077118, 0.5637082457542419, - -2.593783378601074, -0.11392943561077118, 0.5637082457542419, -2.593783378601074, -0.11392943561077118, - 0.5637082457542419, 2.075004816055298, -1.0598397254943848, 1.0823975801467896, 2.075004816055298, - -1.0598397254943848, 1.0823975801467896, 2.075004816055298, -1.0598397254943848, 1.0823975801467896, - 0.05180325731635094, 0.2802475392818451, 0.5289335250854492, 0.05180325731635094, 0.2802475392818451, - 0.5289335250854492, 0.05180325731635094, 0.2802475392818451, 0.5289335250854492, 0.9356630444526672, - 0.7863689064979553, 0.4239695370197296, 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, - 0.9356630444526672, 0.7863689064979553, 0.4239695370197296, 0.8723016977310181, -0.2248474359512329, - 0.3891502320766449, 0.8723016977310181, -0.2248474359512329, 0.3891502320766449, 0.8723016977310181, - -0.2248474359512329, 0.3891502320766449, 0.5463842153549194, -0.7782878875732422, -0.8570080399513245, - 0.5463842153549194, -0.7782878875732422, -0.8570080399513245, 0.5463842153549194, -0.7782878875732422, - -0.8570080399513245, -2.593783378601074, -0.11392943561077118, 0.5637082457542419, -2.593783378601074, - -0.11392943561077118, 0.5637082457542419, -2.593783378601074, -0.11392943561077118, 0.5637082457542419, - 2.075004816055298, -1.0598397254943848, 1.0823975801467896, 2.075004816055298, -1.0598397254943848, - 1.0823975801467896, 2.075004816055298, -1.0598397254943848, 1.0823975801467896, -}; -} // namespace ComplexTile_ExpectedOutput diff --git a/tmva/sofie/test/input_models/references/TopK.ref.hxx b/tmva/sofie/test/input_models/references/TopK.ref.hxx deleted file mode 100644 index 71537a019f183..0000000000000 --- a/tmva/sofie/test/input_models/references/TopK.ref.hxx +++ /dev/null @@ -1,6 +0,0 @@ -namespace TopK_ExpectedOutput { -float values[] = { - 9.0000, 8.0000, 7.4000, 4.5000, 4.0000}; - -float indexes[] = {0, 1, 8, 2, 6}; -} // namespace TopK_ExpectedOutput diff --git a/tmva/sofie/test/test_helpers.h b/tmva/sofie/test/test_helpers.h index 66bd31fe150ac..277366db32bce 100644 --- a/tmva/sofie/test/test_helpers.h +++ b/tmva/sofie/test/test_helpers.h @@ -2,14 +2,109 @@ #include #include #include +#include #include #include +#include #include #include +#include "gtest/gtest.h" + constexpr float DEFAULT_TOLERANCE = 1e-3f; +/// Reference data for one model: the test inputs and the expected outputs, +/// read from the references/.ref file that generate_input_models.py +/// writes next to the generated ONNX models. Entries are keyed "input0", +/// "input1", ... (one per graph input, in graph order) and "output0", ... +/// (one per graph output). +class SofieReference { +public: + const std::vector &f32(std::string const &key) const { return at(fF32, key); } + const std::vector &f64(std::string const &key) const { return at(fF64, key); } + const std::vector &i64(std::string const &key) const { return at(fI64, key); } + const std::vector &u8(std::string const &key) const { return at(fU8, key); } + + std::map> fF32; + std::map> fF64; + std::map> fI64; + std::map> fU8; + +private: + template + static const typename Map::mapped_type &at(Map const &m, std::string const &key) + { + auto it = m.find(key); + if (it == m.end()) + throw std::runtime_error("no reference data entry \"" + key + "\" of this type"); + return it->second; + } +}; + +inline SofieReference readReference(std::string const &modelName) +{ + const std::string path = "input_models/references/" + modelName + ".ref"; + std::ifstream in(path); + if (!in) + throw std::runtime_error("cannot open reference data file " + path + + " (it is written by the SofieGenerateModels_ONNX test)"); + SofieReference ref; + std::string key, type; + std::size_t count; + while (in >> key >> type >> count) { + bool ok = true; + if (type == "f32") { + auto &v = ref.fF32[key]; + v.resize(count); + for (auto &x : v) + ok &= bool(in >> x); + } else if (type == "f64") { + auto &v = ref.fF64[key]; + v.resize(count); + for (auto &x : v) + ok &= bool(in >> x); + } else if (type == "i64") { + auto &v = ref.fI64[key]; + v.resize(count); + for (auto &x : v) + ok &= bool(in >> x); + } else if (type == "u8") { + auto &v = ref.fU8[key]; + v.resize(count); + for (auto &x : v) { + int tmp; + ok &= bool(in >> tmp); + x = static_cast(tmp); + } + } else { + ok = false; + } + if (!ok) + throw std::runtime_error("malformed reference data file " + path + " at entry \"" + key + "\""); + } + return ref; +} + +/// Element-wise |output - expected| <= tolerance +template +void expectNear(std::vector const &output, std::vector const &expected, float tolerance) +{ + ASSERT_EQ(output.size(), expected.size()); + for (std::size_t i = 0; i < output.size(); ++i) + EXPECT_LE(std::abs(static_cast(output[i]) - static_cast(expected[i])), tolerance) + << "at output index " << i; +} + +/// Element-wise exact equality +template +void expectEqual(std::vector const &output, std::vector const &expected) +{ + ASSERT_EQ(output.size(), expected.size()); + for (std::size_t i = 0; i < output.size(); ++i) + EXPECT_EQ(static_cast(output[i]), static_cast(expected[i])) << "at output index " << i; +} + bool includeModel(std::string const &modelName) { const std::string header = modelName + modelHeaderSuffix; diff --git a/tutorials/CMakeLists.txt b/tutorials/CMakeLists.txt index 3297527a27e8f..6897acce3dbd0 100644 --- a/tutorials/CMakeLists.txt +++ b/tutorials/CMakeLists.txt @@ -384,11 +384,18 @@ else() list(APPEND tmva_veto machine_learning/TMVA_SOFIE_GNN.py) list(APPEND tmva_veto machine_learning/TMVA_SOFIE_GNN_Application.C) endif() - if (NOT tmva-sofie) + if (NOT tmva-sofie OR NOT ROOT_ONNX_FOUND) list(APPEND tmva_veto machine_learning/TMVA_SOFIE_ONNX.C) else() - #copy ONNX file needed for the tutorial - configure_file(${CMAKE_SOURCE_DIR}/tmva/sofie/test/input_models/Linear_16.onnx ${CMAKE_BINARY_DIR}/tutorials/machine_learning/Linear_16.onnx COPYONLY) + #generate ONNX file needed for the tutorial + execute_process( + COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tmva/sofie/test/generate_input_models.py + --no-references --outdir ${CMAKE_BINARY_DIR}/tutorials/machine_learning Linear_16 + RESULT_VARIABLE _sofie_onnx_gen_status) + if (NOT _sofie_onnx_gen_status EQUAL 0) + message(WARNING "Could not generate Linear_16.onnx: the TMVA_SOFIE_ONNX.C tutorial will be disabled.") + list(APPEND tmva_veto machine_learning/TMVA_SOFIE_ONNX.C) + endif() endif() endif()