28 #include <Qontrol/Model/GenericModel.hpp>
29 #include <Qontrol/Tasks/GenericTask.hpp>
30 #include <Qontrol/Problem/ControlOutput.hpp>
43 template <Qontrol::ControlOutput output>
class TaskSet {
45 TaskSet(std::shared_ptr<Model::GenericModel> model_library)
46 : model_ptr_{model_library} {
57 std::shared_ptr<Task::GenericTask>
add(std::string task_name,
int task_dimension,
58 double task_weight = 1.0) {
59 if (!
exist(task_name)) {
60 auto base_task_ptr = std::make_shared<Task::GenericTask>(
61 task_name, task_dimension, model_ptr_->getNrOfDegreesOfFreedom());
62 tasks_ptrs_.push_back(base_task_ptr);
63 tasks_names_.push_back(task_name);
64 tasks_weight_.push_back(task_weight);
67 throw std::logic_error(
"Task with name " + task_name +
" already exist.");
71 std::shared_ptr<Task::GenericTask>
add(std::string task_name,
int task_dimension,
72 int optim_vector_dimension,
double task_weight = 1.0) {
73 if (!
exist(task_name)) {
74 auto base_task_ptr = std::make_shared<Task::GenericTask>(
75 task_name, task_dimension, optim_vector_dimension);
76 tasks_ptrs_.push_back(base_task_ptr);
77 tasks_names_.push_back(task_name);
78 tasks_weight_.push_back(task_weight);
81 throw std::logic_error(
"Task with name " + task_name +
" already exist.");
93 template <
template <Qontrol::ControlOutput output2>
class ControlInput>
94 std::shared_ptr<ControlInput<output>>
add(std::string task_name,
95 double task_weight = 1.0) {
96 if (!
exist(task_name)) {
97 auto task_ptr = std::shared_ptr<ControlInput<output>>(
98 new ControlInput<output>(task_name, model_ptr_));
100 tasks_ptrs_.push_back(task_ptr);
101 tasks_names_.push_back(task_name);
102 tasks_weight_.push_back(task_weight);
105 throw std::logic_error(
"Task with name " + task_name +
" already exist.");
115 return (findTaskIterator(task_name) != tasks_names_.end());
123 for (
auto task : tasks_ptrs_)
124 PLOGD <<
"Task name " << task->getName();
132 for (
auto task : tasks_ptrs_) {
142 std::vector<std::shared_ptr<Task::GenericTask>>
getTasks() {
162 if (
exist(task_name)) {
163 auto itr = findTaskIterator(task_name);
164 return std::distance(tasks_names_.begin(), itr);
166 PLOGI <<
"Task " << task_name <<
" doesn't exist. Cannot get it's index.";
176 void remove(std::shared_ptr<Task::GenericTask> task_ptr) {
177 remove(task_ptr->getName());
186 if (
exist(task_name)) {
188 tasks_ptrs_.erase(tasks_ptrs_.begin() + index);
189 tasks_names_.erase(tasks_names_.begin() + index);
190 tasks_weight_.erase(tasks_weight_.begin() + index);
200 bool setTaskWeight(std::shared_ptr<Task::GenericTask> task,
double task_weight) {
211 if (
exist(task_name)) {
212 tasks_weight_.at(
getTaskIndex(task_name)) = task_weight;
215 PLOGW <<
"Task " << task_name <<
" doesn't exist. Cannot set its weight";
221 std::shared_ptr<Model::GenericModel> model_ptr_;
222 std::vector<std::string> tasks_names_;
231 std::vector<std::string>::iterator findTaskIterator(std::string task_name) {
232 return std::find(tasks_names_.begin(), tasks_names_.end(), task_name);
235 std::vector<std::shared_ptr<Task::GenericTask>> tasks_ptrs_;
236 std::vector<double> tasks_weight_;