本文整理汇总了C++中MutableContainer::get方法的典型用法代码示例。如果您正苦于以下问题:C++ MutableContainer::get方法的具体用法?C++ MutableContainer::get怎么用?C++ MutableContainer::get使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MutableContainer
的用法示例。
在下文中一共展示了MutableContainer::get方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: sortNodesIncreasingOrder
/*
* Returns in sortedNodes the nodes n of g sorted in increasing
* order by value[n].
* Precondition:
* - value[n] <= numberOfNodes for all nodes n of g, where n is
* the number of
* nodes in g
*/
void PlanarityTestImpl::sortNodesIncreasingOrder(Graph *g, MutableContainer<int> &value,
vector<node> &sortedNodes) {
// Counting sort;
int numberOfNodes = g->numberOfNodes();
// array<int, numberOfNodes + 1> c;
vector<int> c(numberOfNodes + 1);
for (int i = 1; i <= numberOfNodes; ++i)
c[i] = 0;
// array<node, numberOfNodes + 1> a;
vector<node> a(numberOfNodes + 1);
int j = 0;
// forall_nodes(n, g)
for (auto n : g->nodes()) {
a[++j] = n;
}
for (int i = 1; i <= numberOfNodes; ++i) {
unsigned int tmp = value.get(a[i].id);
++c[tmp];
}
for (int i = 2; i <= numberOfNodes; ++i)
c[i] += c[i - 1];
for (int i = numberOfNodes; i > 0; i--) {
sortedNodes[c[value.get(a[i].id)]] = a[i];
c[value.get(a[i].id)]--;
}
}
示例2: getDist
unsigned int getDist(Graph *g, node n1, node n2) {
vector<node> nextNodes;
TLP_HASH_MAP<node, unsigned int> nodeDepth;
MutableContainer<bool> alreadyTreated;
bool found = false;
alreadyTreated.setAll(false);
nextNodes.push_back(n1);
nodeDepth[n1] = 0;
alreadyTreated.set(n1.id, true);
for (unsigned int i = 0; !found && i < nextNodes.size(); ++i) {
node current = nextNodes[i];
for (auto v : g->getInOutNodes(current)) {
if (alreadyTreated.get(v.id))
continue;
alreadyTreated.set(v.id, true);
nextNodes.push_back(v);
nodeDepth[v] = nodeDepth[current] + 1;
if (v == n2) {
found = true;
break;
}
}
}
return nodeDepth[n2];
}
示例3: biconnectedTest
//=================================================================
bool biconnectedTest(const Graph *graph, node v,
MutableContainer<bool> &mark,
MutableContainer<unsigned int> &low,
MutableContainer<unsigned int> &dfsNumber,
MutableContainer<node> &supergraph,
unsigned int &count) {
mark.set(v.id,true);
dfsNumber.set(v.id,count);
low.set(v.id,count);
++count;
Iterator<node> *it=graph->getInOutNodes(v);
while (it->hasNext()) {
node w=it->next();
if (!mark.get(w.id)) {
if (dfsNumber.get(v.id)==1) {
if (count != 2) {
delete it;
return false;
}
}
supergraph.set(w.id,v);
if (!biconnectedTest(graph,w,mark,low,dfsNumber,supergraph,count)) {
delete it;
return false;
}
if (dfsNumber.get(v.id)!=1) {
if (low.get(w.id)>=dfsNumber.get(v.id)) {
delete it;
return false;
}
else
low.set(v.id, std::min(low.get(v.id), low.get(w.id)));
}
}
else if (supergraph.get(v.id)!=w) {
low.set(v.id, std::min(low.get(v.id), dfsNumber.get(w.id)));
}
}
delete it;
return true;
}
示例4: clearGlyphList
void EdgeExtremityGlyphManager::clearGlyphList(Graph **, GlGraphInputData*, MutableContainer<EdgeExtremityGlyph *>& glyphs) {
static std::list<std::string> plugins = PluginLister::instance()->availablePlugins<EdgeExtremityGlyph>();
for(std::list<std::string>::const_iterator it = plugins.begin(); it != plugins.end(); ++it) {
string glyphName = *it;
delete glyphs.get(PluginLister::pluginInformation(glyphName).id());
}
}
示例5: makeBiconnectedDFS
void makeBiconnectedDFS(Graph *graph, node from,
MutableContainer<int> &low,
MutableContainer<int> &depth,
MutableContainer<node> &supergraph,
unsigned int ¤tDepth,
vector<edge> &addedEdges) {
node u;
depth.set(from.id, currentDepth++);
low.set(from.id, depth.get(from.id));
//for every node connected to this one, call this function so it runs on every node.
StableIterator<node> itN(graph->getInOutNodes(from));
while (itN.hasNext()) {
node to = itN.next();
//if there is a loop, ignore it
if (from == to) {
continue;
}
if (!u.isValid()) {
u = to;
}
//if the destination node has not been visited, visit it
if (depth.get(to.id) == -1) {
supergraph.set(to.id, from);
makeBiconnectedDFS(graph, to, low, depth, supergraph, currentDepth, addedEdges);
if (low.get(to.id) == depth.get(from.id)) {
if (to == u && supergraph.get(from.id).isValid())
addedEdges.push_back(graph->addEdge(to, supergraph.get(from.id)));
if (to != u)
addedEdges.push_back(graph->addEdge(u, to));
}
low.set(from.id, std::min(low.get(from.id), low.get(to.id)));
}
else {
low.set(from.id, std::min(low.get(from.id), depth.get(to.id)));
}
}
}
示例6: lcaBetween
//=================================================================
node PlanarityTestImpl::lcaBetween(node n1,
node n2,
const MutableContainer<node> &p) {
if (isCNode(n1)) {
node n = activeCNodeOf(false, n1);
n1 = p.get(n.id);
}
if (isCNode(n2)) {
node n = activeCNodeOf(false, n2);
n2 = p.get(n.id);
}
if (dfsPosNum.get(n1.id) > dfsPosNum.get(n2.id))
swapNode(n1, n2);
list<node> nl;
while (dfsPosNum.get(n1.id) < dfsPosNum.get(n2.id)) {
nl.push_front(n1);
n1 = p.get(n1.id);
}
node u = NULL_NODE;
if (nl.size() > 0) {
u = nl.front();
nl.pop_front();
}
while (n2 != u && n2 != n1 && dfsPosNum.get(n2.id) < dfsPosNum.get(n1.id)) {
nl.push_front(n2);
n2 = p.get(n2.id);
}
if (n2 == u || n2 == n1)
return n2;
return nl.front();
}
示例7: posDFS
//=================================================================
list<edge> posDFS(Graph *sG, MutableContainer<int> &dfsPos) {
list<edge> dfsEdges;
MutableContainer<int> dfsPre;
dfsPre.setAll(0);
unsigned int preCount = 0;
unsigned int postCount = 0;
for (auto n : sG->nodes()) {
if (dfsPre.get(n.id) == 0)
dfsAux(sG, n, dfsPre, dfsPos, dfsEdges, preCount, postCount);
}
return dfsEdges;
}
示例8: sortNodesIncreasingOrder
/*
* Returns in sortedNodes the nodes n of g sorted in increasing
* order by value[n].
* Precondition:
* - value[n] <= numberOfNodes for all nodes n of g, where n is
* the number of
* nodes in g
*/
void PlanarityTestImpl::sortNodesIncreasingOrder(Graph *g, MutableContainer<int> &value,
vector<node> &sortedNodes) {
// Counting sort;
int numberOfNodes = g->numberOfNodes();
//array<int, numberOfNodes + 1> c;
vector<int> c(numberOfNodes + 1);
for (int i = 1 ; i <= numberOfNodes ; i++)
c[i] = 0;
//array<node, numberOfNodes + 1> a;
vector<node> a(numberOfNodes + 1);
int j = 0;
node n;
// forall_nodes(n, g)
Iterator<node> *it = g->getNodes();
while (it->hasNext()) {
//a[++j] = n;
a[++j] = it->next();
}
delete it;
for (int i = 1 ; i <= numberOfNodes ; i++) {
unsigned int tmp = value.get(a[i].id);
c[tmp]++;
}
for (int i = 2 ; i <= numberOfNodes ; i++)
c[i] += c[i-1];
for (int i = numberOfNodes ; i > 0 ; i--) {
sortedNodes[c[value.get(a[i].id)]] = a[i];
c[value.get(a[i].id)]--;
}
}
示例9: dfsAux
//=================================================================
static void dfsAux(Graph *sG, node n, MutableContainer<int> &dfsPre, MutableContainer<int> &dfsPos,
list<edge> &dfsEdges, unsigned int &preCount, unsigned int &postCount) {
dfsPre.set(n.id, ++preCount);
for (auto e : sG->getOutEdges(n)) {
node target = sG->target(e);
if (dfsPre.get(target.id) == 0) {
dfsEdges.push_back(e);
dfsAux(sG, target, dfsPre, dfsPos, dfsEdges, preCount, postCount);
}
}
dfsPos.set(n.id, ++postCount);
}
示例10: isFreeTree
// Determines if the given graph is topologically a tree
bool TreeTest::isFreeTree(const Graph *graph, node curRoot) {
// do a dfs traversal from curRoot;
MutableContainer<bool> visited;
visited.setAll(false);
stack<dfsFreeTreeStruct> dfsLevels;
dfsFreeTreeStruct curParams(curRoot, curRoot, graph->getInOutNodes(curRoot));
dfsLevels.push(curParams);
while (!dfsLevels.empty()) {
curParams = dfsLevels.top();
curRoot = curParams.curRoot;
node cameFrom = curParams.cameFrom;
Iterator<node> *neighbours = curParams.neighbours;
// set neighbours member to nullptr
// to avoid twice deletion on exit
curParams.neighbours = nullptr;
if (!neighbours->hasNext()) {
dfsLevels.pop();
} else {
visited.set(curRoot.id, true);
// loop on remaining neighbours
while (neighbours->hasNext()) {
node curNode = neighbours->next();
// check self loop
if (curNode == curRoot) {
return false;
}
if (curNode != cameFrom) {
if (visited.get(curNode.id)) {
return false;
}
// go deeper in the dfs exploration
curParams.curRoot = curNode;
curParams.cameFrom = curRoot;
curParams.neighbours = graph->getInOutNodes(curNode);
dfsLevels.push(curParams);
break;
}
}
}
}
return true;
} // end isFreeTree
示例11: posDFS
//=================================================================
list<edge> posDFS(Graph *sG,
MutableContainer<int> &dfsPos) {
list<edge> dfsEdges;
MutableContainer<int> dfsPre;
dfsPre.setAll(0);
preCount = postCount = 1;
StableIterator<node> it(sG->getNodes());
while (it.hasNext()) {
node n = it.next();
if (dfsPre.get(n.id) == 0)
dfsAux(sG, n, dfsPre, dfsPos, dfsEdges);
}
return dfsEdges;
}
示例12: dfsAux
void dfsAux(Graph *sG, node n,
MutableContainer<int>& dfsPre,
MutableContainer<int>& dfsPos,
list<edge>& dfsEdges) {
dfsPre.set(n.id, preCount++);
StableIterator<edge> it(sG->getOutEdges(n));
while (it.hasNext()) {
edge e = it.next();
node target = sG->target(e);
if (dfsPre.get(target.id) == 0) {
dfsEdges.push_back(e);
dfsAux(sG, target, dfsPre, dfsPos, dfsEdges);
}
}
dfsPos.set(n.id, postCount++);
}
示例13: setEdgeOrder
/**
* \brief Set the ordering of edges around n according to their order in v.
*/
void GraphStorage::setEdgeOrder(const node n, const std::vector<edge> &v ) {
if (v.empty()) return;
MutableContainer<int> isEle;
isEle.setAll(0);
for (std::vector<edge>::const_iterator it=v.begin(); it!=v.end(); ++it) {
isEle.add(it->id, 1);
}
std::vector<edge>::const_iterator it2=v.begin();
EdgeVector& currentOrder = nodes[n.id].edges;
for (unsigned int i=0; i<currentOrder.size(); ++i) {
if ( isEle.get(currentOrder[i].id)>0 ) {
isEle.add(currentOrder[i].id, -1);
currentOrder[i] = *it2;
++it2;
}
}
}
示例14: updateNewSelectableNodes
/**
* update is_selectable_visited and is_selectable
*/
void Ordering::updateNewSelectableNodes(node node_f, node no_tmp2 ,edge, node node_last, vector<Face> v_faces, bool one_face,bool was_visited, bool selection_face) {
MutableContainer<bool> tried;
tried.setAll(false);
node n = node_f;
node tmp = no_tmp2;
node tmp2 = node() ;
unsigned int lim = v_faces.size();
while(n != node_last) {
tmp2 = n;
if(Gp->deg(n) > 2 && isSelectable(n)) {
if(visitedNodes.get(n.id))
is_selectable_visited.set(n.id,true);
else
is_selectable.set(n.id,true);
}
else {
is_selectable_visited.set(n.id,false);
is_selectable.set(n.id,false);
}
tried.set(n.id,true);
n = tmp;
tmp = right.get(n.id);
}
if(Gp->deg(n) > 2 && isSelectable(n))
is_selectable_visited.set(n.id,true);
else {
is_selectable_visited.set(n.id,false);
is_selectable.set(n.id,false);
}
if(one_face) {
if(tmp2 == node())
tmp2 = node_f;
Iterator<node> * it_no = Gp->getFaceNodes(Gp->getFaceContaining(tmp2,node_last));
while(it_no->hasNext()) {
node no_tmp = it_no->next();
if(!tried.get(no_tmp.id)) {
bool on_c = contour.get(no_tmp.id);
if(on_c) {
bool sel = isSelectable(no_tmp);
if(sel)
if(visitedNodes.get(no_tmp.id))
is_selectable_visited.set(no_tmp.id,true);
else
is_selectable.set(no_tmp.id, true);
else {
is_selectable_visited.set(no_tmp.id,false);
is_selectable_visited.set(no_tmp.id,false);
}
}
tried.set(no_tmp.id,true);
}
}
delete it_no;
lim--;
}
if((selection_face && was_visited) || !selection_face)
for(unsigned int i = 0; i < lim; ++i) {
bool face_sel = false;
Face f_tmp = v_faces[i];
if(is_selectable_face.get(f_tmp.id) || is_selectable_visited_face.get(f_tmp.id))
face_sel = true;
Iterator<node> * itn = Gp->getFaceNodes(f_tmp);
if(face_sel)
while(itn->hasNext()) {
node no_tmp = itn->next();
is_selectable.set(no_tmp.id,false);
is_selectable_visited.set(no_tmp.id,false);
tried.set(no_tmp.id,true);
}
else {
while(itn->hasNext()) {
node no_tmp = itn->next();
if(!tried.get(no_tmp.id) && (is_selectable_visited.get(no_tmp.id) || is_selectable.get(no_tmp.id))) {
if(!isSelectable(no_tmp)) {
is_selectable_visited.set(no_tmp.id,false);
is_selectable.set(no_tmp.id,false);
}
}
tried.set(no_tmp.id,true);
//.........这里部分代码省略.........
示例15: run
bool run() {
result->setAllNodeValue(0.0);
result->setAllEdgeValue(0.0);
bool directed = false;
bool norm = false;
if ( dataSet!=NULL ) {
dataSet->get("directed",directed);
dataSet->get("norm", norm);
}
//Metric is 0 in this case
if(graph->numberOfNodes()<=2) return true;
Iterator<node> *it = graph->getNodes();
unsigned int count = 0;
while(it->hasNext()) {
if (pluginProgress->progress(count++,graph->numberOfNodes())!=TLP_CONTINUE) break;
node s = it->next();
stack<node> S;
TLP_HASH_MAP<node, list<node> > P;
MutableContainer<int> sigma;
sigma.setAll(0);
sigma.set(s.id,1);
MutableContainer<int> d;
d.setAll(-1);
d.set(s.id, 0);
queue<node> Q;
Q.push(s);
while(!Q.empty()) {
node v = Q.front();
Q.pop();
S.push(v);
Iterator<node> *it2;
if (directed)
it2 = graph->getOutNodes(v);
else
it2 = graph->getInOutNodes(v);
while (it2->hasNext()) {
node w = it2->next();
if (d.get(w.id)<0) {
Q.push(w);
d.set(w.id, d.get(v.id)+1);
}
if (d.get(w.id) == d.get(v.id)+1) {
sigma.add(w.id, sigma.get(v.id));
P[w].push_back(v);
}
}
delete it2;
}
MutableContainer<double> delta;
delta.setAll(0.0);
while(!S.empty()) {
node w = S.top();
S.pop();
list<node>::const_iterator itn = P[w].begin();
for (; itn!=P[w].end(); ++itn) {
node v = *itn;
delta.add(v.id, (double(sigma.get(v.id)) / double(sigma.get(w.id)) * (1.0 + delta.get(w.id))));
edge e = graph->existEdge(v,w,directed);
if(e.isValid())
result->setEdgeValue(e, result->getEdgeValue(e) + double(sigma.get(v.id)) / double(sigma.get(w.id)) * (1.0 + delta.get(w.id)));
}
if (w != s) result->setNodeValue(w, result->getNodeValue(w) + delta.get(w.id));
}
}
delete it;
//Normalization
if(norm || !directed) {
double n = graph->numberOfNodes();
it = graph->getNodes();
while(it->hasNext()) {
node s = it->next();
//In the undirected case, the metric must be divided by two, then
if(norm)
result->setNodeValue(s,result->getNodeValue(s)/((n-1.0)*(n-2.0)));
if(!directed)
result->setNodeValue(s,result->getNodeValue(s)/2.0);
}
delete it;
//.........这里部分代码省略.........