TVM  0.9.4
LeastSquareSolver.h
Go to the documentation of this file.
1 /* Copyright 2017-2020 CNRS-AIST JRL and CNRS-UM LIRMM */
2 
3 #pragma once
4 
5 #include <tvm/api.h>
6 #include <tvm/defs.h>
7 
12 #include <tvm/utils/internal/map.h>
13 
14 namespace tvm
15 {
16 
17 namespace solver
18 {
19 
20 namespace abstract
21 {
37 {
38 public:
39  LeastSquareSolver(bool verbose = false);
42  virtual ~LeastSquareSolver() = default;
58  void startBuild(const VariableVector & x,
59  int nObj,
60  int nEq,
61  int nIneq,
62  bool useBounds = true,
63  const hint::internal::Substitutions * const subs = nullptr);
65  void finalizeBuild();
66 
71 
74 
81  void addObjective(LinearConstraintPtr obj, SolvingRequirementsPtr req, double additionalWeight = 1);
82 
87 
91  bool solve();
92 
94  const Eigen::VectorXd & result() const;
95 
101 
107  void process(const internal::SolverEvents & se);
108 
109 protected:
111  {
112  bool equalityConstraints_ = false;
113  bool inequalityConstraints_ = false;
114  bool bounds_ = false;
115  bool objectives_ = false;
116 
117  template<typename Derived>
118  static bool willReallocate(const Eigen::DenseBase<Derived> & M, int rows, int cols = 1);
119 
124 
125  bool any() const { return equalityConstraints_ || inequalityConstraints_ || bounds_ || objectives_; }
126  };
127 
128  virtual void initializeBuild_(int nObj, int nEq, int nIneq, bool useBounds) = 0;
129  virtual ImpactFromChanges resize_(int nObj, int nEq, int nIneq, bool useBounds) = 0;
130  virtual void addBound_(LinearConstraintPtr bound, RangePtr range, bool first) = 0;
133  virtual void addObjective_(LinearConstraintPtr obj, SolvingRequirementsPtr req, double additionalWeight = 1) = 0;
134  virtual void setMinimumNorm_() = 0;
135  virtual void resetBounds_() = 0;
136  virtual void preAssignmentProcess_() {}
137  virtual void postAssignmentProcess_() {}
138  virtual bool solve_() = 0;
139  virtual const Eigen::VectorXd & result_() const = 0;
140  virtual bool handleDoubleSidedConstraint_() const = 0;
147  virtual void removeBounds_(const Range & range) = 0;
152 
156  virtual void applyImpactLogic(ImpactFromChanges & impact);
157 
158  virtual void printProblemData_() const = 0;
159  virtual void printDiagnostic_() const = 0;
160 
161  const VariableVector & variables() const { return *variables_; }
162  const hint::internal::Substitutions * substitutions() const { return subs_; }
163 
164  template<typename... Args>
165  void addAssignement(Args &&... args);
166 
167 private:
168  void updateWeights(const internal::SolverEvents & se);
169  bool updateVariables(const internal::SolverEvents & se);
170  ImpactFromChanges processRemovedConstraints(const internal::SolverEvents & se);
171  ImpactFromChanges previewAddedConstraints(const internal::SolverEvents & se);
172  void processAddedConstraints(const internal::SolverEvents & se);
173 
174 public:
176  {
177  template<typename... Args>
178  MarkedAssignment(Args &&... args) : assignment(std::forward<Args>(args)...), markedForRemoval(false)
179  {}
182  };
183  template<typename K, typename T>
185  using AssignmentVector = std::vector<std::unique_ptr<MarkedAssignment>>;
186  using AssignmentPtrVector = std::vector<MarkedAssignment *>;
188 
189 protected:
190  int nEq_;
191  int nIneq_;
192  int nObj_;
193  int objSize_;
194  int eqSize_;
196 
197 private:
198  bool buildInProgress_;
199  bool verbose_;
200  VariableVector const * variables_;
202  AssignmentVector assignments_;
207  MapToAssignment objectiveToAssignments_;
208  MapToAssignment equalityConstraintToAssignments_;
209  MapToAssignment inequalityConstraintToAssignments_;
210  MapToAssignment boundToAssignments_;
211  const hint::internal::Substitutions * subs_;
212 };
213 
220 {
221 protected:
222  LSSolverFactory(const std::string & solverName) : solverName_(solverName) {}
223 
224 public:
225  virtual ~LSSolverFactory() = default;
226 
227  virtual std::unique_ptr<LSSolverFactory> clone() const = 0;
228  virtual std::unique_ptr<LeastSquareSolver> createSolver() const = 0;
229 
230 private:
231  std::string solverName_;
232 };
233 
234 template<typename... Args>
235 inline void LeastSquareSolver::addAssignement(Args &&... args)
236 { assignments_.emplace_back(new MarkedAssignment(std::forward<Args>(args)...)); }
237 
238 template<typename Derived>
239 inline bool LeastSquareSolver::ImpactFromChanges::willReallocate(const Eigen::DenseBase<Derived> & M,
240  int rows,
241  int cols)
242 { return M.rows() * M.cols() != rows * cols; }
243 
244 } // namespace abstract
245 
246 } // namespace solver
247 
248 } // namespace tvm
#define TVM_DLLAPI
Definition: api.h:35
Definition: Range.h:19
Definition: VariableVector.h:41
Definition: LinearConstraint.h:56
Definition: Substitutions.h:24
Definition: AssignmentTarget.h:37
Definition: Assignment.h:32
Definition: LeastSquareSolver.h:220
LSSolverFactory(const std::string &solverName)
Definition: LeastSquareSolver.h:222
virtual std::unique_ptr< LSSolverFactory > clone() const =0
virtual std::unique_ptr< LeastSquareSolver > createSolver() const =0
Definition: LeastSquareSolver.h:37
virtual void addObjective_(LinearConstraintPtr obj, SolvingRequirementsPtr req, double additionalWeight=1)=0
LeastSquareSolver(const LeastSquareSolver &)=delete
std::vector< MarkedAssignment * > AssignmentPtrVector
Definition: LeastSquareSolver.h:186
virtual void preAssignmentProcess_()
Definition: LeastSquareSolver.h:136
int objSize_
Definition: LeastSquareSolver.h:193
virtual Range nextInequalityConstraintRange_(const constraint::abstract::LinearConstraint &cstr) const =0
int nObj_
Definition: LeastSquareSolver.h:192
int constraintSize(const constraint::abstract::LinearConstraint &c) const
const VariableVector & variables() const
Definition: LeastSquareSolver.h:161
std::vector< std::unique_ptr< MarkedAssignment > > AssignmentVector
Definition: LeastSquareSolver.h:185
int nIneq_
Definition: LeastSquareSolver.h:191
void addBound(LinearConstraintPtr bound)
void addConstraint(LinearConstraintPtr cstr)
LeastSquareSolver & operator=(const LeastSquareSolver &)=delete
virtual void addIneqalityConstraint_(LinearConstraintPtr cstr)=0
virtual void addEqualityConstraint_(LinearConstraintPtr cstr)=0
virtual Range nextObjectiveRange_(const constraint::abstract::LinearConstraint &cstr) const =0
utils::internal::map< K, T > map
Definition: LeastSquareSolver.h:184
virtual void updateObjectiveTargetData(scheme::internal::AssignmentTarget &target)=0
void addObjective(LinearConstraintPtr obj, SolvingRequirementsPtr req, double additionalWeight=1)
virtual void updateBoundTargetData(scheme::internal::AssignmentTarget &target)=0
virtual Range nextEqualityConstraintRange_(const constraint::abstract::LinearConstraint &cstr) const =0
map< constraint::abstract::LinearConstraint *, AssignmentPtrVector > MapToAssignment
Definition: LeastSquareSolver.h:187
virtual const Eigen::VectorXd & result_() const =0
virtual bool handleDoubleSidedConstraint_() const =0
virtual void updateInequalityTargetData(scheme::internal::AssignmentTarget &target)=0
virtual void removeBounds_(const Range &range)=0
virtual void printProblemData_() const =0
int ineqSize_
Definition: LeastSquareSolver.h:195
virtual void printDiagnostic_() const =0
void startBuild(const VariableVector &x, int nObj, int nEq, int nIneq, bool useBounds=true, const hint::internal::Substitutions *const subs=nullptr)
void addAssignement(Args &&... args)
Definition: LeastSquareSolver.h:235
virtual void updateEqualityTargetData(scheme::internal::AssignmentTarget &target)=0
virtual void initializeBuild_(int nObj, int nEq, int nIneq, bool useBounds)=0
int eqSize_
Definition: LeastSquareSolver.h:194
const hint::internal::Substitutions * substitutions() const
Definition: LeastSquareSolver.h:162
const Eigen::VectorXd & result() const
virtual void applyImpactLogic(ImpactFromChanges &impact)
virtual void postAssignmentProcess_()
Definition: LeastSquareSolver.h:137
void process(const internal::SolverEvents &se)
virtual void addBound_(LinearConstraintPtr bound, RangePtr range, bool first)=0
virtual ImpactFromChanges resize_(int nObj, int nEq, int nIneq, bool useBounds)=0
int nEq_
Definition: LeastSquareSolver.h:190
Definition: SolverEvents.h:14
Definition: probe.h:44
std::map< KeyWithId, Value, IdLess< KeyWithId >, Allocator > map
Definition: map.h:41
Definition: Clock.h:12
std::shared_ptr< constraint::abstract::LinearConstraint > LinearConstraintPtr
Definition: defs.h:59
std::shared_ptr< Range > RangePtr
Definition: defs.h:61
std::shared_ptr< requirements::SolvingRequirementsWithCallbacks > SolvingRequirementsPtr
Definition: defs.h:63
ImpactFromChanges & orAssign(const ImpactFromChanges &other)
static bool willReallocate(const Eigen::DenseBase< Derived > &M, int rows, int cols=1)
Definition: LeastSquareSolver.h:239
ImpactFromChanges operator||(const ImpactFromChanges &other)
bool any() const
Definition: LeastSquareSolver.h:125
scheme::internal::Assignment assignment
Definition: LeastSquareSolver.h:180
bool markedForRemoval
Definition: LeastSquareSolver.h:181
MarkedAssignment(Args &&... args)
Definition: LeastSquareSolver.h:178