Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <complex>
7 : #include <cstddef>
8 : #include <stdexcept>
9 : #include <string>
10 :
11 : #include "DataStructures/DataVector.hpp"
12 :
13 : namespace py_bindings::detail {
14 : // The bindings pass spin-weighted complex data as real, interleaved
15 : // [re, im, re, im, ...] arrays so they can be constructed directly from numpy.
16 :
17 : template <typename ComplexVector>
18 : ComplexVector interleaved_to_complex(const DataVector& interleaved) {
19 : if (interleaved.size() % 2 != 0) {
20 : throw std::invalid_argument(
21 : "Interleaved [re, im, ...] array must have an even number of "
22 : "entries, not " +
23 : std::to_string(interleaved.size()) + ".");
24 : }
25 : ComplexVector result{interleaved.size() / 2};
26 : for (size_t i = 0; i < result.size(); ++i) {
27 : result[i] =
28 : std::complex<double>(interleaved[2 * i], interleaved[2 * i + 1]);
29 : }
30 : return result;
31 : }
32 :
33 : template <typename ComplexVector>
34 : DataVector complex_to_interleaved(const ComplexVector& complex_values) {
35 : DataVector result{2 * complex_values.size()};
36 : for (size_t i = 0; i < complex_values.size(); ++i) {
37 : result[2 * i] = complex_values[i].real();
38 : result[2 * i + 1] = complex_values[i].imag();
39 : }
40 : return result;
41 : }
42 : } // namespace py_bindings::detail
|