Parasol Planning Library (PPL)
NeighborhoodFinderMethod.h
Go to the documentation of this file.
1 #ifndef PMPL_NEIGHBORHOOD_FINDER_METHOD_H_
2 #define PMPL_NEIGHBORHOOD_FINDER_METHOD_H_
3 
4 #include <boost/mpl/list.hpp>
5 #include <boost/mpl/for_each.hpp>
6 
7 #include "Neighbors.h"
9 #include "Utilities/MPUtils.h"
11 
12 
33 
34  public:
35 
38 
40  typedef typename RoadmapType::VID VID;
44 
48 
50  enum class Type {
51  K,
52  RADIUS,
53  APPROX,
54  OTHER
55  };
56 
58  typedef typename std::back_insert_iterator<std::vector<Neighbor>>
60 
64 
66 
67  NeighborhoodFinderMethod(XMLNode& _node, const Type _type = Type::OTHER,
68  const bool _requireDM = true);
69 
70  virtual ~NeighborhoodFinderMethod() = default;
71 
75 
76  virtual void Print(std::ostream& _os) const override;
77 
81 
83  Type GetType() const noexcept;
84 
86  virtual size_t& GetK() noexcept;
87 
89  virtual double& GetRadius() noexcept;
90 
93  virtual void SetDMLabel(const std::string& _label) noexcept;
94 
97  virtual const std::string& GetDMLabel() const noexcept;
98 
102 
110  virtual void FindNeighbors(RoadmapType* const _r, const Cfg& _cfg,
111  const VertexSet& _candidates, OutputIterator _out) = 0;
112 
114  virtual void FindNeighbors(GroupRoadmapType* const _r,
115  const GroupCfgType& _cfg, const VertexSet& _candidates,
116  OutputIterator _out) = 0;
117 
119  template <typename AbstractRoadmapType>
120  void FindNeighbors(AbstractRoadmapType* const _r,
121  const typename AbstractRoadmapType::CfgType& _cfg, OutputIterator _out);
122 
124 
125  protected:
126 
129 
136  template <typename AbstractRoadmapType>
137  bool DirectEdge(const AbstractRoadmapType* _g,
138  const typename AbstractRoadmapType::CfgType& _c,
139  const typename AbstractRoadmapType::VID _v) const noexcept;
140 
147 
149  size_t m_k{0};
150  double m_radius{0};
151 
152  std::string m_dmLabel;
153  bool m_unconnected{false};
154 
156 
157 };
158 
159 /*------------------------ Nearest-Neighbor Queries --------------------------*/
160 
161 template <typename AbstractRoadmapType>
162 void
164 FindNeighbors(AbstractRoadmapType* const _r,
165  const typename AbstractRoadmapType::CfgType& _cfg,
166  OutputIterator _out) {
167  this->FindNeighbors(_r, _cfg, _r->GetAllVIDs(), _out);
168 }
169 
170 /*-------------------------------- Helpers -----------------------------------*/
171 
172 template <typename AbstractRoadmapType>
173 inline
174 bool
176 DirectEdge(const AbstractRoadmapType* _g,
177  const typename AbstractRoadmapType::CfgType& _c,
178  const typename AbstractRoadmapType::VID _v) const noexcept {
179  // The nodes are neighbors if _c is in the graph and the edge (_c, _v) exists.
180  const typename AbstractRoadmapType::VID vid = _g->GetVID(_c);
181  return vid != INVALID_VID and _g->IsEdge(vid, _v);
182 }
183 
184 #endif
#define INVALID_VID
Definition: GenericStateGraph.h:23
Definition: Cfg.h:38
Definition: GenericStateGraph.h:67
STAPLGraph::vertex_descriptor VID
Definition: GenericStateGraph.h:83
std::unordered_set< VID > VertexSet
Definition: GenericStateGraph.h:86
Definition: GroupCfg.h:39
Definition: GroupRoadmap.h:25
Definition: MPBaseObject.h:46
Definition: NeighborhoodFinderMethod.h:32
bool DirectEdge(const AbstractRoadmapType *_g, const typename AbstractRoadmapType::CfgType &_c, const typename AbstractRoadmapType::VID _v) const noexcept
Definition: NeighborhoodFinderMethod.h:176
virtual void Print(std::ostream &_os) const override
Definition: NeighborhoodFinderMethod.cpp:49
RoadmapType::VertexSet VertexSet
Definition: NeighborhoodFinderMethod.h:41
virtual ~NeighborhoodFinderMethod()=default
MPBaseObject::RoadmapType RoadmapType
Definition: NeighborhoodFinderMethod.h:39
MPBaseObject::GroupRoadmapType GroupRoadmapType
Definition: NeighborhoodFinderMethod.h:42
std::string m_dmLabel
The distance metric to use.
Definition: NeighborhoodFinderMethod.h:152
Type
The type of neighbors found.
Definition: NeighborhoodFinderMethod.h:50
@ RADIUS
All neighbors within a radius.
@ K
k-closest neighbors
@ APPROX
Approximate nearest neighbors.
virtual void FindNeighbors(RoadmapType *const _r, const Cfg &_cfg, const VertexSet &_candidates, OutputIterator _out)=0
double m_radius
Maximum distance of closest neighbors.
Definition: NeighborhoodFinderMethod.h:150
Type m_nfType
Type of neighborhood finder.
Definition: NeighborhoodFinderMethod.h:148
RoadmapType::VID VID
Definition: NeighborhoodFinderMethod.h:40
Type GetType() const noexcept
Definition: NeighborhoodFinderMethod.cpp:61
virtual const std::string & GetDMLabel() const noexcept
Definition: NeighborhoodFinderMethod.cpp:93
size_t m_k
How many closest neighbors to find?
Definition: NeighborhoodFinderMethod.h:149
virtual size_t & GetK() noexcept
Definition: NeighborhoodFinderMethod.cpp:69
std::back_insert_iterator< std::vector< Neighbor > > OutputIterator
Output iterator for writing discovered neighbors to a container.
Definition: NeighborhoodFinderMethod.h:59
virtual void SetDMLabel(const std::string &_label) noexcept
Definition: NeighborhoodFinderMethod.cpp:85
NeighborhoodFinderMethod(const Type _type=Type::OTHER)
Definition: NeighborhoodFinderMethod.cpp:10
bool m_unconnected
Require neighbors with no direct edge.
Definition: NeighborhoodFinderMethod.h:153
virtual double & GetRadius() noexcept
Definition: NeighborhoodFinderMethod.cpp:77
MPBaseObject::GroupCfgType GroupCfgType
Definition: NeighborhoodFinderMethod.h:43
Definition: XMLNode.h:27