@@ -30,3 +30,4 def qdump__DateTimeRange(d , value): | |||||
30 | d.putValue(tstop) |
|
30 | d.putValue(tstop) | |
31 | with SubItem(d, "delta"): |
|
31 | with SubItem(d, "delta"): | |
32 | d.putValue(delta) |
|
32 | d.putValue(delta) | |
|
33 |
@@ -1,1 +1,1 | |||||
1 | Subproject commit f5f4debc597b41ab1849dfc02b6e092bf58c32d2 |
|
1 | Subproject commit 22e3e4553178230053aac40131b4fdb36c163075 |
@@ -1,29 +1,37 | |||||
1 | #ifndef CPP_UTILS_H |
|
1 | #ifndef CPP_UTILS_H | |
2 | #define CPP_UTILS_H |
|
2 | #define CPP_UTILS_H | |
3 |
|
3 | |||
|
4 | #include <functional> | |||
|
5 | #include <tuple> | |||
4 | #include <type_traits> |
|
6 | #include <type_traits> | |
5 |
|
7 | |||
6 |
template< |
|
8 | template<class...> using void_t = void; | |
7 | using void_t = void; |
|
|||
8 |
|
9 | |||
9 | #define HAS_METHOD(method)\ |
|
10 | #define HAS_METHOD(method) \ | |
10 | template <class T, class=void>\ |
|
11 | template<class T, class = void> struct _has_##method : std::false_type \ | |
11 | struct _has_##method : std::false_type{};\ |
|
12 | {}; \ | |
12 | \ |
|
13 | \ | |
13 | template <class T>\ |
|
14 | template<class T> \ | |
14 | struct _has_##method<T, void_t<std::is_member_function_pointer<decltype(&T::method)>>>\ |
|
15 | struct _has_##method< \ | |
15 | : std::true_type{};\ |
|
16 | T, void_t<std::is_member_function_pointer<decltype(&T::method)>>> \ | |
16 | \ |
|
17 | : std::true_type \ | |
17 | template< class T>\ |
|
18 | {}; \ | |
18 | static inline constexpr bool has_##method = _has_##method<T>::value; |
|
19 | \ | |
|
20 | template<class T> \ | |||
|
21 | static inline constexpr bool has_##method = _has_##method<T>::value; | |||
19 |
|
22 | |||
20 | //taken from here https://www.fluentcpp.com/2017/10/27/function-aliases-cpp/ |
|
23 | // taken from here https://www.fluentcpp.com/2017/10/27/function-aliases-cpp/ | |
21 |
#define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) |
|
24 | #define ALIAS_TEMPLATE_FUNCTION(highLevelF, lowLevelF) \ | |
22 |
|
|
25 | template<typename... Args> \ | |
23 | inline auto highLevelF(Args &&... args)->decltype(lowLevelF(std::forward<Args>(args)...)) \ |
|
26 | inline auto highLevelF(Args&&... args) \ | |
24 | { \ |
|
27 | ->decltype(lowLevelF(std::forward<Args>(args)...)) \ | |
25 |
|
|
28 | { \ | |
26 | } |
|
29 | return lowLevelF(std::forward<Args>(args)...); \ | |
|
30 | } | |||
27 |
|
31 | |||
|
32 | template<typename T> constexpr T diff(const std::pair<T, T>& p) | |||
|
33 | { | |||
|
34 | return p.second - p.first; | |||
|
35 | } | |||
28 |
|
36 | |||
29 | #endif // CPP_UTILS_H |
|
37 | #endif // CPP_UTILS_H |
@@ -18,10 +18,10 public: | |||||
18 | .begin()); |
|
18 | .begin()); | |
19 |
|
19 | |||
20 | SpectrogramTimeSerie() {} |
|
20 | SpectrogramTimeSerie() {} | |
21 | SpectrogramTimeSerie(SpectrogramTimeSerie::axis_t& t, |
|
21 | SpectrogramTimeSerie(SpectrogramTimeSerie::axis_t&& t, | |
22 | SpectrogramTimeSerie::axis_t& y, |
|
22 | SpectrogramTimeSerie::axis_t&& y, | |
23 | SpectrogramTimeSerie::container_type< |
|
23 | SpectrogramTimeSerie::container_type< | |
24 | SpectrogramTimeSerie::raw_value_type>& values, |
|
24 | SpectrogramTimeSerie::raw_value_type>&& values, | |
25 | std::vector<std::size_t>& shape) |
|
25 | std::vector<std::size_t>& shape) | |
26 | : TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>(t, values, shape) |
|
26 | : TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>(t, values, shape) | |
27 | { |
|
27 | { |
@@ -6,6 +6,7 | |||||
6 | #include "VectorTimeSerie.h" |
|
6 | #include "VectorTimeSerie.h" | |
7 |
|
7 | |||
8 | #include <TimeSeries.h> |
|
8 | #include <TimeSeries.h> | |
|
9 | #include <cmath> | |||
9 | #include <memory> |
|
10 | #include <memory> | |
10 |
|
11 | |||
11 | namespace TimeSeriesUtils |
|
12 | namespace TimeSeriesUtils | |
@@ -36,6 +37,47 namespace TimeSeriesUtils | |||||
36 | } |
|
37 | } | |
37 | return nullptr; |
|
38 | return nullptr; | |
38 | } |
|
39 | } | |
|
40 | ||||
|
41 | struct axis_properties | |||
|
42 | { | |||
|
43 | double range; | |||
|
44 | double max_resolution; | |||
|
45 | bool is_log; | |||
|
46 | }; | |||
|
47 | ||||
|
48 | constexpr auto IsLog = true; | |||
|
49 | constexpr auto IsLinear = false; | |||
|
50 | ||||
|
51 | constexpr auto CheckMedian = true; | |||
|
52 | constexpr auto DontCheckMedian = false; | |||
|
53 | ||||
|
54 | template<bool is_log, bool check_median> | |||
|
55 | axis_properties axis_analysis( | |||
|
56 | typename std::conditional<is_log, std::vector<double>&, | |||
|
57 | const std::vector<double>&>::type axis) | |||
|
58 | { | |||
|
59 | std::vector<double> axis_diff(axis.size()); | |||
|
60 | if constexpr(is_log) | |||
|
61 | { | |||
|
62 | std::transform(std::cbegin(axis), std::cend(axis), std::begin(axis), | |||
|
63 | [](const auto v) { return std::log10(v); }); | |||
|
64 | } | |||
|
65 | auto range = *(std::cend(axis) - 1) - *(std::begin(axis)); | |||
|
66 | std::adjacent_difference(std::cbegin(axis), std::cend(axis), | |||
|
67 | std::begin(axis_diff)); | |||
|
68 | auto min_diff = | |||
|
69 | (*std::min_element(std::cbegin(axis_diff) + 1, std::cend(axis_diff))); | |||
|
70 | if constexpr(check_median) | |||
|
71 | { | |||
|
72 | std::nth_element(std::begin(axis_diff) + 1, | |||
|
73 | std::begin(axis_diff) + axis_diff.size() / 2, | |||
|
74 | std::end(axis_diff)); | |||
|
75 | auto median_diff = *(std::begin(axis_diff) + axis_diff.size() / 2); | |||
|
76 | if(median_diff > (4 * min_diff)) min_diff = median_diff; | |||
|
77 | } | |||
|
78 | return {range, min_diff, is_log}; | |||
|
79 | } | |||
|
80 | ||||
39 | } // namespace TimeSeriesUtils |
|
81 | } // namespace TimeSeriesUtils | |
40 |
|
82 | |||
41 | #endif |
|
83 | #endif |
@@ -193,6 +193,16 _merge(std::vector<TimeSeries::ITimeSerie*> source, const DateTimeRange& range) | |||||
193 | std::back_inserter(*std::dynamic_pointer_cast<T>(dest))); |
|
193 | std::back_inserter(*std::dynamic_pointer_cast<T>(dest))); | |
194 | } |
|
194 | } | |
195 | }); |
|
195 | }); | |
|
196 | if(source.size()) | |||
|
197 | { | |||
|
198 | const auto& first = *source.begin(); | |||
|
199 | for(std::size_t ax_index = 1; ax_index < first->shape().size(); ax_index++) | |||
|
200 | { | |||
|
201 | const auto& ax = first->axis(ax_index); | |||
|
202 | std::copy(std::cbegin(ax), std::cend(ax), | |||
|
203 | std::back_inserter(dest->axis(ax_index))); | |||
|
204 | } | |||
|
205 | } | |||
196 | return dest; |
|
206 | return dest; | |
197 | } |
|
207 | } | |
198 |
|
208 |
@@ -232,7 +232,10 PYBIND11_MODULE(pysciqlopcore, m) | |||||
232 | .def(py::init<const std::vector<std::size_t>>()) |
|
232 | .def(py::init<const std::vector<std::size_t>>()) | |
233 | .def(py::init([](py::array_t<double> t, py::array_t<double> y, |
|
233 | .def(py::init([](py::array_t<double> t, py::array_t<double> y, | |
234 | py::array_t<double> values) { |
|
234 | py::array_t<double> values) { | |
235 | assert(t.size() < values.size()); // TODO check geometry |
|
235 | auto t_s = t.size(); | |
|
236 | auto v_s = values.size(); | |||
|
237 | assert(t.size() < values.size() or | |||
|
238 | t.size() == 0); // TODO check geometry | |||
236 | assert(y.size() == values.shape(1)); |
|
239 | assert(y.size() == values.shape(1)); | |
237 | SpectrogramTimeSerie::axis_t _t(t.size()); |
|
240 | SpectrogramTimeSerie::axis_t _t(t.size()); | |
238 | SpectrogramTimeSerie::axis_t _y(y.size()); |
|
241 | SpectrogramTimeSerie::axis_t _y(y.size()); | |
@@ -243,7 +246,8 PYBIND11_MODULE(pysciqlopcore, m) | |||||
243 | std::vector<std::size_t> shape; |
|
246 | std::vector<std::size_t> shape; | |
244 | shape.push_back(values.shape(0)); |
|
247 | shape.push_back(values.shape(0)); | |
245 | shape.push_back(values.shape(1)); |
|
248 | shape.push_back(values.shape(1)); | |
246 |
return SpectrogramTimeSerie(_t, _y, |
|
249 | return SpectrogramTimeSerie(std::move(_t), std::move(_y), | |
|
250 | std::move(_values), shape); | |||
247 | })) |
|
251 | })) | |
248 | .def("__getitem__", |
|
252 | .def("__getitem__", | |
249 | [](SpectrogramTimeSerie& ts, |
|
253 | [](SpectrogramTimeSerie& ts, |
General Comments 0
You need to be logged in to leave comments.
Login now