Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
ParseComparision.cxx
Go to the documentation of this file.
3#include "onnx.hxx"
4
5namespace TMVA {
6namespace Experimental {
7namespace SOFIE {
8
9template <EComparisionOperator Op>
10std::unique_ptr<ROperator> ParseComparision(RModelParser_ONNX &parser, const onnx::NodeProto &nodeproto)
11{
13
14 for (int i = 0; i < 2; ++i) {
15 auto input_name = nodeproto.input(i);
16 if (parser.IsRegisteredTensorType(input_name)) {
17 // according to ONNX both inputs have same type
18 if (i == 0)
19 input_type = parser.GetTensorType(input_name);
20 else
21 if (input_type != parser.GetTensorType(input_name)) {
22 throw
23 std::runtime_error("TMVA::SOFIE ONNX parser Comparision op has input tensors of different types");
24 }
25 } else {
26 throw std::runtime_error("TMVA::SOFIE ONNX Parser Comparision op has input tensor " + input_name +
27 " but its type is not yet registered");
28 }
29 }
30
31
32 std::string output_name = nodeproto.output(0);
33
34 std::unique_ptr<ROperator> op;
35 switch (input_type) {
37 op.reset(new ROperator_Comparision<float, Op>(nodeproto.input(0), nodeproto.input(1), output_name));
38 break;
40 op.reset(new ROperator_Comparision<int64_t, Op>(nodeproto.input(0), nodeproto.input(1), output_name));
41 break;
43 op.reset(new ROperator_Comparision<int32_t, Op>(nodeproto.input(0), nodeproto.input(1), output_name));
44 break;
45 default:
46 throw std::runtime_error("TMVA::SOFIE - Unsupported - Comparision Operator does not yet support input type " +
47 ConvertTypeToString(input_type));
48 }
49
50 // Infer the output type
51 if (!parser.IsRegisteredTensorType(output_name)) {
52 parser.RegisterTensorType(output_name, ETensorType::BOOL);
53 }
54
55 return op;
56};
57
59{
60 parser.RegisterOperator("Equal", ParseComparision<EComparisionOperator::Eq>);
61 parser.RegisterOperator("Less", ParseComparision<EComparisionOperator::Less>);
62 parser.RegisterOperator("LessOrEqual", ParseComparision<EComparisionOperator::LessEq>);
63 parser.RegisterOperator("Greater", ParseComparision<EComparisionOperator::Greater>);
64 parser.RegisterOperator("GreaterOrEqual", ParseComparision<EComparisionOperator::GreaterEq>);
65}
66
67} // namespace SOFIE
68} // namespace Experimental
69} // namespace TMVA
void RegisterOperator(const std::string &name, ParserFuncSignature func)
void RegisterTensorType(const std::string &, ETensorType)
ETensorType GetTensorType(const std::string &name)
const std::string & input(int i) const
Definition onnx.hxx:509
const std::string & output(int i) const
Definition onnx.hxx:512
void RegisterComparisionParsers(RModelParser_ONNX &parser)
std::string ConvertTypeToString(ETensorType type)
std::unique_ptr< ROperator > ParseComparision(RModelParser_ONNX &parser, const onnx::NodeProto &nodeproto)
create variable transformations