xref: /aosp_15_r20/external/pytorch/c10/util/complex_utils.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_INTERNAL_INCLUDE_COMPLEX_REMAINING_H)
2*da0073e9SAndroid Build Coastguard Worker #error \
3*da0073e9SAndroid Build Coastguard Worker     "c10/util/complex_utils.h is not meant to be individually included. Include c10/util/complex.h instead."
4*da0073e9SAndroid Build Coastguard Worker #endif
5*da0073e9SAndroid Build Coastguard Worker 
6*da0073e9SAndroid Build Coastguard Worker #include <limits>
7*da0073e9SAndroid Build Coastguard Worker 
8*da0073e9SAndroid Build Coastguard Worker namespace c10 {
9*da0073e9SAndroid Build Coastguard Worker 
10*da0073e9SAndroid Build Coastguard Worker template <typename T>
11*da0073e9SAndroid Build Coastguard Worker struct is_complex : public std::false_type {};
12*da0073e9SAndroid Build Coastguard Worker 
13*da0073e9SAndroid Build Coastguard Worker template <typename T>
14*da0073e9SAndroid Build Coastguard Worker struct is_complex<std::complex<T>> : public std::true_type {};
15*da0073e9SAndroid Build Coastguard Worker 
16*da0073e9SAndroid Build Coastguard Worker template <typename T>
17*da0073e9SAndroid Build Coastguard Worker struct is_complex<c10::complex<T>> : public std::true_type {};
18*da0073e9SAndroid Build Coastguard Worker 
19*da0073e9SAndroid Build Coastguard Worker // Extract double from std::complex<double>; is identity otherwise
20*da0073e9SAndroid Build Coastguard Worker // TODO: Write in more idiomatic C++17
21*da0073e9SAndroid Build Coastguard Worker template <typename T>
22*da0073e9SAndroid Build Coastguard Worker struct scalar_value_type {
23*da0073e9SAndroid Build Coastguard Worker   using type = T;
24*da0073e9SAndroid Build Coastguard Worker };
25*da0073e9SAndroid Build Coastguard Worker template <typename T>
26*da0073e9SAndroid Build Coastguard Worker struct scalar_value_type<std::complex<T>> {
27*da0073e9SAndroid Build Coastguard Worker   using type = T;
28*da0073e9SAndroid Build Coastguard Worker };
29*da0073e9SAndroid Build Coastguard Worker template <typename T>
30*da0073e9SAndroid Build Coastguard Worker struct scalar_value_type<c10::complex<T>> {
31*da0073e9SAndroid Build Coastguard Worker   using type = T;
32*da0073e9SAndroid Build Coastguard Worker };
33*da0073e9SAndroid Build Coastguard Worker 
34*da0073e9SAndroid Build Coastguard Worker } // namespace c10
35*da0073e9SAndroid Build Coastguard Worker 
36*da0073e9SAndroid Build Coastguard Worker namespace std {
37*da0073e9SAndroid Build Coastguard Worker 
38*da0073e9SAndroid Build Coastguard Worker template <typename T>
39*da0073e9SAndroid Build Coastguard Worker class numeric_limits<c10::complex<T>> : public numeric_limits<T> {};
40*da0073e9SAndroid Build Coastguard Worker 
41*da0073e9SAndroid Build Coastguard Worker template <typename T>
42*da0073e9SAndroid Build Coastguard Worker bool isnan(const c10::complex<T>& v) {
43*da0073e9SAndroid Build Coastguard Worker   return std::isnan(v.real()) || std::isnan(v.imag());
44*da0073e9SAndroid Build Coastguard Worker }
45*da0073e9SAndroid Build Coastguard Worker 
46*da0073e9SAndroid Build Coastguard Worker } // namespace std
47