TVM  0.9.4
HierarchicalLeastSquares.h
Go to the documentation of this file.
1 
3 #pragma once
4 
5 #include <tvm/internal/traits.h>
10 
11 namespace tvm
12 {
13 
14 namespace scheme
15 {
18 {
21  TVM_ADD_NON_DEFAULT_OPTION(autoDamping, false)
22 };
23 
26 {
27 private:
28  struct Memory : public internal::LinearizedProblemComputationData
29  {
30  Memory(int solverId, std::unique_ptr<solver::abstract::HierarchicalLeastSquareSolver> solver);
31 
32  void reset(std::unique_ptr<solver::abstract::HierarchicalLeastSquareSolver> solver);
33 
34  std::unique_ptr<solver::abstract::HierarchicalLeastSquareSolver> solver;
35 
36  protected:
37  void setVariablesToSolution_(tvm::internal::VariableCountingVector & x) override;
38  };
39 
40  const static internal::SchemeAbilities abilities_;
41 
43  template<typename T>
44  using isFactory = std::is_base_of<solver::abstract::HLSSolverFactory, T>;
46  template<typename T>
47  struct FactoryMemberIsFactory
48  {
49  static constexpr bool value = isFactory<typename T::Factory>::value;
50  };
52  template<typename T>
53  using isHLSSolverFactoryOption =
54  std::conjunction<tvm::internal::has_public_member_type_Factory<T>, FactoryMemberIsFactory<T>>;
55 
56 public:
57  using ComputationDataType = Memory;
58 
64  template<class SolverFactory, typename std::enable_if<isFactory<SolverFactory>::value, int>::type = 0>
65  HierarchicalLeastSquares(const SolverFactory & solverFactory, HierarchicalLeastSquaresOptions schemeOptions = {})
66  : LinearResolutionScheme<HierarchicalLeastSquares>(abilities_), options_(schemeOptions),
67  solverFactory_(solverFactory.clone())
68  {}
69 
77  template<class SolverOptions, typename std::enable_if<isHLSSolverFactoryOption<SolverOptions>::value, int>::type = 0>
78  HierarchicalLeastSquares(const SolverOptions & solverOptions, HierarchicalLeastSquaresOptions schemeOptions = {})
79  : HierarchicalLeastSquares(typename SolverOptions::Factory(solverOptions), schemeOptions)
80  {}
81 
85  template<typename T,
86  typename std::enable_if<!isFactory<T>::value && !isHLSSolverFactoryOption<T>::value, int>::type = 0>
88  : LinearResolutionScheme<HierarchicalLeastSquares>(abilities_)
89  {
91  "First argument can only be a HLSSolverFactory or a solver configuration. "
92  "A configuration needs to have a Factory member type that is itself deriving from HLSSolverFactory. "
93  "See LexLSHLSSolverOptions for an example.");
94  }
95 
104 
108  std::unique_ptr<Memory> createComputationData_(const LinearizedControlProblem & problem) const;
109 
110 protected:
111  void resetComputationData(const LinearizedControlProblem & problem, Memory * memory) const;
112  void processProblem(const LinearizedControlProblem & problem, Memory * memory) const;
113 
114  void addTask(const LinearizedControlProblem & problem,
115  Memory * memory,
116  const TaskWithRequirements & task,
117  solver::internal::SolverEvents & se) const;
118  void removeTask(const LinearizedControlProblem & problem,
119  Memory * memory,
120  const TaskWithRequirements & task,
121  solver::internal::SolverEvents & se) const;
122 
125  std::unique_ptr<solver::abstract::HLSSolverFactory> solverFactory_;
126 };
127 
128 } // namespace scheme
129 
130 } // namespace tvm
#define TVM_ADD_NON_DEFAULT_OPTION(optionName, defaultValue)
Definition: Option.h:30
#define TVM_DLLAPI
Definition: api.h:35
Definition: LinearizedControlProblem.h:24
Definition: ControlProblem.h:22
Definition: VariableCountingVector.h:30
Definition: meta.h:91
Definition: HierarchicalLeastSquares.h:18
Definition: HierarchicalLeastSquares.h:26
void addTask(const LinearizedControlProblem &problem, Memory *memory, const TaskWithRequirements &task, solver::internal::SolverEvents &se) const
HierarchicalLeastSquares & operator=(const HierarchicalLeastSquares &)=delete
void updateComputationData_(const LinearizedControlProblem &problem, internal::ProblemComputationData *data) const
void resetComputationData(const LinearizedControlProblem &problem, Memory *memory) const
HierarchicalLeastSquares(const T &, HierarchicalLeastSquaresOptions={})
Definition: HierarchicalLeastSquares.h:87
Memory ComputationDataType
Definition: HierarchicalLeastSquares.h:57
HierarchicalLeastSquares & operator=(HierarchicalLeastSquares &&)=delete
HierarchicalLeastSquares(HierarchicalLeastSquares &&)=delete
bool solve_(const LinearizedControlProblem &problem, internal::ProblemComputationData *data) const
std::unique_ptr< Memory > createComputationData_(const LinearizedControlProblem &problem) const
HierarchicalLeastSquares(const HierarchicalLeastSquares &)=delete
void removeTask(const LinearizedControlProblem &problem, Memory *memory, const TaskWithRequirements &task, solver::internal::SolverEvents &se) const
HierarchicalLeastSquares(const SolverOptions &solverOptions, HierarchicalLeastSquaresOptions schemeOptions={})
Definition: HierarchicalLeastSquares.h:78
std::unique_ptr< solver::abstract::HLSSolverFactory > solverFactory_
Definition: HierarchicalLeastSquares.h:125
HierarchicalLeastSquares(const SolverFactory &solverFactory, HierarchicalLeastSquaresOptions schemeOptions={})
Definition: HierarchicalLeastSquares.h:65
void processProblem(const LinearizedControlProblem &problem, Memory *memory) const
HierarchicalLeastSquaresOptions options_
Definition: HierarchicalLeastSquares.h:123
Definition: ResolutionScheme.h:65
Definition: LinearizedProblemComputationData.h:20
Definition: ProblemComputationData.h:27
Definition: SchemeAbilities.h:59
Definition: SolverEvents.h:14
Definition: Clock.h:12