MeteoIODoc 20260914.909d27f1
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 {
33
34
46class GapInfo final {
47 public:
58
59 GapInfo() : before(), after(), beforeIdx(IOUtils::npos), afterIdx(IOUtils::npos),
60 gapType(INTERPOLATION), scannedBeforeLimit(IOUtils::npos), scannedAfterLimit(IOUtils::npos) {}
61
66 bool isUndef() const {return (before.isUndef() || after.isUndef());}
67
72
78 void setBefore(const size_t& idx, const std::vector<MeteoData>& vecM) {
79 if (idx>=vecM.size()) return;
80 beforeIdx=idx; before=vecM[idx].date;
81 scannedBeforeLimit = idx;
82 }
83
89 void setAfter(const size_t& idx, const std::vector<MeteoData>& vecM) {
90 if (idx>=vecM.size()) return;
91 afterIdx=idx; after=vecM[idx].date;
92 scannedAfterLimit = idx;
93 }
94
95 std::string toString() const {
96 std::ostringstream os;
97 if (before.isUndef()) {
98 os << "Undefined";
99 } else {
100 std::string type_str( "INTERPOLATION" );
101 if (gapType==GapType::EXTRAPOLATION_BEGIN) type_str = "EXTRAPOLATION_BEGIN";
102 else if (gapType==GapType::EXTRAPOLATION_END) type_str = "EXTRAPOLATION_END";
103 else if (gapType==GapType::NO_VALID_POINTS) type_str = "NO_VALID_POINTS";
104 os << " [" << before.toString(Date::ISO) << " (" << beforeIdx << ") - " << after.toString(Date::ISO) << " (" << afterIdx << ") -> " << type_str << "]";
105 }
106 return os.str();
107 }
108
109 double size() const;
110
111 // Search methods that can use cached anchor points and scanning boundaries
112 size_t searchBackward(const size_t& pos, const size_t& paramindex, const std::vector<MeteoData>& vecM,
113 const Date& resampling_date, const double& max_gap_size);
114 size_t searchForward(const size_t& pos, const size_t& paramindex, const std::vector<MeteoData>& vecM,
115 const Date& resampling_date, const double& max_gap_size);
116
117 Date before; //< Date of the last valid point before the gap
119 size_t beforeIdx;
120 size_t afterIdx;
122
123 private:
124 // These track how far we've scanned when we haven't found anchor points yet
125 size_t scannedBeforeLimit; //< Furthest index scanned backward
126 size_t scannedAfterLimit; //< Furthest index scanned forward
127};
128
129
130
142
143 public:
145
147 hasTimestamp, // Resampling date exactly matches an existing data point
148 inGap, // Resampling date falls between two existing data points
149 begin, // Resampling date is before the first data point (extrapolation)
150 end // Resampling date is after the last data point (extrapolation)
151 };
152
153 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*/)
154 : algo(i_algoname), parname(i_parname), max_gap_size(dflt_max_gap_size), gaps() {}
155
157
158 // findGap now takes stationHash for caching
159 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);
160
161 //return true if resampling took place, false otherwise
162 virtual bool resample(const std::string& stationHash, const size_t& index, const ResamplingPosition& position, const size_t& paramindex,
163 const std::vector<MeteoData>& vecM, MeteoData& md, const gap_info& gap, const bool& exactMatch) = 0;
164
165 void resetResampling() {gaps.clear();} //invalidate all gaps, usually after rebuffering
166
167 const std::string getAlgo() const {return algo;}
168 double getMaxGapSize() const {return max_gap_size;}
169
170 virtual std::string toString() const = 0;
171
172 protected:
173 bool allowExtrapolate = false;
174 static double partialAccumulateAtLeft(const std::vector<MeteoData>& vecM, const size_t& paramindex,
175 const size_t& pos, const Date& curr_date);
176 static double partialAccumulateAtRight(const std::vector<MeteoData>& vecM, const size_t& paramindex,
177 const size_t& pos, const Date& curr_date);
178 static double linearInterpolation(const double& x1, const double& y1,
179 const double& x2, const double& y2, const double& x3);
180 static Date getDailyStart(const Date& resampling_date);
181 static size_t getDailyValue(const std::vector<MeteoData>& vecM, const size_t& paramindex, size_t pos, const Date& intervalStart, const Date& intervalEnd);
182
183 const std::string algo, parname;
185
186 private:
187 std::map<std::string, gap_info> gaps;
188
189};
190
192 public:
193 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);
194};
195
196} //end namespace
197#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
const std::string toString(const FORMATS &type, const bool &gmt=false) const
Return a nicely formated string.
Definition Date.cc:1177
@ ISO
ISO 8601 extended format combined date: YYYY-MM-DDTHH:mm:SS.sss (fields might be dropped,...
Definition Date.h:90
void setUndef(const bool &flag=true)
Definition Date.cc:195
bool isUndef() const
Definition Date.h:143
Stores information about a data gap in a time series.
Definition ResamplingAlgorithms.h:46
std::string toString() const
Definition ResamplingAlgorithms.h:95
size_t searchForward(const size_t &pos, const size_t &paramindex, const std::vector< MeteoData > &vecM, const Date &resampling_date, const double &max_gap_size)
Search forward from pos to find the first valid point after a gap.
Definition ResamplingAlgorithms.cc:173
void setAfter(const size_t &idx, const std::vector< MeteoData > &vecM)
Setter for the 'after' anchor point of the gap.
Definition ResamplingAlgorithms.h:89
size_t afterIdx
Index of the first valid point after the gap.
Definition ResamplingAlgorithms.h:120
GapInfo()
Definition ResamplingAlgorithms.h:59
GapType gapType
Definition ResamplingAlgorithms.h:121
bool isUndef() const
Test if the gap is properly defined.
Definition ResamplingAlgorithms.h:66
Date after
Date of the first valid point after the gap.
Definition ResamplingAlgorithms.h:118
size_t beforeIdx
Index of the last valid point before the gap.
Definition ResamplingAlgorithms.h:119
Date before
Definition ResamplingAlgorithms.h:117
void setBefore(const size_t &idx, const std::vector< MeteoData > &vecM)
Setter for the 'before' anchor point of the gap.
Definition ResamplingAlgorithms.h:78
size_t searchBackward(const size_t &pos, const size_t &paramindex, const std::vector< MeteoData > &vecM, const Date &resampling_date, const double &max_gap_size)
Search backward from pos to find the last valid point before a gap.
Definition ResamplingAlgorithms.cc:121
double size() const
Return the size (in days) of the current gap or IOUtils::nodata if at least one boundary is unknown.
Definition ResamplingAlgorithms.cc:106
void reset()
Reset all members of the gap so, making it undefined.
Definition ResamplingAlgorithms.h:71
A class to represent a singular measurement received from one station at a certain time (represented ...
Definition MeteoData.h:110
Definition ResamplingAlgorithms.h:191
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:221
Interface class for the temporal resampling algorithms.
Definition ResamplingAlgorithms.h:141
static double partialAccumulateAtRight(const std::vector< MeteoData > &vecM, const size_t &paramindex, const size_t &pos, const Date &curr_date)
Definition ResamplingAlgorithms.cc:266
virtual ~ResamplingAlgorithms()
Definition ResamplingAlgorithms.h:156
const std::string parname
Definition ResamplingAlgorithms.h:183
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:153
GapInfo gap_info
Definition ResamplingAlgorithms.h:144
virtual std::string toString() const =0
void resetResampling()
Definition ResamplingAlgorithms.h:165
const std::string getAlgo() const
Definition ResamplingAlgorithms.h:167
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:247
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, const bool &exactMatch)=0
const std::string algo
Definition ResamplingAlgorithms.h:183
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:349
ResamplingPosition
Definition ResamplingAlgorithms.h:146
@ end
Definition ResamplingAlgorithms.h:150
@ inGap
Definition ResamplingAlgorithms.h:148
@ hasTimestamp
Definition ResamplingAlgorithms.h:147
@ begin
Definition ResamplingAlgorithms.h:149
double getMaxGapSize() const
Definition ResamplingAlgorithms.h:168
bool allowExtrapolate
Definition ResamplingAlgorithms.h:173
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:332
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:369
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)
Find a data gap around a given position.
Definition ResamplingAlgorithms.cc:298
double max_gap_size
Maximum extend of a data gap over which to interpolate.
Definition ResamplingAlgorithms.h:184
GapType
Gap type enumeration for temporal resampling.
Definition ResamplingAlgorithms.h:52
@ NO_VALID_POINTS
No valid points at all for this parameter.
Definition ResamplingAlgorithms.h:56
@ EXTRAPOLATION_END
No valid points after the gap (extrapolate backward)
Definition ResamplingAlgorithms.h:55
@ EXTRAPOLATION_BEGIN
No valid points before the gap (extrapolate forward)
Definition ResamplingAlgorithms.h:54
@ INTERPOLATION
Valid data points on both sides of the gap.
Definition ResamplingAlgorithms.h:53
const size_t npos
npos is the out-of-range value
Definition IOUtils.h:82
Definition Config.cc:34