// to get first few eigenvectors void GetEigVec(const PUNGraph& Graph, const int& EigVecs, TFltV& EigValV, TVec<TFltV>& EigVecV) { const int Nodes = Graph->GetNodes(); // Lanczos TUNGraphMtx GraphMtx(Graph); int CalcVals = int(2*EigVecs); if (CalcVals > Nodes) { CalcVals = Nodes; } TFltVV EigVecVV; //while (EigValV.Len() < EigVecs && CalcVals < 10*EigVecs) { try { TSparseSVD::Lanczos(GraphMtx, EigVecs, 2*EigVecs, ssotFull, EigValV, EigVecVV, false); } catch(...) { printf("\n ***EXCEPTION: TRIED %d GOT %d values** \n", CalcVals, EigValV.Len()); } if (EigValV.Len() < EigVecs) { printf(" ***TRIED %d GOT %d values** \n", CalcVals, EigValV.Len()); } // CalcVals += EigVecs; //} TFltIntPrV EigValIdV; for (int i = 0; i < EigValV.Len(); i++) { EigValIdV.Add(TFltIntPr(EigValV[i], i)); } EigValIdV.Sort(false); EigValV.Sort(false); for (int v = 0; v < EigValIdV.Len(); v++) { // vector components are not sorted!!! EigVecV.Add(); EigVecVV.GetCol(EigValIdV[v].Val2, EigVecV.Last()); } IsAllValVNeg(EigVecV[0], true); }
///////////////////////////////////////////////// // Top2 Friends network void TTop2FriendNet::SetTop2() { Top2NIdH.Gen(Net->GetNodes()); TFltIntPrV WgtNIdV; for (TWgtNet::TNodeI NI = Net->BegNI(); NI < Net->EndNI(); NI++) { WgtNIdV.Clr(false); for (int e = 0; e < NI.GetOutDeg(); e++) { WgtNIdV.Add(TFltIntPr(NI.GetOutEDat(e), NI.GetOutNId(e))); } WgtNIdV.Shuffle(TInt::Rnd); // so that ties are broken randomly WgtNIdV.Sort(false); if (WgtNIdV.Len() == 0) { Top2NIdH.AddDat(NI.GetId(), TIntPr(-1, -1)); } else if (WgtNIdV.Len() == 1) { Top2NIdH.AddDat(NI.GetId(), TIntPr(WgtNIdV[0].Val2, -1)); } else if (WgtNIdV.Len() >= 2) { Top2NIdH.AddDat(NI.GetId(), TIntPr(WgtNIdV[0].Val2, WgtNIdV[1].Val2)); } } // create union find structure PNGraph Top1Net = GetTop1Net(); Top1UF = TUnionFind(Top1Net->GetNodes()); TCnComV CnComV; TCnCom::GetWccs(Top1Net, CnComV); for (TWgtNet::TNodeI NI = Net->BegNI(); NI < Net->EndNI(); NI++) { Top1UF.Add(NI.GetId()); } for (int c = 0; c < CnComV.Len(); c++) { for (int i = 1; i < CnComV[c].Len(); i++) { Top1UF.Union(CnComV[c][0], CnComV[c][i]); } } }
void TLwOntoGround::ClassifySpV( const PBowSpV& QueryBowSpV, TSimTermIdPrV& SimTermIdPrV) const { PBowSim BowSim=TBowSim::New(bstCos); SimTermIdPrV.Clr(); for (int TermN=0; TermN<TermIdToConceptSpVH.Len(); TermN++){ int TermId=TermIdToConceptSpVH.GetKey(TermN); PBowSpV ConceptSpV=TermIdToConceptSpVH[TermN]; double Sim=BowSim->GetSim(QueryBowSpV, ConceptSpV); TStr TermNm = GetLwOnto()->GetTermBs()->GetTerm(TermId)->GetTermNm(); if (Sim > 0.0) { SimTermIdPrV.Add(TFltIntPr(Sim, TermId)); } //B: >0 } SimTermIdPrV.Sort(false); }
void GetSngVec(const PNGraph& Graph, const int& SngVecs, TFltV& SngValV, TVec<TFltV>& LeftSV, TVec<TFltV>& RightSV) { const int Nodes = Graph->GetNodes(); SngValV.Clr(); LeftSV.Clr(); RightSV.Clr(); TFltVV LSingV, RSingV; if (Nodes < 100) { // perform full SVD TFltVV AdjMtx(Nodes+1, Nodes+1); TIntH NodeIdH; // create adjecency matrix (1-based) for (TNGraph::TNodeI NodeI = Graph->BegNI(); NodeI < Graph->EndNI(); NodeI++) { NodeIdH.AddKey(NodeI.GetId()); } for (TNGraph::TNodeI NodeI = Graph->BegNI(); NodeI < Graph->EndNI(); NodeI++) { const int NodeId = NodeIdH.GetKeyId(NodeI.GetId())+1; for (int e = 0; e < NodeI.GetOutDeg(); e++) { const int DstNId = NodeIdH.GetKeyId(NodeI.GetOutNId(e))+1; // no self edges if (NodeId != DstNId) AdjMtx.At(NodeId, DstNId) = 1; } } try { // can fail to converge but results seem to be good TSvd::Svd1Based(AdjMtx, LSingV, SngValV, RSingV); } catch(...) { printf("\n***No SVD convergence: G(%d, %d)\n", Nodes, Graph->GetEdges()); } } else { // Lanczos TNGraphMtx GraphMtx(Graph); TSparseSVD::LanczosSVD(GraphMtx, SngVecs, 2*SngVecs, ssotFull, SngValV, LSingV, RSingV); //TGAlg::SaveFullMtx(Graph, "adj_mtx.txt"); //TLAMisc::DumpTFltVVMjrSubMtrx(LSingV, LSingV.GetRows(), LSingV.GetCols(), "LSingV2.txt"); // save MTX } TFltIntPrV SngValIdV; for (int i = 0; i < SngValV.Len(); i++) { SngValIdV.Add(TFltIntPr(SngValV[i], i)); } SngValIdV.Sort(false); SngValV.Sort(false); for (int v = 0; v < SngValIdV.Len(); v++) { LeftSV.Add(); LSingV.GetCol(SngValIdV[v].Val2, LeftSV.Last()); RightSV.Add(); RSingV.GetCol(SngValIdV[v].Val2, RightSV.Last()); } IsAllValVNeg(LeftSV[0], true); IsAllValVNeg(RightSV[0], true); }
void TAGMFast::NeighborComInit(const int InitComs) { //initialize with best neighborhood communities (Gleich et.al. KDD'12) F.Gen(G->GetNodes()); SumFV.Gen(InitComs); NumComs = InitComs; const int Edges = G->GetEdges(); //TIntFltH NCPhiH(F.Len()); TFltIntPrV NIdPhiV(F.Len(), 0); TIntSet InvalidNIDS(F.Len()); TIntV ChosenNIDV(InitComs, 0); //FOR DEBUG TExeTm RunTm; //compute conductance of neighborhood community for (int u = 0; u < F.Len(); u++) { TIntSet NBCmty(G->GetNI(u).GetDeg() + 1); double Phi; if (G->GetNI(u).GetDeg() < 5) { //do not include nodes with too few degree Phi = 1.0; } else { TAGMUtil::GetNbhCom(G, u, NBCmty); IAssert(NBCmty.Len() == G->GetNI(u).GetDeg() + 1); Phi = TAGMUtil::GetConductance(G, NBCmty, Edges); } //NCPhiH.AddDat(u, Phi); NIdPhiV.Add(TFltIntPr(Phi, u)); } NIdPhiV.Sort(true); printf("conductance computation completed [%s]\n", RunTm.GetTmStr()); fflush(stdout); //choose nodes with local minimum in conductance int CurCID = 0; for (int ui = 0; ui < NIdPhiV.Len(); ui++) { int UID = NIdPhiV[ui].Val2; fflush(stdout); if (InvalidNIDS.IsKey(UID)) { continue; } ChosenNIDV.Add(UID); //FOR DEBUG //add the node and its neighbors to the current community AddCom(UID, CurCID, 1.0); TUNGraph::TNodeI NI = G->GetNI(UID); fflush(stdout); for (int e = 0; e < NI.GetDeg(); e++) { AddCom(NI.GetNbrNId(e), CurCID, 1.0); } //exclude its neighbors from the next considerations for (int e = 0; e < NI.GetDeg(); e++) { InvalidNIDS.AddKey(NI.GetNbrNId(e)); } CurCID++; fflush(stdout); if (CurCID >= NumComs) { break; } } if (NumComs > CurCID) { printf("%d communities needed to fill randomly\n", NumComs - CurCID); } //assign a member to zero-member community (if any) for (int c = 0; c < SumFV.Len(); c++) { if (SumFV[c] == 0.0) { int ComSz = 10; for (int u = 0; u < ComSz; u++) { int UID = Rnd.GetUniDevInt(G->GetNodes()); AddCom(UID, c, Rnd.GetUniDev()); } } } }
// Initialize node community memberships using best neighborhood communities (see D. Gleich et al. KDD'12). void TAGMFit::NeighborComInit(const int InitComs) { CIDNSetV.Gen(InitComs); const int Edges = G->GetEdges(); TFltIntPrV NIdPhiV(G->GetNodes(), 0); TIntSet InvalidNIDS(G->GetNodes()); TIntV ChosenNIDV(InitComs, 0); //FOR DEBUG TExeTm RunTm; //compute conductance of neighborhood community TIntV NIdV; G->GetNIdV(NIdV); for (int u = 0; u < NIdV.Len(); u++) { TIntSet NBCmty(G->GetNI(NIdV[u]).GetDeg() + 1); double Phi; if (G->GetNI(NIdV[u]).GetDeg() < 5) { //do not include nodes with too few degree Phi = 1.0; } else { TAGMUtil::GetNbhCom(G, NIdV[u], NBCmty); IAssert(NBCmty.Len() == G->GetNI(NIdV[u]).GetDeg() + 1); Phi = TAGMUtil::GetConductance(G, NBCmty, Edges); } NIdPhiV.Add(TFltIntPr(Phi, NIdV[u])); } NIdPhiV.Sort(true); printf("conductance computation completed [%s]\n", RunTm.GetTmStr()); fflush(stdout); //choose nodes with local minimum in conductance int CurCID = 0; for (int ui = 0; ui < NIdPhiV.Len(); ui++) { int UID = NIdPhiV[ui].Val2; fflush(stdout); if (InvalidNIDS.IsKey(UID)) { continue; } ChosenNIDV.Add(UID); //FOR DEBUG //add the node and its neighbors to the current community CIDNSetV[CurCID].AddKey(UID); TUNGraph::TNodeI NI = G->GetNI(UID); fflush(stdout); for (int e = 0; e < NI.GetDeg(); e++) { CIDNSetV[CurCID].AddKey(NI.GetNbrNId(e)); } //exclude its neighbors from the next considerations for (int e = 0; e < NI.GetDeg(); e++) { InvalidNIDS.AddKey(NI.GetNbrNId(e)); } CurCID++; fflush(stdout); if (CurCID >= InitComs) { break; } } if (InitComs > CurCID) { printf("%d communities needed to fill randomly\n", InitComs - CurCID); } //assign a member to zero-member community (if any) for (int c = 0; c < CIDNSetV.Len(); c++) { if (CIDNSetV[c].Len() == 0) { int ComSz = 10; for (int u = 0; u < ComSz; u++) { int UID = G->GetRndNI().GetId(); CIDNSetV[c].AddKey(UID); } } } InitNodeData(); SetDefaultPNoCom(); }