TVM  0.9.4
ControlProblem.h
Go to the documentation of this file.
1 
3 #pragma once
4 
5 #include <tvm/Task.h>
6 #include <tvm/graph/CallGraph.h>
12 #include <tvm/task_dynamics/None.h>
14 #include <tvm/utils/ProtoTask.h>
15 
16 #include <memory>
17 #include <vector>
18 
19 namespace tvm
20 {
22 {
23 public:
25 
28 };
29 
30 using TaskWithRequirementsPtr = std::shared_ptr<TaskWithRequirements>;
31 
33 {
35 
36 public:
37  ControlProblem() = default;
45  ControlProblem(const ControlProblem &) = delete;
47 
49  template<constraint::Type T>
52  const requirements::SolvingRequirements & req = {});
53  template<constraint::Type T>
54  TaskWithRequirementsPtr add(utils::LinearProtoTask<T> proto,
55  const task_dynamics::abstract::TaskDynamics & td,
56  const requirements::SolvingRequirements & req = {});
57  template<constraint::Type T>
58  TaskWithRequirementsPtr add(utils::LinearProtoTask<T> proto, const requirements::SolvingRequirements & req = {});
60  void remove(const TaskWithRequirements & tr);
61  const std::vector<TaskWithRequirementsPtr> & tasks() const;
62 
64  int size() const;
65 
67  void update();
68 
70  void finalize();
71 
73  const graph::CallGraph & updateGraph() const;
74 
75 protected:
76  class Updater
77  {
78  public:
80 
81  template<typename T, typename... Args>
82  void addInput(std::shared_ptr<T> source, Args... args);
83  template<typename T>
84  void removeInput(T * source);
85 
87  void refresh();
89  void run();
90 
91  const graph::CallGraph & updateGraph() const;
92 
93  private:
94  bool upToDate_;
95  std::shared_ptr<graph::internal::Inputs> inputs_;
96  graph::CallGraph updateGraph_;
97  };
98 
99  virtual void update_() {}
100  virtual void finalize_() {}
101 
102  void needFinalize();
104 
106 
107 private:
108  void addCallBackToTask(TaskWithRequirementsPtr tr);
109 
110  // Note: we want to keep the tasks in the order they were introduced, mostly
111  // for human understanding and debugging purposes, so that we take a
112  // std::vector.
113  // If this induces too much overhead when adding/removing a constraint, then
114  // we should consider std::set.
115  std::vector<TaskWithRequirementsPtr> tr_;
116 
117  // Tokens to identify and keep callbacks alive
119 
120  // Computation data for the resolution schemes
121  std::map<scheme::identifier, std::unique_ptr<scheme::internal::ProblemComputationData>> computationData_;
122 
123  bool finalized_ = false;
124 
125  template<typename Problem, typename Scheme>
127  Problem & problem,
128  const Scheme & resolutionScheme);
129 };
130 
131 template<constraint::Type T>
135 { return add({proto, td}, req); }
136 
137 template<constraint::Type T>
141 { return add({proto, td}, req); }
142 
143 template<constraint::Type T>
146 { return add({proto, task_dynamics::None()}, req); }
147 
148 template<typename T, typename... Args>
149 inline void ControlProblem::Updater::addInput(std::shared_ptr<T> source, Args... args)
150 {
151  inputs_->addInput(source, args...);
152  upToDate_ = false;
153 }
154 
155 template<typename T>
157 {
158  inputs_->removeInput(source);
159  upToDate_ = false;
160 }
161 } // namespace tvm
#define TVM_DLLAPI
Definition: api.h:35
Definition: ControlProblem.h:77
void removeInput(T *source)
Definition: ControlProblem.h:156
const graph::CallGraph & updateGraph() const
void addInput(std::shared_ptr< T > source, Args... args)
Definition: ControlProblem.h:149
Definition: ControlProblem.h:33
ControlProblem & operator=(const ControlProblem &)=delete
virtual void finalize_()
Definition: ControlProblem.h:100
void notify(const scheme::internal::ProblemDefinitionEvent &e)
ControlProblem(const ControlProblem &)=delete
void add(TaskWithRequirementsPtr tr)
const graph::CallGraph & updateGraph() const
virtual void update_()
Definition: ControlProblem.h:99
ControlProblem()=default
TaskWithRequirementsPtr add(const Task &task, const requirements::SolvingRequirements &req={})
void remove(const TaskWithRequirements &tr)
const std::vector< TaskWithRequirementsPtr > & tasks() const
Updater updater_
Definition: ControlProblem.h:105
Definition: LinearizedControlProblem.h:24
Definition: ControlProblem.h:22
Task task
Definition: ControlProblem.h:26
requirements::SolvingRequirementsWithCallbacks requirements
Definition: ControlProblem.h:27
TaskWithRequirements(const Task &task, requirements::SolvingRequirements req)
Definition: Task.h:20
Definition: CallGraph.h:23
Definition: ObjWithId.h:14
Definition: SolvingRequirements.h:108
Definition: SolvingRequirements.h:103
Definition: ProblemComputationData.h:27
Definition: ProblemDefinitionEvent.h:19
Definition: None.h:17
Definition: TaskDynamics.h:37
Definition: ProtoTask.h:29
ProblemComputationData * getComputationData(Problem &problem, const Scheme &resolutionScheme)
std::map< KeyWithId, Value, IdLess< KeyWithId >, Allocator > map
Definition: map.h:41
Definition: Clock.h:12
std::shared_ptr< TaskWithRequirements > TaskWithRequirementsPtr
Definition: ControlProblem.h:30