1#ifndef TMVA_SOFIE_ROPERATOR_Constant
2#define TMVA_SOFIE_ROPERATOR_Constant
33 ROperator_Constant(
const std::string & type,
const std::vector<T> & values,
const std::vector<size_t> & shape, std::string nameX, std::string nameY):
44 std::vector<ETensorType>
TypeInference(std::vector<ETensorType> input)
override {
48 std::vector<std::vector<size_t>>
ShapeInference(std::vector<std::vector<size_t>> input)
override {
60 if (model.CheckIfTensorAlreadyExist(
fNX) ==
false){
61 throw std::runtime_error(
"TMVA SOFIE ConstantOfShape Op Input Tensor is not found in model");
65 if (model.IsConstantTensor(
fNX)) {
67 auto dptr = model.GetInitializedTensorData(
fNX);
68 auto input_tensor =
static_cast<int64_t *
>(dptr.get());
69 auto input_shape = model.GetTensorShape(
fNX);
70 if (input_shape.size() > 1 )
71 throw std::runtime_error(
"TMVA SOFIE ConstantOfShape Op Input Tensor has invalid shape");
72 if (input_tensor !=
nullptr && !input_shape.empty()) {
73 fShape = std::vector<size_t> (input_shape[0]);
74 for (
size_t i = 0; i <
fShape.size(); i++)
75 fShape[i] = input_tensor[i];
81 throw std::runtime_error(
"TMVA SOFIE ConstantOfShape Op value Tensor has invalid size " + std::to_string(
fValues.size()));
84 fValues = std::vector<T>(length, value);
86 else if (model.IsShapeTensor(
fNX)) {
95 throw std::runtime_error(
"TMVA SOFIE ConstantOfShape Op Input Tensor has invalid shape");
98 for (
size_t i = 0; i <
fDimShape[0].dim; i++) {
103 throw std::runtime_error(
"TMVA SOFIE ConstantOfShape Op Input Tensor has not defied shape");
114 " with " + std::to_string(
fValues.size()) +
" values");
123 if (model.Verbose()) {
129 std::cout <<
"... " <<
fValues[0] <<
" ....]" << std::endl;
138 std::string
Generate(std::string opName)
override {
140 std::stringstream out;
155 out <<
SP <<
"size_t " <<
fDimOutputShape[i].param <<
" = " <<
"tensor_" <<
fNX <<
"[" << i <<
"];\n";
160 out <<
SP <<
"std::fill(tensor_" <<
fNY <<
", tensor_" <<
fNY <<
" + " << length <<
", " <<
fValues[0] <<
");\n";
std::vector< size_t > fShape
std::vector< std::vector< size_t > > ShapeInference(std::vector< std::vector< size_t > > input) override
std::vector< Dim > fDimOutputShape
ROperator_Constant(const std::string &type, const std::vector< T > &values, const std::vector< size_t > &shape, std::string nameX, std::string nameY)
void Initialize(RModel &model) override
bool fIsUndefinedInputShape
std::vector< Dim > fDimShape
std::string Generate(std::string opName) override
std::vector< ETensorType > TypeInference(std::vector< ETensorType > input) override
std::vector< std::string_view > fInputTensorNames
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::vector< std::string_view > fOutputTensorNames
std::string ConvertDimShapeToString(const std::vector< Dim > &shape)
std::size_t ConvertShapeToLength(const std::vector< size_t > &shape)
std::string ConvertValuesToString(size_t n, const T *data, size_t maxprint=-1)
ETensorType ConvertStringToType(std::string type)
std::string ConvertDimShapeToLength(const std::vector< Dim > &shape)
std::string ConvertShapeToString(const std::vector< size_t > &shape)
create variable transformations