FMT 1.2.0
Forest management tools for forest planning
Loading...
Searching...
No Matches
FMTConstraint.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 FMTconstraint_Hm_included
9#define FMTconstraint_Hm_included
10
11#include "FMTOutput.h"
12#include <vector>
13#include <string>
14#include <limits>
15#include "FMTBounds.hpp"
16#include <boost/serialization/serialization.hpp>
17#include <boost/serialization/nvp.hpp>
18#include <boost/serialization/export.hpp>
19
20namespace Core
21{
22class FMTTransition;
23class FMTTheme;
24class FMTAction;
25class FMTYields;
26// DocString: FMTconstrainttype
31{
44 FMTrandomaction = 13//need to be deleted
45};
46// DocString: FMTConstraint
51class FMTEXPORT FMTConstraint: public FMTOutput,public FMTSpec
52 {
53 public:
54 // DocString: FMTConstraint()
59 // DocString: FMTConstraint(FMTconstrainttype,const FMTOutput&)
66 // DocString: FMTConstraint(const FMTConstraint&)
72 // DocString: FMTConstraint::operator=
78 FMTConstraint& operator = (const FMTConstraint& rhs);
79 // DocString: FMTConstraint::operator==
85 bool operator == (const FMTConstraint& rhs) const;
86 // DocString: FMTConstraint::operator!=
92 bool operator != (const FMTConstraint& rhs) const;
93 // DocString: FMTConstraint::extraVariables
98 bool extraVariables() const;
99 // DocString: FMTConstraint::isGoal
104 bool isGoal() const;
105 // DocString: FMTConstraint::isSetFrom
111 bool isSetFrom(const std::string& modeltype) const;
112 // DocString: FMTConstraint::isReIgnore
118 bool isReIgnore(const int& replanningperiod) const;
119 // DocString: FMTConstraint::doSupportRandom
124 bool doSupportRandom() const;
125 // DocString: FMTConstraint::setFrom
132 Core::FMTConstraint setFrom(const std::string& modeltype,const double& value) const;
133 // DocString: FMTConstraint::getScheduleWeight
138 double getScheduleWeight() const;
139 // DocString: FMTConstraint::getFromReplicate
146 Core::FMTConstraint getFromReplicate(const size_t& replicate,const int& period) const;
147 // DocString: FMTConstraint::setFromReplicate
154 void setFromReplicate(size_t p_replicate,int p_period);
155
156 // DocString: FMTConstraint::gotReplicate
162 bool gotReplicate(const int& p_period) const;
163 // DocString: FMTConstraint::getPenalties
169 std::vector<std::string>getPenalties(double & sense) const;
170 // DocString: FMTConstraint::getVariableLevels
175 std::vector<std::string>getVariableLevels() const;
176 // DocString: FMTConstraint::getGoal
182 void getGoal(std::string& name,double& value) const;
183 // DocString: FMTConstraint::setGoal
189 void setGoal(const std::string& goalname, const double& value);
190 // DocString: FMTConstraint::setPenalties
196 void setPenalties(const std::string& penaltyoperator, const std::vector<std::string>& variables);
197 // DocString: FMTConstraint::isObjective
202 bool isObjective() const;
203 // DocString: FMTConstraint::sense
208 double sense() const;
209 // DocString: FMTConstraint::getBounds
216 void getBounds(double& lower, double& upper,int period = 0) const;
217 // DocString: FMTConstraint::setRhs
223 void setRhs(double lower,double upper);
224 // DocString: FMTConstraint::setLength
230 void setLength(int firstPeriod = 1,int lastPeriod = std::numeric_limits<int>::max());
231 // DocString: FMTConstraint::getVariations
237 void getVariations(double& lower, double& upper) const;
238 // DocString: FMTConstraint::isMultiple
243 bool isMultiple() const;
244 // DocString: FMTConstraint::acrossPeriod
249 bool acrossPeriod() const;
250 // DocString: FMTConstraint::hash
257 size_t hash(bool hashrhs = true,bool hashoutputonly = false) const;
258 // DocString: FMTConstraint::hasHasOutput
263 size_t hasHasOutput() const;
264 // DocString: FMTConstraint::setOutput
269 void setOutput(const FMTOutput& out);
270 // DocString: FMTConstraint::setConstraintType
276 // DocString: FMTConstraint::getConstraintType
282 // DocString: FMTConstraint::operator std::string
287 operator std::string() const;
288 // DocString: FMTConstraint::isSpatial
293 bool isSpatial() const;
294 // DocString: FMTConstraint::isRandomAction
299 bool isRandomAction() const;
300 // DocString: FMTConstraint::getGroup
305 size_t getGroup() const;
306 // DocString: FMTConstraint::outputEmpty
311 size_t outputEmpty() const;
312 // DocString: FMTConstraint::preSolve
325 const std::vector<FMTTheme>& originalthemes,
326 const std::vector<const FMTTheme*>& selectedthemes,
327 const std::vector<FMTTheme>& newthemes,
328 const std::vector<FMTAction>& actions,
329 const std::vector<bool>& p_valideActions,
330 const FMTYields& yields) const;
331 // DocString: FMTConstraint::preSolveRef
342 void preSolveRef(const FMTMaskFilter& p_filter,
343 const std::vector<FMTTheme>& p_originalThemes,
344 const std::vector<const FMTTheme*>& p_selectedThemes,
345 const std::vector<FMTTheme>& p_newThemes,
346 const std::vector<FMTAction>& p_actions,
347 const std::vector<bool>& p_valideActions,
348 const FMTYields& p_yields);
349 // DocString: ~FMTConstraint()
353 ~FMTConstraint()=default;
354 // DocString: FMTConstraint::evaluate
361 double evaluate(const std::vector<double>& temporalvalues) const;
362 // DocString: FMTConstraint::getActionIds
368 std::vector<int>getActionIds(const std::vector<Core::FMTAction>& actions) const;
369 // DocString: FMTConstraint::isActionsused
375 std::vector<bool>isActionsused(const std::vector<Core::FMTAction>& actions) const;
376 // DocString: FMTConstraint::canBeTurnedToYieldsBasedOnTransitions
385 bool canBeTurnedToYieldsBasedOnTransitions(const std::vector<Core::FMTTheme>& p_themes,
386 const std::vector<Core::FMTTransition>& p_trans,
387 const std::vector<Core::FMTAction>& p_actions,
388 const std::vector<bool>& p_valideActions) const;
389 // DocString: FMTConstraint::turnToYieldsBasedOnTransition
399 void turnToYieldsBasedOnTransition( const std::vector<Core::FMTTheme>& themes,
400 const std::vector<Core::FMTTransition>& trans,
401 std::vector<Core::FMTAction>&actions,
402 const std::vector<bool>& p_valideActions,
403 Core::FMTYields& yields,
404 const int& constraintid) const;
405 // DocString: FMTConstraint::canBeTurnedToYields
411 // DocString: FMTConstraint::turnToYieldsAndActions
420 void turnToYieldsAndActions(const std::vector<Core::FMTTheme>& themes,
421 std::vector<Core::FMTAction>&actions,
422 const std::vector<bool>& p_valideActions,
423 Core::FMTYields& yields,
424 const int& constraintid) const;
425
426 // DocString: FMTConstraint::getThemeTarget
431 int getThemeTarget() const;
432 // DocString: FMTConstraint::getWeight
437 double getWeight() const;
438 private:
439 // DocString: FMTConstraint::serialize
446 friend class boost::serialization::access;
447 template<class Archive>
448 void serialize(Archive& ar, const unsigned int version)
449 {
450 ar& boost::serialization::make_nvp("output", boost::serialization::base_object<FMTOutput>(*this));
451 ar& boost::serialization::make_nvp("specification", boost::serialization::base_object<FMTSpec>(*this));
452 ar& boost::serialization::make_nvp("type", m_type);
453 }
454 // DocString: FMTConstraint::m_type
456 FMTconstrainttype m_type;
457 // DocString: FMTConstraint::_standardString
466 void _standardString(std::string& line, std::string& period_bounds,
467 std::string& goal, std::string& global,bool asInt = false) const;
468 // DocString: FMTConstraint::_getMaxAndMin
475 void _getMaxAndMin(const std::vector<double>& values, double& min, double& max) const;
476 // DocString: FMTConstraint::_getSum
482 double _getSum(const std::vector<double>& values) const;
483 // DocString: FMTConstraint::_getPeriodicVariationCost
490 double _getPeriodicVariationCost(const std::vector<double>& values, bool evaluateupper = false) const;
491 // DocString: FMTConstraint::_getVariability
499 double _getVariability(const std::vector<double>& values, const double& var, const double& lowarvar) const;
500 // DocString: FMTConstraint::_getReplicateValues
508 bool _getReplicateValue(size_t p_replicate, int p_period, double& p_bound) const;
509 // DocString: FMTConstraint::_setIterationChange
515 void _setIterationChange(double p_bound);
516 // DocString: FMTConstraint::getiterationchange
522 Core::FMTConstraint _getIterationChange(double p_PeriodChanges) const;
523
524 };
525}
526
527BOOST_CLASS_EXPORT_KEY(Core::FMTConstraint)
528#endif
#define FMTEXPORT
Definition: FMTutility.h:125
Representation of a line in the optimize section, an objective being considered a constraint.
Definition: FMTConstraint.h:52
void getGoal(std::string &name, double &value) const
Fill up the name and weight of the goal of the constraint.
FMTconstrainttype getConstraintType() const
Return the type of the constraint.
bool isObjective() const
Return true if the constraint is an objective.
size_t hasHasOutput() const
Return the hash of the output of the constraint.
double sense() const
Return the sense of the objective, 1 for minimisation and -1 for maximisation.
size_t hash(bool hashrhs=true, bool hashoutputonly=false) const
Return the hash of the constraint.
double getScheduleWeight() const
Return the global schedule weight of the objective for a local model.
double getWeight() const
Return the weight of the constraint.
Core::FMTConstraint getFromReplicate(const size_t &replicate, const int &period) const
Return a new constraint with the replicate value, if the constraint is built with a replicate table....
bool isReIgnore(const int &replanningperiod) const
Return true if the constraint must be ignored from the replanning period.
bool canBeTurnedToYieldsBasedOnTransitions(const std::vector< Core::FMTTheme > &p_themes, const std::vector< Core::FMTTransition > &p_trans, const std::vector< Core::FMTAction > &p_actions, const std::vector< bool > &p_valideActions) const
Return true if the constraint can be turned to a simple action bound using a simple yield,...
void setOutput(const FMTOutput &out)
Set the output of the constraint.
bool acrossPeriod() const
Return true if the constraint needs to be set across multiple periods like _EVEN, _SEQ or _NDY.
void setGoal(const std::string &goalname, const double &value)
Set a goal with a name and a value if the constraint is not an objective.
void setPenalties(const std::string &penaltyoperator, const std::vector< std::string > &variables)
Set the penalties if the constraint is an objective.
size_t outputEmpty() const
Return true if the output of the constraint is empty.
FMTConstraint()
Default constructor for FMTConstraint.
void setConstraintType(FMTconstrainttype ltype)
Set the type of the constraint.
std::vector< bool > isActionsused(const std::vector< Core::FMTAction > &actions) const
Return a vector of booleans, true for the actions to which the spatial constraint applies.
FMTConstraint(FMTconstrainttype ltype, const FMTOutput &loutput)
Partial constructor specifying the output and the constraint type.
bool isMultiple() const
Return true if the constraint allows some variability like _EVEN.
bool isSpatial() const
Return true if the constraint is a spatial constraint.
std::vector< std::string > getPenalties(double &sense) const
Return the names of the penalties of the constraint if it is a goal, like _GOAL(penaltyname,...
bool gotReplicate(const int &p_period) const
Check if the constraint contains a replicate.
bool isSetFrom(const std::string &modeltype) const
Return true if the constraint needs to be set from a specific model.
FMTConstraint preSolve(const FMTMaskFilter &filter, const std::vector< FMTTheme > &originalthemes, const std::vector< const FMTTheme * > &selectedthemes, const std::vector< FMTTheme > &newthemes, const std::vector< FMTAction > &actions, const std::vector< bool > &p_valideActions, const FMTYields &yields) const
Presolve the constraint, potentially returning an empty constraint. See FMTOutput::preSolve.
bool doSupportRandom() const
Return true if the constraint has only one source based on action area and supports the _RANDOM keywo...
std::vector< int > getActionIds(const std::vector< Core::FMTAction > &actions) const
Return the action ids to which the spatial constraint applies.
FMTConstraint(const FMTConstraint &rhs)
Copy constructor for FMTConstraint.
void preSolveRef(const FMTMaskFilter &p_filter, const std::vector< FMTTheme > &p_originalThemes, const std::vector< const FMTTheme * > &p_selectedThemes, const std::vector< FMTTheme > &p_newThemes, const std::vector< FMTAction > &p_actions, const std::vector< bool > &p_valideActions, const FMTYields &p_yields)
Presolve the constraint in place. See FMTOutput::preSolve.
void getVariations(double &lower, double &upper) const
Get the variation for constraints like _EVEN, _SEQ or _NDY.
bool isGoal() const
Return true if the constraint has a goal weight.
std::vector< std::string > getVariableLevels() const
Return the level names of the constraint if it is a level.
void setRhs(double lower, double upper)
Set the RHS of the constraint with a lower and upper bound.
Core::FMTConstraint setFrom(const std::string &modeltype, const double &value) const
Return a new constraint set with the value of the given model type.
void turnToYieldsBasedOnTransition(const std::vector< Core::FMTTheme > &themes, const std::vector< Core::FMTTransition > &trans, std::vector< Core::FMTAction > &actions, const std::vector< bool > &p_valideActions, Core::FMTYields &yields, const int &constraintid) const
Turn the constraint to yields and actions based on the transitions.
bool isRandomAction() const
Return true if the constraint is a random action constraint.
~FMTConstraint()=default
Default destructor for FMTConstraint.
void turnToYieldsAndActions(const std::vector< Core::FMTTheme > &themes, std::vector< Core::FMTAction > &actions, const std::vector< bool > &p_valideActions, Core::FMTYields &yields, const int &constraintid) const
Generate two yield handlers from the constraint and include them in the yields, modifying the actions...
void getBounds(double &lower, double &upper, int period=0) const
Fill up the lower and upper bound for a given period if the constraint applies to it.
void setLength(int firstPeriod=1, int lastPeriod=std::numeric_limits< int >::max())
Set the length of the constraint.
void setFromReplicate(size_t p_replicate, int p_period)
If the constraint is build with a replicate tables it will gives a new constraint with the correspond...
double evaluate(const std::vector< double > &temporalvalues) const
Return a value representing the quality of the solution for the constraint.
bool extraVariables() const
Return true if the constraint needs extra variables in the matrix formulation.
bool canBeTurnedToYields() const
Return true if the constraint can be turned to a simple action bound using a simple yield.
int getThemeTarget() const
Return the theme target of the constraint.
size_t getGroup() const
Return the group of the constraint (objective = 0, spatial = 1, other = 2 or user defined).
Filter built from masks used to preSolve and postsolve FMTMask objects.
Definition: FMTMaskFilter.h:31
Class letting the user formulate a constraint in the optimize section or collect data across the grap...
Definition: FMTOutput.h:37
FMTList containing multiple yield handlers as seen in the yield section, holding the information rela...
Definition: FMTYields.h:44
The Core namespace provides classes for simulating stands/strata growth/harvest through time.
Definition: FMTAction.h:34
FMTconstrainttype
Enumerator of the constraint and objective types found in an optimization section,...
Definition: FMTConstraint.h:31
@ FMTsequence
Definition: FMTConstraint.h:38
@ FMTspatialadjacency
Definition: FMTConstraint.h:41
@ FMTrandomaction
Definition: FMTConstraint.h:44
@ FMTstandard
Definition: FMTConstraint.h:39
@ FMTMINMAXobjective
Definition: FMTConstraint.h:35
@ FMTSpatialGroup
Definition: FMTConstraint.h:43
@ FMTnondeclining
Definition: FMTConstraint.h:37
@ FMTMAXMINobjective
Definition: FMTConstraint.h:34
@ FMTspatialsize
Regular constraint m_type like output = 1...
Definition: FMTConstraint.h:40
@ FMTMAXobjective
Definition: FMTConstraint.h:32
@ FMTMINobjective
Definition: FMTConstraint.h:33
@ FMTevenflow
Definition: FMTConstraint.h:36
@ FMTspatialgreenup
Definition: FMTConstraint.h:42