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            std::runtime_error(
"TMVA SOFIE Conv Op called to Generate without being initialized first");
 
  311      std::stringstream out;
 
  323      out << 
"\n//----  operator Conv " << 
OpName << 
"\n";
 
  329      size_t id = (
fDim > 2) ? 
fDim-3 : 2;
 
  343      out << 
SP << 
"for (std::size_t oc = 0; oc < " << 
fShapeW[0] << 
"; oc++) {\n";
 
  344      out << 
SP << 
SP << 
"for (std::size_t ic = 0; ic < " << 
fShapeW[1] << 
"; ic++) {\n";
 
  346         out << 
SP << 
SP << 
SP << 
"for (std::size_t kd = 0; kd < " << kDepth << 
"; kd++) {\n";
 
  348         out << 
SP << 
SP << 
SP << 
"for (std::size_t kh = 0; kh < " << 
kHeight << 
"; kh++) {\n";
 
  349      out << 
SP << 
SP << 
SP << 
SP << 
"for (std::size_t kw = 0; kw < " << 
kWidth << 
"; kw++) {\n";
 
  351      out << 
SP << 
SP << 
SP << 
SP << 
SP << 
"tensor_" <<
fNX <<  
"_f[oc * " 
  360      out << 
SP << 
SP << 
SP << 
SP << 
"}\n";
 
  363      out << 
SP << 
SP << 
"}\n";
 
  367      out << 
SP << 
"char " << 
OpName << 
"_transA = 'N';\n";
 
  368      out << 
SP << 
"char " << 
OpName << 
"_transB = 'N';\n";
 
  374      out << 
SP << 
"float " << 
OpName << 
"_alpha = 1.0;\n";
 
  375      out << 
SP << 
"float " << 
OpName << 
"_beta = 0.0;\n";
 
  379      out << 
SP << 
"for (size_t n = 0; n < " << 
bsize << 
"; n++) {\n";
 
  390            std::cout << 
"TMVA SOFIE Operator Conv:  asymmetric padding not supported. Assume an average padding " 
  399            std::cout << 
"TMVA SOFIE Operator Conv:  asymmetric padding not supported. Assume an average padding " << std::endl;
 
  406            std::cout << 
"TMVA SOFIE Operator Conv:  asymmetric padding not supported. Assume an average padding " << std::endl;
 
  419            out << 
SP << 
SP << 
"TMVA::Experimental::SOFIE::UTILITY::Im2col<float>(tensor_" << 
fNX 
  432            out << 
"," << 
"tensor_" <<
fNX << 
"_xcol);\n\n ";
 
  435            out << 
SP << 
SP << 
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" << 
fNX 
  445                << 
"tensor_" << 
fNX << 
"_xcol);\n\n ";
 
  448         out << 
SP << 
SP << 
"BLAS::sgemm_(&" << 
OpName << 
"_transA, &" << 
OpName << 
"_transB, &" << 
OpName << 
"_m, &" 
  452             << 
" + out_offset, &" << 
OpName << 
"_m);\n";
 
  458         out << 
SP << 
SP << 
"for (size_t g = 0; g < " << 
fAttrGroup << 
"; g++) {\n";
 
  465            out << 
SP << 
SP << 
"TMVA::Experimental::SOFIE::UTILITY::Im2col<float>(tensor_" << 
fNX 
  478            out << 
", tensor_" << 
fNX << 
"_xcol);\n\n ";
 
  481            out << 
SP << 
SP << 
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" << 
fNX 
  497         out << 
SP << 
SP << 
SP << 
"size_t offset_f = g * " 
  500         out << 
SP << 
SP << 
"BLAS::sgemm_(&" << 
OpName << 
"_transA, &" << 
OpName << 
"_transB, &" << 
OpName << 
"_m, &" 
  503         out << 
SP << 
SP << 
SP << 
"tensor_" << 
fNX << 
"_f + offset_f, &" << 
OpName << 
"_k, &" << 
OpName << 
"_beta, tensor_" << 
fNY 
  505             << 
", &" << 
OpName << 
"_m);\n";
 
  507         out << 
SP << 
SP << 
"}\n"; 
 
  512         out << 
SP << 
"float " << 
OpName << 
"_gamma = 1.0;\n";
 
  513         out << 
SP << 
"int " << 
OpName << 
"_incx = 1;\n";
 
  514         out << 
SP << 
"int " << 
OpName << 
"_incy = 1;\n";
 
  516         out << 
SP << 
"BLAS::saxpy_(&" << 
OpName << 
"_size, &" << 
OpName << 
"_gamma, tensor_" << 
fNB2 << 
", &" 
  517             << 
OpName << 
"_incx, tensor_" << 
fNY << 
" + out_offset, &" << 
OpName << 
"_incy);\n";
 
 
  527   std::vector<std::string> 
GetBlasRoutines()
 override { 
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
 
void AddIntermediateTensor(std::string tensor_name, ETensorType type, std::vector< Dim > dim_shape)
 
bool CheckIfTensorAlreadyExist(std::string tensor_name)
 
const ETensorType & GetTensorType(std::string name) const
 
const std::vector< size_t > & GetTensorShape(std::string name) const
 
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
 
std::vector< size_t > fShapeY
 
std::string Generate(std::string OpName) override
 
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< std::vector< size_t > > ShapeInference(std::vector< std::vector< size_t > > input) override
 
void Initialize(RModel &model) override
 
std::string GenerateInitCode() override
 
std::vector< size_t > fShapeX
 
std::vector< size_t > fAttrStrides
 
std::vector< ETensorType > TypeInference(std::vector< ETensorType > input) override
 
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< size_t > fAttrKernelShape
 
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