17 template <
typename L,
typename R>
19 static constexpr
bool value =
false;
22 template <
typename T0,
typename T1,
typename T2,
typename RightExpr,
typename L>
24 static constexpr
bool value =
true;
29 template <
typename L,
typename R>
31 static constexpr
bool value =
false;
34 template <
typename T0,
typename T1,
typename T2,
typename RightExpr,
typename L>
36 static constexpr
bool value =
true;
41 template <
typename L,
typename R>
43 static constexpr
bool value =
false;
46 template <
typename T0,
typename T1,
typename T2,
typename RightExpr,
typename R>
48 static constexpr
bool value =
true;
53 template <
typename L,
typename R>
55 static constexpr
bool value =
false;
58 template <
typename T0,
typename T1,
typename T2,
typename RightExpr,
typename R>
60 static constexpr
bool value =
true;
65 template <
typename L,
typename R>
67 static constexpr
bool value =
false;
70 template <
typename T0,
typename T1,
typename T2,
typename RightExpr,
typename L>
72 static constexpr
bool value =
true;
77 template <
typename L,
typename R>
79 static constexpr
bool value =
false;
82 template <
typename T0,
typename T1,
typename T2,
typename RightExpr,
typename L>
84 static constexpr
bool value =
true;
89 template <
typename L,
typename R>
91 static constexpr
bool value =
false;
94 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
96 static constexpr
bool value =
true;
101 template <
typename L,
typename R>
103 static constexpr
bool value =
false;
106 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
108 static constexpr
bool value =
true;
113 template <
typename L,
typename R>
115 static constexpr
bool value =
false;
118 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
120 static constexpr
bool value =
true;
125 template <
typename L,
typename R>
127 static constexpr
bool value =
false;
130 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
132 static constexpr
bool value =
true;
137 template <
typename L,
typename R>
139 static constexpr
bool value =
false;
142 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
144 static constexpr
bool value =
true;
149 template <
typename L,
typename R>
151 static constexpr
bool value =
false;
154 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
156 binary_expr<T3, R2, etl::plus_binary_op<T5>, etl::scalar<T4>>> {
157 static constexpr
bool value =
true;
162 template <
typename L,
typename R>
164 static constexpr
bool value =
false;
167 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
169 binary_expr<T3, etl::scalar<T4>, etl::plus_binary_op<T5>, R2>> {
170 static constexpr
bool value =
true;
175 template <
typename L,
typename R>
177 static constexpr
bool value =
false;
180 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
182 binary_expr<T3, R2, etl::plus_binary_op<T5>, etl::scalar<T4>>> {
183 static constexpr
bool value =
true;
188 template <
typename L,
typename R>
190 static constexpr
bool value =
false;
193 template <
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
195 static constexpr
bool value =
true;
200 template <
typename L,
typename R>
202 static constexpr
bool value =
false;
205 template <
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
207 static constexpr
bool value =
true;
212 template <
typename L,
typename R>
214 static constexpr
bool value =
false;
217 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
219 static constexpr
bool value =
true;
224 template <
typename L,
typename R>
226 static constexpr
bool value =
false;
229 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
231 static constexpr
bool value =
true;
236 template <
typename L,
typename R>
238 static constexpr
bool value =
false;
241 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
243 static constexpr
bool value =
true;
248 template <
typename L,
typename R>
250 static constexpr
bool value =
false;
253 template <
typename T0,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename R1,
typename R2>
255 static constexpr
bool value =
true;
260 template <
typename L,
typename R>
263 template <
typename L,
typename R>
266 template <
typename L,
typename R>
269 template <
typename L,
typename R>
272 template <
typename L,
typename R>
273 static constexpr
bool is_apxdbpy = is_apxdbpy_left_left<L, R> || is_apxdbpy_left_right<L, R> || is_apxdbpy_right_left<L, R> || is_apxdbpy_right_right<L, R>;
275 template <
typename L,
typename R>
278 template <
typename L,
typename R>
281 template <
typename L,
typename R>
284 template <
typename L,
typename R>
287 template <
typename L,
typename R>
288 static constexpr
bool is_apxdby_left =
290 && !is_apxdbpy<L, R> && !is_apxdby_left_left<L, R> && !is_apxdby_left_right<L, R> && !is_apxdby_right_left<L, R> && !is_apxdby_right_right<L, R>;
292 template <
typename L,
typename R>
293 static constexpr
bool is_apxdby_right =
295 && !is_apxdbpy<L, R> && !is_apxdby_left_left<L, R> && !is_apxdby_left_right<L, R> && !is_apxdby_right_left<L, R> && !is_apxdby_right_right<L, R>;
297 template <
typename L,
typename R>
298 static constexpr
bool is_apxdby =
301 R> || is_apxdby_right<L, R> || is_apxdby_left_left<L, R> || is_apxdby_left_right<L, R> || is_apxdby_right_left<L, R> || is_apxdby_right_right<L, R>;
303 template <
typename L,
typename R>
306 template <
typename L,
typename R>
309 template <
typename L,
typename R>
312 template <
typename L,
typename R>
315 template <
typename L,
typename R>
318 template <
typename L,
typename R>
321 template <
typename L,
typename R>
322 static constexpr
bool is_axdbpy =
325 R> || is_axdbpy_right<L, R> || is_axdbpy_left_left<L, R> || is_axdbpy_left_right<L, R> || is_axdbpy_right_left<L, R> || is_axdbpy_right_right<L, R>;
327 template <
typename L,
typename R>
330 template <
typename L,
typename R>
333 template <
typename L,
typename R>
336 template <
typename L,
typename R>
339 template <
typename L,
typename R>
340 static constexpr
bool is_axdy = is_axdy_right_left<L, R> || is_axdy_right_right<L, R> || is_axdy_left_left<L, R> || is_axdy_left_right<L, R>;
342 template <
typename L,
typename R>
343 static constexpr
bool is_special_div = is_axdy<L, R> || is_axdbpy<L, R> || is_apxdbpy<L, R> || is_apxdby<L, R>;
348 template <
typename T>
350 static constexpr
bool linear =
true;
351 static constexpr
bool thread_safe =
true;
352 static constexpr
bool desc_func =
false;
360 template <vector_mode_t V>
366 template <
typename L,
typename R>
367 static constexpr
bool gpu_computable =
368 ((!is_scalar<L> && !is_scalar<R>)&&((is_single_precision_t<T> && impl::egblas::has_saxdy_3 && impl::egblas::has_saxdbpy_3
369 && impl::egblas::has_sapxdbpy_3 && impl::egblas::has_sapxdby_3)
370 || (is_double_precision_t<T> && impl::egblas::has_daxdy_3 && impl::egblas::has_daxdbpy_3
371 && impl::egblas::has_dapxdbpy_3 && impl::egblas::has_dapxdby_3)
372 || (is_complex_single_t<T> && impl::egblas::has_caxdy_3 && impl::egblas::has_caxdbpy_3
373 && impl::egblas::has_capxdbpy_3 && impl::egblas::has_capxdby_3)
374 || (is_complex_double_t<T> && impl::egblas::has_zaxdy_3 && impl::egblas::has_zaxdbpy_3
375 && impl::egblas::has_zapxdbpy_3 && impl::egblas::has_zapxdby_3)))
376 || ((is_scalar<L> != is_scalar<R>)&&((is_single_precision_t<T> && impl::egblas::has_scalar_smul && impl::egblas::has_scalar_sdiv)
377 || (is_double_precision_t<T> && impl::egblas::has_scalar_dmul && impl::egblas::has_scalar_ddiv)
378 || (is_complex_single_t<T> && impl::egblas::has_scalar_cmul && impl::egblas::has_scalar_cdiv)
379 || (is_complex_double_t<T> && impl::egblas::has_scalar_zmul && impl::egblas::has_scalar_zdiv)));
392 template <
typename V = default_vec>
401 static constexpr T
apply(
const T& lhs,
const T& rhs) noexcept {
412 template <
typename V = default_vec>
414 return V::div(lhs, rhs);
425 template <
typename L,
typename R,
typename Y>
428 gpu_compute(lhs, rhs, t3);
440 template <
typename L,
typename R,
typename Y>
441 static Y&
gpu_compute(
const L& lhs,
const R& rhs, Y& yy) noexcept {
442 if constexpr (is_axdy_right_left<L, R>) {
443 auto& rhs_lhs = rhs.get_lhs();
444 auto& rhs_rhs = rhs.get_rhs();
449 constexpr
auto incx = gpu_inc<decltype(lhs)>;
450 constexpr
auto incy = gpu_inc<decltype(rhs_rhs)>;
452 impl::egblas::axdy_3(
etl::size(yy), rhs_lhs.value, x.gpu_memory(), incx, y.gpu_memory(), incy, yy.gpu_memory(), 1);
453 }
else if constexpr (is_axdy_right_right<L, R>) {
454 auto& rhs_lhs = rhs.get_lhs();
455 auto& rhs_rhs = rhs.get_rhs();
460 constexpr
auto incx = gpu_inc<decltype(lhs)>;
461 constexpr
auto incy = gpu_inc<decltype(rhs_lhs)>;
463 impl::egblas::axdy_3(
etl::size(yy), rhs_rhs.value, x.gpu_memory(), incx, y.gpu_memory(), incy, yy.gpu_memory(), 1);
464 }
else if constexpr (is_axdy_left_left<L, R>) {
465 auto& lhs_lhs = lhs.get_lhs();
466 auto& lhs_rhs = lhs.get_rhs();
471 constexpr
auto incx = gpu_inc<decltype(lhs_rhs)>;
472 constexpr
auto incy = gpu_inc<decltype(rhs)>;
474 impl::egblas::axdy_3(
etl::size(yy), T(1) / lhs_lhs.value, x.gpu_memory(), incx, y.gpu_memory(), incy, yy.gpu_memory(), 1);
475 }
else if constexpr (is_axdy_left_right<L, R>) {
476 auto& lhs_lhs = lhs.get_lhs();
477 auto& lhs_rhs = lhs.get_rhs();
482 constexpr
auto incx = gpu_inc<decltype(lhs_lhs)>;
483 constexpr
auto incy = gpu_inc<decltype(rhs)>;
485 impl::egblas::axdy_3(
etl::size(yy), T(1) / lhs_rhs.value, x.gpu_memory(), incx, y.gpu_memory(), incy, yy.gpu_memory(), 1);
486 }
else if constexpr (is_axdbpy_left<L, R>) {
487 auto& rhs_lhs = rhs.get_lhs();
488 auto& rhs_rhs = rhs.get_rhs();
493 constexpr
auto incx = gpu_inc<decltype(lhs)>;
494 constexpr
auto incy = gpu_inc<decltype(rhs_rhs)>;
496 impl::egblas::axdbpy_3(
etl::size(yy), T(1), x.gpu_memory(), incx, rhs_lhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
497 }
else if constexpr (is_axdbpy_right<L, R>) {
498 auto& rhs_lhs = rhs.get_lhs();
499 auto& rhs_rhs = rhs.get_rhs();
504 constexpr
auto incx = gpu_inc<decltype(lhs)>;
505 constexpr
auto incy = gpu_inc<decltype(rhs_lhs)>;
507 impl::egblas::axdbpy_3(
etl::size(yy), T(1), x.gpu_memory(), incx, rhs_rhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
508 }
else if constexpr (is_axdbpy_left_left<L, R>) {
509 auto& lhs_lhs = lhs.get_lhs();
510 auto& lhs_rhs = lhs.get_rhs();
512 auto& rhs_lhs = rhs.get_lhs();
513 auto& rhs_rhs = rhs.get_rhs();
518 constexpr
auto incx = gpu_inc<decltype(lhs_rhs)>;
519 constexpr
auto incy = gpu_inc<decltype(rhs_rhs)>;
521 impl::egblas::axdbpy_3(
etl::size(yy), lhs_lhs.value, x.gpu_memory(), incx, rhs_lhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
522 }
else if constexpr (is_axdbpy_left_right<L, R>) {
523 auto& lhs_lhs = lhs.get_lhs();
524 auto& lhs_rhs = lhs.get_rhs();
526 auto& rhs_lhs = rhs.get_lhs();
527 auto& rhs_rhs = rhs.get_rhs();
532 constexpr
auto incx = gpu_inc<decltype(lhs_rhs)>;
533 constexpr
auto incy = gpu_inc<decltype(rhs_lhs)>;
535 impl::egblas::axdbpy_3(
etl::size(yy), lhs_lhs.value, x.gpu_memory(), incx, rhs_rhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
536 }
else if constexpr (is_axdbpy_right_left<L, R>) {
537 auto& lhs_lhs = lhs.get_lhs();
538 auto& lhs_rhs = lhs.get_rhs();
540 auto& rhs_lhs = rhs.get_lhs();
541 auto& rhs_rhs = rhs.get_rhs();
546 constexpr
auto incx = gpu_inc<decltype(lhs_lhs)>;
547 constexpr
auto incy = gpu_inc<decltype(rhs_rhs)>;
549 impl::egblas::axdbpy_3(
etl::size(yy), lhs_rhs.value, x.gpu_memory(), incx, rhs_lhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
550 }
else if constexpr (is_axdbpy_right_right<L, R>) {
551 auto& lhs_lhs = lhs.get_lhs();
552 auto& lhs_rhs = lhs.get_rhs();
554 auto& rhs_lhs = rhs.get_lhs();
555 auto& rhs_rhs = rhs.get_rhs();
560 constexpr
auto incx = gpu_inc<decltype(lhs_lhs)>;
561 constexpr
auto incy = gpu_inc<decltype(rhs_lhs)>;
563 impl::egblas::axdbpy_3(
etl::size(yy), lhs_rhs.value, x.gpu_memory(), incx, rhs_rhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
564 }
else if constexpr (is_apxdbpy_left_left<L, R>) {
565 auto& lhs_lhs = lhs.get_lhs();
566 auto& lhs_rhs = lhs.get_rhs();
568 auto& rhs_lhs = rhs.get_lhs();
569 auto& rhs_rhs = rhs.get_rhs();
574 constexpr
auto incx = gpu_inc<decltype(lhs_rhs)>;
575 constexpr
auto incy = gpu_inc<decltype(rhs_rhs)>;
577 impl::egblas::apxdbpy_3(
etl::size(yy), lhs_lhs.value, x.gpu_memory(), incx, rhs_lhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
578 }
else if constexpr (is_apxdbpy_left_right<L, R>) {
579 auto& lhs_lhs = lhs.get_lhs();
580 auto& lhs_rhs = lhs.get_rhs();
582 auto& rhs_lhs = rhs.get_lhs();
583 auto& rhs_rhs = rhs.get_rhs();
588 constexpr
auto incx = gpu_inc<decltype(lhs_rhs)>;
589 constexpr
auto incy = gpu_inc<decltype(rhs_lhs)>;
591 impl::egblas::apxdbpy_3(
etl::size(yy), lhs_lhs.value, x.gpu_memory(), incx, rhs_rhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
592 }
else if constexpr (is_apxdbpy_right_left<L, R>) {
593 auto& lhs_lhs = lhs.get_lhs();
594 auto& lhs_rhs = lhs.get_rhs();
596 auto& rhs_lhs = rhs.get_lhs();
597 auto& rhs_rhs = rhs.get_rhs();
602 constexpr
auto incx = gpu_inc<decltype(lhs_lhs)>;
603 constexpr
auto incy = gpu_inc<decltype(rhs_rhs)>;
605 impl::egblas::apxdbpy_3(
etl::size(yy), lhs_rhs.value, x.gpu_memory(), incx, rhs_lhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
606 }
else if constexpr (is_apxdbpy_right_right<L, R>) {
607 auto& lhs_lhs = lhs.get_lhs();
608 auto& lhs_rhs = lhs.get_rhs();
610 auto& rhs_lhs = rhs.get_lhs();
611 auto& rhs_rhs = rhs.get_rhs();
616 constexpr
auto incx = gpu_inc<decltype(lhs_lhs)>;
617 constexpr
auto incy = gpu_inc<decltype(rhs_lhs)>;
619 impl::egblas::apxdbpy_3(
etl::size(yy), lhs_rhs.value, x.gpu_memory(), incx, rhs_rhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
620 }
else if constexpr (is_apxdby_left<L, R>) {
621 auto& lhs_lhs = lhs.get_lhs();
622 auto& lhs_rhs = lhs.get_rhs();
627 constexpr
auto incx = gpu_inc<decltype(lhs_rhs)>;
628 constexpr
auto incy = gpu_inc<decltype(rhs)>;
630 impl::egblas::apxdby_3(
etl::size(yy), lhs_lhs.value, x.gpu_memory(), incx, T(1), y.gpu_memory(), incy, yy.gpu_memory(), 1);
631 }
else if constexpr (is_apxdby_right<L, R>) {
632 auto& lhs_lhs = lhs.get_lhs();
633 auto& lhs_rhs = lhs.get_rhs();
638 constexpr
auto incx = gpu_inc<decltype(lhs_lhs)>;
639 constexpr
auto incy = gpu_inc<decltype(rhs)>;
641 impl::egblas::apxdby_3(
etl::size(yy), lhs_rhs.value, x.gpu_memory(), incx, T(1), y.gpu_memory(), incy, yy.gpu_memory(), 1);
642 }
else if constexpr (is_apxdby_left_left<L, R>) {
643 auto& lhs_lhs = lhs.get_lhs();
644 auto& lhs_rhs = lhs.get_rhs();
646 auto& rhs_lhs = rhs.get_lhs();
647 auto& rhs_rhs = rhs.get_rhs();
652 constexpr
auto incx = gpu_inc<decltype(lhs_rhs)>;
653 constexpr
auto incy = gpu_inc<decltype(rhs_rhs)>;
655 impl::egblas::apxdby_3(
etl::size(yy), lhs_lhs.value, x.gpu_memory(), incx, rhs_lhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
656 }
else if constexpr (is_apxdby_left_right<L, R>) {
657 auto& lhs_lhs = lhs.get_lhs();
658 auto& lhs_rhs = lhs.get_rhs();
660 auto& rhs_lhs = rhs.get_lhs();
661 auto& rhs_rhs = rhs.get_rhs();
666 constexpr
auto incx = gpu_inc<decltype(lhs_rhs)>;
667 constexpr
auto incy = gpu_inc<decltype(rhs_lhs)>;
669 impl::egblas::apxdby_3(
etl::size(yy), lhs_lhs.value, x.gpu_memory(), incx, rhs_rhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
670 }
else if constexpr (is_apxdby_right_left<L, R>) {
671 auto& lhs_lhs = lhs.get_lhs();
672 auto& lhs_rhs = lhs.get_rhs();
674 auto& rhs_lhs = rhs.get_lhs();
675 auto& rhs_rhs = rhs.get_rhs();
680 constexpr
auto incx = gpu_inc<decltype(lhs_lhs)>;
681 constexpr
auto incy = gpu_inc<decltype(rhs_rhs)>;
683 impl::egblas::apxdby_3(
etl::size(yy), lhs_rhs.value, x.gpu_memory(), incx, rhs_lhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
684 }
else if constexpr (is_apxdby_right_right<L, R>) {
685 auto& lhs_lhs = lhs.get_lhs();
686 auto& lhs_rhs = lhs.get_rhs();
688 auto& rhs_lhs = rhs.get_lhs();
689 auto& rhs_rhs = rhs.get_rhs();
694 constexpr
auto incx = gpu_inc<decltype(lhs_lhs)>;
695 constexpr
auto incy = gpu_inc<decltype(rhs_lhs)>;
697 impl::egblas::apxdby_3(
etl::size(yy), lhs_rhs.value, x.gpu_memory(), incx, rhs_rhs.value, y.gpu_memory(), incy, yy.gpu_memory(), 1);
698 }
else if constexpr (!is_scalar<L> && !is_scalar<R> && !is_special_div<L, R>) {
702 constexpr
auto incx = gpu_inc<decltype(lhs)>;
703 constexpr
auto incy = gpu_inc<decltype(rhs)>;
706 impl::egblas::axdy_3(
etl::size(yy), alpha, x.gpu_memory(), incx, y.gpu_memory(), incy, yy.gpu_memory(), 1);
707 }
else if constexpr (!is_scalar<L> && is_scalar<R> && !is_special_div<L, R>) {
708 auto s = T(1) / rhs.value;
712 impl::egblas::scalar_mul(yy.gpu_memory(),
etl::size(yy), 1,
s);
713 }
else if constexpr (is_scalar<L> && !is_scalar<R> && !is_special_div<L, R>) {
718 impl::egblas::scalar_div(
s, yy.gpu_memory(),
etl::size(yy), 1);
731 static std::string
desc() noexcept {
auto s(T &&value)
Force the evaluation of the given expression.
Definition: stop.hpp:18
typename V::template vec_type< T > vec_type
Definition: div.hpp:393
static auto gpu_compute_hint(const L &lhs, const R &rhs, Y &y) noexcept
Compute the result of the operation using the GPU.
Definition: div.hpp:426
static std::string desc() noexcept
Returns a textual representation of the operator.
Definition: div.hpp:731
static Y & gpu_compute(const L &lhs, const R &rhs, Y &yy) noexcept
Compute the result of the operation using the GPU.
Definition: div.hpp:441
Binary operator for scalar division.
Definition: div.hpp:349
A binary expression.
Definition: binary_expr.hpp:18
Root namespace for the ETL library.
Definition: adapter.hpp:15
decltype(auto) force_temporary_gpu_dim_only(E &&expr)
Force a temporary out of the expression, without copying its content.
Definition: temporary.hpp:223
Represents a scalar value.
Definition: concepts_base.hpp:19
constexpr size_t size(const E &expr) noexcept
Returns the size of the given ETL expression.
Definition: helpers.hpp:108
Binary operator for scalar multiplication.
Definition: div.hpp:13
static vec_type< V > load(const vec_type< V > &lhs, const vec_type< V > &rhs) noexcept
Compute several applications of the operator at a time.
Definition: div.hpp:413
decltype(auto) smart_gpu_compute_hint(E &expr, Y &y)
Compute the expression into a representation that is GPU up to date.
Definition: helpers.hpp:368
static constexpr T apply(const T &lhs, const T &rhs) noexcept
Apply the unary operator on lhs and rhs.
Definition: div.hpp:401
AVX-512F is the max vectorization available.
typename decay_traits< E >::value_type value_t
Traits to extract the value type out of an ETL type.
Definition: tmp.hpp:81
decltype(auto) smart_gpu_compute(X &x, Y &y)
Compute the expression into a representation that is GPU up to date and store this representation in ...
Definition: helpers.hpp:397
static constexpr int complexity()
Estimate the complexity of operator.
Definition: div.hpp:385
Binary operator for scalar addition.
Definition: plus.hpp:154