#include "stdafx.h" #include "agm.h" PUNGraph TAGM::GenAGM(TVec& CmtyVV, const double& DensityCoef, const double& ScaleCoef, TRnd& Rnd){ TFltV CProbV; double Prob; for(int i=0;i1){Prob = 1;} CProbV.Add(Prob); } PUNGraph G = TUNGraph::New(); printf("AGM begins\n"); for(int i=0;iAddNode(CmtyV[u]); } Prob = CProbV[i]; printf("\r%d(%d)/%d",i,CmtyVV[i].Len(),CmtyVV.Len()); RndConnectInsideCommunity(G,CmtyV,Prob,Rnd); } printf("AGM completed (%d nodes %d edges)\n",G->GetNodes(),G->GetEdges()); return G; } void TAGM::RndConnectInsideCommunity(PUNGraph& Graph, const TIntV& CmtyV, const double& Prob, TRnd& Rnd){ int CNodes = CmtyV.Len(); int CEdges = Rnd.GetBinomialDev(Prob,CNodes*(CNodes-1)/2); THashSet 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++; } } } void TAGM::GetNodeMembership(THash& NIDComVH, const THash& CmtyVH) { for(int i=0;i& NIDComVH, const TVec& CmtyVV) { THash CmtyVH; for(int i=0;i