96 if (!model.CheckIfTensorAlreadyExist(
fNX1)){
97 throw std::runtime_error(std::string(
"TMVA SOFIE Comparision Op Input Tensor ") +
fNX1 +
"is not found in model");
99 if (!model.CheckIfTensorAlreadyExist(
fNX2)) {
100 throw std::runtime_error(std::string(
"TMVA SOFIE Comparision Op Input Tensor ") +
fNX2 +
"is not found in model");
102 if (model.IsDynamicTensor(
fNX1))
108 if (model.IsDynamicTensor(
fNX2))
118 bool broadcastX1 =
false;
119 bool broadcastX2 =
false;
135 std::unique_ptr<T> broadcastedData1;
136 std::unique_ptr<T> broadcastedData2;
138 std::vector<Dim> shapeData1;
139 std::vector<Dim> shapeData2;
141 bool *outData =
new bool[length];
142 if (model.IsInitializedTensor(
fNX1)) {
143 data1 =
static_cast<T *
>(model.GetInitializedTensorData(
fNX1).get());
145 broadcastedData1 = std::unique_ptr<T>(
147 data1 = broadcastedData1.get();
150 }
else if (model.IsShapeTensor(
fNX1)) {
151 shapeData1 = model.GetShapeTensorValues(
fNX1);
153 if (model.IsInitializedTensor(
fNX2)) {
154 data2 =
static_cast<T *
>(model.GetInitializedTensorData(
fNX2).get());
156 broadcastedData2 = std::unique_ptr<T>(
158 data2 = broadcastedData2.get();
160 }
else if (model.IsShapeTensor(
fNX2)) {
161 shapeData2 = model.GetShapeTensorValues(
fNX2);
163 if (data1 && data2) {
165 for (
size_t i = 0; i < length; i++)
167 model.AddConstantTensor(
fNY,
fShapeY, outData);
169 std::cout << ComparisionTrait<T, Op>::Name() <<
" op ---> " <<
fNY <<
" "
172 }
else if ((data1 || !shapeData1.empty()) && (data2 || !shapeData2.empty())) {
174 if (data1 && !data2) {
176 for (
size_t i = 0; i < length; i++) {
177 if (shapeData2[i].isParam) {
178 if (shapeData2[i].dim ==
size_t(-1) || data1[i] > 0) {
183 shapeData2[i].dim = 0;
188 }
else if (!data1 && data2) {
190 for (
size_t i = 0; i < length; i++) {
191 if (shapeData1[i].isParam) {
192 if (shapeData1[i].dim ==
size_t(-1) || data2[i] > 0) {
197 shapeData1[i].dim = 0;
202 }
else if (!shapeData1.empty() && !shapeData2.empty()) {
204 for (
size_t i = 0; i < length; i++) {
205 if (!shapeData1[i].isParam && !shapeData2[i].isParam) {
207 }
else if (shapeData1[i].isParam && shapeData2[i].isParam) {
208 if (shapeData1[i].param == shapeData2[i].param)
221 model.AddConstantTensor(
fNY,
fShapeY, outData);
223 std::cout << ComparisionTrait<T, Op>::Name() <<
" op ---> " <<
fNY <<
" "
225 <<
" (constant) " << std::endl;
234 std::cout << ComparisionTrait<T, Op>::Name() <<
" op ---> " <<
fNY <<
" "
248 auto IsInputDimParam = [&](
const std::string &p) {
249 auto inputNames = model.GetInputTensorNames();
250 for (
auto &input : inputNames) {
251 for (
auto &i_s : model.GetDimTensorShape(input)) {
252 if (i_s.isParam && i_s.param == p)
258 for (
size_t i = 0; i <
fDimShapeY.size(); i++) {
260 if (s.isParam && s.param.find(
"std::max") != std::string::npos) {
267 }
else if (IsInputDimParam(
fDimShapeX2[i].param)) {
278 if (model.Verbose()) {
282 model.PrintIntermediateTensors();
287 std::string
Generate(std::string opName)
override {
289 opName =
"op_" + opName;
292 throw std::runtime_error(
"TMVA SOFIE Comparision Op called to Generate without being initialized first");
294 std::stringstream out;
305 std::string compute_idx_X1, compute_idx_X2, compute_idx_Y;
308 compute_idx_X1 =
"0";
314 if (stridesA[i].GetVal() !=
"1")
315 compute_idx_X1 +=
" * " + stridesA[i].GetVal();
316 compute_idx_X1 +=
" + ";
319 for (
int j = 0; j < 3; j++)
320 compute_idx_X1.pop_back();
324 compute_idx_X2 =
"0";
330 if (stridesB[i].GetVal() !=
"1")
331 compute_idx_X2 +=
" * " + stridesB[i].GetVal();
332 compute_idx_X2 +=
" + ";
335 for (
int j = 0; j < 3; j++)
336 compute_idx_X2.pop_back();
343 for (
size_t i = 0; i <
fDimShapeY.size(); ++i) {
346 for (
int j = 0; j < nloop; j++) out <<
SP;
347 out <<
"for (size_t idx_" << i <<
" = 0; idx_" << i <<
" < " <<
fDimShapeY[i]
348 <<
"; ++idx_" << i <<
"){\n";
349 compute_idx_Y +=
"idx_" + std::to_string(i);
350 if (stridesY[i].GetVal() !=
"1")
351 compute_idx_Y +=
" * " + stridesY[i].GetVal();
352 compute_idx_Y +=
" + ";
356 for (
int j = 0; j < 3; j++)
357 compute_idx_Y.pop_back();
359 for (
int j = 0; j < nloop + 1; j++) out <<
SP;
360 out <<
"tensor_" <<
fNY <<
"[" << compute_idx_Y <<
"] = "
362 "tensor_" +
fNX2 +
"[" + compute_idx_X2 +
"]") <<
" ;\n";
365 for (
int i = nloop; i > 0; i--) {
366 for (
int j = 0; j < i; j++) out <<
SP;