#ifndef Snap_Cliques #define Snap_Cliques #include "Snap.h" ///////////////////////////////////////////////// // Clique Percolation Method for Overlapping community detection class TCliqueOverlap { private: //Recursion variables only PUNGraph m_G; TIntV m_Q; TVec *m_maxCliques; int m_minMaxCliqueSize; private: void GetNbhs(int NId, THashSet& Nbhs) const; int GetNodeIdWithMaxDeg(const THashSet& Set) const; int MaxNbhsInCANDNodeId(const THashSet& SUBG, const THashSet& CAND) const; private: void Expand(const THashSet& SUBG, THashSet& CAND); public: static void GetRelativeComplement(const THashSet& A, const THashSet& B, THashSet& Complement); static void GetIntersection(const THashSet& A, const THashSet& B, THashSet& C); static int Intersection(const THashSet& A, const THashSet& B); static void CalculateOverlapMtx(const TVec& MaxCliques, int MinNodeOverlap, TVec& OverlapMtx); static PUNGraph CalculateOverlapMtx(const TVec& MaxCliques, int MinNodeOverlap); static void GetOverlapCliques(const TVec& OverlapMtx, int MinNodeOverlap, TVec& CliqueIdVV); static void GetOverlapCliques(const TVec& OverlapMtx, const TVec& MaxCliques, double MinOverlapFrac, TVec& CliqueIdVV); public: TCliqueOverlap() : m_G(), m_Q(), m_maxCliques(NULL), m_minMaxCliqueSize(3) { } void GetMaximalCliques(const PUNGraph& G, int MinMaxCliqueSize, TVec& MaxCliques); /// Enumerate maximal cliques of the network on more than MinMaxCliqueSize nodes static void GetMaxCliques(const PUNGraph& G, int MinMaxCliqueSize, TVec& MaxCliques); /// Clique Percolation method communities static void GetCPMCommunities(const PUNGraph& G, int MinMaxCliqueSize, TVec& Communities); }; #endif