1#ifndef TMVA_SOFIE_ROPERATOR_CONV
2#define TMVA_SOFIE_ROPERATOR_CONV
16namespace Experimental {
56 std::vector<size_t> strides, std::string
nameX, std::string
nameW,
63 if(std::is_same<T, float>::value) {
67 std::runtime_error(
"TMVA SOFIE Encountered unsupported type parsing a Conv operator");
75 std::vector<size_t> strides, std::string
nameX, std::string
nameW,
81 if(std::is_same<T, float>::value) {
85 std::runtime_error(
"TMVA SOFIE Encountered unsupported type parsing a Conv operator");
97 throw std::runtime_error(
"TMVA SOFIE Conv Op Shape inference - invalid input ");
99 if (weight.size() -2 !=
fDim) {
100 throw std::runtime_error(
"TMVA SOFIE Conv Op Shape inference - invalid weights ");
103 throw std::runtime_error(
"TMVA SOFIE Conv - param shapes not supported without group attr");
106 throw std::runtime_error(
"TMVA SOFIE Conv - param shapes not supported without kernel attr");
119 size_t i1 = (
fDim > 1) ? ((
fDim > 2) ? 3 : 2) : 1;
120 size_t i2 = (
fDim > 2) ? 4 : 3;
146 for (
size_t d = 0;
d <
fDim; ++
d) {
148 throw std::runtime_error(
149 "TMVA SOFIE Conv Op: SAME padding with parametric input shape is not supported");
154 for (
size_t d = 0;
d <
fDim; ++
d) {
169 std::runtime_error(
"TMVA SOFIE Conv Op invalid fAutopad");
193 std::string
outStr =
"(" +
inputDim.param +
"+" + std::to_string(
v) +
")";
194 return Dim{
outStr,
static_cast<size_t>(-1)};
199 "((" +
inputDim.param +
"+" + std::to_string(
v) +
")/" + std::to_string(
stride) +
"+1)";
200 return Dim{
outStr,
static_cast<size_t>(-1)};
203 throw std::runtime_error(
"TMVA SOFIE Conv Op - invalid values");
234 if (!model.CheckIfTensorAlreadyExist(
fNX)) {
236 std::runtime_error(
"TMVA SOFIE Conv op Input Tensor " +
fNX +
" is not found in model");
242 std::runtime_error(
"TMVA SOFIE Conv Op input data tensor" +
fNX +
" is not of 3,4 or 5 dimensions");
245 if (!model.CheckIfTensorAlreadyExist(
fNW)) {
247 std::runtime_error(
"TMVA SOFIE Conv op Input weight Tensor " +
fNW +
" is not found in model");
252 throw std::runtime_error(
"TMVA SOFIE Conv Op input weight tensor" +
fNW +
" is not of 3,4 or 5 dimensions");
255 model.AddIntermediateTensor(
fNY, model.GetTensorType(
fNX),
fShapeY);
257 if (!model.CheckIfTensorAlreadyExist(
fNB)) {
259 std::runtime_error(
"TMVA SOFIE Conv op Input Tensor " +
fNB +
" is not found in model");
263 throw std::runtime_error(
"TMVA SOFIE Conv op " +
fNY +
" : invalid shape for Bias tensor " +
fNB +
" : " +
271 throw std::runtime_error(
"TMVA SOFIE Conv op: Bias Tensor has empty shape");
275 throw std::runtime_error(
"TMVA SOFIE Conv op: Bias Tensor has wrong shape: " +
277 if (
fType !=
"float")
278 throw std::runtime_error(
"TMVA SOFIE Conv op: Broadcasting for non-float type tensors is not supported");
296 for (
size_t i = 1; i <
fDim; i++) {
314 if (model.Verbose()) {
321 model.AddNeededHelperFunction(
"Im2col");
323 model.AddNeededHelperFunction(
"Im2col_3d");
324 model.AddNeededHelperFunction(
"Gemm_Call");
326 model.AddNeededHelperFunction(
"UnidirectionalBroadcast");
330 std::stringstream out;
334 std::vector<size_t> shape(
fDim + 1, 1);
338 out <<
"//--- broadcast bias tensor " <<
fNB <<
"for Conv op if needed \n";
346 out <<
SP <<
SP <<
"float * data = UTILITY::UnidirectionalBroadcast(tensor_"
348 out <<
SP <<
SP <<
"fTensor_" <<
fNB <<
".resize(" <<
length <<
");\n";
349 out <<
SP <<
SP <<
"std::copy(data, data + " <<
length <<
", fTensor_" <<
fNB <<
".begin());\n";
350 out <<
SP <<
SP <<
"tensor_" <<
fNB <<
" = fTensor_" <<
fNB <<
".data();\n";
351 out <<
SP <<
SP <<
"delete[] data;\n";
362 std::runtime_error(
"TMVA SOFIE Conv Op called to Generate without being initialized first");
365 std::stringstream out;
383 out <<
"\n//---- operator Conv " <<
OpName <<
"\n";
389 size_t id = (
fDim > 2) ?
fDim-3 : 2;
403 out <<
SP <<
"for (std::size_t oc = 0; oc < " <<
fShapeW[0] <<
"; oc++) {\n";
404 out <<
SP <<
SP <<
"for (std::size_t ic = 0; ic < " <<
fShapeW[1] <<
"; ic++) {\n";
406 out <<
SP <<
SP <<
SP <<
"for (std::size_t kd = 0; kd < " << kDepth <<
"; kd++) {\n";
408 out <<
SP <<
SP <<
SP <<
"for (std::size_t kh = 0; kh < " <<
kHeight <<
"; kh++) {\n";
409 out <<
SP <<
SP <<
SP <<
SP <<
"for (std::size_t kw = 0; kw < " <<
kWidth <<
"; kw++) {\n";
419 out <<
SP <<
SP <<
SP <<
SP <<
"}\n";
422 out <<
SP <<
SP <<
"}\n";
430 out <<
SP <<
"char " <<
OpName <<
"_transA = 'N';\n";
431 out <<
SP <<
"char " <<
OpName <<
"_transB = 'N';\n";
437 out <<
SP <<
"float " <<
OpName <<
"_alpha = 1.0;\n";
439 out <<
SP <<
"float " <<
OpName <<
"_beta = 1.0;\n";
441 out <<
SP <<
"float " <<
OpName <<
"_beta = 0.0;\n";
445 out <<
SP <<
"for (size_t n = 0; n < " <<
bsize <<
"; n++) {\n";
469 out <<
SP <<
SP <<
"UTILITY::Im2col<float>(tensor_" <<
fNX
483 out <<
"," <<
"tensor_" <<
imcol <<
");\n\n ";
486 out <<
SP <<
SP <<
"UTILITY::Im2col_3d<float>(tensor_" <<
fNX
496 <<
"tensor_" <<
imcol <<
");\n\n ";
499 out <<
SP <<
"Gemm_Call("
500 <<
"tensor_" <<
fNY <<
" + out_offset, false, false, " <<
OpName <<
"_m, " <<
OpName <<
"_n, " <<
OpName
504 out <<
"tensor_" <<
fNB;
519 out <<
SP <<
SP <<
"for (size_t g = 0; g < " <<
fAttrGroup <<
"; g++) {\n";
526 out <<
SP <<
SP <<
"UTILITY::Im2col<float>(tensor_" <<
fNX
540 out <<
", tensor_" <<
imcol <<
");\n\n ";
543 out <<
SP <<
SP <<
"UTILITY::Im2col_3d<float>(tensor_" <<
fNX
559 out <<
SP <<
SP <<
SP <<
"size_t offset_f = g * "
563 out <<
SP <<
"Gemm_Call("
564 <<
"tensor_" <<
fNY <<
" + out_offset, false, false, " <<
OpName <<
"_m, " <<
OpName <<
"_n, " <<
OpName
565 <<
"_k, " <<
OpName <<
"_alpha, " <<
"tensor_" <<
imcol <<
", tensor_" <<
convK <<
" + offset_f, "
568 out <<
"tensor_" <<
fNB <<
" + g_offset";
581 out <<
SP <<
SP <<
"}\n";
601 std::vector<std::string>
GetBlasRoutines()
override {
return { std::string(
"Gemm"), std::string(
"Axpy") }; }
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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 length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
std::vector< size_t > fAttrDilations
std::string Generate(std::string OpName) override
std::vector< Dim > fShapeY
std::vector< size_t > fShapeW
ROperator_Conv(std::string autopad, std::vector< size_t > dilations, size_t group, std::vector< size_t > kernelShape, std::vector< size_t > pads, std::vector< size_t > strides, std::string nameX, std::string nameW, std::string nameB, std::string nameY)
std::vector< std::string > GetBlasRoutines() override
Returns the blas routines needed to compile the generated code.
std::vector< Dim > fShapeX
void Initialize(RModel &model) override
std::string GenerateInitCode() override
std::vector< size_t > fAttrStrides
std::vector< size_t > fShapeB
std::vector< size_t > fAttrPads
ROperator_Conv(std::string autopad, std::vector< size_t > dilations, size_t group, std::vector< size_t > kernelShape, std::vector< size_t > pads, std::vector< size_t > strides, std::string nameX, std::string nameW, std::string nameY)
std::vector< Dim > DoShapeInference(const std::vector< Dim > &input, const std::vector< size_t > &weight)
std::vector< size_t > fAttrKernelShape
std::vector< std::string_view > fInputTensorNames
const std::string SP
space used to correctly indent the generated C++ code
std::vector< std::string_view > fOutputTensorNames
bool AreSameShape(const std::vector< size_t > &, const std::vector< size_t > &)
std::string ConvertDimShapeToString(const std::vector< Dim > &shape)
std::size_t ConvertShapeToLength(const std::vector< size_t > &shape)
std::vector< size_t > ConvertShapeToInt(const std::vector< Dim > &shape)
Convert shape based on Dim to integer format.
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