16#include <unordered_map>
21namespace Experimental {
110 throw std::runtime_error(
"TMVA::SOFIE - Failed to read float initialized tensor - actual size is " + std::to_string(tensor->
float_data_size()));
112 std::copy(
src.begin(),
src.end(),
static_cast<float *
>(
data));
119 throw std::runtime_error(
"TMVA::SOFIE - Failed to read double initialized tensor - actual size is " + std::to_string(tensor->
double_data_size()));
121 std::copy(
src.begin(),
src.end(),
static_cast<double *
>(
data));
128 throw std::runtime_error(
"TMVA::SOFIE - Failed to read int32 initialized tensor - actual size is " + std::to_string(tensor->
int32_data_size()));
130 std::copy(
src.begin(),
src.end(),
static_cast<int32_t *
>(
data));
137 throw std::runtime_error(
"TMVA::SOFIE - Failed to read int64 initialized tensor - actual size is " + std::to_string(tensor->
int64_data_size()));
139 std::copy(
src.begin(),
src.end(),
static_cast<int64_t *
>(
data));
149template <std::
size_t N>
150void CopyBswap(
void *
dest,
const void *source, std::size_t nbytes)
153 auto dst =
static_cast<unsigned char *
>(
dest);
154 auto src =
static_cast<const unsigned char *
>(source);
155 for (std::size_t k = 0; k < nbytes; k +=
N) {
157 std::memcpy(&
v,
src + k,
N);
159 std::memcpy(
dst + k, &
v,
N);
164void CopyLEToHost(
void *
dest,
const void *source, std::size_t nbytes, ETensorType tensor_type)
169 std::memcpy(
dest, source, nbytes);
171 case 2: CopyBswap<2>(
dest, source, nbytes);
break;
172 case 4: CopyBswap<4>(
dest, source, nbytes);
break;
173 case 8: CopyBswap<8>(
dest, source, nbytes);
break;
175 throw std::runtime_error(
"Data type " +
ConvertTypeToString(tensor_type) +
" in tensor is not supported!\n");
185 std::shared_ptr<void>
data(malloc(tensor_size), free);
189 if (tensorproto->
raw_data().size() > 0) {
190 if (tensorproto->
raw_data().size() != tensor_size)
191 throw std::runtime_error(
"TMVA::SOFIE - Failed to read raw data of initialized tensor - actual raw size is " +
192 std::to_string(tensorproto->
raw_data().size()));
196 std::memcpy(
data.get(), tensorproto->
raw_data().c_str(), tensor_size);
199 CopyLEToHost(
data.get(), tensorproto->
raw_data().c_str(), tensor_size, tensor_type);
203 switch (tensor_type) {
221 throw std::runtime_error(
"TMVA::SOFIE - ExtractData from TP in BOOL not supported");
225 throw std::runtime_error(
"TMVA::SOFIE - ExtractData from TP in UINT8 not supported");
229 throw std::runtime_error(
"Data type " +
ConvertTypeToString(tensor_type) +
" in weight tensor is not supported!\n");
237 std::string location;
238 size_t offset = 0, buffer_size = 0;
241 if (kv.key() ==
"location") location = kv.value();
242 else if (kv.key() ==
"offset")
offset = std::stoull(kv.value());
243 else if (kv.key() ==
"length") buffer_size = std::stoull(kv.value());
251 if (dataFileName.empty())
253 if (dataFileName.empty())
254 throw std::runtime_error(
"TMVA::SOFIE ONNX : tensor " + tensorproto->
name() +
255 " has external data but no data file location is available");
258 std::cout <<
"Initialized data are stored externally in file " << dataFileName
259 <<
" at location " << location <<
" offset " <<
offset <<
" and with length " << buffer_size << std::endl;
261 if (buffer_size != tensor_size)
262 throw std::runtime_error(
"TMVA::SOFIE ONNX : invalid stored data size vs tensor size");
268 fDataFile.open(dataFileName, std::ios::binary);
270 throw std::runtime_error(
"TMVA::SOFIE ONNX: error reading external weight ONNX data file " + dataFileName);
275 fDataFile.read(
reinterpret_cast<char *
>(
data.get()), buffer_size);
278 CopyLEToHost(
data.get(),
data.get(), buffer_size, tensor_type);
379 std::vector<std::string> ops;
382 ops.emplace_back(it.first);
385 std::sort(ops.begin(), ops.end());
415 const std::string &added = (addnode.
input(0) == convnode.
output(0)) ? addnode.
input(1) : addnode.
input(0);
426std::unique_ptr<ROperator>
429 if (i >= nodes.size())
430 throw std::runtime_error(
"TMVA::SOFIE - Error in parsing ordered operators " + std::to_string(i) +
" is >= " + std::to_string(nodes.size()));
432 const auto &nodeproto = graphproto.
node(idx);
433 const std::string op_type = nodeproto.
op_type();
435 std::cout <<
"Parsing operator " << op_type << std::endl;
441 std::cout <<
"\tFusing operators " << graphproto.
node(idx1).
name()
442 <<
" with " << graphproto.
node(idx1).
name() << std::endl;
458 if (children.size() == 1) {
459 int idx2 = children.front();
460 if (op_type ==
"MatMul") {
466 }
else if (nodeproto.op_type() ==
"Conv" || nodeproto.op_type() ==
"ConvTranspose") {
469 IsConvBiasAdd(graphproto, nodeproto, graphproto.
node(idx2))) {
470 if (nodeproto.op_type() ==
"Conv") {
478 }
else if (nodeproto.op_type() ==
"Gemm") {
484 }
else if (nodeproto.op_type() ==
"BatchNormalization") {
494 std::cout <<
"operator " << op_type <<
" is not supported" << std::endl;
495 throw std::runtime_error(
"TMVA::SOFIE Operator type " + op_type +
" is not yet supported");
498 std::cout <<
"\tCreating operator " << op_type << std::endl;
500 return it->second(*
this, nodeproto);
512 throw std::runtime_error(
"TMVA::SOFIE - Failed to load onnx file " +
filename);
517 std::time_t ttime = std::time(0);
518 std::tm *gmt_time = std::gmtime(&ttime);
519 std::string parsetime(std::asctime(gmt_time));
527 std::string filename_nodir =
filename;
528 if (isep != std::string::npos) {
535 RModel rmodel(filename_nodir, parsetime);
549 throw std::runtime_error(
"TMVA::SOFIE - Failed to parse ONNX model from input stream");
553 std::time_t ttime = std::time(0);
554 std::tm *gmt_time = std::gmtime(&ttime);
555 std::string parsetime(std::asctime(gmt_time));
577 std::fstream
input(
filename, std::ios::in | std::ios::binary);
579 std::cerr <<
"TMVA::SOFIE - Failed to open onnx file " <<
filename << std::endl;
588 auto model = std::make_unique<onnx::ModelProto>();
590 if (!model->ParseFromIstream(&
input)) {
591 std::cerr <<
"TMVA::SOFIE - Failed to parse ONNX model from input stream" << std::endl;
597 std::cout <<
"ONNX Version " << model->ir_version() << std::endl;
604 std::cout <<
"\n" << graph.
name() <<
" Graph operator list\n";
605 for (
int i = 0; i < graph.
node_size(); i++) {
606 const auto & node = graph.
node(i);
607 const std::string opType = node.
op_type();
609 std::cout <<
"\tOperator " << i <<
" : " << opType <<
" (" << node.name() <<
"), " << graph.
node(i).
input_size()
611 for (
int j = 0; j < graph.
node(i).input_size(); j++) {
616 std::cout <<
" }" << std::endl;
620 missingOperators[opType] = level;
622 for (
int j = 0; j < node.attribute_size(); j++) {
623 const auto & attribute = node.attribute(j);
624 if (attribute.has_g()) {
625 const auto & subGraph = attribute.g();
627 CheckGraph(subGraph, level, missingOperators);
637 if (!model)
return false;
642 std::cout <<
"\nModel operator list " << model->producer_name() <<
"\n";
644 std::map<std::string, int> missingOperators;
648 if (!missingOperators.empty()) {
649 std::cout <<
"List of missing operators for model loaded from file " <<
filename << std::endl;
650 for (
auto & op : missingOperators) {
651 std::cout << op.first <<
" " << op.second << std::endl;
655 std::cout <<
"All operators in the loaded model are supported!\n";
663 if (graphName.empty())
664 graphName = graph.
name();
667 std::cout <<
"\nParsing Graph - " << graphName << std::endl;
672 struct FusedOperatorsGuard {
673 std::map<int, std::pair<EFusedOp, int>> &fMap;
674 std::map<int, std::pair<EFusedOp, int>> fSaved;
675 FusedOperatorsGuard(std::map<
int, std::pair<EFusedOp, int>> &map) : fMap(map) { fSaved.swap(fMap); }
676 ~FusedOperatorsGuard() { fMap.swap(fSaved); }
679 std::unordered_set<std::string> initializer_names;
685 std::cout <<
"Parsing model inputs...." << std::endl;
687 for (
int i = 0; i < graph.
input_size(); i++) {
692 std::cout <<
"\tgraph input " << i <<
" name " << graph.
input(i).
name() <<
" type "
695 if (initializer_names.find(graph.
input(i).
name()) != initializer_names.end())
700 std::string input_name = valueinfoproto.
name();
705 bool existParam =
false;
707 throw std::runtime_error(
"TMVA::SOFIE data node with no shape restrictions is not supported yet");
726 throw std::runtime_error(
"TMVA::SOFIE ONNX file error: Valueinfoproto " + input_name +
727 " has neither dim_value nor dim_param! \n");
738 std::vector<size_t> fShape_sizet;
740 fShape_sizet.push_back(j.dim);
750 std::map<std::string, int> allInitializedTensors;
753 std::cout <<
"\nParsing graph initializer list and fill model initialized tensors" << std::endl;
757 std::vector<std::size_t> shape;
758 std::size_t tensor_length = 1;
759 for (
int j = 0; j < tensorproto->
dims_size(); j++) {
760 shape.push_back(tensorproto->
dims(j));
761 tensor_length *= tensorproto->
dims(j);
768 std::cout <<
"\t initializer " << i <<
" name " << tensor_name <<
" type " << graph.
initializer(i).
data_type()
769 <<
" and length " << tensor_length << std::endl;
778 allInitializedTensors[tensor_name] = i;
781 std::cout <<
"add initialized tensor " << tensor_name <<
"with shape " <<
ConvertShapeToString(shape) <<
"and ";
783 std::cout <<
" float data: ";
784 for (
int j = 0; j < std::min(int(tensor_length),3); j++) std::cout << static_cast<float*>(
data.get())[j] <<
" ";
787 std::cout <<
" int64 data: ";
788 for (
int j = 0; j < std::min(int(tensor_length),3); j++) std::cout << static_cast<int64_t*>(
data.get())[j] <<
" ";
791 std::cout <<
" uint8 data: ";
792 for (
int j = 0; j < std::min(int(tensor_length),3); j++) std::cout << static_cast<uint8_t*>(
data.get())[j] <<
" ";
795 std::cout <<
" Boolean data: ";
796 for (
int j = 0; j < std::min(int(tensor_length),3); j++) std::cout << static_cast<bool*>(
data.get())[j] <<
" ";
798 std::cout << std::endl;
804 std::cout <<
"\nGraph operator list (ONNX order)\n";
805 for (
int i = 0; i < graph.
node_size(); i++) {
808 for (
int j = 0; j < graph.
node(i).input_size(); j++) {
813 std::cout <<
" }" << std::endl;
819 std::cout <<
"\n***********************\nRe-Order graph operator list\n*************************\n";
820 std::vector<size_t> nodesOrder;
822 std::vector<bool> foundNodes(graph.
node_size());
825 std::map<std::string, int> allInputs;
826 for (
int i = 0; i < graph.
input_size(); i++) {
830 auto psize = nodesOrder.size();
831 for (
int i = 0; i < graph.
node_size(); i++) {
835 bool existInputs =
true;
839 std::cout <<
"Checking input of Node " << i <<
" : " << graph.
node(i).
name() << std::endl;
840 for (
int j = 0; j < input_size; j++) {
844 existInputs &= (allInputs.find(
name) != allInputs.end() ||
845 allInitializedTensors.find(
name) != allInitializedTensors.end());
847 std::cout <<
"\t\t input " <<
name <<
" "
848 <<
bool(allInputs.find(
name) != allInputs.end()) <<
" " <<
849 bool(allInitializedTensors.find(
name) != allInitializedTensors.end()) <<
" " <<
850 existInputs << std::endl;
856 std::cout <<
"skip node " << graph.
node(i).
op_type() <<
" " << graph.
node(i).
name() <<
" inputs are not existing ";
857 for (
int j = 0; j < input_size; j++) {
858 std::cout << graph.
node(i).
input(j) <<
" ";
860 std::cout << std::endl;
867 std::cout <<
"===> New node " << graph.
node(i).
op_type() <<
" " << graph.
node(i).
name() <<
" order " << i << std::endl;
869 nodesOrder.push_back(i);
870 foundNodes[i] =
true;
872 for (
int j = 0; j < graph.
node(i).output_size(); j++) {
878 if (nodesOrder.size() == psize) {
879 int ilast = nodesOrder.back();
880 std::cout <<
"cannot find a new node after " << graph.
node(ilast).
op_type() <<
" " << graph.
node(ilast).
name() << std::endl;
881 throw std::runtime_error(
"TMVA::SOFIE - cannot find a new node ");
883 }
while ((
int)nodesOrder.size() < graph.
node_size());
887 std::vector<std::vector<int>> nodesChildren(graph.
node_size());
889 for (
int k = 0; k < graph.
node_size(); k++) {
890 int i = nodesOrder[k];
893 for (
const auto& output_name : graph.
node(i).
output()) {
896 int j = nodesOrder[
l];
897 for (
const auto& input_name : graph.
node(j).
input()) {
898 if (input_name == output_name)
899 nodesChildren[i].push_back(j);
907 std::cout <<
"\nGraph operator list (re-ordered)\n";
908 for (
int k = 0; k < graph.
node_size(); k++) {
909 int i = nodesOrder[k];
910 std::cout <<
"\tOperator " << i <<
" : " << graph.
node(i).
op_type() <<
" , " << graph.
node(i).
name() <<
" input tensors : {";
917 std::cout <<
" children : {";
918 for (
const auto & ichild : nodesChildren[i]) {
919 std::cout <<
" [ " << ichild <<
" " << graph.
node(ichild).
op_type() <<
" , " << graph.
node(ichild).
name() <<
"]";
921 std::cout <<
"}" << std::endl;
927 std::cout <<
"Fill RModel with operators...\n";
932 size_t node_order_exec = 0;
933 for (
int i = 0; i < graph.
node_size(); i++) {
934 std::string op_type = graph.
node(nodesOrder[i]).
op_type();
937 std::cout <<
"\t" << i <<
" " << nodesOrder[i] <<
" parsing operator " << op_type << std::endl;
940 std::unique_ptr<ROperator> op =
ParseOperator(i, graph, nodesOrder, nodesChildren[nodesOrder[i]]);
943 std::cout <<
"\t\tskipping operator since it is fused with previous one" << std::endl;
948 rmodel.
AddOperator(std::move(op), node_order_exec++);
951 std::vector<std::string> outputnames;
953 std::cout <<
"\nParsing Graph output list\n";
956 std::cout <<
"\toutput " << i <<
" name " << graph.
output(i).
name() << std::endl;
957 outputnames.push_back(graph.
output(i).
name());
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t dest
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t src
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
std::string fDefaultDataFileName
std::string fOpenedDataFileName
void RegisterOperator(const std::string &name, ParserFuncSignature func)
std::unique_ptr< ROperator > ParseOperator(const size_t, const onnx::GraphProto &, const std::vector< size_t > &, const std::vector< int > &)
std::string fDataFileName
bool IsRegisteredOperator(const std::string &name)
void CheckGraph(const onnx::GraphProto &g, int &level, std::map< std::string, int > &missingOperators)
void ParseONNXGraph(RModel &model, const onnx::GraphProto &g, std::string name="")
RModelParser_ONNX() noexcept
std::unordered_map< std::string, ETensorType > fTensorTypeMap
RModel Parse(std::string const &filename, bool verbose=false)
std::shared_ptr< void > GetInitializedTensorData(onnx::TensorProto *tensorproto, size_t tensor_length, ETensorType type)
std::map< int, std::pair< EFusedOp, int > > fFusedOperators
bool IsRegisteredTensorType(const std::string &)
void RegisterTensorType(const std::string &, ETensorType)
void ResetExternalDataState()
ETensorType GetTensorType(const std::string &name)
std::string fModelDirectory
std::vector< std::string > GetRegisteredOperators()
std::unique_ptr< onnx::ModelProto > LoadModel(const std::string &filename)
std::unique_ptr< OperatorsMapImpl > fOperatorsMapImpl
bool CheckModel(std::string filename, bool verbose=false)
void AddInputTensorInfo(std::string input_name, ETensorType type, std::vector< Dim > shape)
void AddOutputTensorNameList(std::vector< std::string > output_tensor_names)
void AddInitializedTensor(std::string tensor_name, ETensorType type, std::vector< std::size_t > shape, std::shared_ptr< void > data)
void AddInputTensorName(std::string name)
void AddOperator(std::unique_ptr< ROperator > op, int order_execution=-1)
const ValueInfoProto & input(int i) const
const ValueInfoProto & output(int i) const
int initializer_size() const
const std::string & name() const
const NodeProto & node(int i) const
const TensorProto & initializer(int i) const
const std::string & op_type() const
const std::string & input(int i) const
const std::string & output(int i) const
const std::string & name() const
int int32_data_size() const
const std::string & raw_data() const
DataLocation data_location() const
const std::vector< int64_t > & int64_data() const
const std::vector< StringStringEntryProto > & external_data() const
int64_t dims(int i) const
int int64_data_size() const
const std::vector< double > & double_data() const
int float_data_size() const
const std::string & name() const
int double_data_size() const
const std::vector< float > & float_data() const
const std::vector< int32_t > & int32_data() const
const std::string & dim_param() const
ValueCase value_case() const
int64_t dim_value() const
const TensorShapeProto_Dimension & dim(int i) const
const TensorShapeProto & shape() const
const TypeProto_Tensor & tensor_type() const
const TypeProto & type() const
const std::string & name() const
std::string Clean_name(std::string input_tensor_name)
ParserFuncSignature ParseArgMax
ParserFuncSignature ParseBatchNormalization
std::function< std::unique_ptr< ROperator >(RModelParser_ONNX &, const onnx::NodeProto &, const onnx::NodeProto &)> ParserFuseFuncSignature
ParserFuncSignature ParseReshape
ParserFuseFuncSignature ParseFuseConvTransposeAdd
ParserFuseFuncSignature ParseFuseMatMulAdd
ParserFuncSignature ParseGather
ParserFuncSignature ParseWhere
ParserFuncSignature ParseLeakyRelu
std::function< std::unique_ptr< ROperator >(RModelParser_ONNX &, const onnx::NodeProto &)> ParserFuncSignature
ParserFuncSignature ParseEinsum
ParserFuncSignature ParsePool
ParserFuncSignature ParseLayerNormalization
ParserFuncSignature ParseConcat
ParserFuncSignature ParseTopK
void RegisterReduceParsers(RModelParser_ONNX &parser)
ParserFuncSignature ParseIdentity
ParserFuncSignature ParseConvTranspose
ParserFuncSignature ParseNot
ParserFuncSignature ParseSlice
ParserFuncSignature ParseRandom
ParserFuncSignature ParseTranspose
ParserFuncSignature ParseShape
ParserFuncSignature ParseClip
constexpr size_t GetTypeSize(ETensorType type)
ParserFuncSignature ParseScatterND
void RegisterBasicBinaryParsers(RModelParser_ONNX &parser)
ParserFuncSignature ParseGRU
ParserFuncSignature ParseMatMul
ParserFuncSignature ParseErf
ParserFuncSignature ParseNonZero
ParserFuncSignature ParseIf
ParserFuncSignature ParseRange
ParserFuncSignature ParseExpand
ParserFuncSignature ParseRNN
ParserFuncSignature ParseHardSigmoid
ParserFuncSignature ParseLSTM
ParserFuncSignature ParseCast
ParserFuncSignature ParseSwish
ParserFuncSignature ParseSigmoid
ParserFuseFuncSignature ParseFuseConvAdd
ParserFuseFuncSignature ParseFuseBatchnormRelu
ParserFuncSignature ParseSoftmax
void RegisterComparisionParsers(RModelParser_ONNX &parser)
std::string ConvertTypeToString(ETensorType type)
ParserFuncSignature ParseGelu
ParserFuncSignature ParseSplit
ParserFuncSignature ParseConstant
ParserFuncSignature ParseSelu
ParserFuncSignature ParseHardSwish
ParserFuncSignature ParseGatherND
ParserFuncSignature ParseEyeLike
ParserFuncSignature ParsePad
ParserFuncSignature ParseElu
void RegisterBasicIsParsers(RModelParser_ONNX &parser)
std::string ConvertShapeToString(const std::vector< size_t > &shape)
ParserFuncSignature ParseRelu
ParserFuncSignature ParseConv
ParserFuncSignature ParseInstanceNormalization
ParserFuncSignature ParseScatterElements
ParserFuncSignature ParseGemm
ParserFuncSignature ParseTile
ParserFuseFuncSignature ParseFuseGemmRelu
void RegisterBasicUnaryParsers(RModelParser_ONNX &parser)
void RegisterBasicNaryParsers(RModelParser_ONNX &parser)
ParserFuncSignature ParseTanh
create variable transformations
Helper templated class for swapping bytes; specializations for N={2,4,8} are provided below.
std::unordered_map< std::string, ParserFuncSignature > fOperatorsMap