void analyzeSimNetProps() { const char *eFName = "epidemicRoutingNetEdges.txt"; const char *pFName = "prophetRoutingNetEdges.txt"; PNGraph eGraph = TSnap::LoadEdgeListStr<PNGraph>(eFName, 0, 1); PNEGraph pGraph = TSnap::LoadEdgeListStr<PNEGraph>(pFName, 0, 1); PNGraph randGraph = TSnap::GenRndGnm<PNGraph>(eGraph->GetNodes(), eGraph->GetEdges(), true, TInt::Rnd); chdir("dot"); for (int i=0; i<10; i++) { TIntV NIdV; for (int j = 0; j < 10; j++) { int randNode = eGraph->GetRndNId(); NIdV.AddUnique(randNode); } // Plot the mesage propagtion in Endroy-Renyi graphs PNGraph randFlow = TSnap::GetSubGraph<PNGraph>(randGraph, NIdV); char randf[50]; sprintf(randf,"%d-erdos.dot",i); TSnap::SaveGViz(randFlow, randf, TStr("Edros-Renyi random graph")); // Now plot epidemic routing PNGraph epidemicFlow = TSnap::GetSubGraph<PNGraph>(eGraph, NIdV); char epf[50]; sprintf(epf,"%d-epidemic.dot",i); TSnap::SaveGViz(epidemicFlow, epf, TStr("Epidemic routing")); } }
// Test node, edge creation void ManipulateNodesEdges() { int NNodes = 10000; int NEdges = 100000; const char *FName = "demo.graph.dat"; PNGraph Graph; PNGraph Graph1; PNGraph Graph2; int i; int n; int NCount; int ECount1; int ECount2; int x,y; bool t; Graph = TNGraph::New(); t = Graph->Empty(); // create the nodes for (i = 0; i < NNodes; i++) { Graph->AddNode(i); } t = Graph->Empty(); n = Graph->GetNodes(); // create random edges NCount = NEdges; while (NCount > 0) { x = rand() % NNodes; y = rand() % NNodes; // Graph->GetEdges() is not correct for the loops (x == y), // skip the loops in this test if (x != y && !Graph->IsEdge(x,y)) { n = Graph->AddEdge(x, y); NCount--; } } PrintGStats("ManipulateNodesEdges:Graph",Graph); // get all the nodes NCount = 0; for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { NCount++; } // get all the edges for all the nodes ECount1 = 0; for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { for (int e = 0; e < NI.GetOutDeg(); e++) { ECount1++; } } // get all the edges directly ECount2 = 0; for (TNGraph::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) { ECount2++; } printf("ManipulateNodesEdges:Graph, nodes %d, edges1 %d, edges2 %d\n", NCount, ECount1, ECount2); // assignment Graph1 = TNGraph::New(); *Graph1 = *Graph; PrintGStats("ManipulateNodesEdges:Graph1",Graph1); // save the graph { TFOut FOut(FName); Graph->Save(FOut); FOut.Flush(); } // load the graph { TFIn FIn(FName); Graph2 = TNGraph::Load(FIn); } PrintGStats("ManipulateNodesEdges:Graph2",Graph2); // remove all the nodes and edges for (i = 0; i < NNodes; i++) { n = Graph->GetRndNId(); Graph->DelNode(n); } PrintGStats("ManipulateNodesEdges:Graph",Graph); Graph1->Clr(); PrintGStats("ManipulateNodesEdges:Graph1",Graph1); }
// Test node, edge creation TEST(TNGraph, ManipulateNodesEdges) { int NNodes = 10000; int NEdges = 100000; const char *FName = "test.graph.dat"; PNGraph Graph; PNGraph Graph1; PNGraph Graph2; int i; int n; int NCount; int x,y; int Deg, InDeg, OutDeg; Graph = TNGraph::New(); EXPECT_EQ(1,Graph->Empty()); // create the nodes for (i = 0; i < NNodes; i++) { Graph->AddNode(i); } EXPECT_EQ(0,Graph->Empty()); EXPECT_EQ(NNodes,Graph->GetNodes()); // create random edges NCount = NEdges; while (NCount > 0) { x = (long) (drand48() * NNodes); y = (long) (drand48() * NNodes); // Graph->GetEdges() is not correct for the loops (x == y), // skip the loops in this test if (x != y && !Graph->IsEdge(x,y)) { n = Graph->AddEdge(x, y); NCount--; } } EXPECT_EQ(NEdges,Graph->GetEdges()); EXPECT_EQ(0,Graph->Empty()); EXPECT_EQ(1,Graph->IsOk()); for (i = 0; i < NNodes; i++) { EXPECT_EQ(1,Graph->IsNode(i)); } EXPECT_EQ(0,Graph->IsNode(NNodes)); EXPECT_EQ(0,Graph->IsNode(NNodes+1)); EXPECT_EQ(0,Graph->IsNode(2*NNodes)); // nodes iterator NCount = 0; for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { NCount++; } EXPECT_EQ(NNodes,NCount); // edges per node iterator NCount = 0; for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { for (int e = 0; e < NI.GetOutDeg(); e++) { NCount++; } } EXPECT_EQ(NEdges,NCount); // edges iterator NCount = 0; for (TNGraph::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) { NCount++; } EXPECT_EQ(NEdges,NCount); // node degree for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { Deg = NI.GetDeg(); InDeg = NI.GetInDeg(); OutDeg = NI.GetOutDeg(); EXPECT_EQ(Deg,InDeg+OutDeg); } // assignment Graph1 = TNGraph::New(); *Graph1 = *Graph; EXPECT_EQ(NNodes,Graph1->GetNodes()); EXPECT_EQ(NEdges,Graph1->GetEdges()); EXPECT_EQ(0,Graph1->Empty()); EXPECT_EQ(1,Graph1->IsOk()); // saving and loading { TFOut FOut(FName); Graph->Save(FOut); FOut.Flush(); } { TFIn FIn(FName); Graph2 = TNGraph::Load(FIn); } EXPECT_EQ(NNodes,Graph2->GetNodes()); EXPECT_EQ(NEdges,Graph2->GetEdges()); EXPECT_EQ(0,Graph2->Empty()); EXPECT_EQ(1,Graph2->IsOk()); // remove all the nodes and edges for (i = 0; i < NNodes; i++) { n = Graph->GetRndNId(); Graph->DelNode(n); } EXPECT_EQ(0,Graph->GetNodes()); EXPECT_EQ(0,Graph->GetEdges()); EXPECT_EQ(1,Graph->IsOk()); EXPECT_EQ(1,Graph->Empty()); Graph1->Clr(); EXPECT_EQ(0,Graph1->GetNodes()); EXPECT_EQ(0,Graph1->GetEdges()); EXPECT_EQ(1,Graph1->IsOk()); EXPECT_EQ(1,Graph1->Empty()); }
// Demos BFS functions on directed graph that is not fully connected void DemoBFSDirectedRandom() { PNGraph G = TNGraph::New(); TStr FName = TStr::Fmt("%s/sample_bfsdfs_ngraph.txt", DIRNAME); // Create benchmark graph, initially visually to confirm values are correct const int NNodes = 30; G = GenRndGnm<PNGraph>(NNodes, NNodes*2); // Add some more random edges for (int i = 0; i < 10; i++) { TInt Src, Dst; do { Src = G->GetRndNId(); Dst = G->GetRndNId(); } while (Src == Dst || G->IsEdge(Src, Dst)); G->AddEdge(Src, Dst); } // Add isolated component G->AddNode(NNodes); G->AddNode(NNodes+1); G->AddNode(NNodes+2); G->AddEdge(NNodes, NNodes+1); G->AddEdge(NNodes+1, NNodes+2); G->AddEdge(NNodes+2, NNodes+1); printf("G->GetNodes() = %d, G->GetEdges() = %d\n", G->GetNodes(), G->GetEdges()); // SaveEdgeList(G, FName); // G = LoadEdgeList<PNGraph>(FName); TIntStrH NodeLabelH; for (int i = 0; i < G->GetNodes(); i++) { NodeLabelH.AddDat(i, TStr::Fmt("%d", i)); } DrawGViz(G, gvlDot, TStr::Fmt("%s/sample_bfsdfs_ngraph.png", DIRNAME), "Sample BFS Graph", NodeLabelH); printf("G->GetNodes() = %d, G->GetEdges() = %d\n", G->GetNodes(), G->GetEdges()); TIntV NIdV; int StartNId, Hop, Nodes; // for (int IsDir = 0; IsDir < 2; IsDir++) { int IsDir = 1; printf("IsDir = %d:\n", IsDir); StartNId = 11; Hop = 1; Nodes = GetNodesAtHop(G, StartNId, Hop, NIdV, IsDir); printf("Nodes = %d, GetNodesAtHop NIdV.Len() = %d\n", Nodes, NIdV.Len()); for (int i = 0; i < NIdV.Len(); i++) { printf("NIdV[%d] = %d\n", i, NIdV[i].Val); } printf("Nodes == 2"); printf("NIdV.Len() == 2"); TIntPrV HopCntV; Nodes = GetNodesAtHops(G, StartNId, HopCntV, IsDir); printf("Nodes = %d, GetNodesAtHops HopCntV.Len() = %d\n", Nodes, HopCntV.Len()); printf("Nodes == 10"); printf("HopCntV.Len() == 10"); // for (int N = 0; N < HopCntV.Len(); N++) { // printf("HopCntV[%d] = (%d, %d)\n", N, HopCntV[N].Val1.Val, HopCntV[N].Val2.Val); // } int Length, SrcNId, DstNId; SrcNId = 11; DstNId = G->GetNodes() - 1; Length = GetShortPath(G, SrcNId, DstNId, IsDir); printf("%d -> %d: SPL Length = %d\n", SrcNId, DstNId, Length); SrcNId = 11; DstNId = 27; Length = GetShortPath(G, SrcNId, DstNId, IsDir); printf("%d -> %d: SPL Length = %d\n", SrcNId, DstNId, Length); TIntH NIdToDistH; int MaxDist = 9; Length = GetShortPath(G, SrcNId, NIdToDistH, IsDir, MaxDist); // for (int i = 0; i < min(5,NIdToDistH.Len()); i++) { // printf("NIdToDistH[%d] = %d\n", i, NIdToDistH[i].Val); // } TInt::Rnd.PutSeed(0); int FullDiam; double EffDiam, AvgSPL; int NTestNodes = G->GetNodes() / 2; FullDiam = GetBfsFullDiam(G, NTestNodes, IsDir); printf("FullDiam = %d\n", FullDiam); EffDiam = GetBfsEffDiam(G, NTestNodes, IsDir); printf("EffDiam = %.3f\n", EffDiam); EffDiam = GetBfsEffDiam(G, NTestNodes, IsDir, EffDiam, FullDiam); printf("EffDiam = %.3f, FullDiam = %d\n", EffDiam, FullDiam); EffDiam = GetBfsEffDiam(G, NTestNodes, IsDir, EffDiam, FullDiam, AvgSPL); printf("EffDiam = %.3f, FullDiam = %d, AvgDiam = %.3f\n", EffDiam, FullDiam, AvgSPL); TIntV SubGraphNIdV; SubGraphNIdV.Add(8); SubGraphNIdV.Add(29); SubGraphNIdV.Add(16); SubGraphNIdV.Add(0); SubGraphNIdV.Add(19); SubGraphNIdV.Add(17); SubGraphNIdV.Add(26); SubGraphNIdV.Add(14); SubGraphNIdV.Add(10); SubGraphNIdV.Add(24); SubGraphNIdV.Add(27); SubGraphNIdV.Add(2); SubGraphNIdV.Add(18); EffDiam = GetBfsEffDiam(G, NTestNodes, SubGraphNIdV, IsDir, EffDiam, FullDiam); printf("For subgraph: EffDiam = %.4f, FullDiam = %d\n", EffDiam, FullDiam); }