ROOT
master
Reference Guide
Loading...
Searching...
No Matches
ParseGRU.cxx
Go to the documentation of this file.
1
#include "
TMVA/RModelParser_ONNX.hxx
"
2
#include "
TMVA/ROperator_GRU.hxx
"
3
#include "
onnx.hxx
"
4
5
namespace
TMVA
{
6
namespace
Experimental {
7
namespace
SOFIE {
8
9
ParserFuncSignature
ParseGRU
= [](
RModelParser_ONNX
&
parser
,
const
onnx::NodeProto
&
nodeproto
) {
10
ETensorType
input_type
;
11
12
auto
input_name
=
nodeproto
.input(0);
13
if
(
parser
.IsRegisteredTensorType(
input_name
)) {
14
input_type
=
parser
.GetTensorType(
input_name
);
15
}
else
{
16
throw
std::runtime_error(
"TMVA::SOFIE ONNX Parser GRU op has input tensor "
+
input_name
+
17
" but its type is not yet registered"
);
18
}
19
20
std::unique_ptr<ROperator>
op
;
21
22
std::vector<float>
attr_activation_alpha
;
23
std::vector<float>
attr_activation_beta
;
24
std::vector<std::string>
attr_activations
;
25
float
attr_clip
= 0.;
26
std::string
attr_direction
=
"forward"
;
27
size_t
attr_hidden_size
= 0;
28
size_t
attr_layout
= 0;
29
size_t
attr_linear_before_reset
= 0;
30
31
for
(
int_t
i = 0; i <
nodeproto
.attribute_size(); i++) {
32
std::string
attribute_name
=
nodeproto
.attribute(i).name();
33
if
(
attribute_name
==
"activation_alpha"
) {
34
attr_activation_alpha
= {
nodeproto
.attribute(i).floats().
begin
(),
nodeproto
.attribute(i).floats().
end
()};
35
}
else
if
(
attribute_name
==
"activation_beta"
) {
36
attr_activation_beta
= {
nodeproto
.attribute(i).floats().
begin
(),
nodeproto
.attribute(i).floats().
end
()};
37
}
else
if
(
attribute_name
==
"activations"
) {
38
attr_activations
= {
nodeproto
.attribute(i).strings().
begin
(),
nodeproto
.attribute(i).strings().
end
()};
39
}
else
if
(
attribute_name
==
"clip"
) {
40
attr_clip
=
nodeproto
.attribute(i).f();
41
}
else
if
(
attribute_name
==
"direction"
) {
42
attr_direction
=
nodeproto
.attribute(i).s();
43
}
else
if
(
attribute_name
==
"hidden_size"
) {
44
attr_hidden_size
=
nodeproto
.attribute(i).i();
45
}
else
if
(
attribute_name
==
"layout"
) {
46
attr_layout
=
nodeproto
.attribute(i).i();
47
}
else
if
(
attribute_name
==
"linear_before_reset"
) {
48
attr_linear_before_reset
=
nodeproto
.attribute(i).i();
49
}
else
{
50
std::cout <<
"TMVA SOFIE Warning - Model Loading - Attribute "
<<
attribute_name
<<
" in OperatorNode "
51
<<
nodeproto
.name() <<
" is not defined in ONNX IR and not applied!\n"
;
52
}
53
}
54
55
// Optional inputs and outputs
56
std::string
name_b
;
57
std::string
name_sequence_lens
;
58
std::string
name_initial_h
;
59
std::string
name_y
;
60
std::string
name_y_h
;
61
if
(
nodeproto
.input_size() > 3) {
62
name_b
=
nodeproto
.input(3);
63
}
64
if
(
nodeproto
.input_size() > 4) {
65
name_sequence_lens
=
nodeproto
.input(4);
66
}
67
if
(
nodeproto
.input_size() > 5) {
68
name_initial_h
=
nodeproto
.input(5);
69
}
70
if
(
nodeproto
.output_size() > 0) {
71
name_y
=
nodeproto
.output(0);
72
}
73
if
(
nodeproto
.output_size() > 1) {
74
name_y_h
=
nodeproto
.output(1);
75
}
76
77
switch
(
input_type
) {
78
case
ETensorType::FLOAT
:
79
op
.reset(
new
ROperator_GRU<float>
(
attr_activation_alpha
,
attr_activation_beta
,
attr_activations
,
attr_clip
,
80
attr_direction
,
attr_hidden_size
,
attr_layout
,
attr_linear_before_reset
,
81
nodeproto
.input(0),
nodeproto
.input(1),
nodeproto
.input(2),
name_b
,
82
name_sequence_lens
,
name_initial_h
,
name_y
,
name_y_h
));
83
break
;
84
default
:
85
throw
std::runtime_error(
"TMVA::SOFIE - Unsupported - Operator GRU does not yet support input type "
+
86
std::to_string(
static_cast<
int
>
(
input_type
)));
87
}
88
89
if
(!
parser
.IsRegisteredTensorType(
name_y
)) {
90
parser
.RegisterTensorType(
name_y
,
input_type
);
91
}
92
if
(!
parser
.IsRegisteredTensorType(
name_y_h
)) {
93
parser
.RegisterTensorType(
name_y_h
,
input_type
);
94
}
95
96
return
op
;
97
};
98
99
}
// namespace SOFIE
100
}
// namespace Experimental
101
}
// namespace TMVA
RModelParser_ONNX.hxx
ROperator_GRU.hxx
TRangeDynCast
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Definition
TCollection.h:359
ROOT::Detail::TRangeCast
Definition
TCollection.h:312
ROOT::RRangeCast::begin
const_iterator begin() const
Definition
RRangeCast.hxx:103
ROOT::RRangeCast::end
const_iterator end() const
Definition
RRangeCast.hxx:104
TMVA::Experimental::SOFIE::RModelParser_ONNX
Definition
RModelParser_ONNX.hxx:30
TMVA::Experimental::SOFIE::onnx::NodeProto
Definition
onnx.hxx:504
TMVA::Experimental::SOFIE::ETensorType
ETensorType
Definition
SOFIE_common.hxx:29
TMVA::Experimental::SOFIE::ETensorType::FLOAT
@ FLOAT
TMVA::Experimental::SOFIE::ParserFuncSignature
std::function< std::unique_ptr< ROperator >(RModelParser_ONNX &, const onnx::NodeProto &)> ParserFuncSignature
Definition
RModelParser_ONNX.hxx:25
TMVA::Experimental::SOFIE::ParseGRU
ParserFuncSignature ParseGRU
Definition
ParseGRU.cxx:9
TMVA::Experimental::SOFIE::int_t
std::int64_t int_t
Definition
SOFIE_common.hxx:56
TMVA
create variable transformations
Definition
GeneticMinimizer.h:22
onnx.hxx
tmva
sofie_parsers
src
ParseGRU.cxx
ROOTmaster - Reference Guide Generated on Sat Sep 5 2026 04:37:47 (GVA Time) using Doxygen 1.10.0