1#ifndef TMVA_SOFIE_ROPERATOR_Reduce
2#define TMVA_SOFIE_ROPERATOR_Reduce
17namespace Experimental{
30template <EReduceOpMode Op>
53 return "ReduceSumSquare";
85 throw std::runtime_error(
"TMVA SOFIE Reduce Op - invalid axes values " + std::to_string(
fAttrAxes[
j]));
94 for (
size_t j = 0;
j <
ax.size();
j++) {
98 for (
size_t k =
j+1; k <
ax.size(); k++)
109 if (!model.CheckIfTensorAlreadyExist(
fNX)) {
111 throw std::runtime_error(
"TMVA SOFIE Reduce Op Input Tensor " +
fNX +
" is not found in model");
114 if (model.IsDynamicTensor(
fNX))
126 for (
size_t i = 0; i <
fAttrAxes.size(); i++)
131 model.AddIntermediateTensor(
fNY, model.GetTensorType(
fNX),
fShapeY);
132 if (model.Verbose()){
136 model.AddNeededStdLib(
"algorithm");
138 model.AddNeededStdLib(
"limits");
158 std::stringstream out;
159 out <<
"\n//---- operator " <<
Name() <<
" " <<
opName <<
"\n";
164 for (
int k =
fShapeX.size()-1; k >= kmin; k--) {
174 for (
size_t k = 0; k <
fAttrAxes.size(); k++) {
206 out <<
SP <<
"for (size_t i = 0; i < " <<
outputLength <<
"; i++) {\n";
212 out <<
SP <<
SP <<
SP <<
"tensor_" <<
fNY <<
"[i] = std::max(tensor_" <<
fNY <<
"[i], tensor_" <<
fNX
215 out <<
SP <<
SP <<
SP <<
"tensor_" <<
fNY <<
"[i] = std::min(tensor_" <<
fNY <<
"[i], tensor_" <<
fNX
224 out <<
SP <<
SP <<
"}\n";
236 out <<
SP <<
"for (size_t i = 0; i < " <<
reducedLength <<
"; i++) {\n";
237 out <<
SP <<
SP <<
"for (size_t j = 0; j < " <<
outputLength <<
"; j++) {\n";
240 out <<
SP <<
SP <<
SP <<
"tensor_" <<
fNY <<
"[j] = std::max(tensor_" <<
fNY <<
"[j], tensor_" <<
fNX
243 out <<
SP <<
SP <<
SP <<
"tensor_" <<
fNY <<
"[j] = std::min(tensor_" <<
fNY <<
"[j], tensor_" <<
fNX
250 out <<
SP <<
SP <<
SP <<
"tensor_" <<
fNY <<
"[j] += tensor_" <<
fNX <<
"[i * " <<
outputLength <<
" + j] * tensor_"
252 out <<
SP <<
SP <<
"}\n";
255 out <<
SP <<
"for (size_t j = 0; j < " <<
outputLength <<
"; j++) {\n";
275 for (
size_t q = 0;
q <
n;
q++)
280 out <<
SP <<
SP <<
"size_t inputIndex = 0;\n";
282 for (
size_t k = 0; k < dim; k++) {
284 out <<
"for (size_t i_" << k <<
" = 0; i_" << k <<
" < (" <<
fShapeX[k] <<
"); i_" << k <<
"++) {\n";
287 std::string next =
"outputIndex_" + std::to_string(k);
295 out <<
"// compute reduction....\n";
297 std::string
x =
"tensor_" +
fNX +
"[inputIndex]";
300 out <<
y <<
" = std::max(" <<
y <<
", " <<
x <<
");\n";
302 out <<
y <<
" = std::min(" <<
y <<
", " <<
x <<
");\n";
304 out <<
y <<
" *= " <<
x <<
";\n";
306 out <<
y <<
" += " <<
x <<
";\n";
308 out <<
y <<
" += " <<
x <<
" * " <<
x <<
";\n";
310 out <<
"inputIndex++;\n";
311 for (
size_t k = dim; k > 0; k--) {
318 out <<
SP <<
"for (size_t i = 0; i < " <<
outputLength <<
"; i++) {\n";
static void indent(ostringstream &buf, int indent_level)
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
const_iterator begin() const
const_iterator end() const
std::vector< Dim > fShapeY
std::string Generate(std::string opName) override
std::vector< int64_t > fAttrAxes
std::vector< Dim > fShapeYNotPruned
std::vector< Dim > fShapeX
EReduceOpMode fReduceOpMode
void Initialize(RModel &model) override
ROperator_Reduce(int keepdims, std::vector< int64_t > attrAxes, std::string nameX, std::string nameAxes, std::string nameY)
std::vector< Dim > DoShapeInference(const std::vector< Dim > &input)
std::vector< std::string_view > fInputTensorNames
const std::string SP
space used to correctly indent the generated C++ code
bool fUseSession
flag to identify if using the session class
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::string ConvertDimShapeToString(const std::vector< Dim > &shape)
std::size_t ConvertShapeToLength(const std::vector< size_t > &shape)
std::string ConvertTypeToString(ETensorType type)
std::string ConvertDimShapeToLength(const std::vector< Dim > &shape)
create variable transformations