1#ifndef TMVA_SOFIE_ROPERATOR_CONV
2#define TMVA_SOFIE_ROPERATOR_CONV
16namespace Experimental {
55 std::vector<size_t> strides, std::string
nameX, std::string
nameW,
62 if(std::is_same<T, float>::value) {
66 std::runtime_error(
"TMVA SOFIE Encountered unsupported type parsing a Conv operator");
74 std::vector<size_t> strides, std::string
nameX, std::string
nameW,
80 if(std::is_same<T, float>::value) {
84 std::runtime_error(
"TMVA SOFIE Encountered unsupported type parsing a Conv operator");
100 if (
input.size() > 3 ) {
102 std::runtime_error(
"TMVA SOFIE Conv Op Shape inference need 2 or 3 input tensors");
104 for(
size_t i = 0; i <
input.size(); i++) {
107 std::runtime_error(
"TMVA SOFIE Conv Op Shape inference - invalid inputs ");
121 size_t i1 = (
fDim > 1) ? ((
fDim > 2) ? 3 : 2) : 1;
122 size_t i2 = (
fDim > 2) ? 4 : 3;
162 std::runtime_error(
"TMVA SOFIE Conv Op invalid fAutopad");
208 std::runtime_error(
"TMVA SOFIE Conv op Input Tensor " +
fNX +
" is not found in model");
214 std::runtime_error(
"TMVA SOFIE Conv Op input data tensor" +
fNX +
" is not of 3,4 or 5 dimensions");
219 std::runtime_error(
"TMVA SOFIE Conv op Input weight Tensor " +
fNW +
" is not found in model");
224 throw std::runtime_error(
"TMVA SOFIE Conv Op input weight tensor" +
fNW +
" is not of 3,4 or 5 dimensions");
231 std::runtime_error(
"TMVA SOFIE Conv op Input Tensor " +
fNB +
" is not found in model");
240 throw std::runtime_error(
"TMVA SOFIE Conv op: Bias Tensor has empty shape");
244 throw std::runtime_error(
"TMVA SOFIE Conv op: Bias Tensor has wrong shape: " +
246 if (
fType !=
"float")
247 throw std::runtime_error(
"TMVA SOFIE Conv op: Broadcasting for non-float type tensors is not supported");
250 std::vector<size_t> shape(
fDim + 1, 1);
254 std::default_delete<
float[]>());
270 for (
size_t i = 1; i <
fDim; i++) {
286 std::stringstream out;
290 std::vector<size_t> shape(
fDim + 1, 1);
294 out <<
SP <<
SP <<
"float * data = TMVA::Experimental::SOFIE::UTILITY::UnidirectionalBroadcast<float>(tensor_"
297 out <<
SP <<
SP <<
"delete[] data;\n";
308 for (
size_t i = 1; i <
fDim; i++) {
314 std::stringstream out;
331 std::runtime_error(
"TMVA SOFIE Conv Op called to Generate without being initialized first");
334 std::stringstream out;
346 out <<
"\n//---- operator Conv " <<
OpName <<
"\n";
356 size_t id = (
fDim > 2) ?
fDim-3 : 2;
370 out <<
SP <<
"for (std::size_t oc = 0; oc < " <<
fShapeW[0] <<
"; oc++) {\n";
371 out <<
SP <<
SP <<
"for (std::size_t ic = 0; ic < " <<
fShapeW[1] <<
"; ic++) {\n";
373 out <<
SP <<
SP <<
SP <<
"for (std::size_t kd = 0; kd < " << kDepth <<
"; kd++) {\n";
375 out <<
SP <<
SP <<
SP <<
"for (std::size_t kh = 0; kh < " <<
kHeight <<
"; kh++) {\n";
376 out <<
SP <<
SP <<
SP <<
SP <<
"for (std::size_t kw = 0; kw < " <<
kWidth <<
"; kw++) {\n";
378 out <<
SP <<
SP <<
SP <<
SP <<
SP <<
"tensor_" <<
fNX <<
"_f[oc * "
387 out <<
SP <<
SP <<
SP <<
SP <<
"}\n";
390 out <<
SP <<
SP <<
"}\n";
394 out <<
SP <<
"char " <<
OpName <<
"_transA = 'N';\n";
395 out <<
SP <<
"char " <<
OpName <<
"_transB = 'N';\n";
401 out <<
SP <<
"float " <<
OpName <<
"_alpha = 1.0;\n";
402 out <<
SP <<
"float " <<
OpName <<
"_beta = 0.0;\n";
405 out <<
SP <<
fType <<
" tensor_" <<
fNX <<
"_xcol["
411 out <<
SP <<
"for (size_t n = 0; n < " <<
bsize <<
"; n++) {\n";
422 std::cout <<
"TMVA SOFIE Operator Conv: asymmetric padding not supported. Assume an average padding "
431 std::cout <<
"TMVA SOFIE Operator Conv: asymmetric padding not supported. Assume an average padding " << std::endl;
438 std::cout <<
"TMVA SOFIE Operator Conv: asymmetric padding not supported. Assume an average padding " << std::endl;
451 out <<
SP <<
SP <<
"TMVA::Experimental::SOFIE::UTILITY::Im2col<float>(tensor_" <<
fNX
464 out <<
"," <<
"tensor_" <<
fNX <<
"_xcol);\n\n ";
467 out <<
SP <<
SP <<
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" <<
fNX
477 <<
"tensor_" <<
fNX <<
"_xcol);\n\n ";
480 out <<
SP <<
SP <<
"BLAS::sgemm_(&" <<
OpName <<
"_transA, &" <<
OpName <<
"_transB, &" <<
OpName <<
"_m, &"
484 <<
" + out_offset, &" <<
OpName <<
"_m);\n";
490 out <<
SP <<
SP <<
"for (size_t g = 0; g < " <<
fAttrGroup <<
"; g++) {\n";
497 out <<
SP <<
SP <<
"TMVA::Experimental::SOFIE::UTILITY::Im2col<float>(tensor_" <<
fNX
510 out <<
", tensor_" <<
fNX <<
"_xcol);\n\n ";
513 out <<
SP <<
SP <<
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" <<
fNX
529 out <<
SP <<
SP <<
SP <<
"size_t offset_f = g * "
532 out <<
SP <<
SP <<
"BLAS::sgemm_(&" <<
OpName <<
"_transA, &" <<
OpName <<
"_transB, &" <<
OpName <<
"_m, &"
535 out <<
SP <<
SP <<
SP <<
"tensor_" <<
fNX <<
"_f + offset_f, &" <<
OpName <<
"_k, &" <<
OpName <<
"_beta, tensor_" <<
fNY
537 <<
", &" <<
OpName <<
"_m);\n";
539 out <<
SP <<
SP <<
"}\n";
544 out <<
SP <<
"float " <<
OpName <<
"_gamma = 1.0;\n";
545 out <<
SP <<
"int " <<
OpName <<
"_incx = 1;\n";
546 out <<
SP <<
"int " <<
OpName <<
"_incy = 1;\n";
548 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_size, &" <<
OpName <<
"_gamma, tensor_" <<
fNB2 <<
", &"
549 <<
OpName <<
"_incx, tensor_" <<
fNY <<
" + out_offset, &" <<
OpName <<
"_incy);\n";
559 std::vector<std::string>
GetBlasRoutines() {
return { std::string(
"Gemm"), std::string(
"Axpy") }; }
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
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 id
const ETensorType & GetTensorType(std::string name)
void AddIntermediateTensor(std::string tensor_name, ETensorType type, std::vector< Dim > dim_shape)
bool CheckIfTensorAlreadyExist(std::string tensor_name)
const std::vector< size_t > & GetTensorShape(std::string name)
std::shared_ptr< void > GetInitializedTensorData(std::string tensor_name)
void UpdateInitializedTensor(std::string tensor_name, ETensorType type, std::vector< std::size_t > shape, std::shared_ptr< void > data)
std::vector< size_t > fAttrDilations
virtual std::string GenerateSessionMembersCode(std::string opName)
std::vector< size_t > fShapeY
std::string Generate(std::string OpName)
std::string GenerateInitCode()
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)
void Initialize(RModel &model) override
std::vector< size_t > fShapeX
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< std::string > GetBlasRoutines()
Returns the blas routines needed to compile the generated code.
std::vector< size_t > fAttrKernelShape
std::vector< std::vector< size_t > > ShapeInference(std::vector< std::vector< size_t > > input)
std::vector< ETensorType > TypeInference(std::vector< ETensorType > input)
std::vector< std::string_view > fInputTensorNames
const std::string SP
space used to correctly indent the generated C++ code
bool fUseSession
flag to identify if using the session class
std::vector< std::string_view > fOutputTensorNames
bool AreSameShape(const std::vector< size_t > &, const std::vector< size_t > &)
std::string ConvertShapeToString(std::vector< size_t > shape)
ETensorType ConvertStringToType(std::string type)
std::size_t ConvertShapeToLength(std::vector< size_t > shape)
create variable transformations