1#ifndef TMVA_SOFIE_ROPERATOR_RESHAPE
2#define TMVA_SOFIE_ROPERATOR_RESHAPE
12namespace Experimental{
48 :
fOpMode(opMode),
fNData(UTILITY::Clean_name(nameData)),
fNShape(UTILITY::Clean_name(nameShape)),
49 fNOutput(UTILITY::Clean_name(nameOutput))
66 auto ret = std::vector<ETensorType>(1,
input[0]);
72 std::vector<std::vector<size_t>> ret;
73 auto & input_shape =
input[0];
76 if (
input.size() != 2)
throw std::runtime_error(
"TMVA SOFIE Reshape Op needs 2 input tensors");
77 auto output_shape =
input[1];
81 if (input_length != output_length) {
82 if ((output_length == 0 &&
fAllowZero == 0) ||
static_cast<long>(output_length) < 0) {
84 bool replacementDone =
false;
85 for (
size_t i = 0; i < output_shape.size(); i++) {
86 if (output_shape[i] == 0 || output_shape[i] ==
static_cast<size_t>(-1)) {
87 if (replacementDone) {
88 throw std::runtime_error(
"TMVA Reshape Op : output shape has multiple negative or zero values");
90 auto tmp = output_shape;
91 tmp.erase(tmp.begin() + i);
93 output_shape[i] = input_length / tmp_length;
94 replacementDone =
true;
102 throw std::runtime_error(
"TMVA Reshape Op : Invalid shapes : " +
ConvertShapeToString(input_shape) +
106 ret.push_back(output_shape);
112 std::vector<size_t> newShape = {
b, inputSize /
b};
113 ret.push_back(newShape);
118 auto output_shape =
input[0];
119 if (
input.size() == 1) {
121 while (i < output_shape.size()) {
122 if (output_shape[i] == 1 ) {
123 output_shape.erase(output_shape.begin() + i);
129 }
else if (
input.size() == 2) {
130 auto & axes =
input[1];
131 for (
size_t i = 0; i < axes.size(); i++){
132 if (output_shape[axes[i]] != 1)
135 output_shape.erase(output_shape.begin() + axes[i]);
138 ret.push_back(output_shape);
143 assert(
input.size() == 2);
144 auto output_shape =
input[0];
145 auto &axes =
input[1];
147 int64_t
r =
input[0].size() + axes.size();
148 for (
auto &
a : axes) {
149 int64_t i =
static_cast<int64_t
>(
a);
150 if ( i < -r || i >
r - 1 )
151 throw std::runtime_error(
"TMVA Unsqueeze Op - axes input is not in correct range");
153 output_shape.insert(output_shape.begin() + i, 1);
156 output_shape.insert(output_shape.end() + i + 1, 1);
158 ret.push_back(output_shape);
168 throw std::runtime_error(
"TMVA Reshape Op Input Tensor " +
fNData +
" is not found in model");
175 auto input_shape =
static_cast<int64_t *
>(dptr.get());
177 assert(
vec.size() == 1);
180 std::vector<size_t> descShape(
n);
181 std::copy(input_shape, input_shape +
n, descShape.begin());
186 throw std::runtime_error(
"TMVA Reshape Op Shape Tensor " +
fNShape +
" is not found in model");
190 std::vector<size_t> descShape(
fAttrAxes.size());
196 throw std::runtime_error(
"TMVA Reshape Op : Invalid Input/Attribute data");
203 throw std::runtime_error(
"TMVA Reshape Op : Invalid Input/Output lengths");
221 OpName =
"op_" + OpName;
226 throw std::runtime_error(
"TMVA SOFIE Reshape Op : wrong output shape - is " +
230 std::stringstream out;
231 std::string opName =
"Reshape";
237 opName =
"Unsquueze";
239 out <<
SP <<
"///--------" << opName <<
" operator\n" << std::endl;
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 WindowAttributes_t Float_t r
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
const ETensorType & GetTensorType(std::string name)
void AddIntermediateTensor(std::string tensor_name, ETensorType type, std::vector< Dim > dim_shape)
bool CheckIfTensorAlreadyExist(std::string tensor_name)
void AddConstantTensor(std::string tensor_name, ETensorType type, std::vector< std::size_t > shape, std::shared_ptr< void > data)
bool IsInitializedTensor(const std::string &name) const
const std::vector< size_t > & GetTensorShape(std::string name)
std::shared_ptr< void > GetInitializedTensorData(std::string tensor_name)
void SetNotWritableInitializedTensor(const std::string &tensor_name)
void Initialize(RModel &model)
std::vector< size_t > fShapeInput
ROperator_Reshape(ReshapeOpMode opMode, std::vector< int64_t > attrAxes, std::string nameData, std::string nameOutput)
std::vector< size_t > fShapeOutput
std::string Generate(std::string OpName)
std::vector< std::vector< size_t > > ShapeInference(std::vector< std::vector< size_t > > input)
std::vector< int64_t > fAttrAxes
ROperator_Reshape(ReshapeOpMode opMode, int attr_value, std::string nameData, std::string nameShape, std::string nameOutput)
std::vector< ETensorType > TypeInference(std::vector< ETensorType > input)
bool fIsOutputConstant
flag to identify if operator has a constant output (no need to generate code)
const std::string SP
space used to correctly indent the generated C++ code
std::string ConvertValuesToString(size_t n, const T *data)
std::string ConvertShapeToString(std::vector< size_t > shape)
std::size_t ConvertShapeToLength(std::vector< size_t > shape)
create variable transformations