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];
232 if (fShapeX.empty() || fShapeW.empty() || (fNB !=
"" && fShapeB.empty()) || fShapeY.empty()) {
233 throw std::runtime_error(
"TMVA SOFIE Conv Op called to Generate without being initialized first");
236 std::stringstream out;
238 size_t bsize = fShapeX[0];
239 size_t kDepth = (fDim > 2) ? fShapeW[2] : 1;
240 size_t kHeight = (fDim > 1) ? fShapeW[fDim] : 1;
241 size_t kWidth = fShapeW[fDim + 1];
243 size_t iDepth = (fDim > 2) ? fShapeX[2] : 1;
244 size_t iHeight = (fDim > 1) ? fShapeX[fDim] : 1;
245 size_t iWidth = fShapeX[fDim + 1];
247 size_t oDepth = (fDim > 2) ? fShapeY[2] : 1;
248 size_t oHeight = (fDim > 1) ? fShapeY[fDim] : 1;
249 size_t oWidth = fShapeY[fDim + 1];
251 out <<
"\n//---- operator ConvTranspose " <<
OpName <<
"\n";
255 out << SP << fType <<
" * " <<
OpName <<
"_f = fVec_" <<
OpName <<
"_f.data();\n";
260 out << SP << fType <<
" " <<
OpName <<
"_f[" << fShapeW[0] * fShapeW[1] *
kernelSize <<
"] = {0};\n";
266 size_t id = (fDim > 2) ? fDim - 3 : 2;
267 size_t ih = (fDim > 1) ? fDim - 2 : 1;
268 size_t iw = fDim - 1;
283 for (
size_t i = 0; i < fDim; i++)
289 out << SP <<
"for (std::size_t ic = 0; ic < " << fShapeW[0] <<
"; ic++) {\n";
290 out << SP << SP <<
"for (std::size_t oc = 0; oc < " << fShapeW[1] <<
"; oc++) {\n";
293 out << SP << SP << SP <<
"for (std::size_t kd = 0; kd < " << kDepth <<
"; kd++) {\n";
295 out << SP << SP << SP <<
"for (std::size_t kh = 0; kh < " <<
kHeight <<
"; kh++) {\n";
296 out << SP << SP << SP << SP <<
"for (std::size_t kw = 0; kw < " <<
kWidth <<
"; kw++) {\n";
315 out << SP << SP << SP << SP <<
"}\n";
317 out << SP << SP << SP <<
"}\n";
319 out << SP << SP << SP <<
"}\n";
321 out << SP << SP <<
"}\n";
324 out << SP <<
"char " <<
OpName <<
"_transA = 'N';\n";
325 out << SP <<
"char " <<
OpName <<
"_transB = 'T';\n";
328 out << SP <<
"int " <<
OpName <<
"_k = " << fShapeW[0] <<
";\n";
329 out << SP <<
"float " <<
OpName <<
"_alpha = 1.0;\n";
330 out << SP <<
"float " <<
OpName <<
"_beta = 0.0;\n";
333 out << SP << fType <<
" * " <<
OpName <<
"_xcol = fVec_" <<
OpName <<
"_xcol.data();\n";
339 out << SP <<
"for (size_t n = 0; n < " <<
bsize <<
"; n++) {\n";
349 if (fAttrPads[0] != fAttrPads[1]) {
350 std::cout <<
"TMVA SOFIE Operator Conv: asymmetric padding not supported. Assume an average padding "
352 fAttrPads[0] = (fAttrPads[0] + fAttrPads[1]) / 2;
357 if (fAttrPads[0] != fAttrPads[2] || fAttrPads[1] != fAttrPads[3]) {
358 std::cout <<
"TMVA SOFIE Operator ConvTranspose: asymmetric padding not supported. Assume an average padding "
360 fAttrPads[0] = (fAttrPads[0] + fAttrPads[2]) / 2;
361 fAttrPads[1] = (fAttrPads[1] + fAttrPads[3]) / 2;
365 if (fAttrPads[0] != fAttrPads[3] || fAttrPads[1] != fAttrPads[4] || fAttrPads[2] != fAttrPads[5]) {
366 std::cout <<
"TMVA SOFIE Operator ConvTranspose: asymmetric padding not supported. Assume an average padding "
368 fAttrPads[0] = (fAttrPads[0] + fAttrPads[3]) / 2;
369 fAttrPads[1] = (fAttrPads[1] + fAttrPads[4]) / 2;
370 fAttrPads[2] = (fAttrPads[2] + fAttrPads[5]) / 2;
374 if (fAttrGroup == 1) {
375 out << SP << SP <<
"size_t x_offset = n * " << fShapeX[1] *
iDepth *
iHeight *
iWidth <<
";\n";
376 out << SP << SP <<
"size_t out_offset = n * " << fShapeY[1] *
oDepth *
oHeight *
oWidth <<
";\n";
380 out << SP << SP <<
"BLAS::sgemm_(&" <<
OpName <<
"_transA, &" <<
OpName <<
"_transB, &" <<
OpName <<
"_m, &"
382 <<
"tensor_" << fNX <<
" + x_offset, &" <<
OpName <<
"_m,\n";
383 out << SP << SP << SP <<
OpName <<
"_f, &" <<
OpName <<
"_n, &" <<
OpName <<
"_beta, "
390 out << SP << SP <<
"TMVA::Experimental::SOFIE::UTILITY::col2im<float>(" <<
OpName <<
"_xcol,"
395 out <<
"1, " << fAttrKernelShape[0] <<
",0," << fAttrPads[0] <<
",1," << fAttrStrides[0] <<
",1,"
396 << fAttrDilations[0];
398 out << fAttrKernelShape[0] <<
"," << fAttrKernelShape[1] <<
"," << fAttrPads[0] <<
"," << fAttrPads[1]
399 <<
"," << fAttrStrides[0] <<
"," << fAttrStrides[1] <<
"," << fAttrDilations[0] <<
","
400 << fAttrDilations[1];
401 out <<
", tensor_" << fNY <<
" + out_offset);\n\n ";
404 throw std::runtime_error(
"TMVA SOFIE 3D Conv Transpose not yet supported");
405 out << SP << SP <<
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" << fNX
410 << fShapeX[1] <<
"," <<
oDepth <<
"," <<
oHeight <<
"," <<
oWidth <<
"," << fAttrKernelShape[0] <<
","
411 << fAttrKernelShape[1] <<
"," << fAttrKernelShape[2] <<
"," << fAttrPads[0] <<
"," << fAttrPads[1] <<
","
412 << fAttrPads[2] <<
"," << fAttrStrides[0] <<
"," << fAttrStrides[1] <<
"," << fAttrStrides[2] <<
","
413 << fAttrDilations[0] <<
"," << fAttrDilations[1] <<
"," << fAttrDilations[2] <<
"," <<
OpName
426 out << SP << SP <<
"for (size_t g = 0; g < " << fAttrGroup <<
"; g++) {\n";
427 out << SP << SP <<
"size_t x_offset = n * " << fShapeX[1] *
iHeight *
iWidth <<
" + g * "
429 out << SP << SP <<
"size_t out_offset = n * " << fShapeY[1] *
oHeight *
oWidth <<
" + g * "
433 out << SP << SP <<
"BLAS::sgemm_(&" <<
OpName <<
"_transA, &" <<
OpName <<
"_transB, &" <<
OpName <<
"_m, &"
435 <<
"tensor_" << fNX <<
" + x_offset, &" <<
OpName
438 <<
"_beta, " <<
OpName <<
"_xcol , &" <<
OpName <<
"_m);\n";
441 out << SP << SP <<
"TMVA::Experimental::SOFIE::UTILITY::col2im<float>(" <<
OpName <<
"_xcol,"
446 out <<
"1, " << fAttrKernelShape[0] <<
",0," << fAttrPads[0] <<
",1," << fAttrStrides[0] <<
",1,"
447 << fAttrDilations[0];
449 out << fAttrKernelShape[0] <<
"," << fAttrKernelShape[1] <<
"," << fAttrPads[0] <<
"," << fAttrPads[1]
450 <<
"," << fAttrStrides[0] <<
"," << fAttrStrides[1] <<
"," << fAttrDilations[0] <<
","
451 << fAttrDilations[1];
452 out <<
", tensor_" << fNY <<
" + out_offset);\n\n ";
455 throw std::runtime_error(
"TMVA SOFIE 3D Conv Transpose not yet supported");
457 out << SP << SP <<
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" << fNX
462 << fShapeX[1] <<
"," <<
oDepth <<
"," <<
oHeight <<
"," <<
oWidth <<
"," << fAttrKernelShape[0] <<
","
463 << fAttrKernelShape[1] <<
"," << fAttrKernelShape[2] <<
"," << fAttrPads[0] <<
"," << fAttrPads[1] <<
","
464 << fAttrPads[2] <<
"," << fAttrStrides[0] <<
"," << fAttrStrides[1] <<
"," << fAttrStrides[2] <<
","
465 << fAttrDilations[0] <<
"," << fAttrDilations[1] <<
"," << fAttrDilations[2] <<
"," <<
OpName
479 out << SP << SP <<
"}\n";
484 if (fNBroadcastedB !=
"") {
486 out << SP <<
"float " <<
OpName <<
"_gamma = 1.0;\n";
487 out << SP <<
"int " <<
OpName <<
"_incx = 1;\n";
488 out << SP <<
"int " <<
OpName <<
"_incy = 1;\n";
490 out << SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_size, &" <<
OpName <<
"_gamma, tensor_" << fNBroadcastedB <<
", &"
491 <<
OpName <<
"_incx, tensor_" << fNY <<
", &" <<
OpName <<
"_incy);\n";