@@ -1,1 +1,1 | |||
|
1 | Subproject commit 22e3e4553178230053aac40131b4fdb36c163075 | |
|
1 | Subproject commit 1c245f84d0728d99b6f5deab7793fb238105a54d |
@@ -4,11 +4,14 | |||
|
4 | 4 | #include "CoreGlobal.h" |
|
5 | 5 | |
|
6 | 6 | #include <TimeSeries.h> |
|
7 | #include <cmath> | |
|
7 | 8 | |
|
8 | 9 | class SCIQLOP_CORE_EXPORT SpectrogramTimeSerie |
|
9 | 10 | : public TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2> |
|
10 | 11 | { |
|
11 | 12 | public: |
|
13 | double min_sampling = std::nan(""); | |
|
14 | double max_sampling = std::nan(""); | |
|
12 | 15 | using item_t = |
|
13 | 16 | decltype(std::declval< |
|
14 | 17 | TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>>()[0]); |
@@ -22,8 +25,11 public: | |||
|
22 | 25 | SpectrogramTimeSerie::axis_t&& y, |
|
23 | 26 | SpectrogramTimeSerie::container_type< |
|
24 | 27 | SpectrogramTimeSerie::raw_value_type>&& values, |
|
25 |
std::vector<std::size_t>& shape |
|
|
26 | : TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>(t, values, shape) | |
|
28 | std::vector<std::size_t>& shape, double min_sampling, | |
|
29 | double max_sampling) | |
|
30 | : TimeSeries::TimeSerie<double, SpectrogramTimeSerie, 2>(t, values, | |
|
31 | shape), | |
|
32 | min_sampling{min_sampling}, max_sampling{max_sampling} | |
|
27 | 33 | { |
|
28 | 34 | _axes[1] = y; |
|
29 | 35 | } |
@@ -43,6 +43,8 namespace TimeSeriesUtils | |||
|
43 | 43 | double range; |
|
44 | 44 | double max_resolution; |
|
45 | 45 | bool is_log; |
|
46 | double min; | |
|
47 | double max; | |
|
46 | 48 | }; |
|
47 | 49 | |
|
48 | 50 | constexpr auto IsLog = true; |
@@ -54,7 +56,8 namespace TimeSeriesUtils | |||
|
54 | 56 | template<bool is_log, bool check_median> |
|
55 | 57 | axis_properties axis_analysis( |
|
56 | 58 | typename std::conditional<is_log, std::vector<double>&, |
|
57 |
const std::vector<double>&>::type axis |
|
|
59 | const std::vector<double>&>::type axis, | |
|
60 | double given_max_resolution = std::nan("")) | |
|
58 | 61 | { |
|
59 | 62 | std::vector<double> axis_diff(axis.size()); |
|
60 | 63 | if constexpr(is_log) |
@@ -62,10 +65,15 namespace TimeSeriesUtils | |||
|
62 | 65 | std::transform(std::cbegin(axis), std::cend(axis), std::begin(axis), |
|
63 | 66 | [](const auto v) { return std::log10(v); }); |
|
64 | 67 | } |
|
65 |
auto |
|
|
68 | auto min = *std::begin(axis); | |
|
69 | auto max = *(std::cend(axis) - 1); | |
|
70 | auto range = max - min; | |
|
71 | auto min_diff = given_max_resolution; | |
|
72 | if(std::isnan(min_diff)) | |
|
73 | { | |
|
66 | 74 | std::adjacent_difference(std::cbegin(axis), std::cend(axis), |
|
67 | 75 | std::begin(axis_diff)); |
|
68 |
|
|
|
76 | min_diff = | |
|
69 | 77 | (*std::min_element(std::cbegin(axis_diff) + 1, std::cend(axis_diff))); |
|
70 | 78 | if constexpr(check_median) |
|
71 | 79 | { |
@@ -75,7 +83,9 namespace TimeSeriesUtils | |||
|
75 | 83 | auto median_diff = *(std::begin(axis_diff) + axis_diff.size() / 2); |
|
76 | 84 | if(median_diff > (4 * min_diff)) min_diff = median_diff; |
|
77 | 85 | } |
|
78 | return {range, min_diff, is_log}; | |
|
86 | } | |
|
87 | ||
|
88 | return {range, min_diff, is_log, min, max}; | |
|
79 | 89 | } |
|
80 | 90 | |
|
81 | 91 | } // namespace TimeSeriesUtils |
@@ -65,7 +65,7 public: | |||
|
65 | 65 | { |
|
66 | 66 | auto ds = _provider->getData( |
|
67 | 67 | DataProviderParameters{{range}, _variable->metadata()}); |
|
68 | if(ds) data.push_back(ds); | |
|
68 | if(ds and ds->size()) data.push_back(ds); // skip empty dataSeries | |
|
69 | 69 | } |
|
70 | 70 | if(_overwrite) |
|
71 | 71 | _variable->setData(data, _range, true); |
@@ -203,6 +203,18 _merge(std::vector<TimeSeries::ITimeSerie*> source, const DateTimeRange& range) | |||
|
203 | 203 | std::back_inserter(dest->axis(ax_index))); |
|
204 | 204 | } |
|
205 | 205 | } |
|
206 | if constexpr(std::is_same_v<T, SpectrogramTimeSerie>) | |
|
207 | { | |
|
208 | auto d = std::dynamic_pointer_cast<SpectrogramTimeSerie>(dest); | |
|
209 | if(std::isnan(d->max_sampling)) | |
|
210 | { | |
|
211 | std::for_each(std::begin(source), std::end(source), [&d](auto src) { | |
|
212 | auto s = dynamic_cast<SpectrogramTimeSerie*>(src); | |
|
213 | if(!std::isnan(s->max_sampling)) { d->max_sampling = s->max_sampling; } | |
|
214 | if(!std::isnan(s->min_sampling)) { d->min_sampling = s->min_sampling; } | |
|
215 | }); | |
|
216 | } | |
|
217 | } | |
|
206 | 218 | return dest; |
|
207 | 219 | } |
|
208 | 220 |
@@ -264,6 +264,7 class VariableController2::VariableController2Private | |||
|
264 | 264 | } |
|
265 | 265 | data.push_back(var->data().get()); // might be smarter |
|
266 | 266 | var->setData(data, r, true); |
|
267 | std::for_each(std::begin(data), std::end(data), [](auto ts) { delete ts; }); | |
|
267 | 268 | } |
|
268 | 269 | |
|
269 | 270 | public: |
@@ -2,6 +2,7 | |||
|
2 | 2 | |
|
3 | 3 | #include "pywrappers_common.h" |
|
4 | 4 | |
|
5 | #include <Common/debug.h> | |
|
5 | 6 | #include <Data/DataSeriesType.h> |
|
6 | 7 | #include <Data/IDataProvider.h> |
|
7 | 8 | #include <Network/Downloader.h> |
@@ -231,12 +232,13 PYBIND11_MODULE(pysciqlopcore, m) | |||
|
231 | 232 | .def(py::init<>()) |
|
232 | 233 | .def(py::init<const std::vector<std::size_t>>()) |
|
233 | 234 | .def(py::init([](py::array_t<double> t, py::array_t<double> y, |
|
234 |
py::array_t<double> values |
|
|
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 | |
|
239 | assert(y.size() == values.shape(1)); | |
|
235 | py::array_t<double> values, double min_sampling, | |
|
236 | double max_sampling) { | |
|
237 | if(t.size() >= values.size() and t.size() != 0) | |
|
238 | SCIQLOP_ERROR(decltype(py::self), "Doesn't look like a Spectrogram"); | |
|
239 | if(y.size() != values.shape(1)) | |
|
240 | SCIQLOP_ERROR(decltype(py::self), | |
|
241 | "Y axis size and data shape are incompatible"); | |
|
240 | 242 | SpectrogramTimeSerie::axis_t _t(t.size()); |
|
241 | 243 | SpectrogramTimeSerie::axis_t _y(y.size()); |
|
242 | 244 | SpectrogramTimeSerie::container_type< |
@@ -247,7 +249,8 PYBIND11_MODULE(pysciqlopcore, m) | |||
|
247 | 249 | shape.push_back(values.shape(0)); |
|
248 | 250 | shape.push_back(values.shape(1)); |
|
249 | 251 | return SpectrogramTimeSerie(std::move(_t), std::move(_y), |
|
250 |
std::move(_values), shape |
|
|
252 | std::move(_values), shape, min_sampling, | |
|
253 | max_sampling); | |
|
251 | 254 | })) |
|
252 | 255 | .def("__getitem__", |
|
253 | 256 | [](SpectrogramTimeSerie& ts, |
General Comments 0
You need to be logged in to leave comments.
Login now