int main(int argc, char* argv[]) { Env = TEnv(argc, argv, TNotify::StdNotify); Env.PrepArgs(TStr::Fmt("ragm. build: %s, %s. Time: %s", __TIME__, __DATE__, TExeTm::GetCurTm())); TExeTm ExeTm; Try TStr OutFPrx = Env.GetIfArgPrefixStr("-o:", "", "Output Graph data prefix"); const TStr InFNm = Env.GetIfArgPrefixStr("-i:", "../as20graph.txt", "Input edgelist file name"); const TStr LabelFNm = Env.GetIfArgPrefixStr("-l:", "", "Input file name for node names (Node ID, Node label) "); int OptComs = Env.GetIfArgPrefixInt("-c:", -1, "The number of communities to detect (-1: detect automatically)"); const int MinComs = Env.GetIfArgPrefixInt("-mc:", 5, "Minimum number of communities to try"); const int MaxComs = Env.GetIfArgPrefixInt("-xc:", 100, "Maximum number of communities to try"); const int DivComs = Env.GetIfArgPrefixInt("-nc:", 10, "How many trials for the number of communities"); const int NumThreads = Env.GetIfArgPrefixInt("-nt:", 1, "Number of threads for parallelization"); const double StepAlpha = Env.GetIfArgPrefixFlt("-sa:", 0.3, "Alpha for backtracking line search"); const double StepBeta = Env.GetIfArgPrefixFlt("-sb:", 0.3, "Beta for backtracking line search"); PUNGraph G; TIntStrH NIDNameH; if (InFNm.IsStrIn(".ungraph")) { TFIn GFIn(InFNm); G = TUNGraph::Load(GFIn); } else { G = TAGMUtil::LoadEdgeListStr<PUNGraph>(InFNm, NIDNameH); } if (LabelFNm.Len() > 0) { TSsParser Ss(LabelFNm, ssfTabSep); while (Ss.Next()) { if (Ss.Len() > 0) { NIDNameH.AddDat(Ss.GetInt(0), Ss.GetFld(1)); } } } else { } printf("Graph: %d Nodes %d Edges\n", G->GetNodes(), G->GetEdges()); TVec<TIntV> EstCmtyVV; TExeTm RunTm; TAGMFast RAGM(G, 10, 10); if (OptComs == -1) { printf("finding number of communities\n"); OptComs = RAGM.FindComsByCV(NumThreads, MaxComs, MinComs, DivComs, OutFPrx, StepAlpha, StepBeta); } RAGM.NeighborComInit(OptComs); if (NumThreads == 1 || G->GetEdges() < 1000) { RAGM.MLEGradAscent(0.0001, 1000 * G->GetNodes(), "", StepAlpha, StepBeta); } else { RAGM.MLEGradAscentParallel(0.0001, 1000, NumThreads, "", StepAlpha, StepBeta); } RAGM.GetCmtyVV(EstCmtyVV); TAGMUtil::DumpCmtyVV(OutFPrx + "cmtyvv.txt", EstCmtyVV, NIDNameH); TAGMUtil::SaveGephi(OutFPrx + "graph.gexf", G, EstCmtyVV, 1.5, 1.5, NIDNameH); Catch printf("\nrun time: %s (%s)\n", ExeTm.GetTmStr(), TSecTm::GetCurTm().GetTmStr().CStr()); return 0; }
// Save directed, undirected and multi-graphs in GraphVizp .DOT format void IOGViz() { const int NNodes = 500; const int NEdges = 2000; const char *FName1 = "demo1.dot.dat", *FName2 = "demo2.dot.dat"; const char *Desc = "Randomly generated GgraphVizp for input/output."; PNGraph GOut; // Can be PNEGraph or PUNGraph GOut = GenRndGnm<PNGraph>(NNodes, NEdges); SaveGViz(GOut, FName1); // Output node IDs as numbers TIntStrH NIdLabelH; // Generate labels for random graph for (TNGraph::TNodeI NI = GOut->BegNI(); NI < GOut->EndNI(); NI++) { NIdLabelH.AddDat(NI.GetId(), TStr::Fmt("Node%d", NI.GetId())); } SaveGViz(GOut, FName2, Desc, NIdLabelH); PrintGStats("IOGViz - In", GOut); }
/// save bipartite community affiliation into gexf file void TAGMUtil::SaveBipartiteGephi(const TStr& OutFNm, const TIntV& NIDV, const TVec<TIntV>& CmtyVV, const double MaxSz, const double MinSz, const TIntStrH& NIDNameH, const THash<TInt, TIntTr>& NIDColorH, const THash<TInt, TIntTr>& CIDColorH ) { /// Plot bipartite graph if (CmtyVV.Len() == 0) { return; } double NXMin = 0.1, YMin = 0.1, NXMax = 250.00, YMax = 30.0; double CXMin = 0.3 * NXMax, CXMax = 0.7 * NXMax; double CStep = (CXMax - CXMin) / (double) CmtyVV.Len(), NStep = (NXMax - NXMin) / (double) NIDV.Len(); THash<TInt,TIntV> NIDComVH; TAGMUtil::GetNodeMembership(NIDComVH, CmtyVV); FILE* F = fopen(OutFNm.CStr(), "wt"); fprintf(F, "<?xml version='1.0' encoding='UTF-8'?>\n"); fprintf(F, "<gexf xmlns='http://www.gexf.net/1.2draft' xmlns:viz='http://www.gexf.net/1.1draft/viz' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.gexf.net/1.2draft http://www.gexf.net/1.2draft/gexf.xsd' version='1.2'>\n"); fprintf(F, "\t<graph mode='static' defaultedgetype='directed'>\n"); fprintf(F, "\t\t<nodes>\n"); for (int c = 0; c < CmtyVV.Len(); c++) { int CID = c; double XPos = c * CStep + CXMin; TIntTr Color = CIDColorH.IsKey(CID)? CIDColorH.GetDat(CID) : TIntTr(120, 120, 120); fprintf(F, "\t\t\t<node id='C%d' label='C%d'>\n", CID, CID); fprintf(F, "\t\t\t\t<viz:color r='%d' g='%d' b='%d'/>\n", Color.Val1.Val, Color.Val2.Val, Color.Val3.Val); fprintf(F, "\t\t\t\t<viz:size value='%.3f'/>\n", MaxSz); fprintf(F, "\t\t\t\t<viz:shape value='square'/>\n"); fprintf(F, "\t\t\t\t<viz:position x='%f' y='%f' z='0.0'/>\n", XPos, YMax); fprintf(F, "\t\t\t</node>\n"); } for (int u = 0; u < NIDV.Len(); u++) { int NID = NIDV[u]; TStr Label = NIDNameH.IsKey(NID)? NIDNameH.GetDat(NID): ""; double Size = MinSz; double XPos = NXMin + u * NStep; TIntTr Color = NIDColorH.IsKey(NID)? NIDColorH.GetDat(NID) : TIntTr(120, 120, 120); double Alpha = 1.0; fprintf(F, "\t\t\t<node id='%d' label='%s'>\n", NID, Label.CStr()); fprintf(F, "\t\t\t\t<viz:color r='%d' g='%d' b='%d' a='%.1f'/>\n", Color.Val1.Val, Color.Val2.Val, Color.Val3.Val, Alpha); fprintf(F, "\t\t\t\t<viz:size value='%.3f'/>\n", Size); fprintf(F, "\t\t\t\t<viz:shape value='square'/>\n"); fprintf(F, "\t\t\t\t<viz:position x='%f' y='%f' z='0.0'/>\n", XPos, YMin); fprintf(F, "\t\t\t</node>\n"); } fprintf(F, "\t\t</nodes>\n"); fprintf(F, "\t\t<edges>\n"); int EID = 0; for (int u = 0; u < NIDV.Len(); u++) { int NID = NIDV[u]; if (NIDComVH.IsKey(NID)) { for (int c = 0; c < NIDComVH.GetDat(NID).Len(); c++) { int CID = NIDComVH.GetDat(NID)[c]; fprintf(F, "\t\t\t<edge id='%d' source='C%d' target='%d'/>\n", EID++, CID, NID); } } } fprintf(F, "\t\t</edges>\n"); fprintf(F, "\t</graph>\n"); fprintf(F, "</gexf>\n"); }
int TTransCorpus::CountWords(const TIntStrH& StrH) { int Words = 0, KeyId = StrH.FFirstKeyId(); while (StrH.FNextKeyId(KeyId)) { const TStr& Str = StrH[KeyId]; TStrV WordV; Str.SplitOnWs(WordV); Words += WordV.Len(); } return Words; }
/// dump bipartite community affiliation into a text file with node names void TAGMUtil::DumpCmtyVV(const TStr OutFNm, TVec<TIntV>& CmtyVV, TIntStrH& NIDNmH) { FILE* F = fopen(OutFNm.CStr(), "wt"); for (int c = 0; c < CmtyVV.Len(); c++) { for (int u = 0; u < CmtyVV[c].Len(); u++) { if (NIDNmH.IsKey(CmtyVV[c][u])) { fprintf(F, "%s\t", NIDNmH.GetDat(CmtyVV[c][u]).CStr()); } else { fprintf(F, "%d\t", (int) CmtyVV[c][u]); } } fprintf(F, "\n"); } fclose(F); }
// Loads a (directed, undirected or multi) graph from a text file InFNm with 1 node and all its edges in a single line. void IOConnListStr() { const int NNodes = 500; const int NEdges = 2000; const char *FName = "demo.graph.dat"; PUNGraph GOut, GIn; GOut = GenRndGnm<PUNGraph>(NNodes, NEdges); // Output nodes as random strings TIntStrH OutNIdStrH; TStrHash<TInt> OutStrNIdH; // Generate unique random strings for graph for (TUNGraph::TNodeI NI = GOut->BegNI(); NI < GOut->EndNI(); NI++) { TStr RandStr = ""; do { TInt RandLen = TInt::Rnd.GetUniDevInt(5, 10); for (int i = 0; i < RandLen; i++) { // TStr RandChar(TInt::Rnd.GetUniDevInt(33, 126)); TStr RandChar(TInt::Rnd.GetUniDevInt(97, 122)); RandStr += RandChar; } } while (OutStrNIdH.IsKey(RandStr) || RandStr[0] == '#'); OutNIdStrH.AddDat(NI.GetId(), RandStr); OutStrNIdH.AddDat(RandStr, NI.GetId()); } // Create graph file FILE *F = fopen(FName, "w"); for (TUNGraph::TNodeI NI = GOut->BegNI(); NI < GOut->EndNI(); NI++) { fprintf(F, "%s", OutNIdStrH[NI.GetId()].CStr()); for (int e = 0; e < NI.GetOutDeg(); e++) { fprintf(F, " %s", OutNIdStrH[NI.GetOutNId(e)].CStr()); } fprintf(F, "\n"); } fclose(F); TStrHash<TInt> InStrToNIdH; GIn = LoadConnListStr<PUNGraph>(FName, InStrToNIdH); PrintGStats("ConnListStr - Out", GOut); PrintGStats("ConnListStr - In", GIn); }
// Save and load directed, undirected and multi-graphs, where node names are strings void IOEdgeListStr() { const int NNodes = 1000; const int NEdges = 5000; const char *FName = "demo.graph.dat"; PNEGraph GOut, GIn; // Can also be PUNGraph or PNGraph GOut = GenRndGnm<PNEGraph>(NNodes, NEdges); // Output nodes as random strings TIntStrH OutNIdStrH; TStrHash<TInt> OutStrNIdH; // Generate unique random strings for graph TStr RandStr; for (TNEGraph::TNodeI NI = GOut->BegNI(); NI < GOut->EndNI(); NI++) { do { RandStr.Clr(); TInt RandLen = TInt::Rnd.GetUniDevInt(5, 30); for (int i = 0; i < RandLen; i++) { TStr RandChar(TInt::Rnd.GetUniDevInt(33, 126)); RandStr += RandChar; } } while (OutStrNIdH.IsKey(RandStr) || RandStr[0] == '#'); // Not unique or starts with comment OutNIdStrH.AddDat(NI.GetId(), RandStr); OutStrNIdH.AddDat(RandStr, NI.GetId()); } // Create graph file FILE *F = fopen(FName, "w"); for (TNEGraph::TEdgeI EI = GOut->BegEI(); EI < GOut->EndEI(); EI++) { TInt Src = EI.GetSrcNId(); TInt Dst = EI.GetDstNId(); fprintf(F, "%s %s\n", OutNIdStrH[Src].CStr(), OutNIdStrH[Dst].CStr()); } fclose(F); // Load edge list of strings TStrHash<TInt> InStrToNIdH; GIn = LoadEdgeListStr<PNEGraph>(FName, 0, 1, InStrToNIdH); PrintGStats<PNEGraph>("EdgeListStr - Out", GOut); PrintGStats<PNEGraph>("EdgeListStr - In", GIn); }
int main(int argc, char* argv[]) { Env = TEnv(argc, argv, TNotify::StdNotify); Env.PrepArgs(TStr::Fmt("cesna. build: %s, %s. Time: %s", __TIME__, __DATE__, TExeTm::GetCurTm())); TExeTm ExeTm; Try TStr OutFPrx = Env.GetIfArgPrefixStr("-o:", "", "Output Graph data prefix"); const TStr InFNm = Env.GetIfArgPrefixStr("-i:", "./1912.edges", "Input edgelist file name"); const TStr LabelFNm = Env.GetIfArgPrefixStr("-l:", "", "Input file name for node names (Node ID, Node label) "); const TStr AttrFNm = Env.GetIfArgPrefixStr("-a:", "./1912.nodefeat", "Input node attribute file name"); const TStr ANameFNm = Env.GetIfArgPrefixStr("-n:", "./1912.nodefeatnames", "Input file name for node attribute names"); int OptComs = Env.GetIfArgPrefixInt("-c:", 10, "The number of communities to detect (-1: detect automatically)"); const int MinComs = Env.GetIfArgPrefixInt("-mc:", 3, "Minimum number of communities to try"); const int MaxComs = Env.GetIfArgPrefixInt("-xc:", 20, "Maximum number of communities to try"); const int DivComs = Env.GetIfArgPrefixInt("-nc:", 5, "How many trials for the number of communities"); const int NumThreads = Env.GetIfArgPrefixInt("-nt:", 4, "Number of threads for parallelization"); const double AttrWeight = Env.GetIfArgPrefixFlt("-aw:", 0.5, "We maximize (1 - aw) P(Network) + aw * P(Attributes)"); const double LassoWeight = Env.GetIfArgPrefixFlt("-lw:", 1.0, "Weight for l-1 regularization on learning the logistic model parameters"); const double StepAlpha = Env.GetIfArgPrefixFlt("-sa:", 0.05, "Alpha for backtracking line search"); const double StepBeta = Env.GetIfArgPrefixFlt("-sb:", 0.3, "Beta for backtracking line search"); const double MinFeatFrac = Env.GetIfArgPrefixFlt("-mf:", 0.0, "If the fraction of nodes with positive values for an attribute is smaller than this, we ignore that attribute"); #ifdef USE_OPENMP omp_set_num_threads(NumThreads); #endif PUNGraph G; TIntStrH NIDNameH; TStrHash<TInt> NodeNameH; TVec<TFltV> Wck; TVec<TIntV> EstCmtyVV; if (InFNm.IsStrIn(".ungraph")) { TFIn GFIn(InFNm); G = TUNGraph::Load(GFIn); } else { G = TAGMUtil::LoadEdgeListStr<PUNGraph>(InFNm, NodeNameH); NIDNameH.Gen(NodeNameH.Len()); for (int s = 0; s < NodeNameH.Len(); s++) { NIDNameH.AddDat(s, NodeNameH.GetKey(s)); } } if (LabelFNm.Len() > 0) { TSsParser Ss(LabelFNm, ssfTabSep); while (Ss.Next()) { if (Ss.Len() > 0) { NIDNameH.AddDat(Ss.GetInt(0), Ss.GetFld(1)); } } } printf("Graph: %d Nodes %d Edges\n", G->GetNodes(), G->GetEdges()); //load attribute TIntV NIDV; G->GetNIdV(NIDV); THash<TInt, TIntV> RawNIDAttrH, NIDAttrH; TIntStrH RawFeatNameH, FeatNameH; if (ANameFNm.Len() > 0) { TSsParser Ss(ANameFNm, ssfTabSep); while (Ss.Next()) { if (Ss.Len() > 0) { RawFeatNameH.AddDat(Ss.GetInt(0), Ss.GetFld(1)); } } } TCesnaUtil::LoadNIDAttrHFromNIDKH(NIDV, AttrFNm, RawNIDAttrH, NodeNameH); TCesnaUtil::FilterLowEntropy(RawNIDAttrH, NIDAttrH, RawFeatNameH, FeatNameH, MinFeatFrac); TExeTm RunTm; TCesna CS(G, NIDAttrH, 10, 10); if (OptComs == -1) { printf("finding number of communities\n"); OptComs = CS.FindComs(NumThreads, MaxComs, MinComs, DivComs, "", false, 0.1, StepAlpha, StepBeta); } CS.NeighborComInit(OptComs); CS.SetWeightAttr(AttrWeight); CS.SetLassoCoef(LassoWeight); if (NumThreads == 1 || G->GetEdges() < 1000) { CS.MLEGradAscent(0.0001, 1000 * G->GetNodes(), "", StepAlpha, StepBeta); } else { CS.MLEGradAscentParallel(0.0001, 1000, NumThreads, "", StepAlpha, StepBeta); } CS.GetCmtyVV(EstCmtyVV, Wck); TAGMUtil::DumpCmtyVV(OutFPrx + "cmtyvv.txt", EstCmtyVV, NIDNameH); FILE* F = fopen((OutFPrx + "weights.txt").CStr(), "wt"); if (FeatNameH.Len() == Wck[0].Len()) { fprintf(F, "#"); for (int k = 0; k < FeatNameH.Len(); k++) { fprintf(F, "%s", FeatNameH[k].CStr()); if (k < FeatNameH.Len() - 1) { fprintf(F, "\t"); } } fprintf(F, "\n"); } for (int c = 0; c < Wck.Len(); c++) { for (int k = 0; k < Wck[c].Len(); k++) { fprintf(F, "%f", Wck[c][k].Val); if (k < Wck[c].Len() - 1) { fprintf(F, "\t"); } } fprintf(F, "\n"); } fclose(F); Catch printf("\nrun time: %s (%s)\n", ExeTm.GetTmStr(), TSecTm::GetCurTm().GetTmStr().CStr()); return 0; }
// Test drawing of SNAP graphs using GraphViz with color labeling TEST(GVizTest, DrawGVizColor) { PUNGraph UNGraph1; UNGraph1 = LoadEdgeList<PUNGraph>(TStr::Fmt("%s/sample_ungraph1.txt", DIRNAME)); TIntStrH NIdColorH; TStr CName = TStr::Fmt("%s/node_colors.txt", DIRNAME); ASSERT_TRUE(fileExists(CName.CStr())); // Read in node to color mapping FILE *CFile; CFile = fopen(CName.CStr(), "rt"); char line[80]; while(fgets(line, 80, CFile) != NULL) { int NId; char Color[20]; sscanf(line, "%d %s\n", &NId, Color); NIdColorH.AddDat(NId, Color); } PNGraph NGraph1; NGraph1 = LoadEdgeList<PNGraph>(TStr::Fmt("%s/sample_ngraph1.txt", DIRNAME)); TStrV LNames; // gvlDot, gvlNeato, gvlTwopi, gvlCirco LNames.Add("Dot"); LNames.Add("Neato"); LNames.Add("Twopi"); LNames.Add("Circo"); TStrV Exts; //Exts.Add("ps"); //Exts.Add("gif"); Exts.Add("png"); Exts.Add("dot"); for (int i = 0; i < LNames.Len(); i++) { for (int e = 0; e < Exts.Len(); e++) { for (int IsDir = 0; IsDir < 2; IsDir++) { // Baseline file is already created (use as benchmark) TStr FNameBase = TStr::Fmt("%s/base_%s_%s_col.%s", DIRNAME, IsDir ? "ngraph" : "ungraph" , LNames[i].CStr(), Exts[e].CStr()); TStr FNameTest = TStr::Fmt("%s/test_%s_%s_col.%s", DIRNAME, IsDir ? "ngraph" : "ungraph" , LNames[i].CStr(), Exts[e].CStr()); // Compare DOT files directly (generated by graphing other extensions) if (Exts[e] == "dot") { EXPECT_TRUE(compareFiles(FNameBase.CStr(), FNameTest.CStr())); } else { // Remove test graph if it already exists remove(FNameTest.CStr()); EXPECT_FALSE(fileExists(FNameTest.CStr())); // Draw new graph and check if created and equal to baseline (for ps only) if (IsDir) { //TSnap::DrawGViz(NGraph1, TGVizLayout(i), FNameBase, LNames[i], true, NIdColorH); TSnap::DrawGViz(NGraph1, TGVizLayout(i), FNameTest, LNames[i], true, NIdColorH); } else { //TSnap::DrawGViz(UNGraph1, TGVizLayout(i), FNameBase, LNames[i], true, NIdColorH); TSnap::DrawGViz(UNGraph1, TGVizLayout(i), FNameTest, LNames[i], true, NIdColorH); } } // Check if file exists EXPECT_TRUE(fileExists(FNameTest.CStr())); #ifdef __linux // Compare directly for ps files on Linux, (can't compare png and gif due to EXIF-labels) if (Exts[e] == "ps") { EXPECT_TRUE(compareFiles(FNameBase.CStr(), FNameTest.CStr())); } #endif } } } }
int main(int argc, char* argv[]) { Env = TEnv(argc, argv, TNotify::StdNotify); Env.PrepArgs(TStr::Fmt("cpm. build: %s, %s. Time: %s", __TIME__, __DATE__, TExeTm::GetCurTm())); TExeTm ExeTm; Try TStr OutFPrx = Env.GetIfArgPrefixStr("-o:", "", "Output file name prefix"); const TStr InFNm = Env.GetIfArgPrefixStr("-i:", "football.edgelist", "Input edgelist file name. DEMO: AGM with 2 communities"); const TStr LabelFNm = Env.GetIfArgPrefixStr("-l:", "football.labels", "Input file name for node names (Node ID, Node label) "); const TInt RndSeed = Env.GetIfArgPrefixInt("-s:", 0, "Random seed for AGM"); const TFlt Epsilon = Env.GetIfArgPrefixFlt("-e:", 0, "Edge probability between the nodes that do not share any community (default (0.0): set it to be 1 / N^2)"); const TInt Coms = Env.GetIfArgPrefixInt("-c:", 0, "Number of communities (0: determine it by AGM)"); PUNGraph G = TUNGraph::New(); TVec<TIntV> CmtyVV; TIntStrH NIDNameH; if (InFNm == "DEMO") { TVec<TIntV> TrueCmtyVV; TRnd AGMRnd(RndSeed); //generate community bipartite affiliation const int ABegin = 0, AEnd = 70, BBegin = 30, BEnd = 100; TrueCmtyVV.Add(TIntV()); TrueCmtyVV.Add(TIntV()); for (int u = ABegin; u < AEnd; u++) { TrueCmtyVV[0].Add(u); } for (int u = BBegin; u < BEnd; u++) { TrueCmtyVV[1].Add(u); } G = TAGM::GenAGM(TrueCmtyVV, 0.0, 0.2, AGMRnd); } else if (LabelFNm.Len() > 0) { G = TSnap::LoadEdgeList<PUNGraph>(InFNm); TSsParser Ss(LabelFNm, ssfTabSep); while (Ss.Next()) { if (Ss.Len() > 0) { NIDNameH.AddDat(Ss.GetInt(0), Ss.GetFld(1)); } } } else { G = TAGMUtil::LoadEdgeListStr<PUNGraph>(InFNm, NIDNameH); } printf("Graph: %d Nodes %d Edges\n", G->GetNodes(), G->GetEdges()); int MaxIter = 50 * G->GetNodes() * G->GetNodes(); if (MaxIter < 0) { MaxIter = TInt::Mx; } int NumComs = Coms; if (NumComs < 2) { int InitComs; if (G->GetNodes() > 1000) { InitComs = G->GetNodes() / 5; NumComs = TAGMUtil::FindComsByAGM(G, InitComs, MaxIter, RndSeed, 1.5, Epsilon, OutFPrx); } else { InitComs = G->GetNodes() / 5; NumComs = TAGMUtil::FindComsByAGM(G, InitComs, MaxIter, RndSeed, 1.2, Epsilon, OutFPrx); } } TAGMFit AGMFit(G, NumComs, RndSeed); if (Epsilon > 0) { AGMFit.SetPNoCom(Epsilon); } AGMFit.RunMCMC(MaxIter, 10); AGMFit.GetCmtyVV(CmtyVV, 0.9999); TAGMUtil::DumpCmtyVV(OutFPrx + "cmtyvv.txt", CmtyVV, NIDNameH); TAGMUtil::SaveGephi(OutFPrx + "graph.gexf", G, CmtyVV, 1.5, 1.5, NIDNameH); AGMFit.PrintSummary(); Catch printf("\nrun time: %s (%s)\n", ExeTm.GetTmStr(), TSecTm::GetCurTm().GetTmStr().CStr()); return 0; }
TStr TGStat::GetValStr(const TGStatVal& Val) { static TIntStrH ValTyStrH; if (ValTyStrH.Empty()) { ValTyStrH.AddDat(gsvNone, "None"); ValTyStrH.AddDat(gsvTime, "Time"); ValTyStrH.AddDat(gsvNodes, "Nodes"); ValTyStrH.AddDat(gsvZeroNodes, "ZeroNodes"); ValTyStrH.AddDat(gsvNonZNodes, "NonZNodes"); ValTyStrH.AddDat(gsvSrcNodes, "SrcNodes"); ValTyStrH.AddDat(gsvDstNodes, "DstNodes"); ValTyStrH.AddDat(gsvEdges, "Edges"); ValTyStrH.AddDat(gsvUniqEdges, "UniqEdges"); ValTyStrH.AddDat(gsvBiDirEdges, "BiDirEdges"); ValTyStrH.AddDat(gsvWccNodes, "WccNodes"); ValTyStrH.AddDat(gsvWccSrcNodes, "WccSrcNodes"); ValTyStrH.AddDat(gsvWccDstNodes, "WccDstNodes"); ValTyStrH.AddDat(gsvWccEdges, "WccEdges"); ValTyStrH.AddDat(gsvWccUniqEdges, "WccUniqEdges"); ValTyStrH.AddDat(gsvWccBiDirEdges, "WccBiDirEdges"); ValTyStrH.AddDat(gsvFullDiam, "FullDiam"); ValTyStrH.AddDat(gsvEffDiam, "EffDiam"); ValTyStrH.AddDat(gsvEffWccDiam, "EffWccDiam"); ValTyStrH.AddDat(gsvFullWccDiam, "FullWccDiam"); ValTyStrH.AddDat(gsvFullDiamDev, "FullDiamDev"); ValTyStrH.AddDat(gsvEffDiamDev, "EffDiamDev"); ValTyStrH.AddDat(gsvEffWccDiamDev, "EffWccDiamDev"); ValTyStrH.AddDat(gsvFullWccDiamDev, "FullWccDiamDev"); ValTyStrH.AddDat(gsvClustCf, "ClustCf"); ValTyStrH.AddDat(gsvOpenTriads, "OpenTr"); ValTyStrH.AddDat(gsvClosedTriads, "ClosedTr"); ValTyStrH.AddDat(gsvWccSize, "WccSize"); ValTyStrH.AddDat(gsvMx, "Mx"); } IAssert(ValTyStrH.IsKey(int(Val))); return ValTyStrH.GetDat(int(Val)); }
// 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); }
// Demos BFS functions on undirected graph that is not fully connected void DemoBFSUndirectedRandom() { PUNGraph G; TStr FName = TStr::Fmt("%s/sample_bfsdfs_unpower.txt", DIRNAME); const int NNodes = 50; G = GenRndPowerLaw(NNodes, 2.5); // Can save/here // SaveEdgeList(G, FName); // G = LoadEdgeList<PUNGraph>(FName); TIntStrH NodeLabelH; for (int i = 0; i < G->GetNodes(); i++) { NodeLabelH.AddDat(i, TStr::Fmt("%d", i)); } DrawGViz(G, gvlNeato, TStr::Fmt("%s/sample_bfsdfs_unpower.png", DIRNAME), "Sample bfsdfs Graph", NodeLabelH); TIntV NIdV; int StartNId, Hop, Nodes; int IsDir = 0; printf("IsDir = %d:\n", IsDir); StartNId = 1; Hop = 1; Nodes = GetNodesAtHop(G, StartNId, Hop, NIdV, IsDir); printf("StartNId = %d, Nodes = %d, GetNodesAtHop NIdV.Len() = %d, NIdV[0] = %d\n", StartNId, Nodes, NIdV.Len(), NIdV[0].Val); TIntPrV HopCntV; Nodes = GetNodesAtHops(G, StartNId, HopCntV, IsDir); printf("StartNId = %d, Nodes = %d, GetNodesAtHops HopCntV.Len() = %d\n", StartNId , Nodes, HopCntV.Len()); // 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 = 1; DstNId = G->GetNodes() - 1; Length = GetShortPath(G, SrcNId, DstNId, IsDir); printf("%d -> %d: SPL Length = %d\n", SrcNId, DstNId, Length); SrcNId = 1; DstNId = 33; 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() / 3 * 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(0); SubGraphNIdV.Add(4); SubGraphNIdV.Add(31); SubGraphNIdV.Add(45); SubGraphNIdV.Add(18); SubGraphNIdV.Add(11); SubGraphNIdV.Add(11); SubGraphNIdV.Add(48); SubGraphNIdV.Add(34); SubGraphNIdV.Add(30); EffDiam = GetBfsEffDiam(G, NTestNodes, SubGraphNIdV, IsDir, EffDiam, FullDiam); printf("For subgraph: EffDiam = %.4f, FullDiam = %d\n", EffDiam, FullDiam); }
/// save graph into a gexf file which Gephi can read void TAGMUtil::SaveGephi(const TStr& OutFNm, const PUNGraph& G, const TVec<TIntV>& CmtyVVAtr, const double MaxSz, const double MinSz, const TIntStrH& NIDNameH, const THash<TInt, TIntTr>& NIDColorH ) { THash<TInt,TIntV> NIDComVHAtr; TAGMUtil::GetNodeMembership(NIDComVHAtr, CmtyVVAtr); FILE* F = fopen(OutFNm.CStr(), "wt"); fprintf(F, "<?xml version='1.0' encoding='UTF-8'?>\n"); fprintf(F, "<gexf xmlns='http://www.gexf.net/1.2draft' xmlns:viz='http://www.gexf.net/1.1draft/viz' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.gexf.net/1.2draft http://www.gexf.net/1.2draft/gexf.xsd' version='1.2'>\n"); fprintf(F, "\t<graph mode='static' defaultedgetype='undirected'>\n"); if (CmtyVVAtr.Len() > 0) { fprintf(F, "\t<attributes class='node'>\n"); for (int c = 0; c < CmtyVVAtr.Len(); c++) { fprintf(F, "\t\t<attribute id='%d' title='c%d' type='boolean'>", c, c); fprintf(F, "\t\t<default>false</default>\n"); fprintf(F, "\t\t</attribute>\n"); } fprintf(F, "\t</attributes>\n"); } fprintf(F, "\t\t<nodes>\n"); for (TUNGraph::TNodeI NI = G->BegNI(); NI < G->EndNI(); NI++) { int NID = NI.GetId(); TStr Label = NIDNameH.IsKey(NID)? NIDNameH.GetDat(NID): ""; Label.ChangeChAll('<', ' '); Label.ChangeChAll('>', ' '); Label.ChangeChAll('&', ' '); Label.ChangeChAll('\'', ' '); TIntTr Color = NIDColorH.IsKey(NID)? NIDColorH.GetDat(NID) : TIntTr(120, 120, 120); double Size = MinSz; double SizeStep = (MaxSz - MinSz) / (double) CmtyVVAtr.Len(); if (NIDComVHAtr.IsKey(NID)) { Size = MinSz + SizeStep * (double) NIDComVHAtr.GetDat(NID).Len(); } double Alpha = 1.0; fprintf(F, "\t\t\t<node id='%d' label='%s'>\n", NID, Label.CStr()); fprintf(F, "\t\t\t\t<viz:color r='%d' g='%d' b='%d' a='%.1f'/>\n", Color.Val1.Val, Color.Val2.Val, Color.Val3.Val, Alpha); fprintf(F, "\t\t\t\t<viz:size value='%.3f'/>\n", Size); //specify attributes if (NIDComVHAtr.IsKey(NID)) { fprintf(F, "\t\t\t\t<attvalues>\n"); for (int c = 0; c < NIDComVHAtr.GetDat(NID).Len(); c++) { int CID = NIDComVHAtr.GetDat(NID)[c]; fprintf(F, "\t\t\t\t\t<attvalue for='%d' value='true'/>\n", CID); } fprintf(F, "\t\t\t\t</attvalues>\n"); } fprintf(F, "\t\t\t</node>\n"); } fprintf(F, "\t\t</nodes>\n"); //plot edges int EID = 0; fprintf(F, "\t\t<edges>\n"); for (TUNGraph::TNodeI NI = G->BegNI(); NI < G->EndNI(); NI++) { for (int e = 0; e < NI.GetOutDeg(); e++) { if (NI.GetId() > NI.GetOutNId(e)) { continue; } fprintf(F, "\t\t\t<edge id='%d' source='%d' target='%d'/>\n", EID++, NI.GetId(), NI.GetOutNId(e)); } } fprintf(F, "\t\t</edges>\n"); fprintf(F, "\t</graph>\n"); fprintf(F, "</gexf>\n"); fclose(F); }