SNAP Library 2.1, User Reference  2013-09-25 10:47:25
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
TAGM Class Reference

#include <agm.h>

List of all members.

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.

Detailed Description

Affiliaiton Graph Model (AGM) graph generator.

Definition at line 7 of file agm.h.


Member Function Documentation

static PUNGraph TAGM::GenAGM ( const TIntV NIdV,
THash< TInt, TIntV > &  CmtyVH,
const TStr AGMNm,
const double &  PiCoef,
const double &  ProbBase,
TRnd Rnd = TInt::Rnd 
) [static]
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.

                                                                                                       {
  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.

                                                                                                     {
  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.

                                                                                             {
  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.

                                                                                                      {
  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++; 
    } 
  }
}

The documentation for this class was generated from the following files: