1#ifndef TMVA_SOFIE_ROPERATOR_ARGMAX
2#define TMVA_SOFIE_ROPERATOR_ARGMAX
14namespace Experimental {
34 ROperator_ArgMax(int64_t axis,
int keepdims,
int selectLastIndex, std::string nameX, std::string nameY)
38 fNX(UTILITY::Clean_name(nameX)),
39 fNY(UTILITY::Clean_name(nameY))
47 if (!model.CheckIfTensorAlreadyExist(
fNX)) {
48 throw std::runtime_error(
"TMVA SOFIE ArgMax Op Input Tensor " +
fNX +
" is not found in model");
51 int64_t rank =
static_cast<int64_t
>(
fShapeX.size());
58 if (fAttrAxis < 0 || fAttrAxis >= rank) {
59 throw std::runtime_error(
"TMVA SOFIE ArgMax Op - invalid axis value " + std::to_string(
fAttrAxis) +
60 " for input tensor " +
fNX +
" of rank " + std::to_string(rank));
74 std::string
Generate(std::string opName)
override
82 std::string stride =
"(" + axisDim +
") * (" + inner +
")";
86 std::stringstream out;
87 out <<
"\n//------ ArgMax " << opName <<
"\n";
88 out <<
SP <<
"for (size_t o = 0; o < " << outer <<
"; o++) {\n";
89 out <<
SP <<
SP <<
"for (size_t i = 0; i < " << inner <<
"; i++) {\n";
90 out <<
SP <<
SP <<
SP <<
"size_t base = o * " << stride <<
" + i;\n";
91 out <<
SP <<
SP <<
SP <<
"auto greatest = tensor_" <<
fNX <<
"[base];\n";
92 out <<
SP <<
SP <<
SP <<
"int64_t bestIndex = 0;\n";
93 out <<
SP <<
SP <<
SP <<
"for (size_t k = 1; k < " << axisDim <<
"; k++) {\n";
94 out <<
SP <<
SP <<
SP <<
SP <<
"auto value = tensor_" <<
fNX <<
"[base + k * (" << inner <<
")];\n";
95 out <<
SP <<
SP <<
SP <<
SP <<
"if (value " << cmp <<
" greatest) {\n";
96 out <<
SP <<
SP <<
SP <<
SP <<
SP <<
"greatest = value;\n";
97 out <<
SP <<
SP <<
SP <<
SP <<
SP <<
"bestIndex = static_cast<int64_t>(k);\n";
98 out <<
SP <<
SP <<
SP <<
SP <<
"}\n";
99 out <<
SP <<
SP <<
SP <<
"}\n";
100 out <<
SP <<
SP <<
SP <<
"tensor_" <<
fNY <<
"[o * (" << inner <<
") + i] = bestIndex;\n";
101 out <<
SP <<
SP <<
"}\n";
std::string Generate(std::string opName) override
void Initialize(RModel &model) override
std::vector< Dim > fShapeY
ROperator_ArgMax(int64_t axis, int keepdims, int selectLastIndex, std::string nameX, std::string nameY)
std::vector< Dim > fShapeX
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::string ConvertDimShapeToLength(const std::vector< Dim > &shape)
create variable transformations