TVM  0.9.4
Assignment.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 
8 #include <tvm/Variable.h> // Range
15 
16 #include <Eigen/Core>
17 
18 #include <memory>
19 #include <type_traits>
20 #include <vector>
21 
23 {
24 
32 {
33 public:
37  using RHSFunction = const Eigen::VectorXd & (constraint::abstract::LinearConstraint::*)() const;
38 
42  using MatrixFunction = MatrixRef (AssignmentTarget::*)(int, int) const;
43 
49 
51  struct IWontForgetToCallUpdates
52  {};
53 
67  const AssignmentTarget & target,
68  const VariableVector & variables,
69  const hint::internal::Substitutions * const subs = nullptr,
70  double scalarizationWeight = 1);
71 
77  Assignment(LinearConstraintPtr source, const AssignmentTarget & target, const VariablePtr & variables, bool first);
78 
79  Assignment(const Assignment &) = delete;
80  Assignment(Assignment &&) = default;
81  Assignment & operator=(const Assignment &) = delete;
82  Assignment & operator=(Assignment &&) = default;
83 
85  static Assignment reprocess(const Assignment &, const VariablePtr &, bool);
86 
87  AssignmentTarget & target(IWontForgetToCallUpdates = {});
91 
97  void onUpdatedMapping(const VariableVector & newVar, bool updateMatrixtarget = true);
99  void onUpdateWeights(bool scalar = true, bool vector = true);
100 
102  void run();
103 
104  static double big_;
105 
106 private:
110  void checkTarget();
111 
112  void checkBounds();
113 
117  void build(const VariableVector & variables);
118 
124  void build(const VariablePtr & variable, bool first);
125 
127  void processRequirements();
128 
133  void addMatrixAssignment(Variable & x, MatrixFunction M, const Range & range, bool flip);
134 
139  void addMatrixSubstitutionAssignments(const VariableVector & variables,
140  Variable & x,
141  MatrixFunction M,
142  const function::BasicLinearFunction & sub,
143  bool flip);
144 
150  template<AssignType A = AssignType::COPY, typename From, typename To>
151  void addVectorAssignment(const From & f, To v, bool flip, bool useFRHS = true, bool useTRHS = true);
152 
159  template<AssignType A = AssignType::COPY, typename From, typename To>
160  void addVectorAssignment(const From & f,
161  To v,
162  const MatrixConstRef & D,
163  bool flip,
164  bool useFRHS = true,
165  bool useTRHS = true);
166 
170  void addVectorSubstitutionAssignments(const function::BasicLinearFunction & sub,
171  VectorFunction v,
172  Variable & x,
173  bool flip);
174 
178  template<AssignType A = AssignType::COPY, typename To>
179  void addVectorAssignment(double d, To v, bool flip = false, bool useFRHS = true, bool useTRHS = true);
180 
185  template<AssignType A = AssignType::COPY, typename To>
186  void addVectorAssignment(double d,
187  To v,
188  const MatrixConstRef & D,
189  bool flip = false,
190  bool useFRHS = true,
191  bool useTRHS = true);
192 
197  void addZeroAssignment(Variable & x, MatrixFunction M, const Range & range);
198 
203  void addAssignments(const VariableVector & variables, MatrixFunction M, RHSFunction f, VectorFunction v, bool flip);
204 
209  void addAssignments(const VariableVector & variables,
210  MatrixFunction M,
211  RHSFunction f1,
212  VectorFunction v1,
213  RHSFunction f2,
214  VectorFunction v2);
215 
224  void addAssignments(const VariableVector & variables,
225  MatrixFunction M,
226  RHSFunction f1,
227  VectorFunction v1,
228  RHSFunction f2,
229  VectorFunction v2,
230  bool flip);
231 
232  void addBound(const VariablePtr & variable, RHSFunction f, bool first);
233 
234  template<typename L, typename U>
235  void addBounds(const VariablePtr & variable, L l, U u, bool first);
236 
237  template<typename L, typename U, typename TL, typename TU>
238  void addBounds(const VariablePtr & variable, L l, U u, TL tl, TU tu, bool first);
239 
244  template<typename T, AssignType A, typename U>
245  CompiledAssignmentWrapper<T> createAssignment(const U & from, const Eigen::Ref<T> & to, bool flip = false);
246 
251  template<typename T, AssignType A, MatrixMult M = GENERAL, typename U, typename V>
252  CompiledAssignmentWrapper<T> createMultiplicationAssignment(const U & from,
253  const Eigen::Ref<T> & to,
254  const V & Mult,
255  bool flip = false);
256 
258  LinearConstraintPtr source_;
260  AssignmentTarget target_;
262  double scalarizationWeight_;
264  SolvingRequirementsPtr requirements_;
266  bool useDefaultScalarWeight_;
268  bool useDefaultAnisotropicWeight_;
270  std::vector<MatrixAssignment> matrixAssignments_;
275  std::vector<MatrixAssignment> matrixSubstitutionAssignments_;
277  std::vector<VectorAssignment> vectorAssignments_;
281  std::vector<VectorSubstitutionAssignement> vectorSubstitutionAssignments_;
282 
284  VariableVector substitutedVariables_;
285  std::vector<std::shared_ptr<function::BasicLinearFunction>> variableSubstitutions_;
286 
290  struct ReferenceableData
291  {
293  double scalarWeight_ = 1;
294  double minusScalarWeight_ = -1;
295  Eigen::VectorXd anisotropicWeight_;
296  Eigen::VectorXd minusAnisotropicWeight_;
297 
299  Eigen::VectorXd tmp1_;
300  Eigen::VectorXd tmp2_;
301  Eigen::VectorXd tmp3_;
302  Eigen::VectorXd tmp4_;
303  };
304 
305  std::unique_ptr<ReferenceableData> data_;
306 };
307 
308 } // namespace tvm::scheme::internal
309 
310 #include <tvm/scheme/internal/Assignment.hpp>
#define TVM_DLLAPI
Definition: api.h:35
Definition: Range.h:19
Definition: VariableVector.h:41
Definition: Variable.h:49
Definition: LinearConstraint.h:56
Definition: BasicLinearFunction.h:22
Definition: Substitutions.h:24
Definition: AssignmentTarget.h:37
Definition: Assignment.h:32
void onUpdateWeights(bool scalar=true, bool vector=true)
Assignment & operator=(const Assignment &)=delete
Assignment & operator=(Assignment &&)=default
AssignmentTarget & target(IWontForgetToCallUpdates={})
VectorRef(AssignmentTarget::*)() const VectorFunction
Definition: Assignment.h:48
static Assignment reprocess(const Assignment &, const VariableVector &, const hint::internal::Substitutions *const)
Assignment(Assignment &&)=default
static double big_
Definition: Assignment.h:104
void onUpdatedMapping(const VariableVector &newVar, bool updateMatrixtarget=true)
Assignment(LinearConstraintPtr source, SolvingRequirementsPtr req, const AssignmentTarget &target, const VariableVector &variables, const hint::internal::Substitutions *const subs=nullptr, double scalarizationWeight=1)
static Assignment reprocess(const Assignment &, const VariablePtr &, bool)
const Eigen::VectorXd &(constraint::abstract::LinearConstraint::*)() const RHSFunction
Definition: Assignment.h:37
Assignment(LinearConstraintPtr source, const AssignmentTarget &target, const VariablePtr &variables, bool first)
Assignment(const Assignment &)=delete
MatrixRef(AssignmentTarget::*)(int, int) const MatrixFunction
Definition: Assignment.h:42
Definition: CompiledAssignmentWrapper.h:30
Definition: Assignment.h:23
std::shared_ptr< Variable > VariablePtr
Definition: defs.h:65
Eigen::Ref< Eigen::VectorXd > VectorRef
Definition: defs.h:51
std::shared_ptr< constraint::abstract::LinearConstraint > LinearConstraintPtr
Definition: defs.h:59
Eigen::Ref< Eigen::MatrixXd > MatrixRef
Definition: defs.h:49
Eigen::Ref< const Eigen::MatrixXd > MatrixConstRef
Definition: defs.h:48
std::shared_ptr< requirements::SolvingRequirementsWithCallbacks > SolvingRequirementsPtr
Definition: defs.h:63