30 ROperator_Range(std::string start, std::string limit, std::string delta, std::string nameOutput)
31 :
fNStart(UTILITY::Clean_name(start)),
32 fNLimit(UTILITY::Clean_name(limit)),
33 fNDelta(UTILITY::Clean_name(delta)),
34 fNOutput(UTILITY::Clean_name(nameOutput))
36 if (std::is_same<T, float>::value) {
38 }
else if (std::is_same<T, int64_t>::value) {
41 static_assert( (std::is_same_v<T, float> || std::is_same_v<T, int64_t>),
42 "TMVA::SOFIE - Unsupported type by Range operator");
51 if (!model.CheckIfTensorAlreadyExist(
fNStart)) {
53 std::runtime_error(
"TMVA SOFIE Range Op Input Tensor " +
fNStart +
"is not found in model");
55 if (!model.CheckIfTensorAlreadyExist(
fNLimit)) {
57 std::runtime_error(
"TMVA SOFIE Range Op Input Tensor " +
fNLimit +
"is not found in model");
59 if (!model.CheckIfTensorAlreadyExist(
fNDelta)) {
61 std::runtime_error(
"TMVA SOFIE Range Op Input Tensor " +
fNDelta +
"is not found in model");
67 auto analyzeInput = [&](
const std::string & tName, T &
value,
Dim & dim) {
69 if (model.IsInitializedTensor(tName)) {
70 T *
data =
static_cast<T*
>(model.GetInitializedTensorData(tName).get());
72 throw std::runtime_error(
"TMVA SOFIE Range Op Input Tensor has invalid input data");
75 }
else if (model.IsShapeTensor(tName)) {
76 auto data = model.GetShapeTensorValues(tName);
79 value =
static_cast<T
>(dim.dim);
93 int res1 = analyzeInput(
fNStart, start_value, start_dim);
94 int res2 = analyzeInput(
fNLimit, limit_value, limit_dim);
95 int res3 = analyzeInput(
fNDelta, delta_value, delta_dim);
96 if (res1 == 0 || res2 == 0 || res3 == 0) {
101 }
else if (res1 == 1 && res2 == 1 && res3 == 1) {
102 size_t number_of_elements = std::max(
static_cast<int>(std::ceil(
static_cast<float>(limit_value - start_value) / delta_value)) , 0 );
106 std::vector<T> output(number_of_elements);
107 for (
size_t i=0; i<number_of_elements; ++i) {
108 output[i] = start_value + (i * delta_value);
110 std::vector<size_t> shape = {number_of_elements};
111 model.AddConstantTensor(
fNOutput,shape, output.data());
115 std::string start = (res1 == 1) ? std::to_string(start_value) : start_dim.GetVal();
116 std::string limit = (res2 == 1) ? std::to_string(limit_value) : limit_dim.GetVal();
117 std::string delta = (res3 == 1) ? std::to_string(delta_value) : delta_dim.GetVal();
120 if (delta_value == 1)
121 s <<
"std::max(std::ceil("<< limit <<
" - " << start <<
"),0.0f)";
123 s <<
"std::max(std::ceil(("<< limit <<
" - " << start <<
")/" << delta <<
"),0.0f)";
129 s <<
"((" << limit <<
" > " << start <<
") ? (" << limit <<
" - " << start <<
") : 0)";
132 s <<
"((" << limit <<
" + " << delta <<
" - 1)/" << delta <<
")";
134 s <<
"((" << limit <<
" > " << start <<
") ? ((" << limit <<
" - " << start <<
" + " << delta <<
" - 1)/" << delta <<
") : 0)";
142 fShape = {
Dim {s.str(),
static_cast<size_t>(-1)} };
147 if (model.Verbose()) {
150 std::cout << std::endl;