23 template <
typename storageType>
40 Node<storageType>(storageType _value);
55 Edge<storageType>*
Link(Node<storageType>*);
71 Edge<storageType>*
Link(Edge<storageType>*);
152 Edge<storageType>*
FindEdge(Node<storageType>* target);
166 inline std::map<storageType, Edge<storageType>*>*
Edges();
190 std::map<storageType, Edge<storageType>*>
edges;
202 template <
typename storageType>
203 Markov::Node<storageType>::Node(storageType _value) {
204 this->_value = _value;
205 this->total_edge_weights = 0L;
208 template <
typename storageType>
211 this->total_edge_weights = 0L;
214 template <
typename storageType>
219 template <
typename storageType>
221 Markov::Edge<storageType>* v =
new Markov::Edge<storageType>(
this, n);
222 this->UpdateEdges(v);
226 template <
typename storageType>
228 v->SetLeftEdge(
this);
229 this->UpdateEdges(v);
233 template <
typename storageType>
237 long int selection = randomEngine
->random() %
this->total_edge_weights;
240 for(
int i=0;i<
this->edgesV.size();i++){
241 selection -=
this->edgesV[i]->EdgeWeight();
242 if (selection < 0)
return this->edgesV[i]->TraverseNode();
246 std::cout <<
"This should never be reached (node failed to walk to next)\n";
247 assert(
true &&
"This should never be reached (node failed to walk to next)");
251 template <
typename storageType>
253 this->edges.insert({ v->RightNode()->NodeValue(), v });
254 this->edgesV.push_back(v);
256 return v->TraverseNode();
259 template <
typename storageType>
261 auto e =
this->edges.find(repr);
262 if (e ==
this->edges.end())
return NULL;
266 template <
typename storageType>
268 this->total_edge_weights += offset;
271 template <
typename storageType>
273 return &(
this->edges);
276 template <
typename storageType>
278 return this->total_edge_weights;