16#include <unordered_map>
21namespace Experimental {
111 throw std::runtime_error(
"TMVA::SOFIE - Failed to read float initialized tensor - actual size is " + std::to_string(tensor->
float_data_size()));
113 std::copy(
src.begin(),
src.end(),
static_cast<float *
>(
data));
120 throw std::runtime_error(
"TMVA::SOFIE - Failed to read double initialized tensor - actual size is " + std::to_string(tensor->
double_data_size()));
122 std::copy(
src.begin(),
src.end(),
static_cast<double *
>(
data));
129 throw std::runtime_error(
"TMVA::SOFIE - Failed to read int32 initialized tensor - actual size is " + std::to_string(tensor->
int32_data_size()));
131 std::copy(
src.begin(),
src.end(),
static_cast<int32_t *
>(
data));
138 throw std::runtime_error(
"TMVA::SOFIE - Failed to read int64 initialized tensor - actual size is " + std::to_string(tensor->
int64_data_size()));
140 std::copy(
src.begin(),
src.end(),
static_cast<int64_t *
>(
data));
150template <std::
size_t N>
151void CopyBswap(
void *
dest,
const void *source, std::size_t nbytes)
154 auto dst =
static_cast<unsigned char *
>(
dest);
155 auto src =
static_cast<const unsigned char *
>(source);
156 for (std::size_t k = 0; k < nbytes; k +=
N) {
158 std::memcpy(&
v,
src + k,
N);
160 std::memcpy(
dst + k, &
v,
N);
165void CopyLEToHost(
void *
dest,
const void *source, std::size_t nbytes, ETensorType tensor_type)
170 std::memcpy(
dest, source, nbytes);
172 case 2: CopyBswap<2>(
dest, source, nbytes);
break;
173 case 4: CopyBswap<4>(
dest, source, nbytes);
break;
174 case 8: CopyBswap<8>(
dest, source, nbytes);
break;
176 throw std::runtime_error(
"Data type " +
ConvertTypeToString(tensor_type) +
" in tensor is not supported!\n");
186 std::shared_ptr<void>
data(malloc(tensor_size), free);
190 if (tensorproto->
raw_data().size() > 0) {
191 if (tensorproto->
raw_data().size() != tensor_size)
192 throw std::runtime_error(
"TMVA::SOFIE - Failed to read raw data of initialized tensor - actual raw size is " +
193 std::to_string(tensorproto->
raw_data().size()));
197 std::memcpy(
data.get(), tensorproto->
raw_data().c_str(), tensor_size);
200 CopyLEToHost(
data.get(), tensorproto->
raw_data().c_str(), tensor_size, tensor_type);
204 switch (tensor_type) {
222 throw std::runtime_error(
"TMVA::SOFIE - ExtractData from TP in BOOL not supported");
226 throw std::runtime_error(
"TMVA::SOFIE - ExtractData from TP in UINT8 not supported");
230 throw std::runtime_error(
"Data type " +
ConvertTypeToString(tensor_type) +
" in weight tensor is not supported!\n");
238 std::string location;
239 size_t offset = 0, buffer_size = 0;
242 if (kv.key() ==
"location") location = kv.value();
243 else if (kv.key() ==
"offset")
offset = std::stoull(kv.value());
244 else if (kv.key() ==
"length") buffer_size = std::stoull(kv.value());
252 if (dataFileName.empty())
254 if (dataFileName.empty())
255 throw std::runtime_error(
"TMVA::SOFIE ONNX : tensor " + tensorproto->
name() +
256 " has external data but no data file location is available");
259 std::cout <<
"Initialized data are stored externally in file " << dataFileName
260 <<
" at location " << location <<
" offset " <<
offset <<
" and with length " << buffer_size << std::endl;
262 if (buffer_size != tensor_size)
263 throw std::runtime_error(
"TMVA::SOFIE ONNX : invalid stored data size vs tensor size");
269 fDataFile.open(dataFileName, std::ios::binary);
271 throw std::runtime_error(
"TMVA::SOFIE ONNX: error reading external weight ONNX data file " + dataFileName);
276 fDataFile.read(
reinterpret_cast<char *
>(
data.get()), buffer_size);
279 CopyLEToHost(
data.get(),
data.get(), buffer_size, tensor_type);
381 std::vector<std::string> ops;
384 ops.emplace_back(it.first);
387 std::sort(ops.begin(), ops.end());
417 const std::string &added = (addnode.
input(0) == convnode.
output(0)) ? addnode.
input(1) : addnode.
input(0);
428std::unique_ptr<ROperator>
431 if (i >= nodes.size())
432 throw std::runtime_error(
"TMVA::SOFIE - Error in parsing ordered operators " + std::to_string(i) +
" is >= " + std::to_string(nodes.size()));
434 const auto &nodeproto = graphproto.
node(idx);
435 const std::string op_type = nodeproto.
op_type();
437 std::cout <<
"Parsing operator " << op_type << std::endl;
443 std::cout <<
"\tFusing operators " << graphproto.
node(idx1).
name()
444 <<
" with " << graphproto.
node(idx1).
name() << std::endl;
460 if (children.size() == 1) {
461 int idx2 = children.front();
462 if (op_type ==
"MatMul") {
468 }
else if (nodeproto.op_type() ==
"Conv" || nodeproto.op_type() ==
"ConvTranspose") {
471 IsConvBiasAdd(graphproto, nodeproto, graphproto.
node(idx2))) {
472 if (nodeproto.op_type() ==
"Conv") {
480 }
else if (nodeproto.op_type() ==
"Gemm") {
486 }
else if (nodeproto.op_type() ==
"BatchNormalization") {
496 std::cout <<
"operator " << op_type <<
" is not supported" << std::endl;
497 throw std::runtime_error(
"TMVA::SOFIE Operator type " + op_type +
" is not yet supported");
500 std::cout <<
"\tCreating operator " << op_type << std::endl;
502 return it->second(*
this, nodeproto);
514 throw std::runtime_error(
"TMVA::SOFIE - Failed to load onnx file " +
filename);
519 std::time_t ttime = std::time(0);
520 std::tm *gmt_time = std::gmtime(&ttime);
521 std::string parsetime(std::asctime(gmt_time));
529 std::string filename_nodir =
filename;
530 if (isep != std::string::npos) {
537 RModel rmodel(filename_nodir, parsetime);
551 throw std::runtime_error(
"TMVA::SOFIE - Failed to parse ONNX model from input stream");
555 std::time_t ttime = std::time(0);
556 std::tm *gmt_time = std::gmtime(&ttime);
557 std::string parsetime(std::asctime(gmt_time));
579 std::fstream
input(
filename, std::ios::in | std::ios::binary);
581 std::cerr <<
"TMVA::SOFIE - Failed to open onnx file " <<
filename << std::endl;
590 auto model = std::make_unique<onnx::ModelProto>();
592 if (!model->ParseFromIstream(&
input)) {
593 std::cerr <<
"TMVA::SOFIE - Failed to parse ONNX model from input stream" << std::endl;
599 std::cout <<
"ONNX Version " << model->ir_version() << std::endl;
606 std::cout <<
"\n" << graph.
name() <<
" Graph operator list\n";
607 for (
int i = 0; i < graph.
node_size(); i++) {
608 const auto & node = graph.
node(i);
609 const std::string opType = node.
op_type();
611 std::cout <<
"\tOperator " << i <<
" : " << opType <<
" (" << node.name() <<
"), " << graph.
node(i).
input_size()
613 for (
int j = 0; j < graph.
node(i).input_size(); j++) {
618 std::cout <<
" }" << std::endl;
622 missingOperators[opType] = level;
624 for (
int j = 0; j < node.attribute_size(); j++) {
625 const auto & attribute = node.attribute(j);
626 if (attribute.has_g()) {
627 const auto & subGraph = attribute.g();
629 CheckGraph(subGraph, level, missingOperators);
639 if (!model)
return false;
644 std::cout <<
"\nModel operator list " << model->producer_name() <<
"\n";
646 std::map<std::string, int> missingOperators;
650 if (!missingOperators.empty()) {
651 std::cout <<
"List of missing operators for model loaded from file " <<
filename << std::endl;
652 for (
auto & op : missingOperators) {
653 std::cout << op.first <<
" " << op.second << std::endl;
657 std::cout <<
"All operators in the loaded model are supported!\n";
665 if (graphName.empty())
666 graphName = graph.
name();
669 std::cout <<
"\nParsing Graph - " << graphName << std::endl;
674 struct FusedOperatorsGuard {
675 std::map<int, std::pair<EFusedOp, int>> &fMap;
676 std::map<int, std::pair<EFusedOp, int>> fSaved;
677 FusedOperatorsGuard(std::map<
int, std::pair<EFusedOp, int>> &map) : fMap(map) { fSaved.swap(fMap); }
678 ~FusedOperatorsGuard() { fMap.swap(fSaved); }
681 std::unordered_set<std::string> initializer_names;
687 std::cout <<
"Parsing model inputs...." << std::endl;
689 for (
int i = 0; i < graph.
input_size(); i++) {
694 std::cout <<
"\tgraph input " << i <<
" name " << graph.
input(i).
name() <<
" type "
697 if (initializer_names.find(graph.
input(i).
name()) != initializer_names.end())
702 std::string input_name = valueinfoproto.
name();
707 bool existParam =
false;
709 throw std::runtime_error(
"TMVA::SOFIE data node with no shape restrictions is not supported yet");
728 throw std::runtime_error(
"TMVA::SOFIE ONNX file error: Valueinfoproto " + input_name +
729 " has neither dim_value nor dim_param! \n");
740 std::vector<size_t> fShape_sizet;
742 fShape_sizet.push_back(j.dim);
752 std::map<std::string, int> allInitializedTensors;
755 std::cout <<
"\nParsing graph initializer list and fill model initialized tensors" << std::endl;
759 std::vector<std::size_t> shape;
760 std::size_t tensor_length = 1;
761 for (
int j = 0; j < tensorproto->
dims_size(); j++) {
762 shape.push_back(tensorproto->
dims(j));
763 tensor_length *= tensorproto->
dims(j);
770 std::cout <<
"\t initializer " << i <<
" name " << tensor_name <<
" type " << graph.
initializer(i).
data_type()
771 <<
" and length " << tensor_length << std::endl;
780 allInitializedTensors[tensor_name] = i;
783 std::cout <<
"add initialized tensor " << tensor_name <<
"with shape " <<
ConvertShapeToString(shape) <<
"and ";
785 std::cout <<
" float data: ";
786 for (
int j = 0; j < std::min(int(tensor_length),3); j++) std::cout << static_cast<float*>(
data.get())[j] <<
" ";
789 std::cout <<
" int64 data: ";
790 for (
int j = 0; j < std::min(int(tensor_length),3); j++) std::cout << static_cast<int64_t*>(
data.get())[j] <<
" ";
793 std::cout <<
" uint8 data: ";
794 for (
int j = 0; j < std::min(int(tensor_length),3); j++) std::cout << static_cast<uint8_t*>(
data.get())[j] <<
" ";
797 std::cout <<
" Boolean data: ";
798 for (
int j = 0; j < std::min(int(tensor_length),3); j++) std::cout << static_cast<bool*>(
data.get())[j] <<
" ";
800 std::cout << std::endl;
806 std::cout <<
"\nGraph operator list (ONNX order)\n";
807 for (
int i = 0; i < graph.
node_size(); i++) {
810 for (
int j = 0; j < graph.
node(i).input_size(); j++) {
815 std::cout <<
" }" << std::endl;
821 std::cout <<
"\n***********************\nRe-Order graph operator list\n*************************\n";
822 std::vector<size_t> nodesOrder;
824 std::vector<bool> foundNodes(graph.
node_size());
827 std::map<std::string, int> allInputs;
828 for (
int i = 0; i < graph.
input_size(); i++) {
832 auto psize = nodesOrder.size();
833 for (
int i = 0; i < graph.
node_size(); i++) {
837 bool existInputs =
true;
841 std::cout <<
"Checking input of Node " << i <<
" : " << graph.
node(i).
name() << std::endl;
842 for (
int j = 0; j < input_size; j++) {
846 existInputs &= (allInputs.find(
name) != allInputs.end() ||
847 allInitializedTensors.find(
name) != allInitializedTensors.end());
849 std::cout <<
"\t\t input " <<
name <<
" "
850 <<
bool(allInputs.find(
name) != allInputs.end()) <<
" " <<
851 bool(allInitializedTensors.find(
name) != allInitializedTensors.end()) <<
" " <<
852 existInputs << std::endl;
858 std::cout <<
"skip node " << graph.
node(i).
op_type() <<
" " << graph.
node(i).
name() <<
" inputs are not existing ";
859 for (
int j = 0; j < input_size; j++) {
860 std::cout << graph.
node(i).
input(j) <<
" ";
862 std::cout << std::endl;
869 std::cout <<
"===> New node " << graph.
node(i).
op_type() <<
" " << graph.
node(i).
name() <<
" order " << i << std::endl;
871 nodesOrder.push_back(i);
872 foundNodes[i] =
true;
874 for (
int j = 0; j < graph.
node(i).output_size(); j++) {
880 if (nodesOrder.size() == psize) {
881 int ilast = nodesOrder.back();
882 std::cout <<
"cannot find a new node after " << graph.
node(ilast).
op_type() <<
" " << graph.
node(ilast).
name() << std::endl;
883 throw std::runtime_error(
"TMVA::SOFIE - cannot find a new node ");
885 }
while ((
int)nodesOrder.size() < graph.
node_size());
889 std::vector<std::vector<int>> nodesChildren(graph.
node_size());
891 for (
int k = 0; k < graph.
node_size(); k++) {
892 int i = nodesOrder[k];
895 for (
const auto& output_name : graph.
node(i).
output()) {
898 int j = nodesOrder[
l];
899 for (
const auto& input_name : graph.
node(j).
input()) {
900 if (input_name == output_name)
901 nodesChildren[i].push_back(j);
909 std::cout <<
"\nGraph operator list (re-ordered)\n";
910 for (
int k = 0; k < graph.
node_size(); k++) {
911 int i = nodesOrder[k];
912 std::cout <<
"\tOperator " << i <<
" : " << graph.
node(i).
op_type() <<
" , " << graph.
node(i).
name() <<
" input tensors : {";
919 std::cout <<
" children : {";
920 for (
const auto & ichild : nodesChildren[i]) {
921 std::cout <<
" [ " << ichild <<
" " << graph.
node(ichild).
op_type() <<
" , " << graph.
node(ichild).
name() <<
"]";
923 std::cout <<
"}" << std::endl;
929 std::cout <<
"Fill RModel with operators...\n";
934 size_t node_order_exec = 0;
935 for (
int i = 0; i < graph.
node_size(); i++) {
936 std::string op_type = graph.
node(nodesOrder[i]).
op_type();
939 std::cout <<
"\t" << i <<
" " << nodesOrder[i] <<
" parsing operator " << op_type << std::endl;
942 std::unique_ptr<ROperator> op =
ParseOperator(i, graph, nodesOrder, nodesChildren[nodesOrder[i]]);
945 std::cout <<
"\t\tskipping operator since it is fused with previous one" << std::endl;
950 rmodel.
AddOperator(std::move(op), node_order_exec++);
953 std::vector<std::string> outputnames;
955 std::cout <<
"\nParsing Graph output list\n";
958 std::cout <<
"\toutput " << i <<
" name " << graph.
output(i).
name() << std::endl;
959 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
ParserFuncSignature ParsePRelu
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