SNAP Library 2.2, Developer Reference
2014-03-11 19:15:55
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
#include <agmdirected.h>
Public Member Functions | |
TCodaAnalyzer () | |
TCodaAnalyzer (TCoda &Coda, const double MemThres=-1.0) | |
void | GetAllCmtyVV (TVec< TIntV > &CmtyVV, const int MinSz) |
double | GetFrac2Mode (const double Thres2Mode=0.2, const int MinSzEach=2) |
void | Summary (const int TopK=10, const double Thres2Mode=0.2) |
int | GetNumComs () |
void | GetCmtyVAll (TIntV &CmtyVAll, const int CID) |
save bipartite community affiliation into gexf file | |
PNGraph | Net2ModeCommunities (const double MaxJac, const double JacEdge, const bool GetWcc=true) |
void | Dump2ModeCommunities (const TStr &OutFNm, const double MaxJac, const TIntStrH &NIDNameH) |
void | Draw2ModeCommunity (const int CID, const TStr &OutFNm, const TIntStrH &NIDNameH, const THash< TInt, TIntTr > &NIDColorH) |
Public Attributes | |
PNGraph | G |
TVec< TIntFltH > | InCmtyValHV |
TVec< TIntFltH > | OutCmtyValHV |
TVec< TIntFltH > | InOutCmtyValHV |
Definition at line 198 of file agmdirected.h.
TCodaAnalyzer::TCodaAnalyzer | ( | ) | [inline] |
Definition at line 204 of file agmdirected.h.
References G, and TNGraph::New().
{ G = TNGraph::New(); }
TCodaAnalyzer::TCodaAnalyzer | ( | TCoda & | Coda, |
const double | MemThres = -1.0 |
||
) | [inline] |
Definition at line 205 of file agmdirected.h.
References TVec< TVal, TSizeTy >::Add(), G, TNGraph::GetEdges(), TCoda::GetGraphRawNID(), TCoda::GetNIDValH(), TNGraph::GetNodes(), TCoda::GetNumComs(), TCoda::GetTopCIDs(), InCmtyValHV, InOutCmtyValHV, TVec< TVal, TSizeTy >::Len(), OutCmtyValHV, and TCoda::PNoCom.
{ G = Coda.GetGraphRawNID(); printf("graph copied (%d nodes %d edges)\n", G->GetNodes(), G->GetEdges()); TIntV CIdV; Coda.GetTopCIDs(CIdV, Coda.GetNumComs()); double Delta = MemThres == -1.0 ? sqrt(Coda.PNoCom): MemThres; for (int c = 0; c < CIdV.Len(); c++) { int CID = CIdV[c]; TIntFltH InMemH, OutMemH, InOutMemH; Coda.GetNIDValH(InOutMemH, OutMemH, InMemH, CID, Delta); InCmtyValHV.Add(InMemH); OutCmtyValHV.Add(OutMemH); InOutCmtyValHV.Add(InOutMemH); } printf("Communities copied (%d communities)\n", InCmtyValHV.Len()); }
void TCodaAnalyzer::Draw2ModeCommunity | ( | const int | CID, |
const TStr & | OutFNm, | ||
const TIntStrH & | NIDNameH, | ||
const THash< TInt, TIntTr > & | NIDColorH | ||
) | [inline] |
Plot bipartite graph for the 2-mode community
Definition at line 355 of file agmdirected.h.
References TNGraph::BegNI(), TStr::ChangeChAll(), TStr::CStr(), TVec< TVal, TSizeTy >::DelIfIn(), TNGraph::EndNI(), G, GetCmtyVAll(), THash< TKey, TDat, THashFunc >::GetDat(), TSnap::GetSubGraph(), InCmtyValHV, InOutCmtyValHV, THash< TKey, TDat, THashFunc >::IsKey(), TVec< TVal, TSizeTy >::Len(), OutCmtyValHV, TTriple< TVal1, TVal2, TVal3 >::Val1, TTriple< TVal1, TVal2, TVal3 >::Val2, and TTriple< TVal1, TVal2, TVal3 >::Val3.
{ TIntV CmtyVIn, CmtyVOut, CmtyVAll; InCmtyValHV[CID].GetKeyV(CmtyVIn); OutCmtyValHV[CID].GetKeyV(CmtyVOut); GetCmtyVAll(CmtyVAll, CID); //adjust for the nodes who belong to both cmtyvin and cmtyvout for (int u = 0; u < InOutCmtyValHV[CID].Len(); u++) { int UID = InOutCmtyValHV[CID].GetKey(u); if (CmtyVIn.Len() >= CmtyVOut.Len()) { CmtyVIn.DelIfIn(UID); } else { CmtyVOut.DelIfIn(UID); } } PNGraph SG = TSnap::GetSubGraph(G, CmtyVAll); if (CmtyVAll.Len() == 0) { return; } double OXMin = 0.1, YMin = 0.1, OXMax = 2500.00, YMax = 1000.0, IXMin = 0.1, IXMax = 2500.00; double OStep = (OXMax - OXMin) / (double) CmtyVOut.Len(), IStep = (IXMax - IXMin) / (double) CmtyVIn.Len(); 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 < CmtyVOut.Len(); c++) { int NID = CmtyVOut[c]; double XPos = c * OStep + OXMin; 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); 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'/>\n", Color.Val1.Val, Color.Val2.Val, Color.Val3.Val); fprintf(F, "\t\t\t\t<viz:size value='4.0'/>\n"); 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 < CmtyVIn.Len(); u++) { int NID = CmtyVIn[u]; TStr Label = NIDNameH.IsKey(NID)? NIDNameH.GetDat(NID): ""; Label.ChangeChAll('<', ' '); Label.ChangeChAll('>', ' '); Label.ChangeChAll('&', ' '); Label.ChangeChAll('\'', ' '); double XPos = IXMin + u * IStep; 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='4.0'/>\n"); 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"); //plot edges int EID = 0; fprintf(F, "\t\t<edges>\n"); for (TNGraph::TNodeI NI = SG->BegNI(); NI < SG->EndNI(); NI++) { if (NI.GetOutDeg() == 0 && NI.GetInDeg() == 0 ) { continue; } for (int e = 0; e < NI.GetOutDeg(); e++) { 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); }
void TCodaAnalyzer::Dump2ModeCommunities | ( | const TStr & | OutFNm, |
const double | MaxJac, | ||
const TIntStrH & | NIDNameH | ||
) | [inline] |
Definition at line 317 of file agmdirected.h.
References TStr::CStr(), TVec< TVal, TSizeTy >::DelIfIn(), TStr::Fmt(), GetCmtyVAll(), THash< TKey, TDat, THashFunc >::GetDat(), TVec< TVal, TSizeTy >::GetDat(), InCmtyValHV, InOutCmtyValHV, THash< TKey, TDat, THashFunc >::IsKey(), TVec< TVal, TSizeTy >::Len(), and OutCmtyValHV.
{ FILE* F = fopen(OutFNm.CStr(), "wt"); for (int c = 0; c < InCmtyValHV.Len(); c++) { double Jacc = (double) InOutCmtyValHV[c].Len() / (double) (InCmtyValHV[c].Len() + OutCmtyValHV[c].Len() - InOutCmtyValHV[c].Len()); if (Jacc > MaxJac) { continue; } TIntV CmtyVIn, CmtyVOut, CmtyVAll; InCmtyValHV[c].GetKeyV(CmtyVIn); OutCmtyValHV[c].GetKeyV(CmtyVOut); GetCmtyVAll(CmtyVAll, c); //adjust for the nodes who belong to both cmtyvin and cmtyvout for (int u = 0; u < InOutCmtyValHV[c].Len(); u++) { int UID = InOutCmtyValHV[c].GetKey(u); if (CmtyVIn.Len() >= CmtyVOut.Len()) { CmtyVIn.DelIfIn(UID); } else { CmtyVOut.DelIfIn(UID); } } if (CmtyVAll.Len() == 0) { continue; } fprintf(F, "Com %d\n", c); for (int u = 0; u < CmtyVOut.Len(); u++) { int NID = CmtyVOut[u]; TStr Label = NIDNameH.IsKey(NID)? NIDNameH.GetDat(NID): TStr::Fmt("Concept %d", NID); fprintf(F, "%s:%f\n", Label.CStr(), OutCmtyValHV[c].GetDat(NID).Val); } fprintf(F, "||==>||\n"); for (int u = 0; u < CmtyVIn.Len(); u++) { int NID = CmtyVIn[u]; TStr Label = NIDNameH.IsKey(NID)? NIDNameH.GetDat(NID): TStr::Fmt("Concept %d", NID); fprintf(F, "%s:%f\n", Label.CStr(), InCmtyValHV[c].GetDat(NID).Val); } fprintf(F, "\n"); } fclose(F); }
void TCodaAnalyzer::GetAllCmtyVV | ( | TVec< TIntV > & | CmtyVV, |
const int | MinSz | ||
) | [inline] |
Definition at line 221 of file agmdirected.h.
References TVec< TVal, TSizeTy >::Add(), InCmtyValHV, InOutCmtyValHV, TVec< TVal, TSizeTy >::Len(), and OutCmtyValHV.
{ for (int c = 0; c < InCmtyValHV.Len(); c++) { TIntV CmtyVIn, CmtyVOut, CmtyVInOut; if (InCmtyValHV[c].Len() < MinSz || OutCmtyValHV[c].Len() < MinSz) { continue; } InOutCmtyValHV[c].GetKeyV(CmtyVInOut); InCmtyValHV[c].GetKeyV(CmtyVIn); OutCmtyValHV[c].GetKeyV(CmtyVOut); CmtyVV.Add(CmtyVInOut); CmtyVV.Add(CmtyVOut); CmtyVV.Add(CmtyVIn); } }
void TCodaAnalyzer::GetCmtyVAll | ( | TIntV & | CmtyVAll, |
const int | CID | ||
) | [inline] |
save bipartite community affiliation into gexf file
Definition at line 263 of file agmdirected.h.
References TVec< TVal, TSizeTy >::Gen(), InCmtyValHV, TVec< TVal, TSizeTy >::Len(), OutCmtyValHV, TVec< TVal, TSizeTy >::Sort(), and TVec< TVal, TSizeTy >::Union().
Referenced by Draw2ModeCommunity(), and Dump2ModeCommunities().
{ TIntV CmtyVIn, CmtyVOut; InCmtyValHV[CID].GetKeyV(CmtyVIn); OutCmtyValHV[CID].GetKeyV(CmtyVOut); CmtyVIn.Sort(); CmtyVOut.Sort(); CmtyVAll.Gen(CmtyVIn.Len() + CmtyVOut.Len(), 0); CmtyVIn.Union(CmtyVOut, CmtyVAll); }
double TCodaAnalyzer::GetFrac2Mode | ( | const double | Thres2Mode = 0.2 , |
const int | MinSzEach = 2 |
||
) | [inline] |
Definition at line 234 of file agmdirected.h.
References InCmtyValHV, InOutCmtyValHV, TVec< TVal, TSizeTy >::Len(), and OutCmtyValHV.
{ int Cnt2Mode = 0; int CntAll = 0; for (int c = 0; c < InCmtyValHV.Len(); c++) { double Jacc = (double) InOutCmtyValHV[c].Len() / (double) (InCmtyValHV[c].Len() + OutCmtyValHV[c].Len() - InOutCmtyValHV[c].Len()); if (InCmtyValHV[c].Len() < MinSzEach || OutCmtyValHV[c].Len() < MinSzEach) { continue; } if (Jacc <= Thres2Mode) { Cnt2Mode++; } CntAll++; } return (double) Cnt2Mode / (double) CntAll; }
int TCodaAnalyzer::GetNumComs | ( | ) | [inline] |
Definition at line 260 of file agmdirected.h.
References InCmtyValHV, and TVec< TVal, TSizeTy >::Len().
{ return InCmtyValHV.Len(); }
PNGraph TCodaAnalyzer::Net2ModeCommunities | ( | const double | MaxJac, |
const double | JacEdge, | ||
const bool | GetWcc = true |
||
) | [inline] |
Definition at line 273 of file agmdirected.h.
References TVec< TVal, TSizeTy >::Add(), TNGraph::AddEdge(), TNGraph::AddNode(), TNGraph::DelNode(), TNGraph::TNodeI::GetDeg(), TNGraph::GetEdges(), TNGraph::TNodeI::GetInDeg(), TNGraph::GetNI(), TNGraph::GetNIdV(), TNGraph::GetNodes(), TNGraph::TNodeI::GetOutDeg(), TNGraph::TNodeI::GetOutNId(), InCmtyValHV, InOutCmtyValHV, TAGMUtil::Intersection(), TNGraph::IsNode(), TVec< TVal, TSizeTy >::Len(), TNGraph::New(), and OutCmtyValHV.
{ //if In(A) is similar to Out(B), create an edge A->B between 2 communities A, B int Coms = InCmtyValHV.Len(); PNGraph ComG = TNGraph::New(Coms, -1); for (int c = 0; c < InCmtyValHV.Len(); c++) { double Jacc = (double) InOutCmtyValHV[c].Len() / (double) (InCmtyValHV[c].Len() + OutCmtyValHV[c].Len() - InOutCmtyValHV[c].Len()); if (Jacc > MaxJac) { continue; } ComG->AddNode(c); } TVec<TIntSet> CmtySVIn, CmtySVOut; for (int c = 0; c < Coms; c++) { TIntV CmtyVIn, CmtyVOut; InCmtyValHV[c].GetKeyV(CmtyVIn); OutCmtyValHV[c].GetKeyV(CmtyVOut); TIntSet CmtySIn(CmtyVIn), CmtySOut(CmtyVOut); CmtySVIn.Add(CmtySIn); CmtySVOut.Add(CmtySOut); } for (int c1 = 0; c1 < Coms; c1++) { if (! ComG->IsNode(c1)) { continue; } for (int c2 = 0; c2 < Coms; c2++) { if (! ComG->IsNode(c2)) { continue; } int IntC1C2 = TAGMUtil::Intersection(CmtySVIn[c1], CmtySVOut[c2]); double Jac = (double) IntC1C2 / (CmtySVIn[c1].Len() + CmtySVOut[c2].Len() - IntC1C2); if (Jac >= JacEdge) { ComG->AddEdge(c1, c2); } } } //PNGraph Wcc = TSnap::GetMxWcc(ComG); TIntV NIDV; ComG->GetNIdV(NIDV); for (int u = 0; u < NIDV.Len(); u++) { int NID = NIDV[u]; TNGraph::TNodeI NI = ComG->GetNI(NID); if (NI.GetDeg() == 0) { ComG->DelNode(NID); } if (NI.GetInDeg() == 1 && NI.GetOutDeg() == 1 && NI.GetOutNId(0) == NID) { ComG->DelNode(NID); } } printf("Community graph made (Jaccard similarity for edges: %f, %d nodes, %d edges)\n", JacEdge, ComG->GetNodes(), ComG->GetEdges()); return ComG; }
void TCodaAnalyzer::Summary | ( | const int | TopK = 10 , |
const double | Thres2Mode = 0.2 |
||
) | [inline] |
Definition at line 246 of file agmdirected.h.
References InCmtyValHV, InOutCmtyValHV, TVec< TVal, TSizeTy >::Len(), and OutCmtyValHV.
{ int Cnt2Mode = 0; double SumJacc = 0.0; for (int c = 0; c < InCmtyValHV.Len(); c++) { double Jacc = (double) InOutCmtyValHV[c].Len() / (double) (InCmtyValHV[c].Len() + OutCmtyValHV[c].Len() - InOutCmtyValHV[c].Len()); if (Jacc <= Thres2Mode) { Cnt2Mode++; } SumJacc += Jacc; if (c < TopK) { printf("Cmty %d: InOut: %d, In:%d, Out:%d, Jacc;%.3f\n", c, InCmtyValHV[c].Len(), InCmtyValHV[c].Len(), OutCmtyValHV[c].Len(), Jacc); } } double AvgJacc = SumJacc / (double) InCmtyValHV.Len(); printf("Average jaccard similarity = %.3f. (%d / %d communities are 2-mode)\n", AvgJacc, Cnt2Mode, InCmtyValHV.Len()); }
Definition at line 200 of file agmdirected.h.
Referenced by Draw2ModeCommunity(), and TCodaAnalyzer().
Definition at line 201 of file agmdirected.h.
Referenced by Draw2ModeCommunity(), Dump2ModeCommunities(), GetAllCmtyVV(), GetCmtyVAll(), GetFrac2Mode(), GetNumComs(), Net2ModeCommunities(), Summary(), and TCodaAnalyzer().
Definition at line 203 of file agmdirected.h.
Referenced by Draw2ModeCommunity(), Dump2ModeCommunities(), GetAllCmtyVV(), GetFrac2Mode(), Net2ModeCommunities(), Summary(), and TCodaAnalyzer().
Definition at line 202 of file agmdirected.h.
Referenced by Draw2ModeCommunity(), Dump2ModeCommunities(), GetAllCmtyVV(), GetCmtyVAll(), GetFrac2Mode(), Net2ModeCommunities(), Summary(), and TCodaAnalyzer().