FMT 1.2.0
Forest management tools for forest planning
Loading...
Searching...
No Matches
FMTYieldHandler.h
Go to the documentation of this file.
1/*
2Copyright (c) 2019 Gouvernement du Québec
3
4SPDX-License-Identifier: LiLiQ-R-1.1
5License-Filename: LICENSES/EN/LiLiQ-R11unicode.txt
6*/
7
8#ifndef FMTYLDDATA_Hm_included
9#define FMTYLDDATA_Hm_included
10
11#include <string>
12#include <map>
13#include <unordered_map>
14#include <unordered_set>
15#include <algorithm>
16#include <boost/serialization/serialization.hpp>
17#include <boost/serialization/nvp.hpp>
18#include "FMTMask.h"
19#include <vector>
20#include "FMTutility.h"
21#include "FMTObject.h"
22#include "FMTBounds.hpp"
23
24namespace Core
25{
26class FMTYieldRequest;
27class FMTSpec;
28class FMTData;
29
30// DocString: cmpYieldString
35{
36 // DocString: cmpYieldString::operator()
43 inline bool operator()(const std::string& p_first, const std::string& p_second) const noexcept
44 {
45 const size_t FIRST_LENGTH = p_first.length();
46 const size_t SECOND_LENGTH = p_second.length();
47 bool lessThan = false;
48 if (FIRST_LENGTH != SECOND_LENGTH)
49 {
50 lessThan = FIRST_LENGTH < SECOND_LENGTH;
51 }
52 else {
53 size_t i = FIRST_LENGTH;
54 bool gotValue = false;
55 while (!gotValue && i > 0)
56 {
57 --i;
58 if (p_first[i] != p_second[i])
59 {
60 if (p_first[i] < p_second[i])
61 {
62 lessThan = true;
63 }
64 else {
65 lessThan = false;
66 }
67 gotValue = true;
68 }
69 }
70 }
71 return lessThan;
72 }
73};
74
75// DocString: FMTYieldHandler
80{
81public:
82 // DocString: FMTYieldHandler::getOverrideIndex
87 virtual size_t getOverrideIndex() const;
88 // DocString: FMTYieldHandler::getTabous
93 virtual std::vector<size_t> getTabous() const;
94 // DocString: FMTYieldHandler::setOverrideIndex
99 virtual void setOverrideIndex(const size_t& newindex);
100 // DocString: ~FMTYieldHandler()
104 virtual ~FMTYieldHandler() = default;
105 // DocString: FMTYieldHandler()
109 FMTYieldHandler() = default;
110 // DocString: FMTYieldHandler(const FMTYieldHandler&)
115 FMTYieldHandler(const FMTYieldHandler& rhs) = default;
116 // DocString: FMTYieldHandler::operator=
122 FMTYieldHandler& operator = (const FMTYieldHandler& rhs) = default;
123 // DocString: FMTYieldHandler(const FMTMask&)
129 // DocString: FMTYieldHandler::getLinearValue
137 double getLinearValue(const std::vector<double>& dls, const int& agetarget, bool allowoutofrange) const;
138 // DocString: FMTYieldHandler::getLastBase
143 virtual int getLastBase() const;
144 // DocString: FMTYieldHandler::getBases
149 const std::vector<int>& getBases() const;
150 // DocString: FMTYieldHandler::getMask
156 // DocString: FMTYieldHandler::setMask
161 void setMask(const FMTMask& p_mask);
162 // DocString: FMTYieldHandler::pushBase
168 bool pushBase(const int& base);
169 // DocString: FMTYieldHandler::setBase
174 void setBase(const std::vector<int>& allvalues);
175 // DocString: FMTYieldHandler::inLookAt
181 bool inLookAt(const std::string& yld) const;
182 // DocString: FMTYieldHandler::getLastValue
188 virtual double getLastValue(const std::string yld) const;
189 // DocString: FMTYieldHandler::get
196 virtual double get(const std::string& yld, const FMTYieldRequest& request) const;
197 // DocString: FMTYieldHandler::pushData(const std::string&, const double&)
204 virtual bool pushData(const std::string& yld, const double& value);
205 // DocString: FMTYieldHandler::pushData(const std::string&, const FMTData&)
212 virtual bool pushData(const std::string& yld, const FMTData& data);
213 // DocString: FMTYieldHandler::indexes
219 virtual std::vector<std::string> indexes(const std::vector<std::string>& names) const;
220 // DocString: FMTYieldHandler::operator std::string
225 virtual operator std::string() const;
226 // DocString: FMTYieldHandler::compare
232 virtual std::vector<std::string> compare(const std::vector<std::string>& keys) const;
233 // DocString: FMTYieldHandler::clone
238 virtual std::unique_ptr<FMTYieldHandler>clone() const;
239 // DocString: FMTYieldHandler::operator==
245 virtual bool operator == (const FMTYieldHandler& rhs) const;
246 // DocString: FMTYieldHandler::empty
251 virtual bool empty() const;
252 // DocString: FMTYieldHandler::size
257 virtual size_t size() const;
258 // DocString: FMTYieldHandler::getType
263 virtual FMTyldtype getType() const;
264 // DocString: FMTYieldHandler::operator[]
270 virtual FMTData& operator[](const std::string& yldname);
271 // DocString: FMTYieldHandler::at
277 virtual const FMTData& at(const std::string& yldname) const;
278 // DocString: FMTYieldHandler::containsYield
284 virtual bool containsYield(const std::string& yldname) const;
285 // DocString: FMTYieldHandler::isNullYield
291 virtual bool isNullYield(const std::string& yldname) const;
292 // DocString: FMTYieldHandler::getYieldNames
297 virtual std::vector<std::string>getYieldNames() const;
298 // DocString: FMTYieldHandler::clearCache
302 virtual void clearCache();
303 // DocString: FMTYieldHandler::getAllYieldsData
309 virtual std::map<std::string, std::vector<double>>getAllYieldsData(const int& maxbase)const;
310 // DocString: FMTYieldHandler::preSolve
317 virtual std::unique_ptr<FMTYieldHandler> preSolve(const FMTMaskFilter& filter, const std::vector<FMTTheme>& newthemes) const;
318 // DocString: FMTYieldHandler::postSolve
325 virtual std::unique_ptr<FMTYieldHandler> postSolve(const FMTMaskFilter& filter,const std::vector<FMTTheme>& basethemes) const;
326 // DocString: FMTYieldHandler::getFromFactor
333 virtual std::unique_ptr<FMTYieldHandler> getFromFactor(const double& factor,
334 std::vector<std::string>yieldnames = std::vector<std::string>()) const;
335 // DocString: FMTYieldHandler::getEndPoint
344 virtual int getEndPoint(const std::string& yld, const int& lowerstep, const double& bound, const double& value) const;
345 // DocString: FMTYieldHandler::getPeak
353 virtual double getPeak(const FMTYieldRequest& request,const std::string& yld, const int& targetage) const;
354 // DocString: FMTYieldHandler::getAge
361 virtual int getAge(const FMTYieldRequest& request, const FMTSpec& spec) const;
362 // DocString: FMTYieldHandler::getYieldLinearValue
370 virtual double getYieldLinearValue(const std::string&yldname, const FMTYieldRequest& request, bool allowoutofrange=true) const;
371protected:
373 std::vector<int>m_bases;
374 mutable std::unordered_set<std::string>m_lookat;
375 // DocString: FMTYieldHandler::_basePushData(std::map<std::string, FMTData, cmpYieldString>&, const std::string&, const double&)
383 static bool _basePushData(std::map<std::string, FMTData, cmpYieldString>& elements, const std::string& yld, const double& value);
384 // DocString: FMTYieldHandler::_basePushData(std::map<std::string, FMTData, cmpYieldString>&, const std::string&, const FMTData&)
392 static bool _basePushData(std::map<std::string, FMTData, cmpYieldString>& elements, const std::string& yld, const FMTData& data);
393 // DocString: FMTYieldHandler::_getChangesFrom
400 double _getChangesFrom(const int& targetage, const int& peakstep) const;
401 // DocString: FMTYieldHandler::_getMaxBase
407 int _getMaxBase(const FMTYieldRequest& request) const;
408private:
409 friend class boost::serialization::access;
410 // DocString: FMTYieldHandler::serialize
417 template<class Archive>
418 void serialize(Archive& ar, const unsigned int version)
419 {
420 ar& boost::serialization::make_nvp("mask", m_mask);
421 ar& boost::serialization::make_nvp("bases", m_bases);
422 }
423
424
425};
426
427}
428#endif // FMTYLDDATA_Hm_included
#define FMTEXPORT
Definition: FMTutility.h:125
Data of a yield holding the values, sources and operators used to compute complex yields.
Definition: FMTData.h:36
Filter built from masks used to preSolve and postsolve FMTMask objects.
Definition: FMTMaskFilter.h:31
Core class holding, as a boost dynamic bitset, which theme attributes are part of a mask.
Definition: FMTMask.h:96
Base class of multiple FMT classes holding a shared exception handler pointer and logger.
Definition: FMTObject.h:49
Base class for yield handlers, holding a mask and the base ages of the yields.
Definition: FMTYieldHandler.h:80
virtual const FMTData & at(const std::string &yldname) const
Access the data of a yield.
static bool _basePushData(std::map< std::string, FMTData, cmpYieldString > &elements, const std::string &yld, const FMTData &data)
Push data for a yield into the given elements.
int _getMaxBase(const FMTYieldRequest &request) const
Return the maximum base age for a request.
virtual bool empty() const
Return true if the handler is empty.
virtual std::vector< std::string > indexes(const std::vector< std::string > &names) const
Return the yield names that are indexes among the given names.
virtual bool pushData(const std::string &yld, const FMTData &data)
Push data for a yield.
virtual std::map< std::string, std::vector< double > > getAllYieldsData(const int &maxbase) const
Return all the yield data up to a maximum base age.
std::vector< int > m_bases
Definition: FMTYieldHandler.h:373
void setBase(const std::vector< int > &allvalues)
Set the base ages of the handler.
virtual std::unique_ptr< FMTYieldHandler > getFromFactor(const double &factor, std::vector< std::string >yieldnames=std::vector< std::string >()) const
Multiply the handler by a factor and return a new handler.
bool pushBase(const int &base)
Push a base age to the handler.
FMTYieldHandler()=default
Default constructor for FMTYieldHandler.
virtual double getPeak(const FMTYieldRequest &request, const std::string &yld, const int &targetage) const
Return the peak value of a yield for a request.
static bool _basePushData(std::map< std::string, FMTData, cmpYieldString > &elements, const std::string &yld, const double &value)
Push a value for a yield into the given elements.
virtual void clearCache()
Clear the cache of the handler.
virtual ~FMTYieldHandler()=default
Default virtual destructor for FMTYieldHandler.
virtual std::unique_ptr< FMTYieldHandler > postSolve(const FMTMaskFilter &filter, const std::vector< FMTTheme > &basethemes) const
Return a postsolved copy of the handler.
virtual std::vector< size_t > getTabous() const
Return the tabou indexes of the handler.
virtual std::unique_ptr< FMTYieldHandler > preSolve(const FMTMaskFilter &filter, const std::vector< FMTTheme > &newthemes) const
Return a presolved copy of the handler.
virtual double getLastValue(const std::string yld) const
Return the last value of a yield.
virtual int getLastBase() const
Return the last base age of the handler.
FMTMask m_mask
Definition: FMTYieldHandler.h:372
FMTYieldHandler(const FMTMask &lmask)
Construct a yield handler from a mask.
virtual void setOverrideIndex(const size_t &newindex)
Set the override index of the handler.
std::unordered_set< std::string > m_lookat
Definition: FMTYieldHandler.h:374
double _getChangesFrom(const int &targetage, const int &peakstep) const
Return the change of value from a target age over a peak step.
FMTYieldHandler(const FMTYieldHandler &rhs)=default
Copy constructor for FMTYieldHandler.
virtual FMTData & operator[](const std::string &yldname)
Access the data of a yield.
virtual int getEndPoint(const std::string &yld, const int &lowerstep, const double &bound, const double &value) const
Return the age at which a yield reaches a bound value.
virtual std::vector< std::string > compare(const std::vector< std::string > &keys) const
Return the keys that match the handler.
virtual size_t getOverrideIndex() const
Return the override index of the handler.
virtual size_t size() const
Return the number of yields in the handler.
virtual bool isNullYield(const std::string &yldname) const
Return true if a yield is a null yield.
virtual FMTyldtype getType() const
Return the type of the yield handler.
bool inLookAt(const std::string &yld) const
Return true if a yield is in the look at set.
virtual bool pushData(const std::string &yld, const double &value)
Push a value for a yield.
void setMask(const FMTMask &p_mask)
Set the mask of the handler.
virtual bool containsYield(const std::string &yldname) const
Return true if the handler contains a given yield.
virtual std::vector< std::string > getYieldNames() const
Return the yield names of the handler.
FMTMask getMask() const
Return the mask of the handler.
double getLinearValue(const std::vector< double > &dls, const int &agetarget, bool allowoutofrange) const
Return the linearly interpolated value at a target age.
virtual int getAge(const FMTYieldRequest &request, const FMTSpec &spec) const
Return the age of a development from a request and a specification.
virtual double get(const std::string &yld, const FMTYieldRequest &request) const
Get the value of a yield for a request.
const std::vector< int > & getBases() const
Return the base ages of the handler.
virtual double getYieldLinearValue(const std::string &yldname, const FMTYieldRequest &request, bool allowoutofrange=true) const
Return the linearly interpolated value of a yield for a request.
virtual std::unique_ptr< FMTYieldHandler > clone() const
Clone the yield handler.
Request for yield values using a development and optionally a graph vertex.
Definition: FMTYieldRequest.h:37
The Core namespace provides classes for simulating stands/strata growth/harvest through time.
Definition: FMTAction.h:34
FMTyldtype
Enumerator describing the type of a yield (age, time, complex, model).
Definition: FMTutility.h:62
Comparator ordering yield names by length then by content from the end.
Definition: FMTYieldHandler.h:35
bool operator()(const std::string &p_first, const std::string &p_second) const noexcept
Compare two yield names.
Definition: FMTYieldHandler.h:43