SNAP Library, Developer Reference  2012-10-15 15:06:59
SNAP, a general purpose network analysis and graph mining library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
agm.cpp
Go to the documentation of this file.
00001 #include "stdafx.h"
00002 #include "agm.h"
00003 
00004 PUNGraph TAGM::GenAGM(TVec<TIntV>& CmtyVV, const double& DensityCoef, const double& ScaleCoef, TRnd& Rnd){
00005         TFltV CProbV;
00006         double Prob;
00007         for(int i=0;i<CmtyVV.Len();i++) {
00008                 Prob = ScaleCoef*pow(double(CmtyVV[i].Len()),-DensityCoef);
00009                 if(Prob>1){Prob = 1;}
00010                 CProbV.Add(Prob);
00011         }
00012         PUNGraph G = TUNGraph::New();
00013         printf("AGM begins\n");
00014         for(int i=0;i<CmtyVV.Len();i++) {
00015                 TIntV& CmtyV = CmtyVV[i];
00016                 for(int u=0;u<CmtyV.Len();u++) {
00017                         G->AddNode(CmtyV[u]);
00018                 }
00019                 Prob = CProbV[i];
00020                 printf("\r%d(%d)/%d",i,CmtyVV[i].Len(),CmtyVV.Len());
00021                 RndConnectInsideCommunity(G,CmtyV,Prob,Rnd);
00022         }
00023         printf("AGM completed (%d nodes %d edges)\n",G->GetNodes(),G->GetEdges());
00024         return G;
00025 }
00026 
00027 void TAGM::RndConnectInsideCommunity(PUNGraph& Graph, const TIntV& CmtyV, const double& Prob, TRnd& Rnd){
00028         const int CNodes = CmtyV.Len();
00029         const int CEdges = (int) TMath::Round(Rnd.GetBinomialDev(Prob,CNodes*(CNodes-1)/2));
00030         THashSet<TIntPr> NewEdgeSet(CEdges);
00031         for (int edge = 0; edge < CEdges; ) {
00032                 int SrcNId = CmtyV[Rnd.GetUniDevInt(CNodes)];
00033                 int DstNId = CmtyV[Rnd.GetUniDevInt(CNodes)];
00034                 if(SrcNId>DstNId){Swap(SrcNId,DstNId);}
00035                 if (SrcNId != DstNId && !NewEdgeSet.IsKey(TIntPr(SrcNId,DstNId))) { // is new edge
00036                         NewEdgeSet.AddKey(TIntPr(SrcNId,DstNId));
00037                         Graph->AddEdge(SrcNId,DstNId);
00038                         edge++;
00039                 }
00040         }
00041 }
00042 
00043 void TAGM::GetNodeMembership(THash<TInt,TIntV >& NIDComVH, const THash<TInt,TIntV>& CmtyVH) {
00044         for(int i=0;i<CmtyVH.Len();i++){
00045                 int CID = CmtyVH.GetKey(i);
00046                 for(int j=0;j<CmtyVH[i].Len();j++) {
00047                         int NID = CmtyVH[i][j];
00048                         NIDComVH.AddDat(NID).Add(CID);
00049                 }
00050         }
00051 }
00052 
00053 void TAGM::GetNodeMembership(THash<TInt,TIntV >& NIDComVH, const TVec<TIntV>& CmtyVV) {
00054         THash<TInt,TIntV> CmtyVH;
00055         for(int i=0;i<CmtyVV.Len();i++) {
00056                 CmtyVH.AddDat(i,CmtyVV[i]);
00057         }
00058         GetNodeMembership(NIDComVH,CmtyVH);
00059 }