19   -> std::vector<std::vector<size_t>>
 
   29   if (fAttrStrides.empty()) {
 
   30      fAttrStrides = std::vector<size_t>(fDim, 1);
 
   32   if (fAttrDilations.empty()) {
 
   33      fAttrDilations = std::vector<size_t>(fDim, 1);
 
   36   if (fAttrKernelShape.empty()) {
 
   37      fAttrKernelShape.resize(fDim);
 
   38      for (
size_t i = 0; i < fDim; i++)
 
   39         fAttrKernelShape[i] = fShapeW[i + 2] + (fAttrDilations[i] - 1) * (fShapeW[i + 2] - 1);
 
   41   if (fAttrOutputPadding.empty())
 
   42      fAttrOutputPadding = std::vector<size_t>(fDim, 0);
 
   54   if (fAttrPads.empty() ) {
 
   55      fAttrPads = std::vector<size_t>(2 * fDim, 0);
 
   56      if (fAttrOutputShape.size() == fDim) {
 
   60         std::runtime_error(
"ConvTranspose with output_shape explicitly set not yet supported.");
 
   81      if (fAttrAutopad != 
"NOTSET") {
 
   83         std::runtime_error(
"ConvTranspose with padding SAME_UPPER or SMAE_LOWER not supported");
 
   86   if (fAttrOutputShape.empty()) {
 
   87      fAttrOutputShape.resize(fDim);
 
   88      for (
size_t i = 0; i < fDim; i++) {
 
   90         fAttrOutputShape[i] = fAttrStrides[i] * (
inputShape[
j] - 1) + fAttrKernelShape[i] + fAttrOutputPadding[i] - fAttrPads[i] - fAttrPads[fDim+i];
 
   96         std::runtime_error(
"ConvTranspose with output_shape explicitly set not yet supported.");
 
   99   for (
size_t i = 0; i < fDim; i++)
 
  100      outShape[i + 2] = fAttrOutputShape[i];
 
 
  110      throw std::runtime_error(
"TMVA SOFIE Conv Transpose op Input Tensor " + fNX + 
" is not found in model");
 
  113   if (fShapeX.size() < 3 || fShapeX.size() > 5) {
 
  115      throw std::runtime_error(
"TMVA SOFIE Conv Transpose Op input data tensor" + fNX +
 
  116                               " is not of 3,4 or 5 dimensions");
 
  118   fDim = fShapeX.size() - 2;
 
  120      throw std::runtime_error(
"TMVA SOFIE Conv op Input weight Tensor " + fNW + 
" is not found in model");
 
  123   if (fShapeW.size() < 3 || fShapeW.size() > 5) {
 
  125      throw std::runtime_error(
"TMVA SOFIE Conv Transpose Op input weight tensor" + fNW +
 
  126                               " is not of 3,4 or 5 dimensions");
 
  128   fShapeY = ShapeInference({fShapeX, fShapeW})[0];
 
  133         throw std::runtime_error(
"TMVA SOFIE ConvTrans op Input Tensor " + fNB + 
" is not found in model");
 
  136      if (fShapeB.size() < 1)
 
  137            throw std::runtime_error(
"TMVA SOFIE ConvTrans op: Bias Tensor has empty shape");
 
  147         if (
bsize != fShapeY[1] )
 
  148            throw std::runtime_error(
"TMVA SOFIE ConvTrans op: Bias Tensor has wrong shape: " +
 
  153         if (fType != 
"float")
 
  154            throw std::runtime_error(
"TMVA SOFIE ConvTrans op: Broadcasting for non-float type tensors is not supported");
 
  159               UTILITY::BroadcastConvBias<float>(
static_cast<float *
>(
original_data.get()), 
bsize, fShapeY),
 
  160               std::default_delete<
float[]>());
 
  164            fNBroadcastedB = fNB; 
 
  168            fNBroadcastedB = 
"Broadcasted" + fNB;
 
  174         if (fShapeY != fShapeB)
 
  175            throw std::runtime_error(
"TMVA SOFIE ConvTrans op: Broadcasting is not needed but bias has wrong shape" +
 
  177         fNBroadcastedB = fNB;
 
  182   size_t inputSize = 1;
 
  183   for (
size_t i = 0; i < fDim; i++) {
 
  184      inputSize *= fShapeX[2+ i];
 
  193   fImcol = fNX +
"_xcol";
 
  194   fOutputTensorNames.emplace_back(fConvK);
 
  195   fOutputTensorNames.emplace_back(fImcol);
 
 
  222   if (fShapeX.empty() || fShapeW.empty() || (fNB != 
"" && fShapeB.empty()) || fShapeY.empty()) {
 
  223      throw std::runtime_error(
"TMVA SOFIE Conv Op called to Generate without being initialized first");
 
  226   std::stringstream out;
 
  228   size_t bsize = fShapeX[0];
 
  229   size_t kDepth = (fDim > 2) ? fShapeW[2] : 1;     
 
  230   size_t kHeight = (fDim > 1) ? fShapeW[fDim] : 1; 
 
  231   size_t kWidth = fShapeW[fDim + 1];               
 
  233   size_t iDepth = (fDim > 2) ? fShapeX[2] : 1;     
 
  234   size_t iHeight = (fDim > 1) ? fShapeX[fDim] : 1; 
 
  235   size_t iWidth = fShapeX[fDim + 1];               
 
  237   size_t oDepth = (fDim > 2) ? fShapeY[2] : 1;     
 
  238   size_t oHeight = (fDim > 1) ? fShapeY[fDim] : 1; 
 
  239   size_t oWidth = fShapeY[fDim + 1];               
 
  241   out << 
"\n//----  operator ConvTranspose " << 
OpName << 
"\n";
 
  248      out << SP << fType << 
" tensor_" << fNX << 
"_f[" << fShapeW[0] * fShapeW[1] * 
kernelSize << 
"] = {0};\n";
 
  254   size_t id = (fDim > 2) ? fDim - 3 : 2;
 
  255   size_t ih = (fDim > 1) ? fDim - 2 : 1;
 
  256   size_t iw = fDim - 1;
 
  271   for (
size_t i = 0; i < fDim; i++)
 
  277   out << SP << 
"for (std::size_t ic = 0; ic < " << fShapeW[0] << 
"; ic++) {\n";
 
  278   out << SP << SP << 
"for (std::size_t oc = 0; oc < " << fShapeW[1] << 
"; oc++) {\n";
 
  281      out << SP << SP << SP << 
"for (std::size_t kd = 0; kd < " << kDepth << 
"; kd++) {\n";
 
  283      out << SP << SP << SP << 
"for (std::size_t kh = 0; kh < " << 
kHeight << 
"; kh++) {\n";
 
  284   out << SP << SP << SP << SP << 
"for (std::size_t kw = 0; kw < " << 
kWidth << 
"; kw++) {\n";
 
  286   out << SP << SP << SP << SP << SP << 
"tensor_" << fNX << 
"_f[ic * " << 
ocstrideDil << 
" + oc * " << 
icstrideDil;
 
  303   out << SP << SP << SP << SP << 
"}\n";
 
  305      out << SP << SP << SP << 
"}\n";
 
  307      out << SP << SP << SP << 
"}\n";
 
  309   out << SP << SP << 
"}\n";
 
  312   out << SP << 
"char " << 
OpName << 
"_transA = 'N';\n";
 
  313   out << SP << 
"char " << 
OpName << 
"_transB = 'T';\n";
 
  316   out << SP << 
"int " << 
OpName << 
"_k = " << fShapeW[0] << 
";\n";  
 
  317   out << SP << 
"float " << 
OpName << 
"_alpha = 1.0;\n";
 
  318   out << SP << 
"float " << 
OpName << 
"_beta = 0.0;\n";
 
  325   out << SP << 
"for (size_t n = 0; n < " << 
bsize << 
"; n++) {\n";
 
  335      if (fAttrPads[0] != fAttrPads[1]) {
 
  336         std::cout << 
"TMVA SOFIE Operator Conv:  asymmetric padding not supported. Assume an average padding " 
  338         fAttrPads[0] = (fAttrPads[0] + fAttrPads[1]) / 2;
 
  343      if (fAttrPads[0] != fAttrPads[2] || fAttrPads[1] != fAttrPads[3]) {
 
  344         std::cout << 
"TMVA SOFIE Operator ConvTranspose:  asymmetric padding not supported. Assume an average padding " 
  346         fAttrPads[0] = (fAttrPads[0] + fAttrPads[2]) / 2;
 
  347         fAttrPads[1] = (fAttrPads[1] + fAttrPads[3]) / 2;
 
  351      if (fAttrPads[0] != fAttrPads[3] || fAttrPads[1] != fAttrPads[4] || fAttrPads[2] != fAttrPads[5]) {
 
  352         std::cout << 
"TMVA SOFIE Operator ConvTranspose:  asymmetric padding not supported. Assume an average padding " 
  354         fAttrPads[0] = (fAttrPads[0] + fAttrPads[3]) / 2;
 
  355         fAttrPads[1] = (fAttrPads[1] + fAttrPads[4]) / 2;
 
  356         fAttrPads[2] = (fAttrPads[2] + fAttrPads[5]) / 2;
 
  360   if (fAttrGroup == 1) {
 
  361      out << SP << SP << 
"size_t x_offset = n * " << fShapeX[1] * 
iDepth * 
iHeight * 
iWidth << 
";\n";
 
  362      out << SP << SP << 
"size_t out_offset = n * " << fShapeY[1] * 
oDepth * 
oHeight * 
oWidth << 
";\n";
 
  366      out << SP << SP << 
"BLAS::sgemm_(&" << 
OpName << 
"_transA, &" << 
OpName << 
"_transB, &" << 
OpName << 
"_m, &" 
  368          <<  
"tensor_" << fNX << 
" + x_offset, &" << 
OpName << 
"_m,\n"; 
 
  369      out << SP << SP << SP << 
"tensor_" << fNX <<
"_f, &" << 
OpName << 
"_n, &" << 
OpName << 
"_beta, tensor_"  
  370      << fNX <<
"_xcol, &" << 
OpName << 
"_m);\n";
 
  376         out << SP << SP << 
"TMVA::Experimental::SOFIE::UTILITY::col2im<float>(tensor_" << fNX << 
"_xcol," 
  381            out << 
"1, " << fAttrKernelShape[0] << 
",0," << fAttrPads[0] << 
",1," << fAttrStrides[0] << 
",1," 
  382                << fAttrDilations[0];
 
  384            out << fAttrKernelShape[0] << 
"," << fAttrKernelShape[1] << 
"," << fAttrPads[0] << 
"," << fAttrPads[1]
 
  385                << 
"," << fAttrStrides[0] << 
"," << fAttrStrides[1] << 
"," << fAttrDilations[0] << 
"," 
  386                << fAttrDilations[1];
 
  387         out << 
", tensor_" << fNY << 
" + out_offset);\n\n ";
 
  390         throw std::runtime_error(
"TMVA SOFIE 3D Conv Transpose not yet supported");
 
  391         out << SP << SP << 
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" << fNX
 
  396             << fShapeX[1] << 
"," << 
oDepth << 
"," << 
oHeight << 
"," << 
oWidth << 
"," << fAttrKernelShape[0] << 
"," 
  397             << fAttrKernelShape[1] << 
"," << fAttrKernelShape[2] << 
"," << fAttrPads[0] << 
"," << fAttrPads[1] << 
"," 
  398             << fAttrPads[2] << 
"," << fAttrStrides[0] << 
"," << fAttrStrides[1] << 
"," << fAttrStrides[2] << 
"," 
  399             << fAttrDilations[0] << 
"," << fAttrDilations[1] << 
"," << fAttrDilations[2] << 
 
  400             ",tensor_" << fNX <<
"_xcol);\n\n ";
 
  412      out << SP << SP << 
"for (size_t g = 0; g < " << fAttrGroup << 
"; g++) {\n";
 
  413      out << SP << SP << 
"size_t x_offset = n * " << fShapeX[1] * 
iHeight * 
iWidth  << 
" + g * " 
  415      out << SP << SP << 
"size_t out_offset = n * " << fShapeY[1] * 
oHeight * 
oWidth << 
" + g * " 
  419      out << SP << SP << 
"BLAS::sgemm_(&" << 
OpName << 
"_transA, &" << 
OpName << 
"_transB, &" << 
OpName << 
"_m, &" 
  421          << 
"tensor_" << fNX << 
" + x_offset, &" << 
OpName 
  423      out << SP << SP << SP << 
"tensor_" << fNX << 
"_f, &" << 
OpName << 
"_n, &" << 
OpName 
  424      << 
"_beta, tensor_" << fNX << 
"_xcol , &" << 
OpName << 
"_m);\n";
 
  427         out << SP << SP << 
"TMVA::Experimental::SOFIE::UTILITY::col2im<float>(tensor_" << fNX << 
"_xcol," 
  432            out << 
"1, " << fAttrKernelShape[0] << 
",0," << fAttrPads[0] << 
",1," << fAttrStrides[0] << 
",1," 
  433                << fAttrDilations[0];
 
  435            out << fAttrKernelShape[0] << 
"," << fAttrKernelShape[1] << 
"," << fAttrPads[0] << 
"," << fAttrPads[1]
 
  436                << 
"," << fAttrStrides[0] << 
"," << fAttrStrides[1] << 
"," << fAttrDilations[0] << 
"," 
  437                << fAttrDilations[1];
 
  438         out << 
", tensor_" << fNY << 
" + out_offset);\n\n ";
 
  441         throw std::runtime_error(
"TMVA SOFIE 3D Conv Transpose not yet supported");
 
  443         out << SP << SP << 
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" << fNX
 
  448             << fShapeX[1] << 
"," << 
oDepth << 
"," << 
oHeight << 
"," << 
oWidth << 
"," << fAttrKernelShape[0] << 
"," 
  449             << fAttrKernelShape[1] << 
"," << fAttrKernelShape[2] << 
"," << fAttrPads[0] << 
"," << fAttrPads[1] << 
"," 
  450             << fAttrPads[2] << 
"," << fAttrStrides[0] << 
"," << fAttrStrides[1] << 
"," << fAttrStrides[2] << 
"," 
  451             << fAttrDilations[0] << 
"," << fAttrDilations[1] << 
"," << fAttrDilations[2] << 
"," << 
"tensor_" << fNX
 
  465      out << SP << SP << 
"}\n"; 
 
  470   if (fNBroadcastedB != 
"") {
 
  472      out << SP << 
"float " << 
OpName << 
"_gamma = 1.0;\n";
 
  473      out << SP << 
"int " << 
OpName << 
"_incx = 1;\n";
 
  474      out << SP << 
"int " << 
OpName << 
"_incy = 1;\n";
 
  476      out << SP << 
"BLAS::saxpy_(&" << 
OpName << 
"_size, &" << 
OpName << 
"_gamma, tensor_" << fNBroadcastedB << 
", &" 
  477          << 
OpName << 
"_incx, tensor_" << fNY << 
", &" << 
OpName << 
"_incy);\n";