Eigen-Contrib  5.0.1
 
Loading...
Searching...
No Matches
type_traits.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// This Source Code Form is subject to the terms of the Mozilla
5// Public License v. 2.0. If a copy of the MPL was not distributed
6// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
7// SPDX-FileCopyrightText: The Eigen Authors
8// SPDX-License-Identifier: MPL-2.0
9
10#ifndef EIGEN_GPU_TYPE_TRAITS_H
11#define EIGEN_GPU_TYPE_TRAITS_H
12
13// IWYU pragma: private
14#include "./InternalHeaderCheck.h"
15
16#include "./FwdDecl.h"
17#include "./Meta.h"
18
19#include <complex>
20#include <type_traits>
21
22namespace Eigen {
23namespace gpu {
24
33
34namespace internal {
35
37
38template <typename Expr>
39using scalar_type_t = typename device_expr_traits<Expr>::scalar_type;
40
41template <typename T>
42struct is_device_buffer : Eigen::internal::bool_constant<false> {};
43template <>
44struct is_device_buffer<DeviceBuffer> : Eigen::internal::bool_constant<true> {};
45
46template <typename T>
47struct is_device_matrix : Eigen::internal::bool_constant<false> {};
48template <typename Scalar>
49struct is_device_matrix<DeviceMatrix<Scalar>> : Eigen::internal::bool_constant<true> {};
50
51template <typename T>
52struct is_gemm_expr : Eigen::internal::bool_constant<false> {};
53template <typename Lhs, typename Rhs>
54struct is_gemm_expr<GemmExpr<Lhs, Rhs>> : Eigen::internal::bool_constant<true> {};
55
56template <typename T>
57struct is_adjoint_view : Eigen::internal::bool_constant<false> {};
58template <typename Scalar>
59struct is_adjoint_view<AdjointView<Scalar>> : Eigen::internal::bool_constant<true> {};
60
61template <typename T>
62struct is_transpose_view : Eigen::internal::bool_constant<false> {};
63template <typename Scalar>
64struct is_transpose_view<TransposeView<Scalar>> : Eigen::internal::bool_constant<true> {};
65
66template <typename T>
67struct is_scaled : Eigen::internal::bool_constant<false> {};
68template <typename Inner>
69struct is_scaled<Scaled<Inner>> : Eigen::internal::bool_constant<true> {};
70
84template <typename T>
85struct is_scaled_leaf : Eigen::internal::bool_constant<false> {};
86template <typename Inner>
87struct is_scaled_leaf<Scaled<Inner>> : is_device_matrix<std::decay_t<Inner>> {};
88
97template <typename T>
98struct is_scaled_gemm : Eigen::internal::bool_constant<false> {};
99template <typename Inner>
100struct is_scaled_gemm<Scaled<Inner>> : is_gemm_expr<std::decay_t<Inner>> {};
101
102template <typename T>
103struct is_triangular_view : Eigen::internal::bool_constant<false> {};
104template <typename Inner, int UpLo>
105struct is_triangular_view<TriangularView<Inner, UpLo>> : Eigen::internal::bool_constant<true> {};
106
107template <typename T>
108struct is_trsm_expr : Eigen::internal::bool_constant<false> {};
109template <typename Scalar, int UpLo>
110struct is_trsm_expr<TrsmExpr<Scalar, UpLo>> : Eigen::internal::bool_constant<true> {};
111
112template <typename T>
113struct is_selfadjoint_view : Eigen::internal::bool_constant<false> {};
114template <typename Scalar, int UpLo>
115struct is_selfadjoint_view<SelfAdjointView<Scalar, UpLo>> : Eigen::internal::bool_constant<true> {};
116
117template <typename T>
118struct is_const_selfadjoint_view : Eigen::internal::bool_constant<false> {};
119template <typename Inner, int UpLo>
120struct is_const_selfadjoint_view<ConstSelfAdjointView<Inner, UpLo>> : Eigen::internal::bool_constant<true> {};
121
122template <typename T>
123struct is_symm_expr : Eigen::internal::bool_constant<false> {};
124template <typename Scalar, int UpLo>
125struct is_symm_expr<SymmExpr<Scalar, UpLo>> : Eigen::internal::bool_constant<true> {};
126
127template <typename T>
128struct is_syrk_expr : Eigen::internal::bool_constant<false> {};
129template <typename A, int UpLo>
130struct is_syrk_expr<SyrkExpr<A, UpLo>> : Eigen::internal::bool_constant<true> {};
131
132template <typename T>
133struct is_llt_solve_expr : Eigen::internal::bool_constant<false> {};
134template <typename Scalar, int UpLo>
135struct is_llt_solve_expr<LltSolveExpr<Scalar, UpLo>> : Eigen::internal::bool_constant<true> {};
136
137template <typename T>
138struct is_lu_solve_expr : Eigen::internal::bool_constant<false> {};
139template <typename Scalar>
140struct is_lu_solve_expr<LuSolveExpr<Scalar>> : Eigen::internal::bool_constant<true> {};
141
142template <typename T>
143struct is_llt_view : Eigen::internal::bool_constant<false> {};
144template <typename Scalar, int UpLo>
145struct is_llt_view<LLTView<Scalar, UpLo>> : Eigen::internal::bool_constant<true> {};
146
147template <typename T>
148struct is_lu_view : Eigen::internal::bool_constant<false> {};
149template <typename Scalar>
150struct is_lu_view<LUView<Scalar>> : Eigen::internal::bool_constant<true> {};
151
152template <typename T>
153struct is_device_add_expr : Eigen::internal::bool_constant<false> {};
154template <typename Scalar>
155struct is_device_add_expr<DeviceAddExpr<Scalar>> : Eigen::internal::bool_constant<true> {};
156
157template <typename T>
158struct is_device_scaled_device : Eigen::internal::bool_constant<false> {};
159template <typename Inner>
160struct is_device_scaled_device<DeviceScaledDevice<Inner>> : Eigen::internal::bool_constant<true> {};
161
162template <typename T>
163struct is_device_scalar : Eigen::internal::bool_constant<false> {};
164template <typename S>
165struct is_device_scalar<DeviceScalar<S>> : Eigen::internal::bool_constant<true> {};
166
168
169} // namespace internal
170
178
184template <typename T>
185struct is_device_buffer : internal::is_device_buffer<std::decay_t<T>> {};
186
192template <typename T>
194
200template <typename T>
201using require_device_buffer = internal::require_t<is_device_buffer<T>>;
202
208template <typename T>
209struct is_device_matrix : internal::is_device_matrix<std::decay_t<T>> {};
210
216template <typename T>
218
224template <typename T>
225using require_device_matrix = internal::require_t<is_device_matrix<T>>;
226
232template <typename T>
233using require_not_device_matrix = internal::require_not_t<is_device_matrix<T>>;
234
240template <typename... Types>
241using require_all_device_matrix = internal::require_all_t<is_device_matrix_v<Types>...>;
242
248template <typename T>
249struct is_gemm_expr : internal::is_gemm_expr<std::decay_t<T>> {};
250
256template <typename T>
258
264template <typename T>
265using require_gemm_expr = internal::require_t<is_gemm_expr<T>>;
266
272template <typename... Types>
273using require_all_gemm_expr = internal::require_all_t<is_gemm_expr_v<Types>...>;
274
280template <typename T>
281struct is_adjoint_view : internal::is_adjoint_view<std::decay_t<T>> {};
282
288template <typename T>
290
296template <typename T>
297using require_adjoint_view = internal::require_t<is_adjoint_view<T>>;
298
304template <typename... Types>
305using require_all_adjoint_view = internal::require_all_t<is_adjoint_view_v<Types>...>;
306
312template <typename T>
313struct is_transpose_view : internal::is_transpose_view<std::decay_t<T>> {};
314
320template <typename T>
322
328template <typename T>
329using require_transpose_view = internal::require_t<is_transpose_view<T>>;
330
336template <typename... Types>
337using require_all_transpose_view = internal::require_all_t<is_transpose_view_v<Types>...>;
338
344template <typename T>
345struct is_scaled : internal::is_scaled<std::decay_t<T>> {};
346
352template <typename T>
354
360template <typename T>
361using require_scaled = internal::require_t<is_scaled<T>>;
362
368template <typename T>
369struct is_scaled_leaf : internal::is_scaled_leaf<std::decay_t<T>> {};
370
376template <typename T>
378
384template <typename T>
385using require_scaled_leaf = internal::require_t<is_scaled_leaf<T>>;
386
392template <typename T>
393struct is_scaled_gemm : internal::is_scaled_gemm<std::decay_t<T>> {};
394
400template <typename T>
402
408template <typename T>
409using require_scaled_gemm = internal::require_t<is_scaled_gemm<T>>;
410
417template <typename T>
419
425template <typename T>
427 internal::require_t<Eigen::internal::bool_constant<is_adjoint_view_v<T> || is_transpose_view_v<T>>>;
428
434template <typename T>
435struct is_triangular_view : internal::is_triangular_view<std::decay_t<T>> {};
436
442template <typename T>
444
450template <typename T>
451using require_triangular_view = internal::require_t<is_triangular_view<T>>;
452
458template <typename... Types>
459using require_all_triangular_view = internal::require_all_t<is_triangular_view_v<Types>...>;
460
466template <typename T>
467struct is_trsm_expr : internal::is_trsm_expr<std::decay_t<T>> {};
468
474template <typename T>
476
482template <typename T>
483using require_trsm_expr = internal::require_t<is_trsm_expr<T>>;
484
490template <typename... Types>
491using require_all_trsm_expr = internal::require_all_t<is_trsm_expr_v<Types>...>;
492
498template <typename T>
499struct is_selfadjoint_view : internal::is_selfadjoint_view<std::decay_t<T>> {};
500
506template <typename T>
508
514template <typename T>
515using require_selfadjoint_view = internal::require_t<is_selfadjoint_view<T>>;
516
522template <typename... Types>
523using require_all_selfadjoint_view = internal::require_all_t<is_selfadjoint_view_v<Types>...>;
524
530template <typename T>
531struct is_const_selfadjoint_view : internal::is_const_selfadjoint_view<std::decay_t<T>> {};
532
538template <typename T>
540
546template <typename T>
547using require_const_selfadjoint_view = internal::require_t<is_const_selfadjoint_view<T>>;
548
554template <typename... Types>
555using require_all_const_selfadjoint_view = internal::require_all_t<is_const_selfadjoint_view_v<Types>...>;
556
562template <typename T>
563struct is_symm_expr : internal::is_symm_expr<std::decay_t<T>> {};
564
570template <typename T>
572
578template <typename T>
579using require_symm_expr = internal::require_t<is_symm_expr<T>>;
580
586template <typename... Types>
587using require_all_symm_expr = internal::require_all_t<is_symm_expr_v<Types>...>;
588
594template <typename T>
595struct is_syrk_expr : internal::is_syrk_expr<std::decay_t<T>> {};
596
602template <typename T>
604
610template <typename T>
611using require_syrk_expr = internal::require_t<is_syrk_expr<T>>;
612
618template <typename... Types>
619using require_all_syrk_expr = internal::require_all_t<is_syrk_expr_v<Types>...>;
620
626template <typename T>
627struct is_llt_solve_expr : internal::is_llt_solve_expr<std::decay_t<T>> {};
628
634template <typename T>
636
642template <typename T>
643using require_llt_solve_expr = internal::require_t<is_llt_solve_expr<T>>;
644
650template <typename... Types>
651using require_all_llt_solve_expr = internal::require_all_t<is_llt_solve_expr_v<Types>...>;
652
658template <typename T>
659struct is_lu_solve_expr : internal::is_lu_solve_expr<std::decay_t<T>> {};
660
666template <typename T>
668
674template <typename T>
675using require_lu_solve_expr = internal::require_t<is_lu_solve_expr<T>>;
676
682template <typename... Types>
683using require_all_lu_solve_expr = internal::require_all_t<is_lu_solve_expr_v<Types>...>;
684
690template <typename T>
691struct is_llt_view : internal::is_llt_view<std::decay_t<T>> {};
692
698template <typename T>
700
706template <typename T>
707using require_llt_view = internal::require_t<is_llt_view<T>>;
708
714template <typename... Types>
715using require_all_llt_view = internal::require_all_t<is_llt_view_v<Types>...>;
716
722template <typename T>
723struct is_lu_view : internal::is_lu_view<std::decay_t<T>> {};
724
730template <typename T>
732
738template <typename T>
739using require_lu_view = internal::require_t<is_lu_view<T>>;
740
746template <typename... Types>
747using require_all_lu_view = internal::require_all_t<is_lu_view_v<Types>...>;
748
755template <typename T>
757
763template <typename T>
764struct is_device_add_expr : internal::is_device_add_expr<std::decay_t<T>> {};
765
771template <typename T>
773
779template <typename T>
780using require_device_add_expr = internal::require_t<is_device_add_expr<T>>;
781
787template <typename... Types>
788using require_all_device_add_expr = internal::require_all_t<is_device_add_expr_v<Types>...>;
789
795template <typename T>
796struct is_device_scaled_device : internal::is_device_scaled_device<std::decay_t<T>> {};
797
803template <typename T>
805
811template <typename T>
812using require_device_scaled_device = internal::require_t<is_device_scaled_device<T>>;
813
819template <typename... Types>
820using require_all_device_scaled_device = internal::require_all_t<is_device_scaled_device_v<Types>...>;
821
827template <typename T>
828struct is_device_scalar : internal::is_device_scalar<std::decay_t<T>> {};
829
835template <typename T>
837
843template <typename T>
844using require_device_scalar = internal::require_t<is_device_scalar<T>>;
845
851template <typename... Types>
852using require_all_device_scalar = internal::require_all_t<is_device_scalar_v<Types>...>;
853
862
863template <typename T>
864using scalar_type_t = internal::scalar_type_t<std::decay_t<T>>;
865
872template <typename T>
873struct is_device_expr : Eigen::internal::bool_constant<internal::device_expr_traits<std::decay_t<T>>::is_device_expr> {
874};
875
882template <typename T>
884
891template <typename T>
892using require_device_expr = internal::require_t<is_device_expr<T>>;
893
900template <typename... Types>
901using require_all_device_expr = internal::require_all_t<is_device_expr_v<Types>...>;
902
903template <typename T>
904constexpr GpuOp trans_op = internal::device_expr_traits<std::decay_t<T>>::op;
905
907
908namespace internal {
909template <typename T>
910struct is_complex : Eigen::internal::bool_constant<false> {};
911
912template <typename T>
913struct is_complex<std::complex<T>> : Eigen::internal::bool_constant<true> {};
914} // namespace internal
915
921template <typename T>
922struct is_complex : internal::is_complex<std::decay_t<T>> {};
923
929template <typename T>
931
937template <typename T>
938struct is_host_scalar : Eigen::internal::bool_constant<std::is_floating_point<std::decay_t<T>>::value ||
939 std::is_integral<std::decay_t<T>>::value || is_complex_v<T>> {};
940
946template <typename T>
947using require_host_scalar = internal::require_t<is_host_scalar<T>>;
948
950
951} // namespace gpu
952} // namespace Eigen
953
954#endif // EIGEN_GPU_TYPE_TRAITS_H
Expression returned by operator*(Scalar, DeviceMatrix/View), carrying the scalar factor.
Definition DeviceExpr.h:77
Internal RAII owner for an untyped GPU device allocation.
Definition GpuSupport.h:293
internal::require_t< is_scaled< T > > require_scaled
Definition type_traits.h:361
internal::require_all_t< is_llt_view_v< Types >... > require_all_llt_view
Definition type_traits.h:715
internal::require_all_t< is_lu_view_v< Types >... > require_all_lu_view
Definition type_traits.h:747
internal::require_t< is_lu_solve_expr< T > > require_lu_solve_expr
Definition type_traits.h:675
constexpr bool is_transpose_view_v
Definition type_traits.h:321
internal::require_t< is_device_scaled_device< T > > require_device_scaled_device
Definition type_traits.h:812
internal::require_t< is_device_buffer< T > > require_device_buffer
Definition type_traits.h:201
internal::require_all_t< is_adjoint_view_v< Types >... > require_all_adjoint_view
Definition type_traits.h:305
constexpr bool is_const_selfadjoint_view_v
Definition type_traits.h:539
internal::require_all_t< is_transpose_view_v< Types >... > require_all_transpose_view
Definition type_traits.h:337
internal::require_all_t< is_selfadjoint_view_v< Types >... > require_all_selfadjoint_view
Definition type_traits.h:523
internal::require_t< is_scaled_gemm< T > > require_scaled_gemm
Definition type_traits.h:409
constexpr bool is_triangular_view_v
Definition type_traits.h:443
internal::require_not_t< is_device_matrix< T > > require_not_device_matrix
Definition type_traits.h:233
internal::require_all_t< is_syrk_expr_v< Types >... > require_all_syrk_expr
Definition type_traits.h:619
internal::require_t< is_selfadjoint_view< T > > require_selfadjoint_view
Definition type_traits.h:515
constexpr bool is_adjoint_view_v
Definition type_traits.h:289
internal::require_t< is_device_scalar< T > > require_device_scalar
Definition type_traits.h:844
constexpr bool is_device_add_expr_v
Definition type_traits.h:772
internal::require_t< Eigen::internal::bool_constant< is_adjoint_view_v< T >||is_transpose_view_v< T > > > require_adjoint_or_transpose_view
Definition type_traits.h:426
constexpr bool is_lu_view_v
Definition type_traits.h:731
constexpr bool is_gemm_expr_v
Definition type_traits.h:257
constexpr bool is_selfadjoint_view_v
Definition type_traits.h:507
constexpr bool is_gemm_like_v
Definition type_traits.h:418
constexpr bool is_complex_v
Definition type_traits.h:930
internal::require_all_t< is_lu_solve_expr_v< Types >... > require_all_lu_solve_expr
Definition type_traits.h:683
internal::require_all_t< is_symm_expr_v< Types >... > require_all_symm_expr
Definition type_traits.h:587
constexpr bool is_scaled_leaf_v
Definition type_traits.h:377
internal::require_t< is_adjoint_view< T > > require_adjoint_view
Definition type_traits.h:297
internal::require_t< is_lu_view< T > > require_lu_view
Definition type_traits.h:739
constexpr bool is_llt_solve_expr_v
Definition type_traits.h:635
internal::require_t< is_host_scalar< T > > require_host_scalar
Definition type_traits.h:947
constexpr bool is_device_matrix_v
Definition type_traits.h:217
constexpr bool is_device_buffer_v
Definition type_traits.h:193
internal::require_t< is_const_selfadjoint_view< T > > require_const_selfadjoint_view
Definition type_traits.h:547
internal::require_all_t< is_device_expr_v< Types >... > require_all_device_expr
Definition type_traits.h:901
internal::require_all_t< is_device_scaled_device_v< Types >... > require_all_device_scaled_device
Definition type_traits.h:820
constexpr bool is_llt_view_v
Definition type_traits.h:699
internal::require_t< is_gemm_expr< T > > require_gemm_expr
Definition type_traits.h:265
constexpr bool is_device_scalar_v
Definition type_traits.h:836
internal::require_t< is_trsm_expr< T > > require_trsm_expr
Definition type_traits.h:483
internal::require_all_t< is_device_scalar_v< Types >... > require_all_device_scalar
Definition type_traits.h:852
internal::require_t< is_syrk_expr< T > > require_syrk_expr
Definition type_traits.h:611
internal::require_t< is_device_matrix< T > > require_device_matrix
Definition type_traits.h:225
constexpr bool is_lu_solve_expr_v
Definition type_traits.h:667
constexpr bool is_syrk_expr_v
Definition type_traits.h:603
internal::require_t< is_llt_solve_expr< T > > require_llt_solve_expr
Definition type_traits.h:643
constexpr bool is_scaled_v
Definition type_traits.h:353
internal::require_t< is_symm_expr< T > > require_symm_expr
Definition type_traits.h:579
internal::require_all_t< is_gemm_expr_v< Types >... > require_all_gemm_expr
Definition type_traits.h:273
constexpr bool is_trsm_expr_v
Definition type_traits.h:475
internal::require_all_t< is_const_selfadjoint_view_v< Types >... > require_all_const_selfadjoint_view
Definition type_traits.h:555
constexpr bool is_device_scaled_device_v
Definition type_traits.h:804
internal::require_all_t< is_triangular_view_v< Types >... > require_all_triangular_view
Definition type_traits.h:459
internal::require_all_t< is_device_add_expr_v< Types >... > require_all_device_add_expr
Definition type_traits.h:788
internal::require_all_t< is_trsm_expr_v< Types >... > require_all_trsm_expr
Definition type_traits.h:491
internal::require_t< is_device_expr< T > > require_device_expr
Definition type_traits.h:892
internal::require_t< is_device_add_expr< T > > require_device_add_expr
Definition type_traits.h:780
internal::require_t< is_scaled_leaf< T > > require_scaled_leaf
Definition type_traits.h:385
internal::require_t< is_llt_view< T > > require_llt_view
Definition type_traits.h:707
internal::require_all_t< is_llt_solve_expr_v< Types >... > require_all_llt_solve_expr
Definition type_traits.h:651
internal::require_t< is_triangular_view< T > > require_triangular_view
Definition type_traits.h:451
constexpr bool is_factor_expr_v
Definition type_traits.h:756
internal::require_all_t< is_device_matrix_v< Types >... > require_all_device_matrix
Definition type_traits.h:241
constexpr bool is_device_expr_v
Definition type_traits.h:883
internal::require_t< is_transpose_view< T > > require_transpose_view
Definition type_traits.h:329
constexpr bool is_scaled_gemm_v
Definition type_traits.h:401
constexpr bool is_symm_expr_v
Definition type_traits.h:571
Namespace containing all symbols from the Eigen library.
Describes GPU device expression types.
Definition DeviceExpr.h:173
Detects a Scaled directly over a GemmExpr (a product carrying ONE deferred scalar).
Definition type_traits.h:98
Detects a Scaled directly over a leaf DeviceMatrix (no view in between).
Definition type_traits.h:85
Definition type_traits.h:281
Definition type_traits.h:922
Definition type_traits.h:531
Definition type_traits.h:764
Definition type_traits.h:185
Definition type_traits.h:873
Definition type_traits.h:209
Definition type_traits.h:828
Definition type_traits.h:796
Definition type_traits.h:249
Definition type_traits.h:939
Definition type_traits.h:627
Definition type_traits.h:691
Definition type_traits.h:659
Definition type_traits.h:723
Definition type_traits.h:393
Definition type_traits.h:369
Definition type_traits.h:345
Definition type_traits.h:499
Definition type_traits.h:563
Definition type_traits.h:595
Definition type_traits.h:313
Definition type_traits.h:435
Definition type_traits.h:467