29 static auto pool_block_border(
const A& sub,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
32 const auto s_j = j * s1;
33 const auto s_k = k * s2;
35 for (
size_t jj = 0; jj < c1; ++jj) {
36 for (
size_t kk = 0; kk < c2; ++kk) {
37 if (s_j + jj >= p1 && (s_j + jj) - p1 < etl::dim<0>(sub) && s_k + kk >= p2 && (s_k + kk) - p2 < etl::dim<1>(sub)) {
56 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2,
typename A>
58 const auto s_j = j * S1 - P1;
59 const auto s_k = k * S2 - P2;
61 auto max = sub(s_j, s_k);
63 for (
size_t jj = 0; jj < C1; ++jj) {
64 for (
size_t kk = 0; kk < C2; ++kk) {
82 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
typename A>
84 const auto s_j = j * S1;
85 const auto s_k = k * S2;
87 auto max = sub(n, s_j, s_k);
89 for (
size_t jj = 0; jj < C1; ++jj) {
90 for (
size_t kk = 0; kk < C2; ++kk) {
108 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
typename A>
109 static auto pool_block_4d(
const A& sub,
size_t m,
size_t n,
size_t j,
size_t k) {
110 const auto s_j = j * S1;
111 const auto s_k = k * S2;
113 auto max = sub(m, n, s_j, s_k);
115 for (
size_t jj = 0; jj < C1; ++jj) {
116 for (
size_t kk = 0; kk < C2; ++kk) {
133 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_2d A,
typename M>
134 static void apply(
const A& sub, M&& m) {
135 if (!P1 && !P2 && S1 == C1 && S2 == C2){
136 if (C1 == 2 && C2 == 2) {
137 for (
size_t j = 0; j < etl::dim<0>(m); ++j) {
138 for (
size_t k = 0; k < etl::dim<1>(m); ++k) {
143 for (
size_t j = 0; j < etl::dim<0>(m); ++j) {
144 for (
size_t k = 0; k < etl::dim<1>(m); ++k) {
145 m(j, k) = pool_block_2d<C1, C2, C1, C2, 0, 0>(sub, j, k);
150 const size_t o1 = (etl::dim<0>(sub) - C1 + 2 * P1) / S1 + 1;
151 const size_t o2 = (etl::dim<1>(sub) - C2 + 2 * P2) / S2 + 1;
154 for (
size_t i = 0; i < P1; ++i) {
155 for (
size_t j = 0; j < o2; ++j) {
160 for (
size_t i = o1 - P1; i < o1; ++i) {
161 for (
size_t j = 0; j < o2; ++j) {
166 for (
size_t j = 0; j < P2; ++j) {
167 for (
size_t i = P1; i < o1 - P1; ++i) {
172 for (
size_t j = o2 - P2; j < o2; ++j) {
173 for (
size_t i = P1; i < o1 - P1; ++i) {
179 for (
size_t j = P1; j < o1 - P1; ++j) {
180 for (
size_t k = P1; k < o2 - P2; ++k) {
181 m(j, k) = pool_block_2d<C1, C2, S1, S2, P1, P2>(sub, j, k);
195 template <
typename A>
196 static auto pool_block_2d(
const A& sub,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
197 const auto s_j = j * s1 - p1;
198 const auto s_k = k * s2 - p2;
200 auto max = sub(s_j, s_k);
202 for (
size_t jj = 0; jj < c1; ++jj) {
203 for (
size_t kk = 0; kk < c2; ++kk) {
219 template <
typename A>
220 static auto pool_block_2d(
const A& sub,
size_t j,
size_t k,
size_t c1,
size_t c2) {
221 const auto s_j = j * c1;
222 const auto s_k = k * c2;
224 auto max = sub(s_j, s_k);
226 for (
size_t jj = 0; jj < c1; ++jj) {
227 for (
size_t kk = 0; kk < c2; ++kk) {
243 template <
typename A>
245 auto m1 =
std::max(sub(j * 2 + 0, k * 2 + 0), sub(j * 2 + 0, k * 2 + 1));
246 auto m2 =
std::max(sub(j * 2 + 1, k * 2 + 0), sub(j * 2 + 1, k * 2 + 1));
259 template <
typename A>
260 static auto pool_block_3d(
const A& sub,
size_t n,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t s1,
size_t s2) {
261 const auto s_j = j * s1;
262 const auto s_k = k * s2;
264 auto max = sub(n, s_j, s_k);
266 for (
size_t jj = 0; jj < c1; ++jj) {
267 for (
size_t kk = 0; kk < c2; ++kk) {
283 template <
typename A>
284 static auto pool_block_3d(
const A& sub,
size_t n,
size_t j,
size_t k,
size_t c1,
size_t c2) {
285 const auto s_j = j * c1;
286 const auto s_k = k * c2;
288 auto max = sub(n, s_j, s_k);
290 for (
size_t jj = 0; jj < c1; ++jj) {
291 for (
size_t kk = 0; kk < c2; ++kk) {
307 template <
typename A>
309 auto m1 =
std::max(sub(n, j * 2 + 0, k * 2 + 0), sub(n, j * 2 + 0, k * 2 + 1));
310 auto m2 =
std::max(sub(n, j * 2 + 1, k * 2 + 0), sub(n, j * 2 + 1, k * 2 + 1));
323 template <
typename A>
324 static auto pool_block_4d(
const A& sub,
size_t m,
size_t n,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t s1,
size_t s2) {
325 const auto s_j = j * s1;
326 const auto s_k = k * s2;
328 auto max = sub(m, n, s_j, s_k);
330 for (
size_t jj = 0; jj < c1; ++jj) {
331 for (
size_t kk = 0; kk < c2; ++kk) {
347 template <
typename A>
348 static auto pool_block_4d(
const A& sub,
size_t m,
size_t n,
size_t j,
size_t k,
size_t c1,
size_t c2) {
349 const auto s_j = j * 2;
350 const auto s_k = k * 2;
352 auto max = sub(m, n, s_j, s_k);
354 for (
size_t jj = 0; jj < c1; ++jj) {
355 for (
size_t kk = 0; kk < c2; ++kk) {
371 template <
typename A>
373 auto m1 =
std::max(sub(m, n, j * 2 + 0, k * 2 + 0), sub(m, n, j * 2 + 0, k * 2 + 1));
374 auto m2 =
std::max(sub(m, n, j * 2 + 1, k * 2 + 0), sub(m, n, j * 2 + 1, k * 2 + 1));
386 template <etl_2d A,
typename M>
387 static void apply(
const A& sub, M&& m,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
388 if (!p1 && !p2 && s1 == c1 && s2 == c2){
389 if (c1 == 2 && c2 == 2) {
390 for (
size_t j = p1; j < etl::dim<0>(m); ++j) {
391 for (
size_t k = p2; k < etl::dim<1>(m); ++k) {
396 for (
size_t j = p1; j < etl::dim<0>(m); ++j) {
397 for (
size_t k = p2; k < etl::dim<1>(m); ++k) {
404 const size_t o1 = (etl::dim<0>(sub) - c1 + 2 * p1) / s1 + 1;
405 const size_t o2 = (etl::dim<1>(sub) - c2 + 2 * p2) / s2 + 1;
408 for (
size_t i = 0; i < p1; ++i) {
409 for (
size_t j = 0; j < o2; ++j) {
414 for (
size_t i = o1 - p1; i < o1; ++i) {
415 for (
size_t j = 0; j < o2; ++j) {
420 for (
size_t j = 0; j < p2; ++j) {
421 for (
size_t i = p1; i < o1 - p1; ++i) {
426 for (
size_t j = o2 - p2; j < o2; ++j) {
427 for (
size_t i = p1; i < o1 - p1; ++i) {
433 for (
size_t j = p1; j < o1 - p1; ++j) {
434 for (
size_t k = p2; k < o2 - p2; ++k) {
456 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_3d A,
typename M>
457 static void apply(
const A& sub, M&& m) {
458 const size_t N = etl::dim<0>(m);
460 if (!P1 && !P2 && S1 == C1 && S2 == C2){
461 if (C1 == 2 && C2 == 2) {
462 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
463 for (
size_t n = first; n < last; ++n) {
464 for (
size_t j = 0; j < etl::dim<1>(m); ++j) {
465 for (
size_t k = 0; k < etl::dim<2>(m); ++k) {
474 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
475 for (
size_t n = first; n < last; ++n) {
476 for (
size_t j = 0; j < etl::dim<1>(m); ++j) {
477 for (
size_t k = 0; k < etl::dim<2>(m); ++k) {
478 m(n, j, k) = pool_block_3d<C1, C2, C1, C2>(sub, n, j, k);
487 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
489 if (cpp_likely(!P1 && !P2)) {
490 for (
size_t n = first; n < last; ++n) {
491 for (
size_t j = 0; j < etl::dim<1>(m); ++j) {
492 for (
size_t k = 0; k < etl::dim<2>(m); ++k) {
493 m(n, j, k) = pool_block_3d<C1, C2, S1, S2>(sub, n, j, k);
499 for (
size_t n = first; n < last; ++n) {
500 apply<C1, C2, S1, S2, P1, P2>(sub(n), m(n));
517 template <etl_3d A,
typename M>
518 static void apply(
const A& sub, M&& m,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
519 const size_t N = etl::dim<0>(m);
521 if (!p1 && !p2 && s1 == c1 && s2 == c2){
522 if (c1 == 2 && c2 == 2) {
523 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
525 for (
size_t n = first; n < last; ++n) {
526 for (
size_t j = 0; j < etl::dim<1>(m); ++j) {
527 for (
size_t k = 0; k < etl::dim<2>(m); ++k) {
537 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
539 for (
size_t n = first; n < last; ++n) {
540 for (
size_t j = 0; j < etl::dim<1>(m); ++j) {
541 for (
size_t k = 0; k < etl::dim<2>(m); ++k) {
554 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
555 for (
size_t n = first; n < last; ++n) {
556 apply(sub(n), m(n), c1, c2, s1, s2, p1, p2);
579 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_4d A,
typename M>
580 static void apply(
const A& sub, M&& m) {
581 const size_t N = etl::dim<0>(m);
583 if (!P1 && !P2 && S1 == C1 && S2 == C2){
584 if (C1 == 2 && C2 == 2) {
585 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
586 for (
size_t mm = first; mm < last; ++mm) {
587 for (
size_t n = 0; n < etl::dim<1>(m); ++n) {
588 for (
size_t j = 0; j < etl::dim<2>(m); ++j) {
589 for (
size_t k = 0; k < etl::dim<3>(m); ++k) {
599 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
600 for (
size_t mm = first; mm < last; ++mm) {
601 for (
size_t n = 0; n < etl::dim<1>(m); ++n) {
602 for (
size_t j = 0; j < etl::dim<2>(m); ++j) {
603 for (
size_t k = 0; k < etl::dim<3>(m); ++k) {
604 m(mm, n, j, k) = pool_block_4d<C1, C2, C1, C2>(sub, mm, n, j, k);
614 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
615 if (cpp_likely(!P1 && !P2)) {
616 for (
size_t mm = first; mm < last; ++mm) {
617 for (
size_t n = 0; n < etl::dim<1>(m); ++n) {
618 for (
size_t j = 0; j < etl::dim<2>(m); ++j) {
619 for (
size_t k = 0; k < etl::dim<3>(m); ++k) {
620 m(mm, n, j, k) = pool_block_4d<C1, C2, S1, S2>(sub, mm, n, j, k);
626 for (
size_t mm = first; mm < last; ++mm) {
627 for (
size_t n = 0; n < etl::dim<1>(m); ++n) {
628 apply<C1, C2, S1, S2, P1, P2>(sub(mm)(n), m(mm)(n));
645 template <etl_4d A,
typename M>
646 static void apply(
const A& sub, M&& m,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
647 const size_t N = etl::dim<0>(m);
649 if (!p1 && !p2 && s1 == c1 && s2 == c2){
650 if (c1 == 2 && c2 == 2) {
651 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
653 for (
size_t mm = first; mm < last; ++mm) {
654 for (
size_t n = 0; n < etl::dim<1>(m); ++n) {
655 for (
size_t j = 0; j < etl::dim<2>(m); ++j) {
656 for (
size_t k = 0; k < etl::dim<3>(m); ++k) {
667 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
669 for (
size_t mm = first; mm < last; ++mm) {
670 for (
size_t n = 0; n < etl::dim<1>(m); ++n) {
671 for (
size_t j = 0; j < etl::dim<2>(m); ++j) {
672 for (
size_t k = 0; k < etl::dim<3>(m); ++k) {
684 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
686 for (
size_t mm = first; mm < last; ++mm) {
687 for (
size_t n = 0; n < etl::dim<1>(m); ++n) {
688 apply(sub(mm)(n), m(mm)(n), c1, c2, s1, s2, p1, p2);
709 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_5d_and_plus A,
typename M>
710 static void apply(
const A& sub, M&& m) {
711 for (
size_t i = 0; i < etl::dim<0>(sub); ++i) {
712 apply<C1, C2, S1, S2, P1, P2>(sub(i), m(i));
723 template <etl_5d_and_plus A,
typename M>
724 static void apply(
const A& sub, M&& m,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
725 for (
size_t i = 0; i < etl::dim<0>(sub); ++i) {
726 apply(sub(i), m(i), c1, c2, s1, s2, p1, p2);
751 template <
typename A>
753 const A& sub,
size_t i,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3,
size_t p1,
size_t p2,
size_t p3) {
756 const auto s_i = i * s1;
757 const auto s_j = j * s2;
758 const auto s_k = k * s3;
760 for (
size_t ii = 0; ii < c1; ++ii) {
761 for (
size_t jj = 0; jj < c2; ++jj) {
762 for (
size_t kk = 0; kk < c3; ++kk) {
763 if (s_i + ii >= p1 && (s_i + ii) - p1 < etl::dim<0>(sub) && s_j + jj >= p2 && (s_j + jj) - p2 < etl::dim<1>(sub) && s_k + kk >= p3
764 && (s_k + kk) - p3 < etl::dim<2>(sub)) {
765 max =
std::max(
max, sub(s_i + ii - p1, s_j + jj - p2, s_k + kk - p3));
784 template <
size_t C1,
size_t C2,
size_t C3,
size_t S1,
size_t S2,
size_t S3,
size_t P1,
size_t P2,
size_t P3,
typename A>
786 const auto s_i = i * S1 - P1;
787 const auto s_j = j * S2 - P2;
788 const auto s_k = k * S3 - P3;
790 auto max = sub(s_i, s_j, s_k);
792 for (
size_t ii = 0; ii < C1; ++ii) {
793 for (
size_t jj = 0; jj < C2; ++jj) {
794 for (
size_t kk = 0; kk < C3; ++kk) {
816 template <
size_t C1,
size_t C2,
size_t C3,
size_t S1,
size_t S2,
size_t S3,
typename A>
817 static auto pool_block_4d(
const A& sub,
size_t n,
size_t i,
size_t j,
size_t k) {
818 const auto s_i = i * S1;
819 const auto s_j = j * S2;
820 const auto s_k = k * S3;
822 auto max = sub(n, s_i, s_j, s_k);
824 for (
size_t ii = 0; ii < C1; ++ii) {
825 for (
size_t jj = 0; jj < C2; ++jj) {
826 for (
size_t kk = 0; kk < C3; ++kk) {
855 static void apply(
const A& sub, M&& m) {
856 const size_t o1 = (etl::dim<0>(sub) - C1 + 2 * P1) / S1 + 1;
857 const size_t o2 = (etl::dim<1>(sub) - C2 + 2 * P2) / S2 + 1;
858 const size_t o3 = (etl::dim<2>(sub) - C3 + 2 * P3) / S3 + 1;
860 if (P1 || P2 || P3) {
861 for (
size_t i = 0; i < P1; ++i) {
862 for (
size_t j = 0; j < o2; ++j) {
863 for (
size_t k = 0; k < o3; ++k) {
864 m(i, j, k) =
pool_block_border(sub, i, j, k, C1, C2, C3, S1, S2, S3, P1, P2, P3);
869 for (
size_t i = o1 - P1; i < o1; ++i) {
870 for (
size_t j = 0; j < o2; ++j) {
871 for (
size_t k = 0; k < o3; ++k) {
872 m(i, j, k) =
pool_block_border(sub, i, j, k, C1, C2, C3, S1, S2, S3, P1, P2, P3);
877 for (
size_t j = 0; j < P2; ++j) {
878 for (
size_t i = P1; i < o1 - P1; ++i) {
879 for (
size_t k = 0; k < o3; ++k) {
880 m(i, j, k) =
pool_block_border(sub, i, j, k, C1, C2, C3, S1, S2, S3, P1, P2, P3);
885 for (
size_t j = o2 - P2; j < o2; ++j) {
886 for (
size_t i = P1; i < o1 - P1; ++i) {
887 for (
size_t k = 0; k < o3; ++k) {
888 m(i, j, k) =
pool_block_border(sub, i, j, k, C1, C2, C3, S1, S2, S3, P1, P2, P3);
893 for (
size_t k = 0; k < P3; ++k) {
894 for (
size_t i = P1; i < o1 - P1; ++i) {
895 for (
size_t j = P2; j < o2 - P2; ++j) {
896 m(i, j, k) =
pool_block_border(sub, i, j, k, C1, C2, C3, S1, S2, S3, P1, P2, P3);
901 for (
size_t k = o3 - P3; k < o3; ++k) {
902 for (
size_t i = P1; i < o1 - P1; ++i) {
903 for (
size_t j = P2; j < o2 - P2; ++j) {
904 m(i, j, k) =
pool_block_border(sub, i, j, k, C1, C2, C3, S1, S2, S3, P1, P2, P3);
910 for (
size_t i = P1; i < o1 - P1; ++i) {
911 for (
size_t j = P2; j < o2 - P2; ++j) {
912 for (
size_t k = P3; k < o3 - P3; ++k) {
913 m(i, j, k) = pool_block_3d<C1, C2, C3, S1, S2, S3, P1, P2, P3>(sub, i, j, k);
929 template <
typename A>
931 const A& sub,
size_t i,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3,
size_t p1,
size_t p2,
size_t p3) {
932 auto max = sub(i * s1 - p1, j * s2 - p2, k * s3 - p3);
934 for (
size_t ii = 0; ii < c1; ++ii) {
935 for (
size_t jj = 0; jj < c2; ++jj) {
936 for (
size_t kk = 0; kk < c3; ++kk) {
937 max =
std::max(
max, sub(i * s1 + ii - p1, j * s2 + jj - p2, k * s3 + kk - p3));
959 template <
typename A>
960 static auto pool_block_4d(
const A& sub,
size_t n,
size_t i,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3) {
961 auto max = sub(n, i * s1, j * s2, k * s3);
963 for (
size_t ii = 0; ii < c1; ++ii) {
964 for (
size_t jj = 0; jj < c2; ++jj) {
965 for (
size_t kk = 0; kk < c3; ++kk) {
966 max =
std::max(
max, sub(n, i * s1 + ii, j * s2 + jj, k * s3 + kk));
982 template <etl_3d A,
typename M>
983 static void apply(
const A& sub, M&& m,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3,
size_t p1,
size_t p2,
size_t p3) {
984 const size_t o1 = (etl::dim<0>(sub) - c1 + 2 * p1) / s1 + 1;
985 const size_t o2 = (etl::dim<1>(sub) - c2 + 2 * p2) / s2 + 1;
986 const size_t o3 = (etl::dim<2>(sub) - c3 + 2 * p3) / s3 + 1;
988 if (p1 || p2 || p3) {
989 for (
size_t i = 0; i < p1; ++i) {
990 for (
size_t j = 0; j < o2; ++j) {
991 for (
size_t k = 0; k < o3; ++k) {
992 m(i, j, k) =
pool_block_border(sub, i, j, k, c1, c2, c3, s1, s2, s3, p1, p2, p3);
997 for (
size_t i = o1 - p1; i < o1; ++i) {
998 for (
size_t j = 0; j < o2; ++j) {
999 for (
size_t k = 0; k < o3; ++k) {
1000 m(i, j, k) =
pool_block_border(sub, i, j, k, c1, c2, c3, s1, s2, s3, p1, p2, p3);
1005 for (
size_t j = 0; j < p2; ++j) {
1006 for (
size_t i = p1; i < o1 - p1; ++i) {
1007 for (
size_t k = 0; k < o3; ++k) {
1008 m(i, j, k) =
pool_block_border(sub, i, j, k, c1, c2, c3, s1, s2, s3, p1, p2, p3);
1013 for (
size_t j = o2 - p2; j < o2; ++j) {
1014 for (
size_t i = p1; i < o1 - p1; ++i) {
1015 for (
size_t k = 0; k < o3; ++k) {
1016 m(i, j, k) =
pool_block_border(sub, i, j, k, c1, c2, c3, s1, s2, s3, p1, p2, p3);
1021 for (
size_t k = 0; k < p3; ++k) {
1022 for (
size_t i = p1; i < o1 - p1; ++i) {
1023 for (
size_t j = p2; j < o2 - p2; ++j) {
1024 m(i, j, k) =
pool_block_border(sub, i, j, k, c1, c2, c3, s1, s2, s3, p1, p2, p3);
1029 for (
size_t k = o3 - p3; k < o3; ++k) {
1030 for (
size_t i = p1; i < o1 - p1; ++i) {
1031 for (
size_t j = p2; j < o2 - p2; ++j) {
1032 m(i, j, k) =
pool_block_border(sub, i, j, k, c1, c2, c3, s1, s2, s3, p1, p2, p3);
1038 for (
size_t i = p1; i < o1 - p1; ++i) {
1039 for (
size_t j = p2; j < o2 - p2; ++j) {
1040 for (
size_t k = p3; k < o3 - p3; ++k) {
1041 m(i, j, k) =
pool_block_3d(sub, i, j, k, c1, c2, c3, s1, s2, s3, p1, p2, p3);
1063 template <
size_t C1,
1075 static void apply(
const A& sub, M&& m) {
1076 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
1078 if (cpp_likely(!P1 && !P2 && !P3)) {
1079 for (
size_t n = first; n < last; ++n) {
1080 for (
size_t i = 0; i < etl::dim<1>(m); ++i) {
1081 for (
size_t j = 0; j < etl::dim<2>(m); ++j) {
1082 for (
size_t k = 0; k < etl::dim<3>(m); ++k) {
1083 m(n, i, j, k) = pool_block_4d<C1, C2, C3, S1, S2, S3>(sub, n, i, j, k);
1090 for (
size_t n = first; n < last; ++n) {
1091 apply<C1, C2, C3, S1, S2, S3, P1, P2, P3>(sub(n), m(n));
1097 const size_t N = etl::dim<0>(m);
1110 template <etl_4d A,
typename M>
1111 static void apply(
const A& sub, M&& m,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3,
size_t p1,
size_t p2,
size_t p3) {
1112 auto batch_fun_n = [&](
const size_t first,
const size_t last) {
1114 if (cpp_likely(!p1 && !p2 && !p3)) {
1115 for (
size_t n = first; n < last; ++n) {
1116 for (
size_t i = 0; i < etl::dim<1>(m); ++i) {
1117 for (
size_t j = 0; j < etl::dim<2>(m); ++j) {
1118 for (
size_t k = 0; k < etl::dim<3>(m); ++k) {
1119 m(n, i, j, k) =
pool_block_4d(sub, n, i, j, k, c1, c2, c3, s1, s2, s3);
1125 for (
size_t n = first; n < last; ++n) {
1126 apply(sub(n), m(n), c1, c2, c3, s1, s2, s3, p1, p2, p3);
1132 const size_t N = etl::dim<0>(m);
1147 template <
size_t C1,
1158 static void apply(
const A& sub, M&& m) {
1159 for (
size_t i = 0; i < etl::dim<0>(sub); ++i) {
1160 apply<C1, C2, C3, S1, S2, S3, P1, P2, P3>(sub(i), m(i));
1172 template <etl_5d_and_plus A,
typename M>
1173 static void apply(
const A& sub, M&& m,
size_t c1,
size_t c2,
size_t c3,
size_t s1,
size_t s2,
size_t s3,
size_t p1,
size_t p2,
size_t p3) {
1174 for (
size_t i = 0; i < etl::dim<0>(sub); ++i) {
1175 apply(sub(i), m(i), c1, c2, c3, s1, s2, s3, p1, p2, p3);
auto max(L &&lhs, R &&rhs)
Create an expression with the max value of lhs or rhs.
Definition: expression_builder.hpp:65
static auto pool_block_3d(const A &sub, size_t i, size_t j, size_t k)
Pool a block of the sub expression.
Definition: max_pooling.hpp:785
void engine_dispatch_1d_serial(Functor &&functor, size_t first, size_t last, size_t threshold, [[maybe_unused]] size_t n_threads=etl::threads)
Dispatch the elements of a range to a functor in a parallel manner, using the global thread engine...
Definition: parallel_support.hpp:734
static auto pool_block_2d_2x2(const A &sub, size_t j, size_t k)
Pool a block of the sub expression.
Definition: max_pooling.hpp:244
static auto pool_block_border(const A &sub, size_t i, size_t j, size_t k, size_t c1, size_t c2, size_t c3, size_t s1, size_t s2, size_t s3, size_t p1, size_t p2, size_t p3)
Pool a block of the sub expression.
Definition: max_pooling.hpp:752
static auto pool_block_4d(const A &sub, size_t n, size_t i, size_t j, size_t k, size_t c1, size_t c2, size_t c3, size_t s1, size_t s2, size_t s3)
Pool a block of the sub expression.
Definition: max_pooling.hpp:960
static void apply(const A &sub, M &&m, size_t c1, size_t c2, size_t s1, size_t s2, size_t p1, size_t p2)
Apply the functor on sub and store the result in m.
Definition: max_pooling.hpp:387
static auto pool_block_2d(const A &sub, size_t j, size_t k, size_t c1, size_t c2)
Pool a block of the sub expression.
Definition: max_pooling.hpp:220
static auto pool_block_2d(const A &sub, size_t j, size_t k)
Pool a block of the sub expression.
Definition: max_pooling.hpp:57
static auto pool_block_4d_2x2(const A &sub, size_t m, size_t n, size_t j, size_t k)
Pool a block of the sub expression.
Definition: max_pooling.hpp:372
static void apply(const A &sub, M &&m)
Apply the functor on sub and store the result in m.
Definition: max_pooling.hpp:855
Definition: prob_pooling.hpp:10
static auto pool_block_4d(const A &sub, size_t m, size_t n, size_t j, size_t k, size_t c1, size_t c2)
Pool a block of the sub expression.
Definition: max_pooling.hpp:348
Functor for 2D Max Pooling.
Definition: max_pooling.hpp:15
static auto pool_block_3d(const A &sub, size_t n, size_t j, size_t k, size_t c1, size_t c2, size_t s1, size_t s2)
Pool a block of the sub expression.
Definition: max_pooling.hpp:260
static auto pool_block_4d(const A &sub, size_t m, size_t n, size_t j, size_t k, size_t c1, size_t c2, size_t s1, size_t s2)
Pool a block of the sub expression.
Definition: max_pooling.hpp:324
static auto pool_block_3d(const A &sub, size_t n, size_t j, size_t k, size_t c1, size_t c2)
Pool a block of the sub expression.
Definition: max_pooling.hpp:284
static auto pool_block_3d(const A &sub, size_t i, size_t j, size_t k, size_t c1, size_t c2, size_t c3, size_t s1, size_t s2, size_t s3, size_t p1, size_t p2, size_t p3)
Pool a block of the sub expression.
Definition: max_pooling.hpp:930
static auto pool_block_3d(const A &sub, size_t n, size_t j, size_t k)
Pool a block of the sub expression.
Definition: max_pooling.hpp:83
static void apply(const A &sub, M &&m)
Apply the functor on sub and store the result in m.
Definition: max_pooling.hpp:134
static auto pool_block_4d(const A &sub, size_t m, size_t n, size_t j, size_t k)
Pool a block of the sub expression.
Definition: max_pooling.hpp:109
static auto pool_block_2d(const A &sub, size_t j, size_t k, size_t c1, size_t c2, size_t s1, size_t s2, size_t p1, size_t p2)
Pool a block of the sub expression.
Definition: max_pooling.hpp:196
static void apply(const A &sub, M &&m, size_t c1, size_t c2, size_t c3, size_t s1, size_t s2, size_t s3, size_t p1, size_t p2, size_t p3)
Apply the functor on sub and store the result in m.
Definition: max_pooling.hpp:983
static auto pool_block_border(const A &sub, size_t j, size_t k, size_t c1, size_t c2, size_t s1, size_t s2, size_t p1, size_t p2)
Pool a block of the sub expression around the border (with padding)
Definition: max_pooling.hpp:29
typename decay_traits< E >::value_type value_t
Traits to extract the value type out of an ETL type.
Definition: tmp.hpp:81
static auto pool_block_4d(const A &sub, size_t n, size_t i, size_t j, size_t k)
Pool a block of the sub expression.
Definition: max_pooling.hpp:817
static auto pool_block_3d_2x2(const A &sub, size_t n, size_t j, size_t k)
Pool a block of the sub expression.
Definition: max_pooling.hpp:308
Functor for 3D Max Pooling.
Definition: max_pooling.hpp:734