Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
ParseBasicNary.cxx
Go to the documentation of this file.
3#include "onnx.hxx"
4#include <memory>
5
6namespace TMVA {
7namespace Experimental {
8namespace SOFIE {
9
10template<EBasicNaryOperator Op>
11std::unique_ptr<ROperator> ParseBasicNary(RModelParser_ONNX& parser, const onnx::NodeProto& nodeproto) {
13 std::vector<std::string> inputs;
14 size_t size = nodeproto.input_size();
15 inputs.reserve(size);
16 for (int i = 0; i < nodeproto.input_size(); ++i) {
17 auto input_name = nodeproto.input(i);
18 if (parser.IsRegisteredTensorType(input_name)) {
19 if (i == 0)
20 input_type = parser.GetTensorType(input_name);
21 else
22 assert(parser.GetTensorType(input_name) == input_type);
23 } else {
24 throw std::runtime_error("TMVA::SOFIE ONNX Parser " + nodeproto.op_type() + " op has input tensor " +
25 input_name + " but its type is not yet registered");
26 }
27 inputs.emplace_back(input_name);
28 }
29
30 std::unique_ptr<ROperator> op;
31 std::string output_name = nodeproto.output(0);
32
33 switch (input_type) {
34 case ETensorType::FLOAT: op.reset(new ROperator_BasicNary<float, Op>(inputs, output_name)); break;
35 case ETensorType::DOUBLE: op.reset(new ROperator_BasicNary<double, Op>(inputs, output_name)); break;
36 case ETensorType::INT32: op.reset(new ROperator_BasicNary<int32_t, Op>(inputs, output_name)); break;
37 case ETensorType::INT64: op.reset(new ROperator_BasicNary<int64_t, Op>(inputs, output_name)); break;
38 default:
39 throw std::runtime_error("TMVA::SOFIE - Unsupported - Operator " + nodeproto.op_type() +
40 " does not yet support input type " + ConvertTypeToString(input_type));
41 }
42
43 if (!parser.IsRegisteredTensorType(output_name)) {
44 parser.RegisterTensorType(output_name, input_type);
45 }
46
47 return op;
48}
49
51{
52 parser.RegisterOperator("Max", ParseBasicNary<EBasicNaryOperator::Max>);
53 parser.RegisterOperator("Min", ParseBasicNary<EBasicNaryOperator::Min>);
54 parser.RegisterOperator("Mean", ParseBasicNary<EBasicNaryOperator::Mean>);
55 parser.RegisterOperator("Sum", ParseBasicNary<EBasicNaryOperator::Sum>);
56}
57
58} // namespace SOFIE
59} // namespace Experimental
60} // namespace TMVA
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
void RegisterOperator(const std::string &name, ParserFuncSignature func)
void RegisterTensorType(const std::string &, ETensorType)
ETensorType GetTensorType(const std::string &name)
const std::string & op_type() const
Definition onnx.hxx:506
const std::string & input(int i) const
Definition onnx.hxx:509
const std::string & output(int i) const
Definition onnx.hxx:512
std::unique_ptr< ROperator > ParseBasicNary(RModelParser_ONNX &parser, const onnx::NodeProto &nodeproto)
std::string ConvertTypeToString(ETensorType type)
void RegisterBasicNaryParsers(RModelParser_ONNX &parser)
create variable transformations