1 #ifndef PMPL_CONNECTION_METHOD_H_
2 #define PMPL_CONNECTION_METHOD_H_
45 template <
typename AbstractRoadmapType>
48 typename AbstractRoadmapType::VP
66 virtual void Print(std::ostream& _os)
const override;
79 template <
typename AbstractRoadmapType>
80 void Connect(AbstractRoadmapType*
const _r,
81 const VertexSet*
const _targetSet =
nullptr,
90 template <
typename AbstractRoadmapType>
91 void Connect(AbstractRoadmapType*
const _r,
const VID _source,
92 const VertexSet*
const _targetSet =
nullptr,
104 template <
typename AbstractRoadmapType,
typename InputIterator>
105 void Connect(AbstractRoadmapType*
const _r,
106 InputIterator _sourceBegin, InputIterator _sourceEnd,
107 const VertexSet*
const _targetSet =
nullptr,
129 const
VertexSet* const _targetSet =
nullptr,
134 const
VertexSet* const _targetSet =
nullptr,
146 template <typename AbstractRoadmapType>
148 AbstractRoadmapType* const _r, const
VID _source,
149 const std::vector<
Neighbor>& _neighbors,
151 const
bool _earlyQuit = false);
178 template <typename AbstractRoadmapType>
179 bool DoNotCheck(AbstractRoadmapType* const _r, const
VID _source,
180 const
VID _target) const;
191 const
VID _target) noexcept;
199 bool IsCached(
void* const _map, const
VID _source, const
VID _target) const
230 template <
typename AbstractRoadmapType>
235 Connect(_r, _r->begin(), _r->end(), _targetSet, _collision);
239 template <
typename AbstractRoadmapType>
242 Connect(AbstractRoadmapType*
const _r,
const VID _source,
246 const std::array<VID, 1> source{_source};
247 Connect(_r, source.begin(), source.end(), _targetSet, _collision);
251 template <
typename AbstractRoadmapType,
typename InputIterator>
254 Connect(AbstractRoadmapType*
const _r,
255 InputIterator _sourceBegin, InputIterator _sourceEnd,
262 std::cout <<
id << std::endl;
265 for(
auto iter = _sourceBegin; iter != _sourceEnd; ++iter) {
266 const VID sourceVID = _r->GetVID(iter);
268 std::cout <<
"\tAttempting connections from node "
269 << sourceVID <<
" at " << _r->GetVertex(sourceVID).PrettyPrint()
271 ConnectImpl(_r, sourceVID, _targetSet, _collision);
276 template <
typename AbstractRoadmapType>
280 const std::vector<Neighbor>& _neighbors,
282 const bool _earlyQuit) {
284 for(
const auto& neighbor : _neighbors) {
288 std::cout <<
"\t\tFailures (" <<
m_failures <<
") exceed threshold "
295 const VID target = neighbor.target;
297 std::cout <<
"\t\tAttempting connection from " << _source <<
" to "
298 << target <<
" at distance " << neighbor.distance <<
"."
306 const bool connected =
ConnectNodes(_r, _source, target, _collision);
310 std::cout <<
"\t\t\tConnection " << (connected ?
"succeeded" :
"failed")
314 if(_earlyQuit && connected)
325 template <
typename AbstractRoadmapType>
328 DoNotCheck(AbstractRoadmapType*
const _r,
const VID _source,
const VID _target)
333 std::cout <<
"\t\t\tSkipping connection with invalid node "
334 <<
"(" << _source <<
", " << _target <<
")."
342 std::cout <<
"\t\t\tSkipping self-connection "
343 <<
"(" << _source <<
", " << _target <<
")."
349 if(this->
IsCached(_r, _source, _target)) {
351 std::cout <<
"\t\t\tSkipping cached failed connection "
352 <<
"(" << _source <<
", " << _target <<
")."
358 if(_r->IsEdge(_source, _target)) {
360 std::cout <<
"\t\t\tSkipping existing connection "
361 <<
"(" << _source <<
", " << _target <<
")."
368 auto ccTracker = _r->GetCCTracker();
372 const bool sameCC = ccTracker->InSameCC(_source, _target);
375 std::cout <<
"\t\t\tSkipping connection "
376 <<
"(" << _source <<
", " << _target <<
")"
377 <<
" within the same connected component."
#define INVALID_VID
Definition: GenericStateGraph.h:23
#define WHERE
Macro for retrieving info about file, function, and line number.
Definition: RuntimeUtils.h:32
Definition: ConnectorMethod.h:25
bool ConnectNodes(RoadmapType *const _r, const VID _source, const VID _target, OutputIterator< RoadmapType > *const _collision=nullptr)
Definition: ConnectorMethod.cpp:83
MPBaseObject::GroupCfgType GroupCfgType
Definition: ConnectorMethod.h:31
bool m_skipIfSameCC
Skip connections within the same CC?
Definition: ConnectorMethod.h:212
std::string m_lpLabel
Local Planner.
Definition: ConnectorMethod.h:210
virtual ~ConnectorMethod()=default
bool IsCached(void *const _map, const VID _source, const VID _target) const noexcept
Definition: ConnectorMethod.cpp:155
MPBaseObject::RoadmapType RoadmapType
Definition: ConnectorMethod.h:32
void Connect(AbstractRoadmapType *const _r, const VertexSet *const _targetSet=nullptr, OutputIterator< AbstractRoadmapType > *const _collision=nullptr)
Definition: ConnectorMethod.h:233
virtual void ConnectImpl(RoadmapType *const _r, const VID _source, const VertexSet *const _targetSet=nullptr, OutputIterator< RoadmapType > *const _collision=nullptr)
Definition: ConnectorMethod.cpp:65
ConnectorMethod()
Definition: ConnectorMethod.cpp:11
std::unordered_set< ConnectionAttempt > ConnectionAttempts
Definition: ConnectorMethod.h:42
bool m_rewiring
Does this connector delete edges?
Definition: ConnectorMethod.h:216
void ClearConnectionAttempts()
Clear the attempts cache.
Definition: ConnectorMethod.cpp:171
bool DoNotCheck(AbstractRoadmapType *const _r, const VID _source, const VID _target) const
Definition: ConnectorMethod.h:328
virtual void Print(std::ostream &_os) const override
Definition: ConnectorMethod.cpp:37
bool IsRewiring() const noexcept
Definition: ConnectorMethod.cpp:57
MPBaseObject::GroupRoadmapType GroupRoadmapType
Definition: ConnectorMethod.h:33
bool m_selfEdges
Indicates if roadmap vertices should have self-edges.
Definition: ConnectorMethod.h:218
bool m_oneWay
Create one-way edges or two-way?
Definition: ConnectorMethod.h:215
void ConnectNeighbors(AbstractRoadmapType *const _r, const VID _source, const std::vector< Neighbor > &_neighbors, OutputIterator< AbstractRoadmapType > *const _collision=nullptr, const bool _earlyQuit=false)
Definition: ConnectorMethod.h:279
std::pair< VID, VID > ConnectionAttempt
Definition: ConnectorMethod.h:41
RoadmapType::VID VID
Definition: ConnectorMethod.h:34
ConnectionAttemptsCache m_attemptsCache
All failed connection attempts.
Definition: ConnectorMethod.h:209
void CacheFailedConnection(void *const _map, const VID _source, const VID _target) noexcept
Definition: ConnectorMethod.cpp:147
size_t m_failures
Failures in this use.
Definition: ConnectorMethod.h:214
virtual void Initialize() override
Definition: ConnectorMethod.cpp:49
std::vector< Neighbor > m_neighborBuffer
Definition: ConnectorMethod.h:223
size_t m_maxFailures
Maximum allowed failures per use.
Definition: ConnectorMethod.h:213
RoadmapType::VertexSet VertexSet
Definition: ConnectorMethod.h:35
std::back_insert_iterator< std::vector< typename AbstractRoadmapType::VP > > OutputIterator
Definition: ConnectorMethod.h:50
std::unordered_map< void *, ConnectionAttempts > ConnectionAttemptsCache
Definition: ConnectorMethod.h:43
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
std::string GetNameAndLabel() const
Get the unique string identifier for this object "m_name::m_label".
Definition: MPBaseObject.cpp:50
StatClass * GetStatClass() const noexcept
Get the current StatClass.
Definition: MPBaseObject.cpp:158
bool m_debug
Print debug info?
Definition: MPBaseObject.h:183
Definition: MetricUtils.h:124
Definition: Neighbors.h:13
Definition: PMPLExceptions.h:62