1#ifndef TMVA_SOFIE_ROPERATOR_EyeLike
2#define TMVA_SOFIE_ROPERATOR_EyeLike
33 std::vector<ETensorType>
TypeInference(std::vector<ETensorType> input)
override {
37 std::vector<std::vector<size_t>>
ShapeInference(std::vector<std::vector<size_t>> input)
override {
43 if (model.CheckIfTensorAlreadyExist(
fNX) ==
false){
44 throw std::runtime_error(
"TMVA SOFIE EyeLike Op Input Tensor is not found in model");
48 throw std::runtime_error(
"TMVA SOFIE EyeLike Op Input Tensor is not of rank 2");
52 model.AddIntermediateTensor(
fNY, extractedType,
fShape);
55 model.AddIntermediateTensor(
fNY, model.GetTensorType(
fNX),
fShape);
60 std::string
Generate(std::string OpName)
override {
61 OpName =
"op_" + OpName;
63 throw std::runtime_error(
"TMVA SOFIE Operator EyeLike called to Generate without being initialized first");
67 std::stringstream out;
68 out <<
SP <<
"///--------EyeLike operator\n" << std::endl;
70 out <<
SP <<
"(void) tensor_" <<
fNX <<
";\n";
72 out <<
SP <<
"std::fill(tensor_" <<
fNY <<
", tensor_" <<
fNY <<
" + " << length <<
","
74 out <<
SP <<
"for (int i = 0; i < " <<
fShape[0] <<
"; i++) {\n";
75 out <<
SP <<
SP <<
"int j = i +" <<
fk <<
";\n";
76 out <<
SP <<
SP <<
"if (j >= 0 && j < " <<
fShape[1] <<
")\n";
77 out <<
SP <<
SP <<
SP <<
"tensor_" <<
fNY <<
"[i * " <<
fShape[1] <<
"+ j] = 1;\n";
std::string Generate(std::string OpName) override
std::vector< std::vector< size_t > > ShapeInference(std::vector< std::vector< size_t > > input) override
std::vector< ETensorType > TypeInference(std::vector< ETensorType > input) override
std::vector< size_t > fShape
ROperator_EyeLike(int dtype, int k, std::string nameX, std::string nameY)
void Initialize(RModel &model) override
std::vector< std::string_view > fInputTensorNames
const std::string SP
space used to correctly indent the generated C++ code
std::vector< std::string_view > fOutputTensorNames
std::vector< size_t > ComputeStrideFromShape(const std::vector< size_t > &shape)
compute stride of a tensor given its shape (assume layout is row-major)
std::size_t ConvertShapeToLength(const std::vector< size_t > &shape)
create variable transformations