1 #ifndef PMPL_GOAL_TRACKER_H_
2 #define PMPL_GOAL_TRACKER_H_
12 #include <unordered_set>
25 template <
typename Roadmap,
typename Task>
33 typedef typename Roadmap::VI
VI;
34 typedef typename Roadmap::VID
VID;
40 typedef std::unordered_set<VID>
VIDSet;
49 GoalMap(Roadmap*
const _r,
const Task*
const _t);
95 void TrackCfg(const
VI _vertex);
100 void UntrackCfg(const
VI _vertex);
103 std::
string GetHookLabel() const noexcept;
109 static std::atomic<
size_t> s_index;
111 const
size_t m_index;
112 Roadmap* const m_roadmap;
113 const Task* const m_task;
119 std::vector<
VIDSet> m_goalVIDs;
127 template <typename Roadmap, typename Task>
128 std::atomic<
size_t>
GoalMap<Roadmap, Task>::s_index(0);
131 template <typename Roadmap, typename Task>
133 GoalMap(Roadmap* const _roadmap, const Task* const _task)
134 : m_index(++s_index), m_roadmap(_roadmap), m_task(_task) {
147 m_goalVIDs.resize(m_task->GetNumGoals());
150 for(
auto vi = m_roadmap->begin(); vi != m_roadmap->end(); ++vi)
155 template <
typename Roadmap,
typename Task>
162 template <
typename Roadmap,
typename Task>
170 template <
typename Roadmap,
typename Task>
174 if(_index > m_goalVIDs.size())
176 << _index <<
", but only "
177 << m_goalVIDs.size() <<
" constraints are "
178 <<
"present in task '" << m_task->GetLabel()
180 return m_goalVIDs[_index];
184 template <
typename Roadmap,
typename Task>
191 for(
const auto& vids : m_goalVIDs)
192 count += vids.empty();
198 template <
typename Roadmap,
typename Task>
202 std::vector<size_t> indexes;
205 for(
size_t i = 0; i < m_goalVIDs.size(); ++i)
206 if(m_goalVIDs[i].empty())
207 indexes.push_back(i);
214 template <
typename Roadmap,
typename Task>
218 using HT =
typename Roadmap::HookType;
220 const std::string& label = this->GetHookLabel();
222 m_roadmap->InstallHook(HT::AddVertex, label,
223 [
this](
const VI _vi){this->TrackCfg(_vi);});
225 m_roadmap->InstallHook(HT::DeleteVertex, label,
226 [
this](
const VI _vi){this->UntrackCfg(_vi);});
230 template <
typename Roadmap,
typename Task>
234 using HT =
typename Roadmap::HookType;
236 const std::string& label = this->GetHookLabel();
238 if(m_roadmap->IsHook(HT::AddVertex, label))
239 m_roadmap->RemoveHook(HT::AddVertex, label);
241 if(m_roadmap->IsHook(HT::DeleteVertex, label))
242 m_roadmap->RemoveHook(HT::DeleteVertex, label);
247 template <
typename Roadmap,
typename Task>
252 const VID vid = _vertex->descriptor();
253 const auto& cfg = _vertex->property();
256 if(m_task->EvaluateStartConstraints(cfg))
257 m_startVIDs.insert(vid);
260 const size_t numGoals = m_task->GetNumGoals();
261 for(
size_t i = 0; i < numGoals; ++i)
262 if(m_task->EvaluateGoalConstraints(cfg, i))
263 m_goalVIDs[i].insert(vid);
267 template <
typename Roadmap,
typename Task>
272 const VID vid = _vertex->descriptor();
275 if(m_startVIDs.count(vid))
276 m_startVIDs.erase(vid);
279 for(
auto& vids : m_goalVIDs)
285 template <
typename Roadmap,
typename Task>
289 return "GoalMap" + std::to_string(m_index);
334 template <
typename Roadmap,
typename Task>
350 template <
typename Roadmap,
typename Task>
352 const size_t _index)
const;
363 template <
typename Roadmap,
typename Task>
377 template <
typename Roadmap,
typename Task>
379 const Task*
const _task)
const;
417 typedef std::pair<RoadmapType*, const MPTask*> IndividualKey;
418 typedef std::pair<GroupRoadmapType*, const GroupTask*> GroupKey;
428 const MPTask*
const _task)
const;
439 std::map<IndividualKey, IndividualMap> m_individualMaps;
440 std::map<GroupKey, GroupMap> m_groupMaps;
#define WHERE
Macro for retrieving info about file, function, and line number.
Definition: RuntimeUtils.h:32
Definition: GenericStateGraph.h:67
STAPLGraph::vertex_descriptor VID
Definition: GenericStateGraph.h:83
Definition: GoalTracker.h:26
const VIDSet & GetGoalVIDs(const size_t _index) const noexcept
Definition: GoalTracker.h:173
Roadmap::VI VI
Definition: GoalTracker.h:33
void InstallHooks() noexcept
Install hooks in the roadmap for mapping new configurations.
Definition: GoalTracker.h:217
void RemoveHooks() noexcept
Remove hooks from the roadmap.
Definition: GoalTracker.h:233
const VIDSet & GetStartVIDs() const noexcept
Definition: GoalTracker.h:165
std::vector< size_t > UnreachedGoalIndexes() const noexcept
Definition: GoalTracker.h:201
std::unordered_set< VID > VIDSet
Definition: GoalTracker.h:40
size_t UnreachedGoalCount() const noexcept
Check the number of unreached goals.
Definition: GoalTracker.h:187
~GoalMap()
Definition: GoalTracker.h:157
GoalMap(Roadmap *const _r, const Task *const _t)
Definition: GoalTracker.h:133
Roadmap::VID VID
Definition: GoalTracker.h:34
Maintains a set of GoalMap for multiple roadmap/task pairs.
Definition: GoalTracker.h:298
RoadmapType::VID VID
Definition: GoalTracker.h:307
MPBaseObject::RoadmapType RoadmapType
Definition: GoalTracker.h:305
std::unordered_set< VID > VIDSet
Definition: GoalTracker.h:313
MPBaseObject::GroupRoadmapType GroupRoadmapType
Definition: GoalTracker.h:306
Definition: GroupRoadmap.h:25
Definition: GroupTask.h:44
Definition: MPBaseObject.h:46
Definition: MPLibrary.h:47
Definition: PMPLExceptions.h:62