|
SNAP Library 2.2, User 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.
{ G = TNGraph::New(); }
| TCodaAnalyzer::TCodaAnalyzer | ( | TCoda & | Coda, |
| const double | MemThres = -1.0 |
||
| ) | [inline] |
Definition at line 205 of file agmdirected.h.
{
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.
{
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.
{
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.
{
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.
{
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.
{
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.
{ 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.
{
//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.
{
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.
Definition at line 201 of file agmdirected.h.
Definition at line 203 of file agmdirected.h.
Definition at line 202 of file agmdirected.h.