1#ifndef TMVA_SOFIE_ROPERATOR_Concat
2 #define TMVA_SOFIE_ROPERATOR_Concat
16 namespace Experimental{
35 for (
auto &
name : inputs)
44 std::vector<std::vector<size_t>>
ShapeInference(std::vector<std::vector<size_t>> inputs){
45 std::vector<std::vector<size_t>> ret(1);
50 if (fAxis < 0 || fAxis >= (
int) inputs[0].
size())
51 throw std::runtime_error(
"TMVA SOFIE Concat Op - invalid axis value ");
55 for (
size_t i = 0; i < inputs.size(); i++) {
56 if (i > 0 && inputs[i].
size() != inputs[i - 1].
size())
57 throw std::runtime_error(
"TMVA SOFIE Concat Op - input tensors have different shapes " +
59 for (
size_t iaxis = 0; iaxis < inputs[i].size(); iaxis++) {
60 if ((
int)iaxis ==
fAxis)
61 concat_dim += inputs[i][iaxis];
62 else if (i > 0 && inputs[i][iaxis] != inputs[i - 1][iaxis])
63 throw std::runtime_error(
"TMVA SOFIE Concat Op - input tensors have wrong shapes " +
71 ret[0][
fAxis] = concat_dim;
73 std::vector<int> stack;
75 for(
size_t i = 0; i < inputs.size(); i++) {
76 if (i > 0 && inputs[i].
size() != inputs[i-1].
size() )
77 throw std::runtime_error(
"TMVA SOFIE Concat Op - input tensors have different shapes " +
79 for (
size_t iaxis = 0; iaxis < inputs[i].size(); iaxis++) {
80 if ((
int) iaxis ==
fAxis)
81 stack.push_back(inputs[i][iaxis]);
83 if (i> 0 && inputs[i][iaxis] != inputs[i-1][iaxis])
84 throw std::runtime_error(
"TMVA SOFIE Concat Op - input tensors have wrong shapes " +
97 std::vector<std::vector<Dim>>
ShapeInference(
const std::vector<std::vector<Dim>> & inputs){
98 std::vector<std::vector<Dim>> ret(1);
103 if (fAxis < 0 || fAxis >= (
int) inputs[0].
size())
104 throw std::runtime_error(
"TMVA SOFIE Concat Op - invalid axis value ");
108 for (
size_t i = 0; i < inputs.size(); i++) {
109 if (i > 0 && inputs[i].
size() != inputs[i - 1].
size())
110 throw std::runtime_error(
"TMVA SOFIE Concat Op - input tensors have different shapes " +
112 for (
size_t iaxis = 0; iaxis < inputs[i].size(); iaxis++) {
113 if ((
int)iaxis ==
fAxis) {
115 if (inputs[i][iaxis].isParam)
116 throw std::runtime_error(
"TMVA SOFIE Concat Op - not supporting input param dimensions for concatenation axis. Input shape is " +
118 concat_dim += inputs[i][iaxis].dim;
121 else if (i > 0 && inputs[i][iaxis].GetVal() != inputs[i - 1][iaxis].GetVal())
122 throw std::runtime_error(
"TMVA SOFIE Concat Op - input tensors have wrong shapes " +
130 ret[0][
fAxis].dim = concat_dim;
137 throw std::runtime_error(
"TMVA SOFIE Concat Op - stacking (i.e. COncatFromSequence with new_axis=1) is not supported ");
146 throw std::runtime_error(
"TMVA SOFIE Concat Op Input Tensor " + it +
" is not found in model");
155 OpName =
"op_"+OpName;
157 throw std::runtime_error(
"TMVA SOFIE Concat called to Generate without being initialized first");
159 std::stringstream out;
160 out<<
"\n//--------- Concat\n";
162 bool hasShapeOnes =
true;
163 for(
int i = 0; i<
fAxis; ++i){
165 hasShapeOnes =
false;
169 if (
fAxis == 0 || hasShapeOnes) {
171 for(
size_t i=0; i<
fInputs.size(); ++i) {
182 std::vector<std::vector<Dim>> inStrides(
fInputs.size());
184 for (
auto &s : inStrides) {
188 for (
int i = 0; i <
fAxis; ++i) {
190 out <<
SP <<
"for (size_t i" << i <<
" = 0; i" << i <<
" < " <<
fOutputShape[i].GetVal() <<
"; ++i" << i <<
") {\n";
193 out <<
SP <<
SP <<
SP <<
"int idxOut = ";
194 for (
int k = 0; k <
fAxis; k++) {
195 if (k > 0) out <<
" + ";
196 out << outStride[k].GetVal() <<
"*i" << k;
200 for (
size_t j = 0; j <
fInputs.size(); j++) {
203 out <<
SP <<
SP <<
SP <<
"int idxIn" << j <<
" = ";
204 for (
int k = 0; k <
fAxis; k++) {
205 if (k > 0) out <<
" + ";
206 out << inStrides[j][k].GetVal() <<
"*i" << k;
210 out <<
SP <<
SP <<
SP <<
SP <<
"tensor_" <<
fOutput <<
"[idxOut+iC] = tensor_" <<
fInputs[j] <<
"[idxIn" << j <<
"+iC];\n";
211 out <<
SP <<
SP <<
SP <<
"}\n";
214 for (
int i = 0; i <
fAxis; ++i) {
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
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 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 offset
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)
std::vector< Dim > GetDynamicTensorShape(std::string name)
bool CheckIfTensorAlreadyExist(std::string tensor_name)
std::vector< std::vector< Dim > > ShapeInference(const std::vector< std::vector< Dim > > &inputs)
std::vector< ETensorType > TypeInference(std::vector< ETensorType > input)
std::vector< std::vector< size_t > > ShapeInference(std::vector< std::vector< size_t > > inputs)
std::vector< Dim > fOutputShape
void Initialize(RModel &model)
std::vector< std::vector< Dim > > fInputShapes
std::string Generate(std::string OpName)
ROperator_Concat(std::vector< std::string > inputs, int axis, int newAxis, std::string output)
std::vector< std::string > fInputs
const std::string SP
space used to correctly indent the generated C++ code
std::string Clean_name(std::string input_tensor_name)
std::vector< size_t > ComputeStrideFromShape(const std::vector< size_t > &shape)
compute stride of a tensor given its shape (assume layout is row-major)
std::string ConvertDynamicShapeToLength(std::vector< Dim > shape)
std::string ConvertShapeToString(std::vector< size_t > shape)
std::string ConvertDynamicShapeToString(std::vector< Dim > shape)
create variable transformations