24 const size_t M = etl::dim<0>(exp_sub);
25 const size_t N = etl::dim<1>(exp_sub);
27 for (
size_t m = 0; m < M; ++m) {
28 const auto start_mm = (m >> 1) << 1;
30 for (
size_t n = 0; n < N; ++n) {
31 const auto start_nn = (n >> 1) << 1;
33 base(m, n) = exp_sub(start_mm + 0, start_nn + 0) + exp_sub(start_mm + 0, start_nn + 1) + exp_sub(start_mm + 1, start_nn + 0)
34 + exp_sub(start_mm + 1, start_nn + 1);
46 template <
size_t C1,
size_t C2,
typename T>
48 const size_t M = etl::dim<0>(exp_sub);
49 const size_t N = etl::dim<1>(exp_sub);
51 for (
size_t m = 0; m < M; ++m) {
52 const auto start_mm = (m / C1) * C1;
54 for (
size_t n = 0; n < N; ++n) {
55 const auto start_nn = (n / C2) * C2;
59 for (
size_t mm = start_mm; mm < start_mm + C1; ++mm) {
60 for (
size_t nn = start_nn; nn < start_nn + C2; ++nn) {
79 const size_t M = etl::dim<0>(exp_sub);
80 const size_t N = etl::dim<1>(exp_sub);
82 for (
size_t m = 0; m < M; ++m) {
83 const auto start_mm = (m / c1) * c1;
85 for (
size_t n = 0; n < N; ++n) {
86 const auto start_nn = (n / c2) * c2;
90 for (
size_t mm = start_mm; mm < start_mm + c1; ++mm) {
91 for (
size_t nn = start_nn; nn < start_nn + c2; ++nn) {
109 template <
typename A>
117 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_2d A,
typename C>
119 static_assert(S1 == C1,
"pmp_h does not support strides");
120 static_assert(S2 == C2,
"pmp_h does not support strides");
121 static_assert(P1 == 0,
"pmp_h does not support padding");
122 static_assert(P2 == 0,
"pmp_h does not support padding");
126 const size_t M = etl::dim<0>(a);
127 const size_t N = etl::dim<1>(a);
135 if (C1 == 2 && C2 == 2) {
136 pmp_h_kernel_2x2(exp_sub, base);
138 pmp_h_kernel<C1, C2>(exp_sub, base);
141 c = exp_sub / (1.0 + base);
150 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_3d A,
typename C>
152 static_assert(S1 == C1,
"pmp_h does not support strides");
153 static_assert(S2 == C2,
"pmp_h does not support strides");
154 static_assert(P1 == 0,
"pmp_h does not support padding");
155 static_assert(P2 == 0,
"pmp_h does not support padding");
159 const size_t L = etl::dim<0>(a);
160 const size_t M = etl::dim<1>(a);
161 const size_t N = etl::dim<2>(a);
167 if (C1 == 2 && C2 == 2) {
168 for (
size_t l = 0; l < L; ++l) {
171 pmp_h_kernel_2x2(exp_sub, base);
173 c(l) = exp_sub / (1.0 + base);
176 for (
size_t l = 0; l < L; ++l) {
179 pmp_h_kernel<C1, C2>(exp_sub, base);
181 c(l) = exp_sub / (1.0 + base);
192 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_4d A,
typename C>
194 static_assert(S1 == C1,
"pmp_h does not support strides");
195 static_assert(S2 == C2,
"pmp_h does not support strides");
196 static_assert(P1 == 0,
"pmp_h does not support padding");
197 static_assert(P2 == 0,
"pmp_h does not support padding");
201 const size_t K = etl::dim<0>(a);
202 const size_t L = etl::dim<1>(a);
203 const size_t M = etl::dim<2>(a);
204 const size_t N = etl::dim<3>(a);
210 if (C1 == 2 && C2 == 2) {
211 for (
size_t k = 0; k < K; ++k) {
212 for (
size_t l = 0; l < L; ++l) {
213 exp_sub =
exp(a(k)(l));
215 pmp_h_kernel_2x2(exp_sub, base);
217 c(k)(l) = exp_sub / (1.0 + base);
221 for (
size_t k = 0; k < K; ++k) {
222 for (
size_t l = 0; l < L; ++l) {
223 exp_sub =
exp(a(k)(l));
225 pmp_h_kernel<C1, C2>(exp_sub, base);
227 c(k)(l) = exp_sub / (1.0 + base);
243 template <
typename A>
251 template <etl_2d A,
typename C>
252 static void apply(A&& a, C&& c,
size_t c1,
size_t c2, [[maybe_unused]]
size_t s1, [[maybe_unused]]
size_t s2, [[maybe_unused]]
size_t p1, [[maybe_unused]]
size_t p2) {
253 cpp_assert(s1 == c1,
"pmp_p does not support strides");
254 cpp_assert(s2 == c2,
"pmp_p does not support strides");
255 cpp_assert(p1 == 0,
"pmp_p does not support pooling");
256 cpp_assert(p2 == 0,
"pmp_p does not support pooling");
260 const size_t M = etl::dim<0>(a);
261 const size_t N = etl::dim<1>(a);
269 if (c1 == 2 && c2 == 2) {
270 pmp_h_kernel_2x2(exp_sub, base);
272 pmp_h_kernel(exp_sub, base, c1, c2);
275 c = exp_sub / (1.0 + base);
284 template <etl_3d A,
typename C>
285 static void apply(A&& a, C&& c,
size_t c1,
size_t c2, [[maybe_unused]]
size_t s1, [[maybe_unused]]
size_t s2, [[maybe_unused]]
size_t p1, [[maybe_unused]]
size_t p2) {
286 cpp_assert(s1 == c1,
"pmp_p does not support strides");
287 cpp_assert(s2 == c2,
"pmp_p does not support strides");
288 cpp_assert(p1 == 0,
"pmp_p does not support pooling");
289 cpp_assert(p2 == 0,
"pmp_p does not support pooling");
293 const size_t L = etl::dim<0>(a);
294 const size_t M = etl::dim<1>(a);
295 const size_t N = etl::dim<2>(a);
301 if (c1 == 2 && c2 == 2) {
302 for (
size_t l = 0; l < L; ++l) {
305 pmp_h_kernel_2x2(exp_sub, base);
307 c(l) = exp_sub / (1.0 + base);
310 for (
size_t l = 0; l < L; ++l) {
313 pmp_h_kernel(exp_sub, base, c1, c2);
315 c(l) = exp_sub / (1.0 + base);
326 template <etl_4d A,
typename C>
327 static void apply(A&& a, C&& c,
size_t c1,
size_t c2, [[maybe_unused]]
size_t s1, [[maybe_unused]]
size_t s2, [[maybe_unused]]
size_t p1, [[maybe_unused]]
size_t p2) {
328 cpp_assert(s1 == c1,
"pmp_p does not support strides");
329 cpp_assert(s2 == c2,
"pmp_p does not support strides");
330 cpp_assert(p1 == 0,
"pmp_p does not support pooling");
331 cpp_assert(p2 == 0,
"pmp_p does not support pooling");
335 const size_t K = etl::dim<0>(a);
336 const size_t L = etl::dim<1>(a);
337 const size_t M = etl::dim<2>(a);
338 const size_t N = etl::dim<3>(a);
344 if (c1 == 2 && c2 == 2) {
345 for (
size_t k = 0; k < K; ++k) {
346 for (
size_t l = 0; l < L; ++l) {
347 exp_sub =
exp(a(k)(l));
349 pmp_h_kernel_2x2(exp_sub, base);
351 c(k)(l) = exp_sub / (1.0 + base);
355 for (
size_t k = 0; k < K; ++k) {
356 for (
size_t l = 0; l < L; ++l) {
357 exp_sub =
exp(a(k)(l));
359 pmp_h_kernel(exp_sub, base, c1, c2);
361 c(k)(l) = exp_sub / (1.0 + base);
379 template <
typename T>
381 const size_t M = etl::dim<0>(exp_sub);
382 const size_t N = etl::dim<1>(exp_sub);
384 for (
size_t m = 0; m < M / 2; ++m) {
385 const auto start_mm = m * 2;
387 for (
size_t n = 0; n < N / 2; ++n) {
388 const auto start_nn = n * 2;
390 base(m, n) = exp_sub(start_mm + 0, start_nn + 0) + exp_sub(start_mm + 0, start_nn + 1) + exp_sub(start_mm + 1, start_nn + 0)
391 + exp_sub(start_mm + 1, start_nn + 1);
403 template <
size_t C1,
size_t C2,
typename T>
405 const size_t M = etl::dim<0>(exp_sub);
406 const size_t N = etl::dim<1>(exp_sub);
408 for (
size_t m = 0; m < M / C1; ++m) {
409 const auto start_mm = m * C1;
411 for (
size_t n = 0; n < N / C2; ++n) {
412 const auto start_nn = n * C2;
416 for (
size_t mm = start_mm; mm < start_mm + C1; ++mm) {
417 for (
size_t nn = start_nn; nn < start_nn + C2; ++nn) {
418 p += exp_sub(mm, nn);
434 template <
typename T>
436 const size_t M = etl::dim<0>(exp_sub);
437 const size_t N = etl::dim<1>(exp_sub);
439 for (
size_t m = 0; m < M / c1; ++m) {
440 const auto start_mm = m * c1;
442 for (
size_t n = 0; n < N / c2; ++n) {
443 const auto start_nn = n * c2;
447 for (
size_t mm = start_mm; mm < start_mm + c1; ++mm) {
448 for (
size_t nn = start_nn; nn < start_nn + c2; ++nn) {
449 p += exp_sub(mm, nn);
466 template <
typename A>
474 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_2d A,
typename C>
476 static_assert(S1 == C1,
"pmp_p does not support strides");
477 static_assert(S2 == C2,
"pmp_p does not support strides");
478 static_assert(P1 == 0,
"pmp_p does not support padding");
479 static_assert(P2 == 0,
"pmp_p does not support padding");
483 const size_t M = etl::dim<0>(a);
484 const size_t N = etl::dim<1>(a);
491 if (C1 == 2 && C2 == 2) {
492 pmp_p_kernel_2x2(exp_sub, base);
494 pmp_p_kernel<C1, C2>(exp_sub, base);
497 c = 1.0 / (1.0 + base);
505 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_3d A,
typename C>
507 static_assert(S1 == C1,
"pmp_p does not support strides");
508 static_assert(S2 == C2,
"pmp_p does not support strides");
509 static_assert(P1 == 0,
"pmp_p does not support padding");
510 static_assert(P2 == 0,
"pmp_p does not support padding");
514 const size_t L = etl::dim<0>(a);
515 const size_t M = etl::dim<1>(a);
516 const size_t N = etl::dim<2>(a);
521 if (C1 == 2 && C2 == 2) {
522 for (
size_t l = 0; l < L; ++l) {
525 pmp_p_kernel_2x2(exp_sub, base);
527 c(l) = 1.0 / (1.0 + base);
530 for (
size_t l = 0; l < L; ++l) {
533 pmp_p_kernel<C1, C2>(exp_sub, base);
535 c(l) = 1.0 / (1.0 + base);
545 template <
size_t C1,
size_t C2,
size_t S1,
size_t S2,
size_t P1,
size_t P2, etl_4d A,
typename C>
547 static_assert(S1 == C1,
"pmp_p does not support strides");
548 static_assert(S2 == C2,
"pmp_p does not support strides");
549 static_assert(P1 == 0,
"pmp_p does not support padding");
550 static_assert(P2 == 0,
"pmp_p does not support padding");
554 const size_t K = etl::dim<0>(a);
555 const size_t L = etl::dim<1>(a);
556 const size_t M = etl::dim<2>(a);
557 const size_t N = etl::dim<3>(a);
562 if (C1 == 2 && C2 == 2) {
563 for (
size_t k = 0; k < K; ++k) {
564 for (
size_t l = 0; l < L; ++l) {
565 exp_sub =
exp(a(k)(l));
567 pmp_p_kernel_2x2(exp_sub, base);
569 c(k)(l) = 1.0 / (1.0 + base);
573 for (
size_t k = 0; k < K; ++k) {
574 for (
size_t l = 0; l < L; ++l) {
575 exp_sub =
exp(a(k)(l));
577 pmp_p_kernel<C1, C2>(exp_sub, base);
579 c(k)(l) = 1.0 / (1.0 + base);
594 template <
typename A>
602 template <etl_2d A,
typename C>
603 static void apply(A&& a, C&& c,
size_t c1,
size_t c2, [[maybe_unused]]
size_t s1, [[maybe_unused]]
size_t s2, [[maybe_unused]]
size_t p1, [[maybe_unused]]
size_t p2) {
604 cpp_assert(s1 == c1,
"pmp_p does not support strides");
605 cpp_assert(s2 == c2,
"pmp_p does not support strides");
606 cpp_assert(p1 == 0,
"pmp_p does not support pooling");
607 cpp_assert(p2 == 0,
"pmp_p does not support pooling");
611 const size_t M = etl::dim<0>(a);
612 const size_t N = etl::dim<1>(a);
619 if (c1 == 2 && c2 == 2) {
620 pmp_p_kernel_2x2(exp_sub, base);
622 pmp_p_kernel(exp_sub, base, c1, c2);
625 c = 1.0 / (1.0 + base);
633 template <etl_3d A,
typename C>
634 static void apply(A&& a, C&& c,
size_t c1,
size_t c2, [[maybe_unused]]
size_t s1, [[maybe_unused]]
size_t s2, [[maybe_unused]]
size_t p1, [[maybe_unused]]
size_t p2) {
635 cpp_assert(s1 == c1,
"pmp_p does not support strides");
636 cpp_assert(s2 == c2,
"pmp_p does not support strides");
637 cpp_assert(p1 == 0,
"pmp_p does not support pooling");
638 cpp_assert(p2 == 0,
"pmp_p does not support pooling");
642 const size_t L = etl::dim<0>(a);
643 const size_t M = etl::dim<1>(a);
644 const size_t N = etl::dim<2>(a);
649 if (c1 == 2 && c2 == 2) {
650 for (
size_t l = 0; l < L; ++l) {
653 pmp_p_kernel_2x2(exp_sub, base);
655 c(l) = 1.0 / (1.0 + base);
658 for (
size_t l = 0; l < L; ++l) {
661 pmp_p_kernel(exp_sub, base, c1, c2);
663 c(l) = 1.0 / (1.0 + base);
673 template <etl_4d A,
typename C>
674 static void apply(A&& a, C&& c,
size_t c1,
size_t c2, [[maybe_unused]]
size_t s1, [[maybe_unused]]
size_t s2, [[maybe_unused]]
size_t p1, [[maybe_unused]]
size_t p2) {
675 cpp_assert(s1 == c1,
"pmp_p does not support strides");
676 cpp_assert(s2 == c2,
"pmp_p does not support strides");
677 cpp_assert(p1 == 0,
"pmp_p does not support pooling");
678 cpp_assert(p2 == 0,
"pmp_p does not support pooling");
682 const size_t K = etl::dim<0>(a);
683 const size_t L = etl::dim<1>(a);
684 const size_t M = etl::dim<2>(a);
685 const size_t N = etl::dim<3>(a);
690 if (c1 == 2 && c2 == 2) {
691 for (
size_t k = 0; k < K; ++k) {
692 for (
size_t l = 0; l < L; ++l) {
693 exp_sub =
exp(a(k)(l));
695 pmp_p_kernel_2x2(exp_sub, base);
697 c(k)(l) = 1.0 / (1.0 + base);
701 for (
size_t k = 0; k < K; ++k) {
702 for (
size_t l = 0; l < L; ++l) {
703 exp_sub =
exp(a(k)(l));
705 pmp_p_kernel(exp_sub, base, c1, c2);
707 c(k)(l) = 1.0 / (1.0 + base);
Definition: prob_pooling.hpp:10
static void apply(A &&a, C &&c, size_t c1, size_t c2, [[maybe_unused]] size_t s1, [[maybe_unused]] size_t s2, [[maybe_unused]] size_t p1, [[maybe_unused]] size_t p2)
Apply the functor.
Definition: prob_pooling.hpp:603
static void apply(A &&a, C &&c)
Apply the functor.
Definition: prob_pooling.hpp:118
static constexpr bool gpu_computable
Indicates if the temporary expression can be directly evaluated using only GPU.
Definition: prob_pooling.hpp:110
Matrix with run-time fixed dimensions.
Definition: dyn.hpp:26
static void apply(A &&a, C &&c)
Apply the functor.
Definition: prob_pooling.hpp:475
auto exp(E &&value) -> detail::unary_helper< E, exp_unary_op >
Apply exponential on each value of the given expression.
Definition: function_expression_builder.hpp:154
2D Implemenetation of Probabilistic Max Pooling for hidden units
Definition: prob_pooling.hpp:104
Dynamic Implemenetation of Probabilistic Max Pooling for hidden units.
Definition: prob_pooling.hpp:238
typename decay_traits< E >::value_type value_t
Traits to extract the value type out of an ETL type.
Definition: tmp.hpp:81
Implemenetation of Probabilistic Max Pooling for pooling units.
Definition: prob_pooling.hpp:461
static void apply(A &&a, C &&c, size_t c1, size_t c2, [[maybe_unused]] size_t s1, [[maybe_unused]] size_t s2, [[maybe_unused]] size_t p1, [[maybe_unused]] size_t p2)
Apply the functor.
Definition: prob_pooling.hpp:252
Dynamic 4D Implemenetation of Probabilistic Max Pooling for pooling units.
Definition: prob_pooling.hpp:589