8#ifndef model_NetworkNode_H_
9#define model_NetworkNode_H_
24#define VerboseNetworkNode(N,x) if(verboseLevel>=N){std::cout<<redColor<<x<<defaultColor;}
26#define VerboseNetworkNode(N,x)
33 template<
typename Derived>
37 ,
public std::set<typename TypeTraits<Derived>::LoopNodeType*>
38 ,
private std::map<size_t,std::tuple<Derived* const ,typename TypeTraits<Derived>::NetworkLinkType* const>>
52 typedef std::tuple<Derived* const ,NetworkLinkType* const>
NeighborType;
62 VerboseNetworkNode(1,
"Constructing NetworkNode "<<
tag()<<std::endl);
68 VerboseNetworkNode(1,
"Destroying NetworkNode "<<
tag()<<std::endl);
79 temp.insert(ln->next.second);
92 temp.insert(ln->prev.second);
100 std::set<size_t>
temp;
101 for (
const auto &loopIter :
loops())
103 temp.insert(loopIter->sID);
110 std::set<LoopType*>
temp;
113 temp.insert(ln->loop().get());
133 throw std::runtime_error(
"Duplicate LoopNode could not be added");
140 const size_t erased(
loopNodes().erase(pN));
143 throw std::runtime_error(
"LoopNode could not be erased");
156 const auto nodeIter(this->
network().networkNodes().find(this->
sID));
157 if(nodeIter!=this->
network().networkNodes().
end())
159 return std::distance(this->
network().networkNodes().begin(),nodeIter);
163 throw std::runtime_error(
"NetworkNode "+std::to_string(this->
sID)+
" not found in calling NetworkNode::gID().");
188 if (pL->source->sID==this->sID)
200 throw std::runtime_error(
"CANNOT INSERT IN NEIGHBORHOOD.");
204 else if (pL->sink->sID==this->sID)
210 throw std::runtime_error(
"CANNOT INSERT IN NEIGHBORHOOD.");
216 throw std::runtime_error(
"CANNOT INSERT NON-INCIDENT EDGE");
225 if (pL->source->sID==this->sID)
227 const size_t key=pL->sink->sID;
231 throw std::runtime_error(
"CANNOT REMOVE FROM NEIGHBORHOOD.");
235 else if (pL->sink->sID==this->sID)
237 const size_t key=pL->source->sID;
241 throw std::runtime_error(
"CANNOT REMOVE FROM NEIGHBORHOOD.");
246 throw std::runtime_error(
"CANNOT REMOVE FROM NEIGHBORHOOD.");
253 return std::to_string(this->
sID) ;
257 template<
typename Derived>
CRTP()
The default constructor.
const LoopNetworkType & network() const
NetworkBase(const NetworkBase< LoopNetworkType, KeyType > &)=delete
std::map< size_t, NeighborType > NeighborContainerType
TypeTraits< Derived >::LoopNodeType LoopNodeType
LoopLinkContainerType inLoopLinks() const
LoopLinkContainerType outLoopLinks() const
bool isContractableTo(const std::shared_ptr< Derived > &) const
void addLoopNode(LoopNodeType *const pN)
NeighborContainerType & neighbors()
void removeFromNeighborhood(NetworkLinkType *const pL)
std::set< LoopNodeType * > LoopNodeContainerType
NetworkBase< Derived, size_t > NetworkBaseType
std::set< size_t > loopIDs() const
void removeLoopNode(LoopNodeType *const pN)
TypeTraits< Derived >::LoopType LoopType
TypeTraits< Derived >::LoopLinkType LoopLinkType
LoopNodeContainerType & loopNodes()
NetworkNode(LoopNetworkType *const loopNetwork_in)
const NeighborContainerType & neighbors() const
const LoopNodeContainerType & loopNodes() const
TypeTraits< Derived >::LoopNetworkType LoopNetworkType
std::set< LoopType * > loops() const
std::tuple< Derived *const,NetworkLinkType *const > NeighborType
void addToNeighborhood(NetworkLinkType *const pL)
TypeTraits< Derived >::NetworkLinkType NetworkLinkType
std::set< LoopLinkType * > LoopLinkContainerType
const size_t sID
The static ID of this.
enum insertvertexresult success