MeteoIODoc 20260811.aeb9aef5
Environmental timeseries pre-processing
Loading...
Searching...
No Matches
ResamplingAlgorithms.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-3.0-or-later
2/***********************************************************************************/
3/* Copyright 2009 WSL Institute for Snow and Avalanche Research SLF-DAVOS */
4/***********************************************************************************/
5/* This file is part of MeteoIO.
6 MeteoIO is free software: you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 MeteoIO is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with MeteoIO. If not, see <http://www.gnu.org/licenses/>.
18*/
19#ifndef RESAMPLINGALGORITHMS_H
20#define RESAMPLINGALGORITHMS_H
21
23#include <meteoio/IOUtils.h>
24
25#include <string>
26#include <vector>
27
28#ifdef _MSC_VER
29 #pragma warning(disable:4512) //we don't need any = operator!
30#endif
31
32namespace mio {
44
45 public:
46 enum GapType {
47 INTERPOLATION, // Valid data points on both sides of the gap
48 EXTRAPOLATION_BEGIN, // No valid points before the gap (extrapolate forward)
49 EXTRAPOLATION_END, // No valid points after the gap (extrapolate backward)
50 NO_VALID_POINTS // No valid points at all for this parameter
51 };
52
53 typedef struct GAP_INFO {
54 // --- Constructor ---
55 GAP_INFO() : before(), after(), beforeIdx(IOUtils::npos), afterIdx(IOUtils::npos),
56 gapType(INTERPOLATION), scannedBeforeLimit(IOUtils::npos), scannedAfterLimit(IOUtils::npos) {}
57
58 // --- Public methods for anchor points ---
59 void extend(const size_t& idx, const std::vector<MeteoData>& vecM) {
60 if (idx<beforeIdx) setBefore(idx, vecM);
61 if (idx>afterIdx) setAfter(idx, vecM);
62 }
63 void setBefore(const size_t& idx, const std::vector<MeteoData>& vecM) {
64 if (idx>=vecM.size()) return;
65 beforeIdx=idx; before=vecM[idx].date;
66 // Reset scanning limit when we find a valid anchor
67 scannedBeforeLimit = IOUtils::npos;
68 }
69 void setAfter(const size_t& idx, const std::vector<MeteoData>& vecM) {
70 if (idx>=vecM.size()) return;
71 afterIdx=idx; after=vecM[idx].date;
72 // Reset scanning limit when we find a valid anchor
73 scannedAfterLimit = IOUtils::npos;
74 }
75
76 std::string toString() const {
77 std::ostringstream os;
78 if (before.isUndef()) {
79 os << "Undefined";
80 } else {
81 os << " [" << before.toString(Date::ISO) << " (" << beforeIdx << ") - " << after.toString(Date::ISO) << " (" << afterIdx << ")]";
82 }
83 return os.str();
84 }
85 double size() const {return std::abs(after.getJulian(true)-before.getJulian(true));}
86
87 // --- Search methods (now part of gap_info for better encapsulation) ---
88 size_t searchBackward(const size_t& pos, const size_t& paramindex, const std::vector<MeteoData>& vecM,
89 const Date& resampling_date, const double& i_max_gap_size);
90 size_t searchForward(const size_t& pos, const size_t& paramindex, const std::vector<MeteoData>& vecM,
91 const Date& resampling_date, const double& i_max_gap_size, const size_t& indexP1);
92
93 // --- Public members: Anchor points for interpolation ---
94 Date before; //< Date of the last valid point before the gap
95 Date after;
96 size_t beforeIdx;
97 size_t afterIdx;
98 GapType gapType;
99
100 private:
101 // --- Private members: Scanning boundaries for caching ---
102 // These track how far we've scanned when we haven't found anchor points yet
103 size_t scannedBeforeLimit; //< Furthest index scanned backward (only valid if beforeIdx == npos)
104 size_t scannedAfterLimit; //< Furthest index scanned forward (only valid if afterIdx == npos)
105 } gap_info;
106
108 exact_match, // Resampling date exactly matches an existing data point
109 in_gap, // Resampling date falls between two existing data points
110 begin, // Resampling date is before the first data point (extrapolation)
111 end // Resampling date is after the last data point (extrapolation)
112 };
113
114 public:
115
116 ResamplingAlgorithms(const std::string& i_algoname, const std::string& i_parname, const double& dflt_max_gap_size, const std::vector< std::pair<std::string, std::string> >& /*vecArgs*/)
117 : algo(i_algoname), parname(i_parname), max_gap_size(dflt_max_gap_size), gaps() {}
118
120
121 // findGap now takes stationHash for caching
122 gap_info findGap(const std::string& stationHash, const size_t& pos, const size_t& paramindex, const std::vector<MeteoData>& vecM, const Date& resampling_date,
123 const double& i_max_gap_size);
124
125 //return true if resampling took place, false otherwise
126 virtual bool resample(const std::string& stationHash, const size_t& index, const ResamplingPosition& position, const size_t& paramindex,
127 const std::vector<MeteoData>& vecM, MeteoData& md, const gap_info& gap) = 0;
128
135 virtual bool allowResample(const gap_info& gap, const ResamplingPosition& position) const;
136
137 void resetResampling() {gaps.clear();} //invalidate all gaps, usually after rebuffering
138
139 const std::string getAlgo() const {return algo;}
140 double getMaxGapSize() const {return max_gap_size;}
141
142 virtual std::string toString() const = 0;
143
144 protected:
145 bool extrapolate = false;
146 static double partialAccumulateAtLeft(const std::vector<MeteoData>& vecM, const size_t& paramindex,
147 const size_t& pos, const Date& curr_date);
148 static double partialAccumulateAtRight(const std::vector<MeteoData>& vecM, const size_t& paramindex,
149 const size_t& pos, const Date& curr_date);
150 void getNearestValidPts(const std::string& stationHash, const size_t& pos, const size_t& paramindex, const std::vector<MeteoData>& vecM, const Date& resampling_date,
151 const double& i_max_gap_size, size_t& indexP1, size_t& indexP2);
152 static double linearInterpolation(const double& x1, const double& y1,
153 const double& x2, const double& y2, const double& x3);
154 static Date getDailyStart(const Date& resampling_date);
155 static size_t getDailyValue(const std::vector<MeteoData>& vecM, const size_t& paramindex, size_t pos, const Date& intervalStart, const Date& intervalEnd);
156
157 const std::string algo, parname;
159
160 private:
161 std::map<std::string, gap_info> gaps;
162
163};
164
166 public:
167 static ResamplingAlgorithms* getAlgorithm(const std::string& i_algoname, const std::string& parname, const double& max_gap_size, const std::vector< std::pair<std::string, std::string> >& vecArgs, const Config &cfg);
168};
169
170} //end namespace
171#endif
A class that reads a key/value file. These files (typically named *.ini) follow the INI file format s...
Definition Config.h:79
A class to handle timestamps. This class handles conversion between different time display formats (I...
Definition Date.h:86
A class to represent a singular measurement received from one station at a certain time (represented ...
Definition MeteoData.h:108
Definition ResamplingAlgorithms.h:165
static ResamplingAlgorithms * getAlgorithm(const std::string &i_algoname, const std::string &parname, const double &max_gap_size, const std::vector< std::pair< std::string, std::string > > &vecArgs, const Config &cfg)
Definition ResamplingAlgorithms.cc:115
Interface class for the temporal resampling algorithms.
Definition ResamplingAlgorithms.h:43
static double partialAccumulateAtRight(const std::vector< MeteoData > &vecM, const size_t &paramindex, const size_t &pos, const Date &curr_date)
Definition ResamplingAlgorithms.cc:160
virtual ~ResamplingAlgorithms()
Definition ResamplingAlgorithms.h:119
const std::string parname
Definition ResamplingAlgorithms.h:157
ResamplingAlgorithms(const std::string &i_algoname, const std::string &i_parname, const double &dflt_max_gap_size, const std::vector< std::pair< std::string, std::string > > &)
Definition ResamplingAlgorithms.h:116
void getNearestValidPts(const std::string &stationHash, const size_t &pos, const size_t &paramindex, const std::vector< MeteoData > &vecM, const Date &resampling_date, const double &i_max_gap_size, size_t &indexP1, size_t &indexP2)
This function returns the last and next valid points around a given position.
Definition ResamplingAlgorithms.cc:356
virtual std::string toString() const =0
void resetResampling()
Definition ResamplingAlgorithms.h:137
const std::string getAlgo() const
Definition ResamplingAlgorithms.h:139
static double partialAccumulateAtLeft(const std::vector< MeteoData > &vecM, const size_t &paramindex, const size_t &pos, const Date &curr_date)
‍For algorithms that support extrapolations, this could be set to true in the ini file
Definition ResamplingAlgorithms.cc:141
bool extrapolate
Definition ResamplingAlgorithms.h:145
virtual bool resample(const std::string &stationHash, const size_t &index, const ResamplingPosition &position, const size_t &paramindex, const std::vector< MeteoData > &vecM, MeteoData &md, const gap_info &gap)=0
const std::string algo
Definition ResamplingAlgorithms.h:157
GapType
Definition ResamplingAlgorithms.h:46
@ INTERPOLATION
Definition ResamplingAlgorithms.h:47
@ NO_VALID_POINTS
Definition ResamplingAlgorithms.h:50
@ EXTRAPOLATION_BEGIN
Definition ResamplingAlgorithms.h:48
@ EXTRAPOLATION_END
Definition ResamplingAlgorithms.h:49
static Date getDailyStart(const Date &resampling_date)
For a given date, find the start of the day, considering that for midnight we return the day before!...
Definition ResamplingAlgorithms.cc:390
ResamplingPosition
Definition ResamplingAlgorithms.h:107
@ end
Definition ResamplingAlgorithms.h:111
@ exact_match
Definition ResamplingAlgorithms.h:108
@ begin
Definition ResamplingAlgorithms.h:110
@ in_gap
Definition ResamplingAlgorithms.h:109
double getMaxGapSize() const
Definition ResamplingAlgorithms.h:140
static double linearInterpolation(const double &x1, const double &y1, const double &x2, const double &y2, const double &x3)
This function solves the equation y = ax + b for two given points and returns y for a given x.
Definition ResamplingAlgorithms.cc:373
static size_t getDailyValue(const std::vector< MeteoData > &vecM, const size_t &paramindex, size_t pos, const Date &intervalStart, const Date &intervalEnd)
Find a unique value in a given time interval. This is useful for retrieving a unique daily average,...
Definition ResamplingAlgorithms.cc:410
virtual bool allowResample(const gap_info &gap, const ResamplingPosition &position) const
Check if this algorithm allows resampling for the given gap and position.
Definition ResamplingAlgorithms.cc:97
gap_info findGap(const std::string &stationHash, const size_t &pos, const size_t &paramindex, const std::vector< MeteoData > &vecM, const Date &resampling_date, const double &i_max_gap_size)
Definition ResamplingAlgorithms.cc:320
double max_gap_size
Definition ResamplingAlgorithms.h:158
Definition Config.cc:34
Definition ResamplingAlgorithms.h:53
GapType gapType
Definition ResamplingAlgorithms.h:98
Date before
Definition ResamplingAlgorithms.h:94
std::string toString() const
Definition ResamplingAlgorithms.h:76
size_t afterIdx
Index of the first valid point after the gap.
Definition ResamplingAlgorithms.h:97
void extend(const size_t &idx, const std::vector< MeteoData > &vecM)
Definition ResamplingAlgorithms.h:59
void setBefore(const size_t &idx, const std::vector< MeteoData > &vecM)
Definition ResamplingAlgorithms.h:63
size_t beforeIdx
Index of the last valid point before the gap.
Definition ResamplingAlgorithms.h:96
GAP_INFO()
Definition ResamplingAlgorithms.h:55
void setAfter(const size_t &idx, const std::vector< MeteoData > &vecM)
Definition ResamplingAlgorithms.h:69
size_t searchForward(const size_t &pos, const size_t &paramindex, const std::vector< MeteoData > &vecM, const Date &resampling_date, const double &i_max_gap_size, const size_t &indexP1)
Date after
Date of the first valid point after the gap.
Definition ResamplingAlgorithms.h:95
double size() const
Definition ResamplingAlgorithms.h:85
size_t searchBackward(const size_t &pos, const size_t &paramindex, const std::vector< MeteoData > &vecM, const Date &resampling_date, const double &i_max_gap_size)