81 std::vector<Dim>
DoShapeInference(
const std::vector<Dim> & input_shape,
const std::vector<Dim> & target_shape) {
85 std::vector<Dim> output_shape = target_shape;
86 bool hasMinusOne =
false;
88 for (
size_t i = 0; i < output_shape.size(); i++) {
90 if (!output_shape[i].isParam) {
91 if (output_shape[i].dim == 0) {
94 output_shape[i] =
Dim{0};
96 if (i > 0 && output_shape.size() != input_shape.size())
97 std::cout <<
"WARNING: TMVA Reshape Op : output shape has zero value at index " << i <<
98 " but input shape has a different rank than output shape" << std::endl;
99 if (i >= input_shape.size())
100 throw std::runtime_error(
"TMVA Reshape Op : output shape has zero value at index " + std::to_string(i) +
101 " but input shape does not have corresponding index");
103 output_shape[i] = input_shape[i];
104 }
else if (output_shape[i].dim ==
static_cast<size_t>(-1)) {
109 if (hasZero && hasMinusOne) {
110 throw std::runtime_error(
"TMVA Reshape Op : zero value in shape is not allowed when there is also a -1 in shape");
113 for (
size_t i = 0; i < output_shape.size(); i++) {
114 if (output_shape[i] ==
static_cast<size_t>(-1) && !output_shape[i].isParam) {
115 auto tmp = output_shape;
116 tmp.erase(tmp.begin() + i);
121 << input_length <<
" to " << tmp_length << std::endl;
124 output_shape[i] =
Dim{
static_cast<size_t>(std::stoi(input_length) / std::stoi(tmp_length))};
125 else if (
IsInteger(tmp_length) && std::stoi(tmp_length) == 1) {
126 output_shape[i] =
Dim{input_length,
static_cast<size_t>(-1)};
131 bool canSimplify =
false;
132 std::vector <Dim> reduced_input;
137 std::stringstream ss(input_length);
142 while(getline(ss, token,
'*'))
145 token.erase(std::remove_if(token.begin(), token.end(),
146 [](
unsigned char x) { return std::isspace(x); }), token.end());
147 if (token != tmp_length) {
149 size_t il =
static_cast<size_t>(std::stoi(input_length));
150 size_t tl =
static_cast<size_t>(std::stoi(tmp_length));
151 if ((il % tl) == 0) {
153 reduced_input.push_back(
Dim{il / tl});
156 reduced_input.push_back(
Dim{token});
167 if (res_shape.find(
'*') != std::string::npos)
168 output_shape[i] =
Dim{std::string(
"(") + res_shape +
")",
static_cast<size_t>(-1)};
170 output_shape[i] =
Dim{res_shape};
173 output_shape[i] =
Dim{std::string(
"(") + input_length +
" / (" + tmp_length +
"))",
static_cast<size_t>(-1)};
194 fAxis += input_shape.size();
195 auto s1 = std::vector<Dim>(input_shape.begin(), input_shape.begin() +
fAxis);
196 auto s2 = std::vector<Dim>(input_shape.begin() +
fAxis, input_shape.end());
199 std::vector<Dim> newShape = {
Dim{l1},
Dim{l2}};
204 auto output_shape = input_shape;
207 while (i < output_shape.size()) {
208 if (output_shape[i] ==
Dim{1}) {
209 output_shape.erase(output_shape.begin() + i);
216 for (
size_t i = 0; i < axes.size(); i++) {
218 axes[i] += input_shape.size();
219 if (!(output_shape[axes[i]] ==
Dim{1}))
220 throw std::runtime_error(
"TMVA Squeeze Op : Invalid axis value " + std::to_string(axes[i]) +
224 std::sort(axes.begin(), axes.end(), std::greater<int>());
225 for (
auto & axis : axes) {
226 output_shape.erase(output_shape.begin() + axis);
234 auto output_shape = input_shape;
237 int64_t
r = input_shape.size() + axes.size();
238 for (
auto &
a : axes) {
239 int64_t i =
static_cast<int64_t
>(
a);
240 if (i < -r || i >
r - 1)
241 throw std::runtime_error(
"TMVA Unsqueeze Op - axes input is not in correct range");
243 output_shape.insert(output_shape.begin() + i,
Dim{1});
246 output_shape.insert(output_shape.end() + i + 1,
Dim{1});
250 throw std::runtime_error(
"TMVA Reshape Op : Invalid ReshapeOpMode");
258 std::cout <<
"initialize reshape op type " <<
fOpMode <<
" - for input " <<
fNData
259 <<
" to shape given by " <<
fNInput2 << std::endl;
261 if (model.CheckIfTensorAlreadyExist(
fNData) ==
false) {
263 throw std::runtime_error(
"TMVA Reshape Op Input Tensor " +
fNData +
" is not found in model");
269 if (model.CheckIfTensorAlreadyExist(
fNInput2)) {
270 if (model.IsInitializedTensor(
fNInput2)) {
272 auto dptr = model.GetInitializedTensorData(
fNInput2);
273 auto values =
static_cast<int64_t *
>(dptr.get());
274 auto vec = model.GetTensorShape(
fNInput2);
280 fShape = std::vector<int64_t>(values, values +
n);
282 fAttrAxes = std::vector<int64_t>(values, values +
n);
284 std::vector<Dim> targetShape(
fShape.begin(),
fShape.end());
287 model.SetNotWritableInitializedTensor(
fNInput2);
288 }
else if (model.IsShapeTensor(
fNInput2)) {
289 auto shapeData = model.GetShapeTensorValues(
fNInput2);
297 if (model.IsDynamicTensor(
fNInput2)) {
298 throw std::runtime_error(
"TMVA Reshape Op 2nd input Tensor " +
fNInput2 +
" cannot have dynamic shape");
300 auto shapeInput2 = model.GetTensorShape(
fNInput2);
307 throw std::runtime_error(
"TMVA Reshape Op 2nd input Tensor " +
fNInput2 +
" is not found in model");
315 throw std::runtime_error(
"TMVA Reshape Op : Invalid Input/Attribute data");
320 auto inputData =
static_cast<int64_t*
>(model.GetInitializedTensorData(
fNData).get());
323 throw std::runtime_error(
"TMVA Reshape Op : Invalid Input/Output lengths");
324 model.AddConstantTensor<int64_t>(
fNOutput, o_shape, inputData);
325 if (model.Verbose()) {
338 if (model.Verbose()) {