TVM  0.9.4
ResolutionScheme.h
Go to the documentation of this file.
1 
3 #pragma once
4 
5 #include <tvm/VariableVector.h>
10 
11 namespace tvm
12 {
13 
14 class LinearizedControlProblem;
15 
16 namespace scheme
17 {
18 
19 namespace abstract
20 {
21 
37 template<typename Derived>
39 {
40 public:
41  template<typename Problem>
42  bool solve(Problem & problem) const;
43 
44  template<typename Problem>
45  std::unique_ptr<internal::ProblemComputationData> createComputationData(const Problem & problem) const;
46 
47  template<typename Problem>
48  void updateComputationData(const Problem & problem, internal::ProblemComputationData * data) const;
49 
51  Derived & derived() { return *static_cast<Derived *>(this); }
53  const Derived & derived() const { return *static_cast<const Derived *>(this); }
54 
55 protected:
56  ResolutionScheme(internal::SchemeAbilities abilities, double big = constant::big_number);
57 };
58 
63 template<typename Derived>
65 {
66 protected:
67  LinearResolutionScheme(internal::SchemeAbilities abilities, double big = constant::big_number);
68 };
69 
70 template<typename Derived>
71 template<typename Problem>
72 inline bool ResolutionScheme<Derived>::solve(Problem & problem) const
73 {
74  auto data = getComputationData(problem, *this);
75  problem.update();
76  updateComputationData(problem, data);
77  bool b = derived().solve_(problem, data);
78  data->setVariablesToSolution();
79  problem.substitutions().updateVariableValues();
80  return b;
81 }
82 
83 template<typename Derived>
84 template<typename Problem>
85 inline std::unique_ptr<internal::ProblemComputationData> ResolutionScheme<Derived>::createComputationData(
86  const Problem & problem) const
87 {
89  return derived().createComputationData_(problem);
91 }
92 
93 template<typename Derived>
94 template<typename Problem>
97 {
99  derived().updateComputationData_(problem, data);
101 }
102 
103 template<typename Derived>
105 : ResolutionSchemeBase(abilities, big)
106 {}
107 
108 template<typename Derived>
110 : ResolutionScheme<Derived>(abilities, big)
111 {}
112 
113 } // namespace abstract
114 
115 } // namespace scheme
116 
117 } // namespace tvm
118 
119 #include <tvm/scheme/internal/helpers.hpp>
Definition: ResolutionScheme.h:65
LinearResolutionScheme(internal::SchemeAbilities abilities, double big=constant::big_number)
Definition: ResolutionScheme.h:109
Definition: ResolutionScheme.h:39
Derived & derived()
Definition: ResolutionScheme.h:51
bool solve(Problem &problem) const
Definition: ResolutionScheme.h:72
std::unique_ptr< internal::ProblemComputationData > createComputationData(const Problem &problem) const
Definition: ResolutionScheme.h:85
ResolutionScheme(internal::SchemeAbilities abilities, double big=constant::big_number)
Definition: ResolutionScheme.h:104
void updateComputationData(const Problem &problem, internal::ProblemComputationData *data) const
Definition: ResolutionScheme.h:95
const Derived & derived() const
Definition: ResolutionScheme.h:53
Definition: ProblemComputationData.h:27
Definition: ResolutionSchemeBase.h:22
Definition: SchemeAbilities.h:59
ProblemComputationData * getComputationData(Problem &problem, const Scheme &resolutionScheme)
void restore_is_malloc_allowed()
Definition: memoryChecks.h:77
void override_is_malloc_allowed(bool allow)
Definition: memoryChecks.h:69
Definition: Clock.h:12