int Intersect(TUNGraph::TNodeI Node, int *NNodes, int NNodes_br){ int br = 0; int neig; for (int i = 0; i<Node.GetDeg(); i++) { neig = Node.GetNbrNId(i); for (int j = 0; j<NNodes_br; j++) { if (neig == NNodes[j]) { br++; j = NNodes_br; } } } neig = Node.GetId(); for (int j = 0; j<NNodes_br; j++) { if (neig == NNodes[j]) { br++; j = NNodes_br; } } return br; }
// Compute the change in likelihood (Delta) if node UID leaves community CID. double TAGMFit::SeekLeave(const int& UID, const int& CID) { IAssert(CIDNSetV[CID].IsKey(UID)); IAssert(G->IsNode(UID)); double Delta = 0.0; TUNGraph::TNodeI NI = G->GetNI(UID); int NbhsInC = 0; for (int e = 0; e < NI.GetDeg(); e++) { const int VID = NI.GetNbrNId(e); if (! NIDComVH.GetDat(VID).IsKey(CID)) { continue; } TIntPr SrcDstNIDPr(TMath::Mn(UID,VID), TMath::Mx(UID,VID)); TIntSet& JointCom = EdgeComVH.GetDat(SrcDstNIDPr); double CurPuv, NewPuv, LambdaSum = SelectLambdaSum(JointCom); CurPuv = 1 - exp(- LambdaSum); NewPuv = 1 - exp(- LambdaSum + LambdaV[CID]); IAssert(JointCom.Len() > 0); if (JointCom.Len() == 1) { NewPuv = PNoCom; } Delta += (log(NewPuv) - log(CurPuv)); IAssert(!_isnan(Delta)); NbhsInC++; } Delta += LambdaV[CID] * (CIDNSetV[CID].Len() - 1 - NbhsInC); return Delta; }
double TAGMFast::LikelihoodForOneVar(const TFltV& AlphaKV, const int UID, const int CID, const double& Val) { TUNGraph::TNodeI UI = G->GetNI(UID); double L = 0.0, PNoEdge; int VID = 0; for (int e = 0; e < UI.GetDeg(); e++) { VID = UI.GetNbrNId(e); if (HOVIDSV[UID].IsKey(UI.GetNbrNId(e))) { continue; } if (! F[VID].IsKey(CID)) { PNoEdge = AlphaKV[e]; } else { PNoEdge = AlphaKV[e] * exp (- F[VID].GetDat(CID) * Val); } IAssert(PNoEdge <= 1.0 && PNoEdge >= 0.0); //PNoEdge = PNoEdge >= 1.0 - PNoCom? 1 - PNoCom: PNoEdge; L += log(1.0 - PNoEdge) + NegWgt * GetCom(VID, CID) * Val; // += ((PNoEdge * F[VID].GetDat(CID)) / (1.0 - PNoEdge) + NegWgt * F[VID].GetDat(CID)); } L -= NegWgt * (SumFV[CID] - GetCom(UID, CID)) * Val; //add regularization if (RegCoef > 0.0) { //L1 L -= RegCoef * Val; } if (RegCoef < 0.0) { //L2 L += RegCoef * Val * Val; } return L; }
THash<TInt, TInt> * choose_seeds (const PUNGraph g, const int num, const int * infection_state, const int infect) { THash<TInt, TInt> choices; THash<TInt, TUNGraph::TNode> nodes; THash<TInt, TInt> * output = new THash<TInt, TInt> (); TInt weight = 0; TInt num_total = 0; for (TUNGraph::TNodeI n = g->BegNI(); n != g->EndNI(); n++) { //cout << "nodeID: " << n.GetId() << ",\tStatus: " << infection_state[n.GetId () - 1] << endl; if (infection_state[n.GetId () - 1] != infect) { weight += n.GetDeg (); choices.AddDat (num_total, weight); nodes.AddDat (num_total, n.GetId()); num_total++; } } // TRnd random ((int) time(NULL)); // TRnd random (0); TInt num_chosen = 0; while (num_chosen < num) { TInt choice = my_random.GetUniDevInt (weight); TUNGraph::TNode node_choice = nodes[find (choice, choices, 0, num_total-1)]; if (!output->IsKey(node_choice.GetId())) { num_chosen++; // cout << node_choice.GetId () << "\n"; output->AddDat(node_choice.GetId (), 1); } } return output; }
double ave_path_length (PUNGraph p) { TVec<TInt> v; double tot_lengths = 0.0; for (TUNGraph::TNodeI n = p->BegNI(); n != p->EndNI(); n++) { v = v + n.GetId(); } // cerr << "vlen: " << v.Len() << endl; TBreathFS<PUNGraph> b(p); double tot_pairs = 0.0; while (v.Len () > 0) { TInt last = v[v.Len()-1]; b.DoBfs (last, true, true); for (TVec<TInt>::TIter i = v.BegI(); (*i) != last; i++) { int length; length = b.GetHops (last, (*i)); if (length == length) { tot_lengths += length; tot_pairs += 1; } } // cerr << "tps: " << tot_pairs << ", last: " << last << ", beg: " << v[*(v.BegI())] << endl; v.Del(v.Len()-1); } // cerr << "paths: " << tot_lengths << " " << tot_pairs << " " << (tot_lengths/tot_pairs) << endl; return tot_lengths / tot_pairs; }
double TAGMUtil::GetConductance(const PUNGraph& Graph, const TIntSet& CmtyS, const int Edges) { const int Edges2 = Edges >= 0 ? 2*Edges : Graph->GetEdges(); int Vol = 0, Cut = 0; double Phi = 0.0; for (int i = 0; i < CmtyS.Len(); i++) { if (! Graph->IsNode(CmtyS[i])) { continue; } TUNGraph::TNodeI NI = Graph->GetNI(CmtyS[i]); for (int e = 0; e < NI.GetOutDeg(); e++) { if (! CmtyS.IsKey(NI.GetOutNId(e))) { Cut += 1; } } Vol += NI.GetOutDeg(); } // get conductance if (Vol != Edges2) { if (2 * Vol > Edges2) { Phi = Cut / double (Edges2 - Vol); } else if (Vol == 0) { Phi = 0.0; } else { Phi = Cut / double(Vol); } } else { if (Vol == Edges2) { Phi = 1.0; } } return Phi; }
// Compute the change in likelihood (Delta) if node UID switches from CurCID to NewCID. double TAGMFit::SeekSwitch(const int& UID, const int& CurCID, const int& NewCID) { IAssert(! CIDNSetV[NewCID].IsKey(UID)); IAssert(CIDNSetV[CurCID].IsKey(UID)); double Delta = SeekJoin(UID, NewCID) + SeekLeave(UID, CurCID); //correct only for intersection between new com and current com TUNGraph::TNodeI NI = G->GetNI(UID); for (int e = 0; e < NI.GetDeg(); e++) { const int VID = NI.GetNbrNId(e); if (! NIDComVH.GetDat(VID).IsKey(CurCID) || ! NIDComVH.GetDat(VID).IsKey(NewCID)) {continue;} TIntPr SrcDstNIDPr(TMath::Mn(UID,VID), TMath::Mx(UID,VID)); TIntSet& JointCom = EdgeComVH.GetDat(SrcDstNIDPr); double CurPuv, NewPuvAfterJoin, NewPuvAfterLeave, NewPuvAfterSwitch, LambdaSum = SelectLambdaSum(JointCom); CurPuv = 1 - exp(- LambdaSum); NewPuvAfterLeave = 1 - exp(- LambdaSum + LambdaV[CurCID]); NewPuvAfterJoin = 1 - exp(- LambdaSum - LambdaV[NewCID]); NewPuvAfterSwitch = 1 - exp(- LambdaSum - LambdaV[NewCID] + LambdaV[CurCID]); if (JointCom.Len() == 1 || NewPuvAfterLeave == 0.0) { NewPuvAfterLeave = PNoCom; } Delta += (log(NewPuvAfterSwitch) + log(CurPuv) - log(NewPuvAfterLeave) - log(NewPuvAfterJoin)); if (_isnan(Delta)) { printf("NS:%f C:%f NL:%f NJ:%f PNoCom:%f", NewPuvAfterSwitch, CurPuv, NewPuvAfterLeave, NewPuvAfterJoin, PNoCom.Val); } IAssert(!_isnan(Delta)); } return Delta; }
void TAGMFit::InitNodeData() { TSnap::DelSelfEdges(G); NIDComVH.Gen(G->GetNodes()); for (TUNGraph::TNodeI NI = G->BegNI(); NI < G->EndNI(); NI++) { NIDComVH.AddDat(NI.GetId()); } TAGMUtil::GetNodeMembership(NIDComVH, CIDNSetV); GetEdgeJointCom(); LambdaV.Gen(CIDNSetV.Len()); for (int c = 0; c < CIDNSetV.Len(); c++) { int MaxE = (CIDNSetV[c].Len()) * (CIDNSetV[c].Len() - 1) / 2; if (MaxE < 2) { LambdaV[c] = MaxLambda; } else{ LambdaV[c] = -log((double) (MaxE - ComEdgesV[c]) / MaxE); } if (LambdaV[c] > MaxLambda) { LambdaV[c] = MaxLambda; } if (LambdaV[c] < MinLambda) { LambdaV[c] = MinLambda; } } NIDCIDPrS.Gen(G->GetNodes() * 10); for (int c = 0; c < CIDNSetV.Len(); c++) { for (TIntSet::TIter SI = CIDNSetV[c].BegI(); SI < CIDNSetV[c].EndI(); SI++) { NIDCIDPrS.AddKey(TIntPr(SI.GetKey(), c)); } } }
void TAGMUtil::GetNbhCom(const PUNGraph& Graph, const int NID, TIntSet& NBCmtyS) { TUNGraph::TNodeI NI = Graph->GetNI(NID); NBCmtyS.Gen(NI.GetDeg()); NBCmtyS.AddKey(NID); for (int e = 0; e < NI.GetDeg(); e++) { NBCmtyS.AddKey(NI.GetNbrNId(e)); } }
int Intersect(TUNGraph::TNodeI Node, TIntH NNodes){ int br = 0; for (int i = 0; i<Node.GetDeg(); i++) { if (NNodes.IsKey(Node.GetNbrNId(i))) br++; } if (NNodes.IsKey(Node.GetId())) br++; return br; }
double GetGroupDegreeCentr(const PUNGraph& Graph, const PUNGraph& Group) { int deg; TIntH NN; for (TUNGraph::TNodeI NI = Group->BegNI(); NI < Group->EndNI(); NI++) { deg = Graph->GetNI(NI.GetId()).GetDeg(); for (int i = 0; i<deg; i++) { if (Group->IsNode(Graph->GetNI(NI.GetId()).GetNbrNId(i)) == 0) NN.AddDat(Graph->GetNI(NI.GetId()).GetNbrNId(i), NI.GetId()); } } return (double)NN.Len(); }
int main(int argc, char* argv[]) { Env = TEnv(argc, argv, TNotify::StdNotify); Env.PrepArgs(TStr::Fmt("Node Centrality. build: %s, %s. Time: %s", __TIME__, __DATE__, TExeTm::GetCurTm())); TExeTm ExeTm; Try const TStr InFNm = Env.GetIfArgPrefixStr("-i:", "../as20graph.txt", "Input un/directed graph"); const TStr OutFNm = Env.GetIfArgPrefixStr("-o:", "node_centrality.tab", "Output file"); printf("Loading %s...", InFNm.CStr()); PNGraph Graph = TSnap::LoadEdgeList<PNGraph>(InFNm); //PNGraph Graph = TSnap::GenRndGnm<PNGraph>(10, 10); //TGraphViz::Plot(Graph, gvlNeato, InFNm+".gif", InFNm, true); printf("nodes:%d edges:%d\n", Graph->GetNodes(), Graph->GetEdges()); PUNGraph UGraph = TSnap::ConvertGraph<PUNGraph>(Graph); // undirected version of the graph TIntFltH BtwH, EigH, PRankH, CcfH, CloseH, HubH, AuthH; //printf("Computing...\n"); printf("Treat graph as DIRECTED: "); printf(" PageRank... "); TSnap::GetPageRank(Graph, PRankH, 0.85); printf(" Hubs&Authorities..."); TSnap::GetHits(Graph, HubH, AuthH); printf("\nTreat graph as UNDIRECTED: "); printf(" Eigenvector..."); TSnap::GetEigenVectorCentr(UGraph, EigH); printf(" Clustering..."); TSnap::GetNodeClustCf(UGraph, CcfH); printf(" Betweenness (SLOW!)..."); TSnap::GetBetweennessCentr(UGraph, BtwH, 1.0); printf(" Constraint (SLOW!)..."); TNetConstraint<PUNGraph> NetC(UGraph, true); printf(" Closeness (SLOW!)..."); for (TUNGraph::TNodeI NI = UGraph->BegNI(); NI < UGraph->EndNI(); NI++) { const int NId = NI.GetId(); CloseH.AddDat(NId, TSnap::GetClosenessCentr<PUNGraph>(UGraph, NId, false)); } printf("\nDONE! saving..."); FILE *F = fopen(OutFNm.CStr(), "wt"); fprintf(F,"#Network: %s\n", InFNm.CStr()); fprintf(F,"#Nodes: %d\tEdges: %d\n", Graph->GetNodes(), Graph->GetEdges()); fprintf(F,"#NodeId\tDegree\tCloseness\tBetweennes\tEigenVector\tNetworkConstraint\tClusteringCoefficient\tPageRank\tHubScore\tAuthorityScore\n"); for (TUNGraph::TNodeI NI = UGraph->BegNI(); NI < UGraph->EndNI(); NI++) { const int NId = NI.GetId(); const double DegCentr = UGraph->GetNI(NId).GetDeg(); const double CloCentr = CloseH.GetDat(NId); const double BtwCentr = BtwH.GetDat(NId); const double EigCentr = EigH.GetDat(NId); const double Constraint = NetC.GetNodeC(NId); const double ClustCf = CcfH.GetDat(NId); const double PgrCentr = PRankH.GetDat(NId); const double HubCentr = HubH.GetDat(NId); const double AuthCentr = AuthH.GetDat(NId); fprintf(F, "%d\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n", NId, DegCentr, CloCentr, BtwCentr, EigCentr, Constraint, ClustCf, PgrCentr, HubCentr, AuthCentr); } fclose(F); Catch printf("\nrun time: %s (%s)\n", ExeTm.GetTmStr(), TSecTm::GetCurTm().GetTmStr().CStr()); return 0; }
// After MCMC, NID joins community CID. void TAGMFit::JoinCom(const int& NID, const int& JoinCID) { TUNGraph::TNodeI NI = G->GetNI(NID); for (int e = 0; e < NI.GetDeg(); e++) { int VID = NI.GetNbrNId(e); if (NIDComVH.GetDat(VID).IsKey(JoinCID)) { TIntPr SrcDstNIDPr = TIntPr(TMath::Mn(NID,VID), TMath::Mx(NID,VID)); EdgeComVH.GetDat(SrcDstNIDPr).AddKey(JoinCID); ComEdgesV[JoinCID]++; } } CIDNSetV[JoinCID].AddKey(NID); NIDComVH.GetDat(NID).AddKey(JoinCID); NIDCIDPrS.AddKey(TIntPr(NID, JoinCID)); }
void TAGMFit::RandomInit(const int& MaxK) { CIDNSetV.Clr(); for (int c = 0; c < MaxK; c++) { CIDNSetV.Add(); int NC = Rnd.GetUniDevInt(G -> GetNodes()); TUNGraph::TNodeI NI = G -> GetRndNI(); CIDNSetV.Last().AddKey(NI.GetId()); for (int v = 0; v < NC; v++) { NI = G->GetNI(NI.GetNbrNId(Rnd.GetUniDevInt(NI.GetDeg()))); CIDNSetV.Last().AddKey(NI.GetId()); } } InitNodeData(); SetDefaultPNoCom(); }
static double CmtyCMN(const PUNGraph& Graph, TCnComV& CmtyV) { TCNMQMatrix QMatrix(Graph); // maximize modularity while (QMatrix.MergeBestQ()) { } // reconstruct communities THash<TInt, TIntV> IdCmtyH; for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { IdCmtyH.AddDat(QMatrix.CmtyIdUF.Find(NI.GetId())).Add(NI.GetId()); } CmtyV.Gen(IdCmtyH.Len()); for (int j = 0; j < IdCmtyH.Len(); j++) { CmtyV[j].NIdV.Swap(IdCmtyH[j]); } return QMatrix.Q; }
// Connected components of a graph define clusters // OutDegH and OrigEdges stores node degrees and number of edges in the original graph double _GirvanNewmanGetModularity(const PUNGraph& G, const TIntH& OutDegH, const int& OrigEdges, TCnComV& CnComV) { TSnap::GetWccs(G, CnComV); // get communities double Mod = 0; for (int c = 0; c < CnComV.Len(); c++) { const TIntV& NIdV = CnComV[c](); double EIn=0, EEIn=0; for (int i = 0; i < NIdV.Len(); i++) { TUNGraph::TNodeI NI = G->GetNI(NIdV[i]); EIn += NI.GetOutDeg(); EEIn += OutDegH.GetDat(NIdV[i]); } Mod += (EIn-EEIn*EEIn/(2.0*OrigEdges)); } if (Mod == 0) { return 0; } else { return Mod/(2.0*OrigEdges); } }
void GetEigenVectorCentr(const PUNGraph& Graph, TIntFltH& NIdEigenH, const double& Eps, const int& MaxIter) { const int NNodes = Graph->GetNodes(); NIdEigenH.Gen(NNodes); // initialize vector values for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { NIdEigenH.AddDat(NI.GetId(), 1.0 / NNodes); IAssert(NI.GetId() == NIdEigenH.GetKey(NIdEigenH.Len() - 1)); } TFltV TmpV(NNodes); for (int iter = 0; iter < MaxIter; iter++) { int j = 0; // add neighbor values for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, j++) { TmpV[j] = 0; for (int e = 0; e < NI.GetOutDeg(); e++) { TmpV[j] += NIdEigenH.GetDat(NI.GetOutNId(e)); } } // normalize double sum = 0; for (int i = 0; i < TmpV.Len(); i++) { sum += (TmpV[i] * TmpV[i]); } sum = sqrt(sum); for (int i = 0; i < TmpV.Len(); i++) { TmpV[i] /= sum; } // compute difference double diff = 0.0; j = 0; for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, j++) { diff += fabs(NIdEigenH.GetDat(NI.GetId()) - TmpV[j]); } // set new values j = 0; for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, j++) { NIdEigenH.AddDat(NI.GetId(), TmpV[j]); } if (diff < Eps) { break; } } }
// network cascade: add spurious edges // for more details see "Correcting for Missing Data in Information Cascades" by E. Sadikov, M. Medina, J. Leskovec, H. Garcia-Molina. WSDM, 2011 PNGraph AddSpuriousEdges(const PUNGraph& Graph, const PNGraph& Casc, TIntH NIdTmH) { TIntPrV EdgeV; for (TNGraph::TNodeI NI = Casc->BegNI(); NI < Casc->EndNI(); NI++) { TUNGraph::TNodeI GNI = Graph->GetNI(NI.GetId()); const int Tm = NIdTmH.GetDat(NI.GetId()); for (int i=0,j=0; i < GNI.GetOutDeg(); i++) { const int Dst = GNI.GetOutNId(i); if (NIdTmH.IsKey(Dst) && Tm<NIdTmH.GetDat(Dst) && ! NI.IsNbhNId(Dst)) { EdgeV.Add(TIntPr(GNI.GetId(), Dst)); } } } PNGraph NetCasc = TNGraph::New(); *NetCasc = *Casc; for (int e = 0; e < EdgeV.Len(); e++) { NetCasc->AddEdge(EdgeV[e].Val1, EdgeV[e].Val2); } return NetCasc; }
double GetDegreeCentralization(const PUNGraph& Graph) { int MaxDeg = -1; int N = Graph->GetNodes(); int Sum = 0; if (Graph->GetNodes() > 1 && (double(N - 2.0)*double(N - 1)) > 0) { for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { int deg = NI.GetDeg(); if (deg > MaxDeg) { MaxDeg = deg; } } for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { Sum += MaxDeg - NI.GetDeg(); } return double(Sum) / (double(N - 2.0)*double(N - 1)); } else { return 0.0; } }
int TCliqueOverlap::MaxNbrsInCANDNodeId(const THashSet<TInt>& SUBG, const THashSet<TInt>& CAND) const{ int id = -1; int maxIntersection = -1; // for (THashSetKeyI<TInt> it=SUBG.BegI(); it<SUBG.EndI(); it++) { int nId = it.GetKey(); TUNGraph::TNodeI nIt = m_G->GetNI(nId); int deg = nIt.GetDeg(); // int curIntersection = 0; for (int i=0; i<deg; i++) { int nbrId = nIt.GetNbrNId(i); if (CAND.IsKey(nbrId)) curIntersection++; } // if (maxIntersection < curIntersection) { maxIntersection=curIntersection; id=nId; } } return id; }
double GetGroupDegreeCentr(const PUNGraph& Graph, const TIntH& GroupNodes) { int deg; TIntH NN; TIntH GroupNodes1; for (THashKeyDatI<TInt, TInt> NI = GroupNodes.BegI(); NI < GroupNodes.EndI(); NI++) GroupNodes1.AddDat(NI.GetDat(), NI.GetDat()); for (THashKeyDatI<TInt, TInt> NI = GroupNodes1.BegI(); NI < GroupNodes1.EndI(); NI++){ TUNGraph::TNodeI node = Graph->GetNI(NI.GetKey()); deg = node.GetDeg(); for (int j = 0; j < deg; j++){ if (GroupNodes1.IsKey(node.GetNbrNId(j)) == 0 && NN.IsKey(node.GetNbrNId(j)) == 0) NN.AddDat(node.GetNbrNId(j), NI.GetKey()); } } return (double)NN.Len(); }
int FastCorePeriphery(PUNGraph& Graph, TIntIntH& out) { TIntIntH nodes; double Z=0; for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { // Calculate and store the degrees of each node. int deg = NI.GetDeg(); int id = NI.GetId(); Z += deg; nodes.AddDat(id,deg); } Z = Z/2; nodes.SortByDat(false); // Then sort the nodes in descending order of degree, to get a list of nodes {v1, v2, . . . , vn}. double Zbest = 99999900000000000; int kbest = 0; int br=0; for (int k=0; k<nodes.Len(); k++) { br++; Z = Z + br - 1 - nodes[k]; if (Z < Zbest) { // or <= Zbest = Z; kbest = br; } } int cp = 0; br = 0; for (THashKeyDatI<TInt, TInt> it = nodes.BegI(); !it.IsEnd(); it++) { if (br < kbest) cp = 1; else cp = 0; out.AddDat(it.GetKey(), cp); br++; } return kbest; }
int Intersect1(TUNGraph::TNodeI Node, TStr NNodes){ int br = 0; for (int i = 0; i<Node.GetDeg(); i++) { TInt digi = Node.GetNbrNId(i); TStr buf = ""; buf = digi.GetStr(); if (NNodes.SearchStr(buf.CStr()) != -1) br++; } TInt digi = Node.GetId(); TStr buf = digi.GetStr(); if (NNodes.SearchStr(buf.CStr()) != -1) br++; return br; }
// For each (u, v) in edges, precompute C_uv (the set of communities u and v share). void TAGMFit::GetEdgeJointCom() { ComEdgesV.Gen(CIDNSetV.Len()); EdgeComVH.Gen(G->GetEdges()); for (TUNGraph::TNodeI SrcNI = G->BegNI(); SrcNI < G->EndNI(); SrcNI++) { int SrcNID = SrcNI.GetId(); for (int v = 0; v < SrcNI.GetDeg(); v++) { int DstNID = SrcNI.GetNbrNId(v); if (SrcNID >= DstNID) { continue; } TIntSet JointCom; IAssert(NIDComVH.IsKey(SrcNID)); IAssert(NIDComVH.IsKey(DstNID)); TAGMUtil::GetIntersection(NIDComVH.GetDat(SrcNID), NIDComVH.GetDat(DstNID), JointCom); EdgeComVH.AddDat(TIntPr(SrcNID,DstNID),JointCom); for (int k = 0; k < JointCom.Len(); k++) { ComEdgesV[JointCom[k]]++; } } } IAssert(EdgeComVH.Len() == G->GetEdges()); }
double TAGMFast::HessianForOneVar(const TFltV& AlphaKV, const int UID, const int CID, const double& Val) { TUNGraph::TNodeI UI = G->GetNI(UID); double H = 0.0, PNoEdge; int VID = 0; for (int e = 0; e < UI.GetDeg(); e++) { VID = UI.GetNbrNId(e); if (HOVIDSV[UID].IsKey(UI.GetNbrNId(e))) { continue; } if (! F[VID].IsKey(CID)) { continue; } PNoEdge = AlphaKV[e] * exp (- F[VID].GetDat(CID) * Val); IAssert(PNoEdge <= 1.0 && PNoEdge >= 0.0); //PNoEdge = PNoEdge == 1.0? 1 - PNoCom: PNoEdge; H += (- PNoEdge * F[VID].GetDat(CID) * F[VID].GetDat(CID)) / (1.0 - PNoEdge) / (1.0 - PNoEdge); } //add regularization if (RegCoef < 0.0) { //L2 H += 2 * RegCoef; } IAssert (H <= 0.0); return H; }
// renumber node ids to 0...N-1 PUNGraph GetSubGraph(const PUNGraph& Graph, const TIntV& NIdV, const bool& RenumberNodes) { if (! RenumberNodes) { return TSnap::GetSubGraph(Graph, NIdV); } PUNGraph NewGraphPt = TUNGraph::New(); TUNGraph& NewGraph = *NewGraphPt; NewGraph.Reserve(NIdV.Len(), -1); TIntSet NIdSet(NIdV.Len()); for (int n = 0; n < NIdV.Len(); n++) { NewGraph.AddNode(n); NIdSet.AddKey(NIdV[n]); } for (int n = 0; n < NIdV.Len(); n++) { const TUNGraph::TNodeI NI = Graph->GetNI(NIdV[n]); const int SrcNId = NIdSet.GetKeyId(NI.GetId()); for (int edge = 0; edge < NI.GetDeg(); edge++) { const int OutNId = NIdSet.GetKeyId(NI.GetNbhNId(edge)); if (NewGraph.IsNode(OutNId)) { NewGraph.AddEdge(SrcNId, OutNId); } } } return NewGraphPt; }
void GetEigenVectorCentr(const PUNGraph& Graph, TIntFltH& EigenH, const double& Eps, const int& MaxIter) { const int NNodes = Graph->GetNodes(); EigenH.Gen(NNodes); for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { EigenH.AddDat(NI.GetId(), 1.0/NNodes); IAssert(NI.GetId() == EigenH.GetKey(EigenH.Len()-1)); } TFltV TmpV(NNodes); double diff = TFlt::Mx; for (int iter = 0; iter < MaxIter; iter++) { int j = 0; for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, j++) { TmpV[j] = 0; for (int e = 0; e < NI.GetOutDeg(); e++) { TmpV[j] += EigenH.GetDat(NI.GetOutNId(e)); } } double sum = 0; for (int i = 0; i < TmpV.Len(); i++) { EigenH[i] = TmpV[i]; sum += EigenH[i]; } for (int i = 0; i < EigenH.Len(); i++) { EigenH[i] /= sum; } if (fabs(diff-sum) < Eps) { break; } //printf("\tdiff:%f\tsum:%f\n", fabs(diff-sum), sum); diff = sum; } }
// Maximum modularity clustering by Girvan-Newman algorithm (slow) // Girvan M. and Newman M. E. J., Community structure in social and biological networks, Proc. Natl. Acad. Sci. USA 99, 7821–7826 (2002) double CommunityGirvanNewman(PUNGraph& Graph, TCnComV& CmtyV) { TIntH OutDegH; const int NEdges = Graph->GetEdges(); for (TUNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { OutDegH.AddDat(NI.GetId(), NI.GetOutDeg()); } double BestQ = -1; // modularity TCnComV CurCmtyV; CmtyV.Clr(); TIntV Cmty1, Cmty2; while (true) { CmtyGirvanNewmanStep(Graph, Cmty1, Cmty2); const double Q = _GirvanNewmanGetModularity(Graph, OutDegH, NEdges, CurCmtyV); //printf("current modularity: %f\n", Q); if (Q > BestQ) { BestQ = Q; CmtyV.Swap(CurCmtyV); } if (Cmty1.Len()==0 || Cmty2.Len() == 0) { break; } } return BestQ; }
int Intersect(TUNGraph::TNodeI Node, TStr NNodes){ int br = 0; TInt digi = -1; TStr buf = ""; for (int i = 0; i<Node.GetDeg(); i++) { digi = Node.GetNbrNId(i); TStr buf = digi.GetStr(); if (NNodes.IsStrIn(buf.CStr())) br++; } digi = Node.GetId(); buf = digi.GetStr(); if (NNodes.IsStrIn(buf.CStr())) br++; return br; }
double TAGMFast::GradientForOneVar(const TFltV& AlphaKV, const int UID, const int CID, const double& Val) { TUNGraph::TNodeI UI = G->GetNI(UID); double Grad = 0.0, PNoEdge; int VID = 0; for (int e = 0; e < UI.GetDeg(); e++) { VID = UI.GetNbrNId(e); if (HOVIDSV[UID].IsKey(UI.GetNbrNId(e))) { continue; } if (! F[VID].IsKey(CID)) { continue; } PNoEdge = AlphaKV[e] * exp (- F[VID].GetDat(CID) * Val); IAssert(PNoEdge <= 1.0 && PNoEdge >= 0.0); //PNoEdge = PNoEdge >= 1.0 - PNoCom? 1 - PNoCom: PNoEdge; Grad += ((PNoEdge * F[VID].GetDat(CID)) / (1.0 - PNoEdge) + NegWgt * F[VID].GetDat(CID)); } Grad -= NegWgt * (SumFV[CID] - GetCom(UID, CID)); //add regularization if (RegCoef > 0.0) { //L1 Grad -= RegCoef; } if (RegCoef < 0.0) { //L2 Grad += 2 * RegCoef * Val; } return Grad; }