24 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2,
typename A,
typename M>
26 auto value = in(j, k);
29 if constexpr (P1 || P2) {
30 if (cpp_unlikely(j < P1 || k < P2 || j >= etl::dim<0>(in) - P1 || k >= etl::dim<1>(in) - P2)) {
31 const size_t base_j = j * S1 - P1;
32 const size_t base_k = k * S2 - P2;
34 for (
size_t jj = 0; jj < C1; ++jj) {
35 for (
size_t kk = 0; kk < C2; ++kk) {
36 if (base_j + jj < etl::dim<0>(m) && base_k + kk < etl::dim<1>(m)) {
37 if constexpr (S1 == C1 && S2 == C2) {
38 m(base_j + jj, base_k + kk) = value;
40 m(base_j + jj, base_k + kk) += value;
50 for (
size_t jj = 0; jj < C1; ++jj) {
51 for (
size_t kk = 0; kk < C2; ++kk) {
52 if constexpr (S1 == C1 && S2 == C2) {
53 m(j * S1 - P1 + jj, k * S2 - P2 + kk) = value;
55 m(j * S1 - P1 + jj, k * S2 - P2 + kk) += value;
69 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2,
typename A,
typename M>
71 auto value = in(q, j, k);
74 if constexpr (P1 || P2) {
75 if (cpp_unlikely(j < P1 || k < P2 || j >= etl::dim<1>(in) - P1 || k >= etl::dim<2>(in) - P2)) {
76 const size_t base_j = j * S1 - P1;
77 const size_t base_k = k * S2 - P2;
79 for (
size_t jj = 0; jj < C1; ++jj) {
80 for (
size_t kk = 0; kk < C2; ++kk) {
81 if (base_j + jj < etl::dim<1>(m) && base_k + kk < etl::dim<2>(m)) {
82 if constexpr (S1 == C1 && S2 == C2) {
83 m(q, base_j + jj, base_k + kk) = value;
85 m(q, base_j + jj, base_k + kk) += value;
95 for (
size_t jj = 0; jj < C1; ++jj) {
96 for (
size_t kk = 0; kk < C2; ++kk) {
97 if constexpr (S1 == C1 && S2 == C2) {
98 m(q, j * S1 - P1 + jj, k * S2 - P2 + kk) = value;
100 m(q, j * S1 - P1 + jj, k * S2 - P2 + kk) += value;
114 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2,
typename A,
typename M>
116 auto value = in(p, q, j, k);
119 if constexpr (P1 || P2) {
120 if (cpp_unlikely(j < P1 || k < P2 || j >= etl::dim<2>(in) - P1 || k >= etl::dim<3>(in) - P2)) {
121 const size_t base_j = j * S1 - P1;
122 const size_t base_k = k * S2 - P2;
124 for (
size_t jj = 0; jj < C1; ++jj) {
125 for (
size_t kk = 0; kk < C2; ++kk) {
126 if (base_j + jj < etl::dim<2>(m) && base_k + kk < etl::dim<3>(m)) {
127 if constexpr (S1 == C1 && S2 == C2) {
128 m(p, q, base_j + jj, base_k + kk) = value;
130 m(p, q, base_j + jj, base_k + kk) += value;
140 for (
size_t jj = 0; jj < C1; ++jj) {
141 for (
size_t kk = 0; kk < C2; ++kk) {
142 if constexpr (S1 == C1 && S2 == C2) {
143 m(p, q, j * S1 - P1 + jj, k * S2 - P2 + kk) = value;
145 m(p, q, j * S1 - P1 + jj, k * S2 - P2 + kk) += value;
159 template <
typename A,
typename M>
160 static void upsample_block_2d(A&& in, M& m,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
161 auto value = in(j, k);
164 if (cpp_unlikely(p1 || p2)) {
165 if (cpp_unlikely(j < p1 || k < p2 || j >= etl::dim<0>(in) - p1 || k >= etl::dim<1>(in) - p2)) {
166 const size_t base_j = j * s1 - p1;
167 const size_t base_k = k * s2 - p2;
169 for (
size_t jj = 0; jj < c1; ++jj) {
170 for (
size_t kk = 0; kk < c2; ++kk) {
171 if (base_j + jj < etl::dim<0>(m) && base_k + kk < etl::dim<1>(m)) {
172 if (s1 == c1 && s2 == c2) {
173 m(base_j + jj, base_k + kk) = value;
175 m(base_j + jj, base_k + kk) += value;
185 if (s1 == c1 && s2 == c2) {
186 for (
size_t jj = 0; jj < c1; ++jj) {
187 for (
size_t kk = 0; kk < c2; ++kk) {
188 m(j * s1 - p1 + jj, k * s2 - p2 + kk) = value;
192 for (
size_t jj = 0; jj < c1; ++jj) {
193 for (
size_t kk = 0; kk < c2; ++kk) {
194 m(j * s1 - p1 + jj, k * s2 - p2 + kk) += value;
208 template <
typename A,
typename M>
209 static void upsample_block_3d(A&& in, M& m,
size_t q,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
210 auto value = in(q, j, k);
213 if (cpp_unlikely(p1 || p2)) {
214 if (cpp_unlikely(j < p1 || k < p2 || j >= etl::dim<1>(in) - p1 || k >= etl::dim<2>(in) - p2)) {
215 const size_t base_j = j * s1 - p1;
216 const size_t base_k = k * s2 - p2;
218 for (
size_t jj = 0; jj < c1; ++jj) {
219 for (
size_t kk = 0; kk < c2; ++kk) {
220 if (base_j + jj < etl::dim<1>(m) && base_k + kk < etl::dim<2>(m)) {
221 if (s1 == c1 && s2 == c2) {
222 m(q, base_j + jj, base_k + kk) = value;
224 m(q, base_j + jj, base_k + kk) += value;
234 if (s1 == c1 && s2 == c2) {
235 for (
size_t jj = 0; jj < c1; ++jj) {
236 for (
size_t kk = 0; kk < c2; ++kk) {
237 m(q, j * s1 - p1 + jj, k * s2 - p2 + kk) = value;
241 for (
size_t jj = 0; jj < c1; ++jj) {
242 for (
size_t kk = 0; kk < c2; ++kk) {
243 m(q, j * s1 - p1 + jj, k * s2 - p2 + kk) += value;
257 template <
typename A,
typename M>
258 static void upsample_block_4d(A&& in, M& m,
size_t p,
size_t q,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
259 auto value = in(p, q, j, k);
262 if (cpp_unlikely(p1 || p2)) {
263 if (cpp_unlikely(j < p1 || k < p2 || j >= etl::dim<2>(in) - p1 || k >= etl::dim<3>(in) - p2)) {
264 const size_t base_j = j * s1 - p1;
265 const size_t base_k = k * s2 - p2;
267 for (
size_t jj = 0; jj < c1; ++jj) {
268 for (
size_t kk = 0; kk < c2; ++kk) {
269 if (base_j + jj < etl::dim<2>(m) && base_k + kk < etl::dim<3>(m)) {
270 if (s1 == c1 && s2 == c2) {
271 m(p, q, base_j + jj, base_k + kk) = value;
273 m(p, q, base_j + jj, base_k + kk) += value;
283 if (s1 == c1 && s2 == c2) {
284 for (
size_t jj = 0; jj < c1; ++jj) {
285 for (
size_t kk = 0; kk < c2; ++kk) {
286 m(p, q, j * s1 - p1 + jj, k * s2 - p2 + kk) = value;
290 for (
size_t jj = 0; jj < c1; ++jj) {
291 for (
size_t kk = 0; kk < c2; ++kk) {
292 m(p, q, j * s1 - p1 + jj, k * s2 - p2 + kk) += value;
307 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_2d A,
typename M>
309 if (S1 != C1 || S2 != C2) {
313 for (
size_t j = 0; j < etl::dim<0>(in); ++j) {
314 for (
size_t k = 0; k < etl::dim<1>(in); ++k) {
315 upsample_block_2d<C1, C2, S1, S2, P1, P2>(in, m, j, k);
327 template <etl_2d A,
typename M>
328 static void apply(A&& in, M&& m,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
329 if (s1 != c1 || s2 != c2) {
333 for (
size_t j = 0; j < etl::dim<0>(in); ++j) {
334 for (
size_t k = 0; k < etl::dim<1>(in); ++k) {
349 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_3d A,
typename M>
351 if (S1 != C1 || S2 != C2) {
359 auto batch_fun = [&](
const size_t first,
const size_t last) {
360 for (
size_t q = first; q < last; ++q) {
361 for (
size_t j = 0; j < etl::dim<1>(in); ++j) {
362 for (
size_t k = 0; k < etl::dim<2>(in); ++k) {
363 upsample_block_3d<C1, C2, S1, S2, P1, P2>(in, m, q, j, k);
369 const size_t N = etl::dim<0>(in);
381 template <etl_3d A,
typename M>
382 static void apply(A&& in, M&& m,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
383 if (s1 != c1 || s2 != c2) {
391 auto batch_fun = [&](
const size_t first,
const size_t last) {
392 for (
size_t q = first; q < last; ++q) {
393 for (
size_t j = 0; j < etl::dim<1>(in); ++j) {
394 for (
size_t k = 0; k < etl::dim<2>(in); ++k) {
395 upsample_block_3d(in, m, q, j, k, c1, c2, s1, s2, p1, p2);
401 const size_t N = etl::dim<0>(in);
415 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_4d A,
typename M>
417 if (S1 != C1 || S2 != C2) {
425 auto batch_fun = [&](
const size_t first,
const size_t last) {
426 for (
size_t p = first; p < last; ++p) {
427 for (
size_t q = 0; q < etl::dim<1>(in); ++q) {
428 for (
size_t j = 0; j < etl::dim<2>(in); ++j) {
429 for (
size_t k = 0; k < etl::dim<3>(in); ++k) {
430 upsample_block_4d<C1, C2, S1, S2, P1, P2>(in, m, p, q, j, k);
437 const size_t N = etl::dim<0>(in);
449 template <etl_4d A,
typename M>
450 static void apply(A&& in, M&& m,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
451 if (s1 != c1 || s2 != c2) {
459 auto batch_fun = [&](
const size_t first,
const size_t last) {
460 for (
size_t p = first; p < last; ++p) {
461 for (
size_t q = 0; q < etl::dim<1>(in); ++q) {
462 for (
size_t j = 0; j < etl::dim<2>(in); ++j) {
463 for (
size_t k = 0; k < etl::dim<3>(in); ++k) {
464 upsample_block_4d(in, m, p, q, j, k, c1, c2, s1, s2, p1, p2);
471 const size_t N = etl::dim<0>(in);
485 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>
487 for (
size_t i = 0; i < etl::dim<0>(in); ++i) {
488 apply<C1, C2, S1, S2, P1, P2>(in(i), m(i));
499 template <etl_5d_and_plus A,
typename M>
500 static void apply(A&& in, M& m,
size_t c1,
size_t c2,
size_t s1,
size_t s2,
size_t p1,
size_t p2) {
501 for (
size_t i = 0; i < etl::dim<0>(in); ++i) {
502 apply(in(i), m(i), c1, c2, s1, s2, p1, p2);
522 template <
size_t C1,
size_t C2,
size_t C3,
typename A,
typename M>
524 auto value = in(i, j, k);
526 for (
size_t ii = 0; ii < C1; ++ii) {
527 for (
size_t jj = 0; jj < C2; ++jj) {
528 for (
size_t kk = 0; kk < C3; ++kk) {
529 m(i * C1 + ii, j * C2 + jj, k * C3 + kk) = value;
546 template <
size_t C1,
size_t C2,
size_t C3,
typename A,
typename M>
548 auto value = in(q, i, j, k);
550 for (
size_t ii = 0; ii < C1; ++ii) {
551 for (
size_t jj = 0; jj < C2; ++jj) {
552 for (
size_t kk = 0; kk < C3; ++kk) {
553 m(q, i * C1 + ii, j * C2 + jj, k * C3 + kk) = value;
570 template <
typename A,
typename M>
571 static void upsample_block_3d(A&& in, M& m,
size_t i,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t c3) {
572 auto value = in(i, j, k);
574 for (
size_t ii = 0; ii < c1; ++ii) {
575 for (
size_t jj = 0; jj < c2; ++jj) {
576 for (
size_t kk = 0; kk < c3; ++kk) {
577 m(i * c1 + ii, j * c2 + jj, k * c3 + kk) = value;
594 template <
typename A,
typename M>
595 static void upsample_block_4d(A&& in, M& m,
size_t q,
size_t i,
size_t j,
size_t k,
size_t c1,
size_t c2,
size_t c3) {
596 auto value = in(q, i, j, k);
598 for (
size_t ii = 0; ii < c1; ++ii) {
599 for (
size_t jj = 0; jj < c2; ++jj) {
600 for (
size_t kk = 0; kk < c3; ++kk) {
601 m(q, i * c1 + ii, j * c2 + jj, k * c3 + kk) = value;
617 template <
size_t C1,
size_t C2,
size_t C3, etl_3d A,
typename M>
619 for (
size_t i = 0; i < etl::dim<0>(in); ++i) {
620 for (
size_t j = 0; j < etl::dim<1>(in); ++j) {
621 for (
size_t k = 0; k < etl::dim<2>(in); ++k) {
622 upsample_block_3d<C1, C2, C3>(in, m, i, j, k);
636 template <etl_3d A,
typename M>
637 static void apply(A&& in, M&& m,
size_t c1,
size_t c2,
size_t c3) {
638 for (
size_t i = 0; i < etl::dim<0>(in); ++i) {
639 for (
size_t j = 0; j < etl::dim<1>(in); ++j) {
640 for (
size_t k = 0; k < etl::dim<2>(in); ++k) {
657 template <
size_t C1,
size_t C2,
size_t C3, etl_4d A,
typename M>
663 auto batch_fun = [&](
const size_t first,
const size_t last) {
664 for (
size_t q = first; q < last; ++q) {
665 for (
size_t i = 0; i < etl::dim<1>(in); ++i) {
666 for (
size_t j = 0; j < etl::dim<2>(in); ++j) {
667 for (
size_t k = 0; k < etl::dim<3>(in); ++k) {
668 upsample_block_4d<C1, C2, C3>(in, m, q, i, j, k);
675 const size_t N = etl::dim<0>(in);
688 template <etl_4d A,
typename M>
689 static void apply(A&& in, M&& m,
size_t c1,
size_t c2,
size_t c3) {
694 auto batch_fun = [&](
const size_t first,
const size_t last) {
695 for (
size_t q = first; q < last; ++q) {
696 for (
size_t i = 0; i < etl::dim<1>(in); ++i) {
697 for (
size_t j = 0; j < etl::dim<2>(in); ++j) {
698 for (
size_t k = 0; k < etl::dim<3>(in); ++k) {
706 const size_t N = etl::dim<0>(in);
721 template <
size_t C1,
size_t C2,
size_t C3, etl_5d_and_plus A,
typename M>
723 for (
size_t i = 0; i < etl::dim<0>(in); ++i) {
724 apply<C1, C2, C3>(in(i), m(i));
736 template <etl_5d_and_plus A,
typename M>
737 static void apply(A&& in, M& m,
size_t c1,
size_t c2,
size_t c3) {
738 for (
size_t i = 0; i < etl::dim<0>(in); ++i) {
739 apply(in(i), m(i), c1, c2, c3);
static void upsample_block_4d(A &&in, M &m, size_t q, size_t i, size_t j, size_t k, size_t c1, size_t c2, size_t c3)
Upsample a block of the sub expression.
Definition: upsample.hpp:595
static void apply(A &&in, M &&m)
Apply the functor on sub and store the result in m.
Definition: upsample.hpp:308
static void upsample_block_2d(A &&in, M &m, size_t j, size_t k, size_t c1, size_t c2, size_t s1, size_t s2, size_t p1, size_t p2)
Upsample a block of the sub expression.
Definition: upsample.hpp:160
static void apply(A &&in, M &m, size_t c1, size_t c2, size_t c3)
Apply the functor on sub and store the result in m.
Definition: upsample.hpp:737
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
Functor for 3D Upsampling.
Definition: upsample.hpp:510
static void upsample_block_4d(A &&in, M &m, size_t p, size_t q, size_t j, size_t k)
Upsample a block of the sub expression.
Definition: upsample.hpp:115
Definition: prob_pooling.hpp:10
static void upsample_block_4d(A &&in, M &m, size_t q, size_t i, size_t j, size_t k)
Upsample a block of the sub expression.
Definition: upsample.hpp:547
static void upsample_block_2d(A &&in, M &m, size_t j, size_t k)
Upsample a block of the sub expression.
Definition: upsample.hpp:25
static void apply(A &&in, 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: upsample.hpp:328
static void upsample_block_3d(A &&in, M &m, size_t i, size_t j, size_t k, size_t c1, size_t c2, size_t c3)
Upsample a block of the sub expression.
Definition: upsample.hpp:571
static void upsample_block_3d(A &&in, M &m, size_t i, size_t j, size_t k)
Upsample a block of the sub expression.
Definition: upsample.hpp:523
static void upsample_block_3d(A &&in, M &m, size_t q, size_t j, size_t k, size_t c1, size_t c2, size_t s1, size_t s2, size_t p1, size_t p2)
Upsample a block of the sub expression.
Definition: upsample.hpp:209
static void apply(A &&in, M &m)
Apply the functor on sub and store the result in m.
Definition: upsample.hpp:486
static void apply(A &&in, M &&m, size_t c1, size_t c2, size_t c3)
Apply the functor on sub and store the result in m.
Definition: upsample.hpp:637
static void upsample_block_3d(A &&in, M &m, size_t q, size_t j, size_t k)
Upsample a block of the sub expression.
Definition: upsample.hpp:70
void safe_ensure_cpu_up_to_date(E &&expr)
Ensure that the CPU is up to date.
Definition: helpers.hpp:278
static void apply(A &&in, M &&m)
Apply the functor on sub and store the result in m.
Definition: upsample.hpp:618
Functor for 2D Upsampling.
Definition: upsample.hpp:15
static void apply(A &&in, 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: upsample.hpp:500
static void apply(A &&in, M &m)
Apply the functor on sub and store the result in m.
Definition: upsample.hpp:722
static void upsample_block_4d(A &&in, M &m, size_t p, size_t q, size_t j, size_t k, size_t c1, size_t c2, size_t s1, size_t s2, size_t p1, size_t p2)
Upsample a block of the sub expression.
Definition: upsample.hpp:258