Parasol Planning Library (PPL)
Syclop.h
Go to the documentation of this file.
1 #ifndef PMPL_SYCLOP_H_
2 #define PMPL_SYCLOP_H_
3 
4 #include "BasicRRTStrategy.h"
8 
20 class Syclop : public BasicRRTStrategy {
21  public:
24 
27  typedef typename RoadmapType::VID VID;
28 
32 
33  using typename BasicRRTStrategy::VertexSet;
34 
38 
39  Syclop();
40 
41  Syclop(XMLNode& _node);
42 
43  virtual ~Syclop() = default;
44 
46 
47  protected:
50 
51  virtual void Initialize() override;
52 
56 
59  virtual VID FindNearestNeighbor(
60  const Cfg& _cfg,
61  const VertexSet* const _candidates = nullptr) override;
62 
64  virtual VID Extend(const VID _nearVID,
65  const Cfg& _qRand,
66  LPOutput& _lp,
67  const bool _requireNew = true) override;
68 
70  virtual std::pair<VID, bool> AddNode(const Cfg& _newCfg) override;
71 
73  virtual void AddEdge(const VID _source,
74  const VID _target,
75  const LPOutput& _lpOutput) override;
76 
80 
82  std::vector<VID> DiscreteLead();
83 
85  void FindAvailableRegions(std::vector<VID> _lead);
86 
89 
93 
96  size_t Sel(const WorkspaceRegion* const _r1,
97  const WorkspaceRegion* const _r2);
98 
100  size_t Conn(const WorkspaceRegion* const _r1,
101  const WorkspaceRegion* const _r2);
102 
104  double Cost(const WorkspaceRegion* const _r1,
105  const WorkspaceRegion* const _r2);
106  double Cost(const WorkspacePortal& _p);
107 
111 
112  void ComputeFreeVolumes();
113 
117 
121  struct RegionData {
124 
126  double weight;
127 
129  double alpha;
130 
132  double freeVolume;
133 
135  size_t numTimesSelected{0};
136 
138 
139  std::set<size_t> cells;
141 
142  size_t Coverage() const { return cells.size(); }
143 
147 
149  void AddCell(size_t _index) {
150  cells.insert(_index);
151  UpdateAlpha();
152  UpdateWeight();
153  }
154 
155  void UpdateAlpha() {
156  alpha = 1. / ((1. + Coverage()) * std::pow(freeVolume, 4.));
157  }
158 
159  void UpdateWeight() {
160  weight = std::pow(freeVolume, 4.) /
161  ((1. + Coverage()) * (1. + std::pow(numTimesSelected, 2.)));
162  }
163 
165  };
166 
170  struct RegionPairData {
173  void AddCell(size_t _index) { cells.insert(_index); }
174 
176  size_t Coverage() const { return cells.size(); }
177 
180 
181  size_t numLeadUses{0};
182  size_t numAttempts{0};
183 
184  private:
187  std::set<size_t> cells;
188 
190  };
191 
196  struct WeightFunctor {
199 
201  typedef double value_type;
203 
207 
209 
213 
215 
219 
220  value_type get(property_type& _p) { return m_syclop->Cost(_p); }
221 
222  void put(property_type& _p, value_type& _v) {}
223 
224  template <typename functor>
225  void apply(property_type& _p, functor _f) {
226  _f(_p);
227  }
228 
230  };
231 
235  struct DFSVisitor : public stapl::visitor_base<WorkspaceDecomposition> {
238 
240  typedef stapl::visitor_return visitor_return;
241  typedef std::map<VID, VID> map_type;
242 
246 
248 
252 
254 
258 
260  graph_type::vertex_iterator _vit,
261  graph_type::adj_edge_iterator _eit) override {
262  m_parentMap[_eit->target()] = _eit->source();
263  return visitor_return::CONTINUE;
264  }
265 
267  };
268 
272 
274  std::map<const WorkspaceRegion*, RegionData> m_regionData;
275 
277  std::map<std::pair<const WorkspaceRegion*, const WorkspaceRegion*>,
280 
281  std::string m_tmLabel;
282 
284  std::set<const WorkspaceRegion*> m_availableRegions;
285 
290 
291  size_t m_currentLeadUses{0};
292  size_t m_maxLeadUses{6};
293 
295  size_t m_maxRegionUses{6};
296 
297  std::string m_freeVolumeSampler{"UniformRandom"};
298  std::string m_freeVolumeVcLabel{"pqp_solid"};
299 
301 
302  bool m_improvement{false};
303 
305 };
306 
307 #endif
Definition: BasicRRTStrategy.h:48
size_t VID
Definition: BasicRRTStrategy.h:55
std::unordered_set< VID > VertexSet
Definition: BasicRRTStrategy.h:56
Definition: Cfg.h:38
Definition: Weight.h:36
Definition: GenericStateGraph.h:67
STAPLGraph::vertex_descriptor VID
Definition: GenericStateGraph.h:83
Definition: Syclop.h:20
std::string m_freeVolumeSampler
Definition: Syclop.h:297
size_t Conn(const WorkspaceRegion *const _r1, const WorkspaceRegion *const _r2)
Estimate the progress made in connecting _r1 to _r2.
Definition: Syclop.cpp:443
std::set< const WorkspaceRegion * > m_availableRegions
The currently available regions.
Definition: Syclop.h:284
Syclop()
Definition: Syclop.cpp:17
MPBaseObject::RoadmapType RoadmapType
Definition: Syclop.h:26
virtual std::pair< VID, bool > AddNode(const Cfg &_newCfg) override
As basic RRT, but also updates coverage information.
Definition: Syclop.cpp:110
virtual void Initialize() override
Definition: Syclop.cpp:47
virtual ~Syclop()=default
size_t Sel(const WorkspaceRegion *const _r1, const WorkspaceRegion *const _r2)
Definition: Syclop.cpp:428
bool m_improvement
Have we improved the map w/ current region?
Definition: Syclop.h:302
std::string m_tmLabel
The topological map label.
Definition: Syclop.h:281
MPBaseObject::WeightType WeightType
Definition: Syclop.h:25
std::map< const WorkspaceRegion *, RegionData > m_regionData
Holds extra data associated with the regions.
Definition: Syclop.h:274
std::vector< VID > DiscreteLead()
Compute a high-level plan (a sequence of regions).
Definition: Syclop.cpp:160
std::string m_freeVolumeVcLabel
Definition: Syclop.h:298
const WorkspaceRegion * m_currentRegion
Definition: Syclop.h:300
void ComputeFreeVolumes()
Estimate the free volume of each region.
Definition: Syclop.cpp:462
void FindAvailableRegions(std::vector< VID > _lead)
Compute a set of potential regions from the discrete lead.
Definition: Syclop.cpp:296
RoadmapType::VID VID
Definition: Syclop.h:27
size_t m_currentLeadUses
Definition: Syclop.h:291
virtual VID FindNearestNeighbor(const Cfg &_cfg, const VertexSet *const _candidates=nullptr) override
Definition: Syclop.cpp:86
size_t m_maxRegionUses
Definition: Syclop.h:295
virtual void AddEdge(const VID _source, const VID _target, const LPOutput &_lpOutput) override
As basic RRT, but also updates region edge connectivity information.
Definition: Syclop.cpp:142
const WorkspaceRegion * SelectRegion()
Select a region from a set of available regions.
Definition: Syclop.cpp:335
std::map< std::pair< const WorkspaceRegion *, const WorkspaceRegion * >, RegionPairData > m_regionPairData
Holds extra data associated with region pairs.
Definition: Syclop.h:279
double Cost(const WorkspaceRegion *const _r1, const WorkspaceRegion *const _r2)
Compute the edge weight in the region graph from _r1 to _r2.
Definition: Syclop.cpp:452
size_t m_maxLeadUses
Definition: Syclop.h:292
size_t m_currentRegionUses
Definition: Syclop.h:294
virtual VID Extend(const VID _nearVID, const Cfg &_qRand, LPOutput &_lp, const bool _requireNew=true) override
As basic RRT, but also logs extension attempts.
Definition: Syclop.cpp:96
Definition: WorkspaceDecomposition.h:24
RegionGraph::adj_edge_iterator adj_edge_iterator
Definition: WorkspaceDecomposition.h:40
Definition: WorkspacePortal.h:19
Definition: WorkspaceRegion.h:18
Definition: XMLNode.h:27
Definition: LPOutput.h:24
A visitor to track the parent-child relationships discovered during DFS.
Definition: Syclop.h:235
stapl::visitor_return visitor_return
Definition: Syclop.h:240
std::map< VID, VID > map_type
Definition: Syclop.h:241
DFSVisitor(map_type &_pm)
Definition: Syclop.h:253
virtual visitor_return tree_edge(graph_type::vertex_iterator _vit, graph_type::adj_edge_iterator _eit) override
Definition: Syclop.h:259
WorkspaceDecomposition graph_type
Definition: Syclop.h:239
map_type & m_parentMap
Definition: Syclop.h:247
Holds all external data related to a specific workspace region.
Definition: Syclop.h:121
size_t Coverage() const
Definition: Syclop.h:142
void UpdateAlpha()
Definition: Syclop.h:155
double weight
Relative probability of selecting this region from a lead.
Definition: Syclop.h:126
std::set< size_t > cells
Definition: Syclop.h:139
void AddCell(size_t _index)
Add a cell to this region's cell indexes and update alpha/weight.
Definition: Syclop.h:149
double freeVolume
The estimated free state-space volume of this region.
Definition: Syclop.h:132
void UpdateWeight()
Definition: Syclop.h:159
double alpha
The edge-weight coefficient for this region.
Definition: Syclop.h:129
VertexSet vertices
The VID's of the configurations in this region.
Definition: Syclop.h:137
size_t numTimesSelected
The number of times this region has been selected.
Definition: Syclop.h:135
Tracks data related to edges between regions in the decomposition graph.
Definition: Syclop.h:170
size_t Coverage() const
Get the coverage for this edge.
Definition: Syclop.h:176
size_t numLeadUses
Times this edge was used in a lead.
Definition: Syclop.h:181
void AddCell(size_t _index)
Definition: Syclop.h:173
size_t numAttempts
Attempted extensions across this edge.
Definition: Syclop.h:182
Definition: Syclop.h:196
WorkspacePortal property_type
Definition: Syclop.h:200
double value_type
Definition: Syclop.h:201
value_type get(property_type &_p)
Definition: Syclop.h:220
void apply(property_type &_p, functor _f)
Definition: Syclop.h:225
void put(property_type &_p, value_type &_v)
Definition: Syclop.h:222
Syclop strategy_type
Definition: Syclop.h:202
strategy_type * m_syclop
Definition: Syclop.h:208
WeightFunctor(strategy_type *_s)
Definition: Syclop.h:214