本文整理汇总了C++中GraphCopy类的典型用法代码示例。如果您正苦于以下问题:C++ GraphCopy类的具体用法?C++ GraphCopy怎么用?C++ GraphCopy使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了GraphCopy类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: constructMergeGraph
bool FeasibleUpwardPlanarSubgraph::constructMergeGraph(
GraphCopy &M,
adjEntry adj_orig,
const List<edge> &orig_edges)
{
CombinatorialEmbedding Beta(M);
//set ext. face of Beta
adjEntry ext_adj = M.copy(adj_orig->theEdge())->adjSource();
Beta.setExternalFace(Beta.rightFace(ext_adj));
FaceSinkGraph fsg(Beta, M.copy(adj_orig->theNode()));
SList<node> aug_nodes;
SList<edge> aug_edges;
SList<face> fList;
fsg.possibleExternalFaces(fList); // use this method to call the methode checkForest()
node v_ext = fsg.faceNodeOf(Beta.externalFace());
OGDF_ASSERT(v_ext != 0);
fsg.stAugmentation(v_ext, M, aug_nodes, aug_edges);
//add the deleted edges
for(edge eOrig: orig_edges) {
node a = M.copy(eOrig->source());
node b = M.copy(eOrig->target());
M.newEdge(a, b);
}
return (isAcyclic(M));
}
示例2: GraphCopy
UpwardPlanRep::UpwardPlanRep(const GraphCopy &GC, ogdf::adjEntry adj_ext) :
GraphCopy(GC),
isAugmented(false),
t_hat(nullptr),
extFaceHandle(nullptr),
crossings(0)
{
OGDF_ASSERT(adj_ext != nullptr);
OGDF_ASSERT(hasSingleSource(*this));
m_isSourceArc.init(*this, false);
m_isSinkArc.init(*this, false);
hasSingleSource(*this, s_hat);
m_Gamma.init(*this);
//compute the ext. face;
node v = copy(GC.original(adj_ext->theNode()));
extFaceHandle = copy(GC.original(adj_ext->theEdge()))->adjSource();
if (extFaceHandle->theNode() != v)
extFaceHandle = extFaceHandle->twin();
m_Gamma.setExternalFace(m_Gamma.rightFace(extFaceHandle));
for(adjEntry adj : s_hat->adjEntries)
m_isSourceArc[adj->theEdge()] = true;
computeSinkSwitches();
}
示例3: constructed
void SubgraphUpwardPlanarizer::constructComponentGraphs(BCTree &BC, NodeArray<GraphCopy> &biComps)
{
NodeArray<int> constructed(BC.originalGraph(), -1);
const Graph &bcTree = BC.bcTree();
int i = 0; // comp. number
for(node v : bcTree.nodes) {
if (BC.typeOfBNode(v) == BCTree::CComp)
continue;
const SList<edge> &edges_comp = BC.hEdges(v); //bicomp edges
List<edge> edges_orig;
for(edge e : edges_comp)
edges_orig.pushBack(BC.original(e));
GraphCopy GC;
GC.createEmpty(BC.originalGraph());
// construct i-th component graph
for(edge eOrig : edges_orig) {
node srcOrig = eOrig->source();
node tgtOrig = eOrig->target();
if (constructed[srcOrig] != i) {
constructed[srcOrig] = i;
GC.newNode(srcOrig);
}
if (constructed[tgtOrig] != i) {
constructed[tgtOrig] = i;
GC.newNode(tgtOrig);
}
GC.newEdge(eOrig);
}
biComps[v] = GC;
i++;
}
}
示例4: component
//use the layout information in the umlgraph to find nodes in
//unconnected active parts of a CC that can be connected without
//crossings in the given embedding
void PlanRepInc::getExtAdjs(List<adjEntry> & /* extAdjs */)
{
//in order not to change the current CC initialization,
//we construct a copy of the active parts (one by one)
//and use the layout information to compute a external
//face for that part. An (original) adjEntry on this face
//is then inserted into the extAdjs list.
//derive the unconnected parts by a run through the current
//copy
//compute connected component of current CC
NodeArray<int> component(*this);
int numPartialCC = connectedComponents(*this, component);
EdgeArray<edge> copyEdge;//copy edges in partial CC copy
//now we compute a copy for every CC
//initialize an array of lists of nodes contained in a CC
Array<List<node> > nodesInPartialCC;
nodesInPartialCC.init(numPartialCC);
for(node v : nodes)
nodesInPartialCC[component[v]].pushBack(v);
int i = 0;
for (i = 0; i < numPartialCC; i++)
{
List<node> &theNodes = nodesInPartialCC[i];
GraphCopy GC;
GC.createEmpty(*this);
GC.initByNodes(theNodes, copyEdge);
//now we derive an outer face of GC by using the
//layout information on it's original
//TODO: Insert the bend points into the copy
//CombinatorialEmbedding E(GC);
//run through the faces and compute angles to
//derive outer face
//we dont care about the original structure of
//the graph, i.e., if crossings are inserted aso
//we only take the given partial CC and its layout
//adjEntry extAdj = getExtAdj(GC, E);
//for(node v : GC.nodes)
//{
//
//}
}//for
}//getextadj
示例5: computePolyline
void Layout::computePolyline(GraphCopy &GC, edge eOrig, DPolyline &dpl) const
{
dpl.clear();
const List<edge> &edgePath = GC.chain(eOrig);
// The corresponding edge path in the copy must contain at least 1 edge!
OGDF_ASSERT(edgePath.size() >= 1);
// iterate over all edges in the corresponding edge path in the copy
bool firstTime = true;
for (edge e : edgePath) {
node v = e->source();
// append point of source node of e ...
if (!firstTime)
dpl.pushBack(DPoint(m_x[v], m_y[v]));
else
firstTime = false;
// ... and polyline of e
const DPolyline &segment = m_bends[e];
for (const DPoint &dp : segment)
dpl.pushBack(dp);
}
}
示例6: OGDF_ASSERT
Module::ReturnType FeasibleUpwardPlanarSubgraph::call(
Graph &G,
GraphCopy &FUPS,
adjEntry &extFaceHandle,
List<edge> &delEdges,
bool multisources,
int runs)
{
#ifdef OGDF_DEBUG
OGDF_ASSERT(!UpwardPlanarity::isUpwardPlanar_singleSource(G));
#endif
delEdges.clear();
//current fups, its embedding and the removed edges
GraphCopy FUPS_cur;
List<edge> delEdges_cur;
call(G, FUPS, extFaceHandle, delEdges, multisources);
for (int i = 1; i < runs; ++i) {
adjEntry extFaceHandle_cur;
call(G, FUPS_cur, extFaceHandle_cur, delEdges_cur, multisources);
// use new result??
if (delEdges_cur.size() < delEdges.size()) {
FUPS = FUPS_cur;
extFaceHandle = FUPS.copy(FUPS_cur.original(extFaceHandle_cur->theEdge()))->adjSource();
delEdges = delEdges_cur;
}
}
return Module::retFeasible;
}
示例7: callAndDelete
void UpwardPlanarSubgraphModule::callAndDelete(
GraphCopy &GC,
List<edge> &delOrigEdges)
{
List<edge> delEdges;
call(GC, delEdges);
ListConstIterator<edge> it;
for(it = delEdges.begin(); it.valid(); ++it) {
edge eCopy = *it;
delOrigEdges.pushBack(GC.original(eCopy));
GC.delEdge(eCopy);
}
}
示例8: getSpanTree
void FUPSSimple::getSpanTree(GraphCopy &GC, List<edge> &delEdges, bool random)
{
if (GC.numberOfNodes() == 1)
return; // nothing to do
node s;
hasSingleSource(GC, s);
NodeArray<bool> visited(GC, false);
EdgeArray<bool> isTreeEdge(GC,false);
List<node> toDo;
//mark the incident edges e1..e_i of super source s and the incident edges of the target node of the edge e1.._e_i as tree edge.
visited[s] = true;
for(adjEntry adj : s->adjEdges) {
isTreeEdge[adj] = true;
visited[adj->theEdge()->target()];
for(adjEntry adjTmp : adj->theEdge()->target()->adjEdges) {
isTreeEdge[adjTmp] = true;
node tgt = adjTmp->theEdge()->target();
if (!visited[tgt]) {
toDo.pushBack(tgt);
visited[tgt] = true;
}
}
}
//traversing with dfs
for(node start : toDo) {
for(adjEntry adj : start->adjEdges) {
node v = adj->theEdge()->target();
if (!visited[v])
dfs_visit(GC, adj->theEdge(), visited, isTreeEdge, random);
}
}
// delete all non tree edgesEdges to obtain a span tree
List<edge> l;
for(edge e : GC.edges) {
if (!isTreeEdge[e])
l.pushBack(e);
}
while (!l.empty()) {
edge e = l.popFrontRet();
delEdges.pushBack(GC.original(e));
GC.delEdge(e);
}
}
示例9: getSpanTree
void FeasibleUpwardPlanarSubgraph::getSpanTree(GraphCopy &GC, List<edge> &delEdges, bool random, bool multisource)
{
delEdges.clear();
if (GC.numberOfNodes() == 1)
return; // nothing to do
node s;
hasSingleSource(GC, s);
NodeArray<bool> visited(GC, false);
EdgeArray<bool> isTreeEdge(GC,false);
List<node> toDo;
// the original graph is a multisource graph. The sources are connected with the super source s.
// so do not delete the incident edges of s
if (multisource){
// put all incident edges of the source to treeEdges
for(adjEntry adj : s->adjEdges) {
isTreeEdge[adj->theEdge()] = true;
visited[adj->theEdge()->target()];
toDo.pushBack(adj->theEdge()->target());
}
}
else
toDo.pushBack(s);
//traversing with dfs
for(node start : toDo) {
for(adjEntry adj : start->adjEdges) {
node v = adj->theEdge()->target();
if (!visited[v])
dfs_visit(GC, adj->theEdge(), visited, isTreeEdge, random);
}
}
// delete all non tree edgesEdges to obtain a span tree
List<edge> l;
for(edge e : GC.edges) {
if (!isTreeEdge[e])
l.pushBack(e);
}
while (!l.empty()) {
edge e = l.popFrontRet();
delEdges.pushBack(GC.original(e));
GC.delEdge(e);
}
}
示例10: updateNode
void GEMLayout::updateNode(GraphCopy &G, GraphCopyAttributes &AG,node v) {
//const Graph &G = AG.constGraph();
int n = G.numberOfNodes();
double impulseLength;
impulseLength = length(m_newImpulseX,m_newImpulseY);
if(OGDF_GEOM_ET.greater(impulseLength,0.0)) {
// scale impulse by node temperature
m_newImpulseX *= m_localTemperature[v] / impulseLength;
m_newImpulseY *= m_localTemperature[v] / impulseLength;
// move node
AG.x(v) += m_newImpulseX;
AG.y(v) += m_newImpulseY;
// adjust barycenter
m_barycenterX += weight(v) * m_newImpulseX;
m_barycenterY += weight(v) * m_newImpulseY;
impulseLength = length(m_newImpulseX,m_newImpulseY)
* length(m_impulseX[v],m_impulseY[v]);
if(OGDF_GEOM_ET.greater(impulseLength,0.0)) {
m_globalTemperature -= m_localTemperature[v] / n;
// compute sine and cosine of angle between old and new impulse
double sinBeta,cosBeta;
sinBeta = (m_newImpulseX * m_impulseX[v]
- m_newImpulseY * m_impulseY[v])
/ impulseLength;
cosBeta = (m_newImpulseX * m_impulseX[v]
+ m_newImpulseY * m_impulseY[v])
/ impulseLength;
// check for rotation
if(OGDF_GEOM_ET.greater(sinBeta,m_sin))
m_skewGauge[v] += m_rotationSensitivity;
// check for oscillation
if(OGDF_GEOM_ET.greater(length(cosBeta),m_cos))
m_localTemperature[v] *=
(1 + cosBeta * m_oscillationSensitivity);
// cool down according to skew gauge
m_localTemperature[v] *= (1.0 - length(m_skewGauge[v]));
if(OGDF_GEOM_ET.geq(m_localTemperature[v],m_initialTemperature))
m_localTemperature[v] = m_initialTemperature;
// adjust global temperature
m_globalTemperature += m_localTemperature[v] / n;
}
// save impulse
m_impulseX[v] = m_newImpulseX;
m_impulseY[v] = m_newImpulseY;
}
}
示例11: GraphCopy
Module::ReturnType FeasibleUpwardPlanarSubgraph::call(
const Graph &G,
GraphCopy &FUPS,
adjEntry &extFaceHandle,
List<edge> &delEdges,
bool multisources)
{
FUPS = GraphCopy(G);
delEdges.clear();
node s_orig;
hasSingleSource(G, s_orig);
List<edge> nonTreeEdges_orig;
getSpanTree(FUPS, nonTreeEdges_orig, true, multisources);
CombinatorialEmbedding Gamma(FUPS);
nonTreeEdges_orig.permute(); // random order
//insert nonTreeEdges
while (!nonTreeEdges_orig.empty()) {
// make identical copy GC of Fups
//and insert e_orig in GC
GraphCopy GC = FUPS;
edge e_orig = nonTreeEdges_orig.popFrontRet();
//node a = GC.copy(e_orig->source());
//node b = GC.copy(e_orig->target());
GC.newEdge(e_orig);
if (UpwardPlanarity::upwardPlanarEmbed_singleSource(GC)) { //upward embedded the fups and check feasibility
CombinatorialEmbedding Beta(GC);
//choose a arbitrary feasibel ext. face
FaceSinkGraph fsg(Beta, GC.copy(s_orig));
SList<face> ext_faces;
fsg.possibleExternalFaces(ext_faces);
OGDF_ASSERT(!ext_faces.empty());
Beta.setExternalFace(ext_faces.front());
GraphCopy M = GC; // use a identical copy of GC to constrcut the merge graph of GC
adjEntry extFaceHandle_cur = getAdjEntry(Beta, GC.copy(s_orig), Beta.externalFace());
adjEntry adj_orig = GC.original(extFaceHandle_cur->theEdge())->adjSource();
if (constructMergeGraph(M, adj_orig, nonTreeEdges_orig)) {
FUPS = GC;
extFaceHandle = FUPS.copy(GC.original(extFaceHandle_cur->theEdge()))->adjSource();
continue;
}
else {
//Beta is not feasible
delEdges.pushBack(e_orig);
}
}
else {
// not ok, GC is not feasible
delEdges.pushBack(e_orig);
}
}
return Module::retFeasible;
}
示例12: componentNumber
void ComponentSplitterLayout::call(GraphAttributes &GA)
{
// Only do preparations and call if layout is valid
if (m_secondaryLayout.valid())
{
//first we split the graph into its components
const Graph& G = GA.constGraph();
NodeArray<int> componentNumber(G);
m_numberOfComponents = connectedComponents(G, componentNumber);
if (m_numberOfComponents == 0) {
return;
}
//std::vector< std::vector<node> > componentArray;
//componentArray.resize(numComponents);
//Array<GraphAttributes *> components(numComponents);
//
// intialize the array of lists of nodes contained in a CC
nodesInCC.init(m_numberOfComponents);
node v;
forall_nodes(v,G)
nodesInCC[componentNumber[v]].pushBack(v);
// Create copies of the connected components and corresponding
// GraphAttributes
GraphCopy GC;
GC.createEmpty(G);
EdgeArray<edge> auxCopy(G);
for (int i = 0; i < m_numberOfComponents; i++)
{
GC.initByNodes(nodesInCC[i],auxCopy);
GraphAttributes cGA(GC);
//copy information into copy GA
forall_nodes(v, GC)
{
cGA.width(v) = GA.width(GC.original(v));
cGA.height(v) = GA.height(GC.original(v));
cGA.x(v) = GA.x(GC.original(v));
cGA.y(v) = GA.y(GC.original(v));
}
m_secondaryLayout.get().call(cGA);
//copy layout information back into GA
forall_nodes(v, GC)
{
node w = GC.original(v);
if (w != 0)
GA.x(w) = cGA.x(v);
GA.y(w) = cGA.y(v);
}
}
示例13: computeImpulse
void GEMLayout::computeImpulse(GraphCopy &G, GraphCopyAttributes &AG,node v) {
//const Graph &G = AG.constGraph();
int n = G.numberOfNodes();
double deltaX,deltaY,delta,deltaSqu;
double desiredLength,desiredSqu;
// add double node radius to desired edge length
desiredLength = m_desiredLength + length(AG.getHeight(v),AG.getWidth(v));
desiredSqu = desiredLength * desiredLength;
// compute attraction to center of gravity
m_newImpulseX = (m_barycenterX / n - AG.x(v)) * m_gravitationalConstant;
m_newImpulseY = (m_barycenterY / n - AG.y(v)) * m_gravitationalConstant;
// disturb randomly
int maxIntDisturbance = (int)(m_maximalDisturbance * 10000);
std::uniform_int_distribution<> dist(-maxIntDisturbance,maxIntDisturbance);
m_newImpulseX += (dist(m_rng) / 10000.0);
m_newImpulseY += (dist(m_rng) / 10000.0);
// compute repulsive forces
for(node u : G.nodes)
if(u != v ) {
deltaX = AG.x(v) - AG.x(u);
deltaY = AG.y(v) - AG.y(u);
delta = length(deltaX,deltaY);
if(OGDF_GEOM_ET.greater(delta,0.0)) {
deltaSqu = delta * delta;
m_newImpulseX += deltaX * desiredSqu / deltaSqu;
m_newImpulseY += deltaY * desiredSqu / deltaSqu;
}
}
// compute attractive forces
for(adjEntry adj : v->adjEntries) {
node u = adj->twinNode();
deltaX = AG.x(v) - AG.x(u);
deltaY = AG.y(v) - AG.y(u);
delta = length(deltaX,deltaY);
if(m_attractionFormula == 1) {
m_newImpulseX -= deltaX * delta / (desiredLength * weight(v));
m_newImpulseY -= deltaY * delta / (desiredLength * weight(v));
}
else {
deltaSqu = delta * delta;
m_newImpulseX -= deltaX * deltaSqu / (desiredSqu * weight(v));
m_newImpulseY -= deltaY * deltaSqu / (desiredSqu * weight(v));
}
}
}
示例14: callAndDelete
Module::ReturnType PlanarSubgraphModule::callAndDelete(
GraphCopy &PG,
const List<edge> &preferedEdges,
List<edge> &delOrigEdges,
bool preferedImplyPlanar)
{
List<edge> delEdges;
ReturnType retValue = call(PG, preferedEdges, delEdges, preferedImplyPlanar);
if(isSolution(retValue))
{
ListConstIterator<edge> it;
for(it = delEdges.begin(); it.valid(); ++it) {
edge eCopy = *it;
delOrigEdges.pushBack(PG.original(eCopy));
PG.delCopy(eCopy);
}
}
return retValue;
}
示例15: initGC
void GraphCopy::initGC(const GraphCopy &GC,
NodeArray<node> &vCopy,
EdgeArray<edge> &eCopy)
{
createEmpty(*GC.m_pGraph);
for(node v : GC.nodes)
m_vOrig[vCopy[v]] = GC.original(v);
for(edge e : GC.edges)
m_eOrig[eCopy[e]] = GC.original(e);
for (node v : nodes) {
node w = m_vOrig[v];
if (w != nullptr)
m_vCopy[w] = v;
}
for(edge e : m_pGraph->edges) {
ListConstIterator<edge> it;
for (edge ei : GC.m_eCopy[e])
m_eIterator[eCopy[ei]] = m_eCopy[e].pushBack(eCopy[ei]);
}
}