|
SNAP Library 2.1, Developer Reference
2013-09-25 10:47:25
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
#include <agm.h>
Static Public Member Functions | |
| static void | RndConnectInsideCommunity (PUNGraph &Graph, const TIntV &CmtyV, const double &Prob, TRnd &Rnd) |
| Connect members of a given community by Erdos-Renyi. | |
| static PUNGraph | GenAGM (const TIntV &NIdV, THash< TInt, TIntV > &CmtyVH, const TStr &AGMNm, const double &PiCoef, const double &ProbBase, TRnd &Rnd=TInt::Rnd) |
| static PUNGraph | GenAGM (TVec< TIntV > &CmtyVV, const double &DensityCoef, const double &ScaleCoef, TRnd &Rnd=TInt::Rnd) |
| static PUNGraph | GenAGM (TVec< TIntV > &CmtyVV, const double &DensityCoef, const int TargetEdges, TRnd &Rnd) |
| static PUNGraph | GenAGM (TVec< TIntV > &CmtyVV, const TFltV &CProbV, TRnd &Rnd, const double PNoCom=-1.0) |
| Generate graph using the AGM model. CProbV = vector of Pc. | |
| PUNGraph TAGM::GenAGM | ( | TVec< TIntV > & | CmtyVV, |
| const double & | DensityCoef, | ||
| const double & | ScaleCoef, | ||
| TRnd & | Rnd = TInt::Rnd |
||
| ) | [static] |
Definition at line 37 of file agm.cpp.
References TVec< TVal, TSizeTy >::Add(), GenAGM(), and TVec< TVal, TSizeTy >::Len().
{
TFltV CProbV;
double Prob;
for (int i = 0; i < CmtyVV.Len(); i++) {
Prob = ScaleCoef*pow( double( CmtyVV[i].Len()), - DensityCoef);
if (Prob > 1.0) { Prob = 1; }
CProbV.Add(Prob);
}
return TAGM::GenAGM(CmtyVV, CProbV, Rnd);
}

| PUNGraph TAGM::GenAGM | ( | TVec< TIntV > & | CmtyVV, |
| const double & | DensityCoef, | ||
| const int | TargetEdges, | ||
| TRnd & | Rnd | ||
| ) | [static] |
Definition at line 31 of file agm.cpp.
References GenAGM(), and TUNGraph::GetEdges().
{
PUNGraph TryG = TAGM::GenAGM(CmtyVV, DensityCoef, 1.0, Rnd);
const double ScaleCoef = (double) TargetEdges / (double) TryG->GetEdges();
return TAGM::GenAGM(CmtyVV, DensityCoef, ScaleCoef, Rnd);
}

| PUNGraph TAGM::GenAGM | ( | TVec< TIntV > & | CmtyVV, |
| const TFltV & | CProbV, | ||
| TRnd & | Rnd, | ||
| const double | PNoCom = -1.0 |
||
| ) | [static] |
Generate graph using the AGM model. CProbV = vector of Pc.
Definition at line 49 of file agm.cpp.
References THashSet< TKey, THashFunc >::AddKey(), TUNGraph::AddNode(), TUNGraph::Defrag(), TUNGraph::GetEdges(), THashSet< TKey, THashFunc >::GetKeyV(), TUNGraph::GetNodes(), TUNGraph::IsNode(), TVec< TVal, TSizeTy >::Len(), TUNGraph::New(), and RndConnectInsideCommunity().
{
PUNGraph G = TUNGraph::New(100 * CmtyVV.Len(), -1);
printf("AGM begins\n");
for (int i = 0; i < CmtyVV.Len(); i++) {
TIntV& CmtyV = CmtyVV[i];
for (int u = 0; u < CmtyV.Len(); u++) {
if ( G->IsNode(CmtyV[u])) { continue; }
G->AddNode(CmtyV[u]);
}
double Prob = CProbV[i];
RndConnectInsideCommunity(G, CmtyV, Prob, Rnd);
}
if (PNoCom > 0.0) { //if we want to connect nodes that do not share any community
TIntSet NIDS;
for (int c = 0; c < CmtyVV.Len(); c++) {
for (int u = 0; u < CmtyVV[c].Len(); u++) {
NIDS.AddKey(CmtyVV[c][u]);
}
}
TIntV NIDV;
NIDS.GetKeyV(NIDV);
RndConnectInsideCommunity(G,NIDV,PNoCom,Rnd);
}
printf("AGM completed (%d nodes %d edges)\n",G->GetNodes(),G->GetEdges());
G->Defrag();
return G;
}

| void TAGM::RndConnectInsideCommunity | ( | PUNGraph & | Graph, |
| const TIntV & | CmtyV, | ||
| const double & | Prob, | ||
| TRnd & | Rnd | ||
| ) | [static] |
Connect members of a given community by Erdos-Renyi.
Definition at line 10 of file agm.cpp.
References TUNGraph::AddEdge(), THashSet< TKey, THashFunc >::AddKey(), TRnd::GetBinomialDev(), TRnd::GetUniDevInt(), THashSet< TKey, THashFunc >::IsKey(), TVec< TVal, TSizeTy >::Len(), and Swap().
Referenced by GenAGM().
{
int CNodes = CmtyV.Len(), CEdges;
if (CNodes < 20) {
CEdges = (int) Rnd.GetBinomialDev(Prob, CNodes * (CNodes-1) / 2);
} else {
CEdges = (int) (Prob * CNodes * (CNodes - 1) / 2);
}
THashSet<TIntPr> NewEdgeSet(CEdges);
for (int edge = 0; edge < CEdges; ) {
int SrcNId = CmtyV[Rnd.GetUniDevInt(CNodes)];
int DstNId = CmtyV[Rnd.GetUniDevInt(CNodes)];
if (SrcNId > DstNId) { Swap(SrcNId,DstNId); }
if (SrcNId != DstNId && ! NewEdgeSet.IsKey(TIntPr(SrcNId, DstNId))) { // is new edge
NewEdgeSet.AddKey(TIntPr(SrcNId, DstNId));
Graph->AddEdge(SrcNId, DstNId);
edge++;
}
}
}

