Medial Code Documentation
Loading...
Searching...
No Matches
Meta.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2015 Gael Guennebaud <gael.guennebaud@inria.fr>
5// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6//
7// This Source Code Form is subject to the terms of the Mozilla
8// Public License v. 2.0. If a copy of the MPL was not distributed
9// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11#ifndef EIGEN_META_H
12#define EIGEN_META_H
13
14#if defined(EIGEN_GPU_COMPILE_PHASE)
15
16 #include <cfloat>
17
18 #if defined(EIGEN_CUDA_ARCH)
19 #include <math_constants.h>
20 #endif
21
22 #if defined(EIGEN_HIP_DEVICE_COMPILE)
23 #include "Eigen/src/Core/arch/HIP/hcc/math_constants.h"
24 #endif
25
26#endif
27
28// Recent versions of ICC require <cstdint> for pointer types below.
29#define EIGEN_ICC_NEEDS_CSTDINT (EIGEN_COMP_ICC>=1600 && EIGEN_COMP_CXXVER >= 11)
30
31// Define portable (u)int{32,64} types
32#if EIGEN_HAS_CXX11 || EIGEN_ICC_NEEDS_CSTDINT
33#include <cstdint>
34namespace Eigen {
35namespace numext {
36typedef std::uint8_t uint8_t;
37typedef std::int8_t int8_t;
38typedef std::uint16_t uint16_t;
39typedef std::int16_t int16_t;
40typedef std::uint32_t uint32_t;
41typedef std::int32_t int32_t;
42typedef std::uint64_t uint64_t;
43typedef std::int64_t int64_t;
44}
45}
46#else
47// Without c++11, all compilers able to compile Eigen also
48// provide the C99 stdint.h header file.
49#include <stdint.h>
50namespace Eigen {
51namespace numext {
52typedef ::uint8_t uint8_t;
53typedef ::int8_t int8_t;
54typedef ::uint16_t uint16_t;
55typedef ::int16_t int16_t;
56typedef ::uint32_t uint32_t;
57typedef ::int32_t int32_t;
58typedef ::uint64_t uint64_t;
59typedef ::int64_t int64_t;
60}
61}
62#endif
63
64namespace Eigen {
65
66typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex;
67
74typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE Index;
75
76namespace internal {
77
85// Only recent versions of ICC complain about using ptrdiff_t to hold pointers,
86// and older versions do not provide *intptr_t types.
87#if EIGEN_ICC_NEEDS_CSTDINT
88typedef std::intptr_t IntPtr;
89typedef std::uintptr_t UIntPtr;
90#else
91typedef std::ptrdiff_t IntPtr;
92typedef std::size_t UIntPtr;
93#endif
94#undef EIGEN_ICC_NEEDS_CSTDINT
95
96struct true_type { enum { value = 1 }; };
97struct false_type { enum { value = 0 }; };
98
99template<bool Condition>
101
102template<>
104
105template<>
107
108template<bool Condition, typename Then, typename Else>
109struct conditional { typedef Then type; };
110
111template<typename Then, typename Else>
112struct conditional <false, Then, Else> { typedef Else type; };
113
114template<typename T> struct remove_reference { typedef T type; };
115template<typename T> struct remove_reference<T&> { typedef T type; };
116
117template<typename T> struct remove_pointer { typedef T type; };
118template<typename T> struct remove_pointer<T*> { typedef T type; };
119template<typename T> struct remove_pointer<T*const> { typedef T type; };
120
121template <class T> struct remove_const { typedef T type; };
122template <class T> struct remove_const<const T> { typedef T type; };
123template <class T> struct remove_const<const T[]> { typedef T type[]; };
124template <class T, unsigned int Size> struct remove_const<const T[Size]> { typedef T type[Size]; };
125
126template<typename T> struct remove_all { typedef T type; };
127template<typename T> struct remove_all<const T> { typedef typename remove_all<T>::type type; };
128template<typename T> struct remove_all<T const&> { typedef typename remove_all<T>::type type; };
129template<typename T> struct remove_all<T&> { typedef typename remove_all<T>::type type; };
130template<typename T> struct remove_all<T const*> { typedef typename remove_all<T>::type type; };
131template<typename T> struct remove_all<T*> { typedef typename remove_all<T>::type type; };
132
133template<typename T> struct is_arithmetic { enum { value = false }; };
134template<> struct is_arithmetic<float> { enum { value = true }; };
135template<> struct is_arithmetic<double> { enum { value = true }; };
136// GPU devices treat `long double` as `double`.
137#ifndef EIGEN_GPU_COMPILE_PHASE
138template<> struct is_arithmetic<long double> { enum { value = true }; };
139#endif
140template<> struct is_arithmetic<bool> { enum { value = true }; };
141template<> struct is_arithmetic<char> { enum { value = true }; };
142template<> struct is_arithmetic<signed char> { enum { value = true }; };
143template<> struct is_arithmetic<unsigned char> { enum { value = true }; };
144template<> struct is_arithmetic<signed short> { enum { value = true }; };
145template<> struct is_arithmetic<unsigned short>{ enum { value = true }; };
146template<> struct is_arithmetic<signed int> { enum { value = true }; };
147template<> struct is_arithmetic<unsigned int> { enum { value = true }; };
148template<> struct is_arithmetic<signed long> { enum { value = true }; };
149template<> struct is_arithmetic<unsigned long> { enum { value = true }; };
150
151template<typename T, typename U> struct is_same { enum { value = 0 }; };
152template<typename T> struct is_same<T,T> { enum { value = 1 }; };
153
154template< class T >
155struct is_void : is_same<void, typename remove_const<T>::type> {};
156
157#if EIGEN_HAS_CXX11
158template<> struct is_arithmetic<signed long long> { enum { value = true }; };
159template<> struct is_arithmetic<unsigned long long> { enum { value = true }; };
160using std::is_integral;
161#else
162template<typename T> struct is_integral { enum { value = false }; };
163template<> struct is_integral<bool> { enum { value = true }; };
164template<> struct is_integral<char> { enum { value = true }; };
165template<> struct is_integral<signed char> { enum { value = true }; };
166template<> struct is_integral<unsigned char> { enum { value = true }; };
167template<> struct is_integral<signed short> { enum { value = true }; };
168template<> struct is_integral<unsigned short> { enum { value = true }; };
169template<> struct is_integral<signed int> { enum { value = true }; };
170template<> struct is_integral<unsigned int> { enum { value = true }; };
171template<> struct is_integral<signed long> { enum { value = true }; };
172template<> struct is_integral<unsigned long> { enum { value = true }; };
173template<> struct is_integral<signed long long> { enum { value = true }; };
174template<> struct is_integral<unsigned long long> { enum { value = true }; };
175#endif
176
177#if EIGEN_HAS_CXX11
178using std::make_unsigned;
179#else
180// TODO: Possibly improve this implementation of make_unsigned.
181// It is currently used only by
182// template<typename Scalar> struct random_default_impl<Scalar, false, true>.
183template<typename> struct make_unsigned;
184template<> struct make_unsigned<char> { typedef unsigned char type; };
185template<> struct make_unsigned<signed char> { typedef unsigned char type; };
186template<> struct make_unsigned<unsigned char> { typedef unsigned char type; };
187template<> struct make_unsigned<signed short> { typedef unsigned short type; };
188template<> struct make_unsigned<unsigned short> { typedef unsigned short type; };
189template<> struct make_unsigned<signed int> { typedef unsigned int type; };
190template<> struct make_unsigned<unsigned int> { typedef unsigned int type; };
191template<> struct make_unsigned<signed long> { typedef unsigned long type; };
192template<> struct make_unsigned<unsigned long> { typedef unsigned long type; };
193template<> struct make_unsigned<unsigned long long> { typedef unsigned long long type; };
194template<> struct make_unsigned<long long> { typedef unsigned long long type; };
195#endif
196
197template <typename T> struct add_const { typedef const T type; };
198template <typename T> struct add_const<T&> { typedef T& type; };
199
200template <typename T> struct is_const { enum { value = 0 }; };
201template <typename T> struct is_const<T const> { enum { value = 1 }; };
202
203template<typename T> struct add_const_on_value_type { typedef const T type; };
204template<typename T> struct add_const_on_value_type<T&> { typedef T const& type; };
205template<typename T> struct add_const_on_value_type<T*> { typedef T const* type; };
206template<typename T> struct add_const_on_value_type<T* const> { typedef T const* const type; };
207template<typename T> struct add_const_on_value_type<T const* const> { typedef T const* const type; };
208
209#if EIGEN_HAS_CXX11
210
211using std::is_convertible;
212
213#else
214
215template<typename From, typename To>
217{
218private:
219 struct any_conversion
220 {
221 template <typename T> any_conversion(const volatile T&);
222 template <typename T> any_conversion(T&);
223 };
224 struct yes {int a[1];};
225 struct no {int a[2];};
226
227 template<typename T>
228 static yes test(T, int);
229
230 template<typename T>
231 static no test(any_conversion, ...);
232
233public:
234 static typename internal::remove_reference<From>::type* ms_from;
235#ifdef __INTEL_COMPILER
236 #pragma warning push
237 #pragma warning ( disable : 2259 )
238#endif
239 enum { value = sizeof(test<To>(*ms_from, 0))==sizeof(yes) };
240#ifdef __INTEL_COMPILER
241 #pragma warning pop
242#endif
243};
244
245template<typename From, typename To>
247{
249};
250
251template<typename T>
252struct is_convertible<T,T&> { enum { value = false }; };
253
254template<typename T>
255struct is_convertible<const T,const T&> { enum { value = true }; };
256
257#endif
258
262template<bool Condition, typename T=void> struct enable_if;
263
264template<typename T> struct enable_if<true,T>
265{ typedef T type; };
266
267#if defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
268#if !defined(__FLT_EPSILON__)
269#define __FLT_EPSILON__ FLT_EPSILON
270#define __DBL_EPSILON__ DBL_EPSILON
271#endif
272
273namespace device {
274
275template<typename T> struct numeric_limits
276{
277 EIGEN_DEVICE_FUNC
278 static EIGEN_CONSTEXPR T epsilon() { return 0; }
279 static T (max)() { assert(false && "Highest not supported for this type"); }
280 static T (min)() { assert(false && "Lowest not supported for this type"); }
281 static T infinity() { assert(false && "Infinity not supported for this type"); }
282 static T quiet_NaN() { assert(false && "quiet_NaN not supported for this type"); }
283};
284template<> struct numeric_limits<float>
285{
286 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
287 static float epsilon() { return __FLT_EPSILON__; }
288 EIGEN_DEVICE_FUNC
289 static float (max)() {
290 #if defined(EIGEN_CUDA_ARCH)
291 return CUDART_MAX_NORMAL_F;
292 #else
293 return HIPRT_MAX_NORMAL_F;
294 #endif
295 }
296 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
297 static float (min)() { return FLT_MIN; }
298 EIGEN_DEVICE_FUNC
299 static float infinity() {
300 #if defined(EIGEN_CUDA_ARCH)
301 return CUDART_INF_F;
302 #else
303 return HIPRT_INF_F;
304 #endif
305 }
306 EIGEN_DEVICE_FUNC
307 static float quiet_NaN() {
308 #if defined(EIGEN_CUDA_ARCH)
309 return CUDART_NAN_F;
310 #else
311 return HIPRT_NAN_F;
312 #endif
313 }
314};
315template<> struct numeric_limits<double>
316{
317 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
318 static double epsilon() { return __DBL_EPSILON__; }
319 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
320 static double (max)() { return DBL_MAX; }
321 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
322 static double (min)() { return DBL_MIN; }
323 EIGEN_DEVICE_FUNC
324 static double infinity() {
325 #if defined(EIGEN_CUDA_ARCH)
326 return CUDART_INF;
327 #else
328 return HIPRT_INF;
329 #endif
330 }
331 EIGEN_DEVICE_FUNC
332 static double quiet_NaN() {
333 #if defined(EIGEN_CUDA_ARCH)
334 return CUDART_NAN;
335 #else
336 return HIPRT_NAN;
337 #endif
338 }
339};
340template<> struct numeric_limits<int>
341{
342 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
343 static int epsilon() { return 0; }
344 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
345 static int (max)() { return INT_MAX; }
346 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
347 static int (min)() { return INT_MIN; }
348};
349template<> struct numeric_limits<unsigned int>
350{
351 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
352 static unsigned int epsilon() { return 0; }
353 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
354 static unsigned int (max)() { return UINT_MAX; }
355 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
356 static unsigned int (min)() { return 0; }
357};
358template<> struct numeric_limits<long>
359{
360 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
361 static long epsilon() { return 0; }
362 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
363 static long (max)() { return LONG_MAX; }
364 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
365 static long (min)() { return LONG_MIN; }
366};
367template<> struct numeric_limits<unsigned long>
368{
369 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
370 static unsigned long epsilon() { return 0; }
371 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
372 static unsigned long (max)() { return ULONG_MAX; }
373 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
374 static unsigned long (min)() { return 0; }
375};
376template<> struct numeric_limits<long long>
377{
378 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
379 static long long epsilon() { return 0; }
380 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
381 static long long (max)() { return LLONG_MAX; }
382 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
383 static long long (min)() { return LLONG_MIN; }
384};
385template<> struct numeric_limits<unsigned long long>
386{
387 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
388 static unsigned long long epsilon() { return 0; }
389 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
390 static unsigned long long (max)() { return ULLONG_MAX; }
391 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
392 static unsigned long long (min)() { return 0; }
393};
394template<> struct numeric_limits<bool>
395{
396 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
397 static bool epsilon() { return false; }
398 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
399 static bool (max)() { return true; }
400 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
401 static bool (min)() { return false; }
402};
403
404}
405
406#endif // defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
407
412{
413 EIGEN_DEVICE_FUNC noncopyable(const noncopyable&);
414 EIGEN_DEVICE_FUNC const noncopyable& operator=(const noncopyable&);
415protected:
416 EIGEN_DEVICE_FUNC noncopyable() {}
417 EIGEN_DEVICE_FUNC ~noncopyable() {}
418};
419
434template<typename T, typename EnableIf = void> struct array_size {
435 enum { value = Dynamic };
436};
437
438template<typename T> struct array_size<T,typename internal::enable_if<((T::SizeAtCompileTime&0)==0)>::type> {
439 enum { value = T::SizeAtCompileTime };
440};
441
442template<typename T, int N> struct array_size<const T (&)[N]> {
443 enum { value = N };
444};
445template<typename T, int N> struct array_size<T (&)[N]> {
446 enum { value = N };
447};
448
449#if EIGEN_HAS_CXX11
450template<typename T, std::size_t N> struct array_size<const std::array<T,N> > {
451 enum { value = N };
452};
453template<typename T, std::size_t N> struct array_size<std::array<T,N> > {
454 enum { value = N };
455};
456#endif
457
458
469#if EIGEN_COMP_CXXVER < 20
470template <typename T>
471EIGEN_CONSTEXPR std::ptrdiff_t index_list_size(const T& x) {
472 return static_cast<std::ptrdiff_t>(x.size());
473}
474
475template<typename T, std::ptrdiff_t N>
476EIGEN_CONSTEXPR std::ptrdiff_t index_list_size(const T (&)[N]) { return N; }
477#else
478template <typename T>
479EIGEN_CONSTEXPR auto index_list_size(T&& x) {
480 using std::ssize;
481 return ssize(std::forward<T>(x));
482}
483#endif // EIGEN_COMP_CXXVER
484
500#if EIGEN_HAS_STD_INVOKE_RESULT
501template<typename T> struct result_of;
502
503template<typename F, typename... ArgTypes>
504struct result_of<F(ArgTypes...)> {
505 typedef typename std::invoke_result<F, ArgTypes...>::type type1;
506 typedef typename remove_all<type1>::type type;
507};
508#elif EIGEN_HAS_STD_RESULT_OF
509template<typename T> struct result_of {
510 typedef typename std::result_of<T>::type type1;
511 typedef typename remove_all<type1>::type type;
512};
513#else
514template<typename T> struct result_of { };
515
516struct has_none {int a[1];};
517struct has_std_result_type {int a[2];};
518struct has_tr1_result {int a[3];};
519
520template<typename Func, int SizeOf>
522
523template<typename Func>
524struct nullary_result_of_select<Func, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
525
526template<typename Func>
527struct nullary_result_of_select<Func, sizeof(has_tr1_result)> {typedef typename Func::template result<Func()>::type type;};
528
529template<typename Func>
530struct result_of<Func()> {
531 template<typename T>
532 static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
533 template<typename T>
534 static has_tr1_result testFunctor(T const *, typename T::template result<T()>::type const * = 0);
535 static has_none testFunctor(...);
536
537 // note that the following indirection is needed for gcc-3.3
538 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
540};
541
542template<typename Func, typename ArgType, int SizeOf=sizeof(has_none)>
543struct unary_result_of_select {typedef typename internal::remove_all<ArgType>::type type;};
544
545template<typename Func, typename ArgType>
546struct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
547
548template<typename Func, typename ArgType>
549struct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;};
550
551template<typename Func, typename ArgType>
552struct result_of<Func(ArgType)> {
553 template<typename T>
554 static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
555 template<typename T>
556 static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0);
557 static has_none testFunctor(...);
558
559 // note that the following indirection is needed for gcc-3.3
560 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
561 typedef typename unary_result_of_select<Func, ArgType, FunctorType>::type type;
562};
563
564template<typename Func, typename ArgType0, typename ArgType1, int SizeOf=sizeof(has_none)>
565struct binary_result_of_select {typedef typename internal::remove_all<ArgType0>::type type;};
566
567template<typename Func, typename ArgType0, typename ArgType1>
569{typedef typename Func::result_type type;};
570
571template<typename Func, typename ArgType0, typename ArgType1>
573{typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;};
574
575template<typename Func, typename ArgType0, typename ArgType1>
577 template<typename T>
578 static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
579 template<typename T>
580 static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0);
581 static has_none testFunctor(...);
582
583 // note that the following indirection is needed for gcc-3.3
584 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
585 typedef typename binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type;
586};
587
588template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2, int SizeOf=sizeof(has_none)>
589struct ternary_result_of_select {typedef typename internal::remove_all<ArgType0>::type type;};
590
591template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
593{typedef typename Func::result_type type;};
594
595template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
597{typedef typename Func::template result<Func(ArgType0,ArgType1,ArgType2)>::type type;};
598
599template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
601 template<typename T>
602 static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
603 template<typename T>
604 static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1,ArgType2)>::type const * = 0);
605 static has_none testFunctor(...);
606
607 // note that the following indirection is needed for gcc-3.3
608 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
609 typedef typename ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, FunctorType>::type type;
610};
611
612#endif
613
614#if EIGEN_HAS_STD_INVOKE_RESULT
615template<typename F, typename... ArgTypes>
616struct invoke_result {
617 typedef typename std::invoke_result<F, ArgTypes...>::type type1;
618 typedef typename remove_all<type1>::type type;
619};
620#elif EIGEN_HAS_CXX11
621template<typename F, typename... ArgTypes>
622struct invoke_result {
623 typedef typename result_of<F(ArgTypes...)>::type type1;
624 typedef typename remove_all<type1>::type type;
625};
626#else
627template<typename F, typename ArgType0 = void, typename ArgType1 = void, typename ArgType2 = void>
629 typedef typename result_of<F(ArgType0, ArgType1, ArgType2)>::type type1;
630 typedef typename remove_all<type1>::type type;
631};
632
633template<typename F>
635 typedef typename result_of<F()>::type type1;
636 typedef typename remove_all<type1>::type type;
637};
638
639template<typename F, typename ArgType0>
641 typedef typename result_of<F(ArgType0)>::type type1;
642 typedef typename remove_all<type1>::type type;
643};
644
645template<typename F, typename ArgType0, typename ArgType1>
647 typedef typename result_of<F(ArgType0, ArgType1)>::type type1;
648 typedef typename remove_all<type1>::type type;
649};
650#endif
651
652struct meta_yes { char a[1]; };
653struct meta_no { char a[2]; };
654
655// Check whether T::ReturnType does exist
656template <typename T>
658{
659 template <typename C> static meta_yes testFunctor(C const *, typename C::ReturnType const * = 0);
660 template <typename C> static meta_no testFunctor(...);
661
662 enum { value = sizeof(testFunctor<T>(static_cast<T*>(0))) == sizeof(meta_yes) };
663};
664
665template<typename T> const T* return_ptr();
666
667template <typename T, typename IndexType=Index>
669{
670 template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()())>0)>::type * = 0);
671 static meta_no testFunctor(...);
672
673 enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
674};
675
676template <typename T, typename IndexType=Index>
678{
679 template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()(IndexType(0)))>0)>::type * = 0);
680 static meta_no testFunctor(...);
681
682 enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
683};
684
685template <typename T, typename IndexType=Index>
687{
688 template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()(IndexType(0),IndexType(0)))>0)>::type * = 0);
689 static meta_no testFunctor(...);
690
691 enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
692};
693
697template<int Y,
698 int InfX = 0,
699 int SupX = ((Y==1) ? 1 : Y/2),
700 bool Done = ((SupX - InfX) <= 1 || ((SupX * SupX <= Y) && ((SupX + 1) * (SupX + 1) > Y)))>
702{
703 enum {
704 MidX = (InfX+SupX)/2,
705 TakeInf = MidX*MidX > Y ? 1 : 0,
706 NewInf = int(TakeInf) ? InfX : int(MidX),
707 NewSup = int(TakeInf) ? int(MidX) : SupX
708 };
709 public:
710 enum { ret = meta_sqrt<Y,NewInf,NewSup>::ret };
711};
712
713template<int Y, int InfX, int SupX>
714class meta_sqrt<Y, InfX, SupX, true> { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
715
716
720template<int A, int B, int K=1, bool Done = ((A*K)%B)==0, bool Big=(A>=B)>
725template<int A, int B, int K, bool Done>
730template<int A, int B, int K>
732{
733 enum { ret = A*K };
734};
735
736
738template<typename T, typename U> struct scalar_product_traits
739{
740 enum { Defined = 0 };
741};
742
743// FIXME quick workaround around current limitation of result_of
744// template<typename Scalar, typename ArgType0, typename ArgType1>
745// struct result_of<scalar_product_op<Scalar>(ArgType0,ArgType1)> {
746// typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type;
747// };
748
752template<unsigned Len, unsigned Align>
754 struct type {
755 EIGEN_ALIGN_TO_BOUNDARY(Align) unsigned char data[Len];
756 };
757};
758
759} // end namespace internal
760
761namespace numext {
762
763#if defined(EIGEN_GPU_COMPILE_PHASE)
764template<typename T> EIGEN_DEVICE_FUNC void swap(T &a, T &b) { T tmp = b; b = a; a = tmp; }
765#else
766template<typename T> EIGEN_STRONG_INLINE void swap(T &a, T &b) { std::swap(a,b); }
767#endif
768
769#if defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
770using internal::device::numeric_limits;
771#else
772using std::numeric_limits;
773#endif
774
775// Integer division with rounding up.
776// T is assumed to be an integer type with a>=0, and b>0
777template<typename T>
778EIGEN_DEVICE_FUNC
779T div_ceil(const T &a, const T &b)
780{
781 return (a+b-1) / b;
782}
783
784// The aim of the following functions is to bypass -Wfloat-equal warnings
785// when we really want a strict equality comparison on floating points.
786template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
787bool equal_strict(const X& x,const Y& y) { return x == y; }
788
789#if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
790template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
791bool equal_strict(const float& x,const float& y) { return std::equal_to<float>()(x,y); }
792
793template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
794bool equal_strict(const double& x,const double& y) { return std::equal_to<double>()(x,y); }
795#endif
796
797template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
798bool not_equal_strict(const X& x,const Y& y) { return x != y; }
799
800#if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
801template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
802bool not_equal_strict(const float& x,const float& y) { return std::not_equal_to<float>()(x,y); }
803
804template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
805bool not_equal_strict(const double& x,const double& y) { return std::not_equal_to<double>()(x,y); }
806#endif
807
808} // end namespace numext
809
810} // end namespace Eigen
811
812#endif // EIGEN_META_H
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
Definition Meta.h:702
Definition Meta.h:412
Namespace containing all symbols from the Eigen library.
Definition LDLT.h:16
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time,...
Definition Constants.h:22
int N
Simulate some binary data with a single categorical and single continuous predictor.
Definition logistic_regression.py:26
Definition BFloat16.h:88
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Definition json.hpp:24418
Definition Meta.h:197
Definition Meta.h:434
Definition Meta.h:100
Definition Meta.h:109
Definition Meta.h:262
Definition Meta.h:97
Definition Meta.h:658
Definition Meta.h:516
Definition Meta.h:518
Definition Meta.h:628
Definition Meta.h:133
Definition Meta.h:200
Definition Meta.h:247
Definition Meta.h:162
Definition Meta.h:151
Definition Meta.h:155
Definition Meta.h:183
Definition Meta.h:653
Definition Meta.h:652
Definition Meta.h:126
Definition Meta.h:121
Definition Meta.h:117
Definition Meta.h:514
Definition Meta.h:96