SNAP Library , Developer Reference  2013-01-07 14:03:36
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=TInt::Rnd)
static PUNGraph GenAGM (TVec< TIntV > &CmtyVV, const double &DensityCoef, const double &ScaleCoef, TRnd &Rnd=TInt::Rnd)
static void GetNodeMembership (THash< TInt, TIntV > &NIDComVH, const THash< TInt, TIntV > &CmtyVH)
static void GetNodeMembership (THash< TInt, TIntV > &NIDComVH, const TVec< TIntV > &CmtyVV)
template<class PGraph >
static void GVizComGraph (const PGraph &Graph, const TVec< TIntV > &CmtyVV, const TStr &OutFNm, const TStr &Desc=TStr())

Detailed Description

Definition at line 5 of file agm.h.


Member Function Documentation

PUNGraph TAGM::GenAGM ( TVec< TIntV > &  CmtyVV,
const double &  DensityCoef,
const double &  ScaleCoef,
TRnd Rnd = TInt::Rnd 
) [static]

Definition at line 4 of file agm.cpp.

References TVec< TVal >::Add(), TUNGraph::AddNode(), TUNGraph::GetEdges(), TUNGraph::GetNodes(), TVec< TVal >::Len(), TUNGraph::New(), and RndConnectInsideCommunity().

                                                                                                       {
        TFltV CProbV;
        double Prob;
        for(int i=0;i<CmtyVV.Len();i++) {
                Prob = ScaleCoef*pow(double(CmtyVV[i].Len()),-DensityCoef);
                if(Prob>1){Prob = 1;}
                CProbV.Add(Prob);
        }
        PUNGraph G = TUNGraph::New();
        printf("AGM begins\n");
        for(int i=0;i<CmtyVV.Len();i++) {
                TIntV& CmtyV = CmtyVV[i];
                for(int u=0;u<CmtyV.Len();u++) {
                        G->AddNode(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;
}

Here is the call graph for this function:

void TAGM::GetNodeMembership ( THash< TInt, TIntV > &  NIDComVH,
const THash< TInt, TIntV > &  CmtyVH 
) [static]

Definition at line 43 of file agm.cpp.

References TVec< TVal >::Add(), THash< TKey, TDat, THashFunc >::AddDat(), THash< TKey, TDat, THashFunc >::GetKey(), and THash< TKey, TDat, THashFunc >::Len().

Referenced by GetNodeMembership(), and GVizComGraph().

                                                                                          {
        for(int i=0;i<CmtyVH.Len();i++){
                int CID = CmtyVH.GetKey(i);
                for(int j=0;j<CmtyVH[i].Len();j++) {
                        int NID = CmtyVH[i][j];
                        NIDComVH.AddDat(NID).Add(CID);
                }
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void TAGM::GetNodeMembership ( THash< TInt, TIntV > &  NIDComVH,
const TVec< TIntV > &  CmtyVV 
) [static]

Definition at line 53 of file agm.cpp.

References THash< TKey, TDat, THashFunc >::AddDat(), GetNodeMembership(), and TVec< TVal >::Len().

                                                                                    {
        THash<TInt,TIntV> CmtyVH;
        for(int i=0;i<CmtyVV.Len();i++) {
                CmtyVH.AddDat(i,CmtyVV[i]);
        }
        GetNodeMembership(NIDComVH,CmtyVH);
}

Here is the call graph for this function:

template<class PGraph >
static void TAGM::GVizComGraph ( const PGraph &  Graph,
const TVec< TIntV > &  CmtyVV,
const TStr OutFNm,
const TStr Desc = TStr() 
) [inline, static]

Definition at line 13 of file agm.h.

References TStr::CStr(), TStr::Fmt(), THash< TKey, TDat, THashFunc >::GetDat(), TStr::GetFExt(), GetNodeMembership(), TStr::GetSubStr(), TVec< TVal >::GetV(), gfDirected, TSnap::TSnapDetail::GVizDoLayout(), gvlNeato, HasGraphFlag, IAssert, TVec< TVal >::Len(), and TStr::Len().

                                                                                                                                {
                TStrV Colors = TStrV::GetV("red","blue","green","pink","cyan");
                TStrV Shapes = TStrV::GetV("ellipse","triangle","square","pentagon","hexagon");
                THash<TInt,TIntV> NIDComVH;
                GetNodeMembership(NIDComVH,CmtyVV);

          const TStr Ext = OutFNm.GetFExt();
          const TStr GraphFNm = OutFNm.GetSubStr(0, OutFNm.Len()-Ext.Len()) + "dot";
                const bool IsDir = HasGraphFlag(typename PGraph::TObj, gfDirected);
                FILE *F = fopen(GraphFNm.CStr(), "wt");
                if (! Desc.Empty()) fprintf(F, "/*****\n%s\n*****/\n\n", Desc.CStr());
                if (IsDir) { fprintf(F, "digraph G {\n"); } else { fprintf(F, "graph G {\n"); }
                fprintf(F, "  graph [splines=false overlap=false]\n"); //size=\"12,10\" ratio=fill
                // node  [width=0.3, height=0.3, label=\"\", style=filled, color=black]
                // node  [shape=box, width=0.3, height=0.3, label=\"\", style=filled, fillcolor=red]
                fprintf(F, "  node  [width=0.3, height=0.3]\n");
                // node colors
                //for (int i = 0; i < NIdColorH.Len(); i++) {
                for (typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
                        int NID = NI.GetId();
                        TIntV& CIDV = NIDComVH.GetDat(NID);
                        IAssert(CIDV.Len()>0);
                        TStr ShapeNm = Shapes[(CIDV.Len()-1)%Shapes.Len()];
                        TStr ColorNm = Colors[CIDV[0]%Colors.Len()];
                        TStr NodeComLabel = TStr::Fmt("%d(",NID);
                        for(int i=0;i<CIDV.Len();i++) {
                                TStr TmpStr = TStr::Fmt("%d",int(CIDV[i]));
                                NodeComLabel += TmpStr;
                                if(i<CIDV.Len()-1){NodeComLabel+=",";}
                        }
                        NodeComLabel += ")";
                        fprintf(F, "  %d [style=filled, shape=\"%s\" fillcolor=\"%s\" label=\"%s\"];\n", NI.GetId(), ShapeNm.CStr(),ColorNm.CStr(), NodeComLabel.CStr());
                }

                // edges
                for (typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
                        if (NI.GetOutDeg()==0 && NI.GetInDeg()==0  ) {
                                fprintf(F, "%d;\n", NI.GetId()); }
                        else {
                                for (int e = 0; e < NI.GetOutDeg(); e++) {
                                        if (! IsDir && NI.GetId() > NI.GetOutNId(e)) { continue; }
                                        fprintf(F, "  %d %s %d;\n", NI.GetId(), IsDir?"->":"--", NI.GetOutNId(e));
                                }
                        }
                }
                if (! Desc.Empty()) {
                        fprintf(F, "  label = \"\\n%s\\n\";", Desc.CStr());
                        fprintf(F, "  fontsize=24;\n");
                }
                fprintf(F, "}\n");
                fclose(F);
                TSnap::TSnapDetail::GVizDoLayout(GraphFNm, OutFNm, gvlNeato);
        }

Here is the call graph for this function:

void TAGM::RndConnectInsideCommunity ( PUNGraph Graph,
const TIntV CmtyV,
const double &  Prob,
TRnd Rnd = TInt::Rnd 
) [static]

Definition at line 27 of file agm.cpp.

References TUNGraph::AddEdge(), THashSet< TKey, THashFunc >::AddKey(), TRnd::GetBinomialDev(), TRnd::GetUniDevInt(), THashSet< TKey, THashFunc >::IsKey(), TVec< TVal >::Len(), TMath::Round(), and Swap().

Referenced by GenAGM().

                                                                                                      {
        const int CNodes = CmtyV.Len();
        const int CEdges = (int) TMath::Round(Rnd.GetBinomialDev(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++;
                }
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:


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