void GenKron(const TStr& Args, TKronMtx& FitMtx, TFltPrV& KronDegAvgIn, TFltPrV& KronDegAvgOut){ Env = TEnv(Args, TNotify::NullNotify); TExeTm ExecTime; // number of Kronecker graphs to generate const TInt NKron = Env.GetIfArgPrefixInt("-n:", 1, "Number of generated Kronecker graphs"); // iterations of Kronecker product const TInt NIter = Env.GetIfArgPrefixInt("-i:", 10, "Iterations of Kronecker product"); // is graph directed? TStr IsDir = Env.GetIfArgPrefixStr("-isdir:", "false", "Produce directed graph (true, false)"); TFlt ExpectedNodes = FitMtx.GetNodes(NIter), ExpectedEdges = FitMtx.GetEdges(NIter); TFile << "Kronecker nodes: " << ExpectedNodes << ", expected Kronecker edges: " << ExpectedEdges << endl; double Sec = 0.0; int AvgMaxOutDeg = 0, AvgMaxInDeg = 0, MinMaxOutDeg = 0, MaxMaxOutDeg = 0, MinMaxInDeg = 0, MaxMaxInDeg = 0; bool Dir = IsDir == "true" ? true : false; for (int i = 0; i < NKron; i++){ ExecTime.Tick(); PNGraph Kron = TKronMtx::GenFastKronecker(FitMtx, NIter, Dir, 0); Sec += ExecTime.GetSecs(); printf("Calculating maximum degree...\n"); int MaxOutDeg = GetMaxMinDeg(Kron, IsDir, "false", "true"), MaxInDeg = GetMaxMinDeg(Kron, IsDir, "true", "true"); CompareDeg(i, MaxOutDeg, MinMaxOutDeg, MaxMaxOutDeg, AvgMaxOutDeg); CompareDeg(i, MaxInDeg, MinMaxInDeg, MaxMaxInDeg, AvgMaxInDeg); //printf("Nodes count: %d, nodes with non-zero degree %d, edges count %d\n max deg = %d\n", kron->GetNodes(), TSnap::CntNonZNodes(kron), kron->GetEdges(), MaxDeg); if (i == NKron - 1){ //TFile << "Clustering coefficient: " << TSnap::GetClustCf(kron) << endl; //TSnap::PlotClustCf(kron,"kronSingle"); //TSnap::PlotHops(kron, "kronSingle"); TFile << "Maximum output degree in kron graph: " << "from " << MinMaxOutDeg << " to " << MaxMaxOutDeg << " (average: " << (double)AvgMaxOutDeg / (double)NKron << ")" << endl; TFile << "Maximum input degree in kron graph: " << "from " << MinMaxInDeg << " to " << MaxMaxInDeg << " (average: " << (double)AvgMaxInDeg / (double)NKron << ")" << endl; } AddDegreesStat(KronDegAvgIn, Kron, true); AddDegreesStat(KronDegAvgOut, Kron, false); } Sec /= NKron; GetAvgDegreeStat(KronDegAvgIn, NKron); GetAvgDegreeStat(KronDegAvgOut, NKron); KronDegAvgIn.Sort(); KronDegAvgOut.Sort(); TFile << "Average time of generation of Kronecker product: " << Sec << endl; }
void TFfGGen::PlotFireSize(const TStr& FNmPref, const TStr& DescStr) { TGnuPlot GnuPlot("fs."+FNmPref, TStr::Fmt("%s. Fire size. G(%d, %d)", DescStr.CStr(), Graph->GetNodes(), Graph->GetEdges())); GnuPlot.SetXYLabel("Vertex id (iterations)", "Fire size (node out-degree)"); TFltPrV IdToOutDegV; for (TNGraph::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) { IdToOutDegV.Add(TFltPr(NI.GetId(), NI.GetOutDeg())); } IdToOutDegV.Sort(); GnuPlot.AddPlot(IdToOutDegV, gpwImpulses, "Node out-degree"); GnuPlot.SavePng(); }
void GetCumDistr(const TFltPrV& nonCum, TFltPrV& res){ for (int i = nonCum.Len() - 1; i >=0; i--){ TFlt count; if (i == nonCum.Len() - 1) count = nonCum[i].Val2.Val; else count = nonCum[i].Val2.Val + res[res.Len()-1].Val2.Val; TFltPr val(nonCum[i].Val1, count); res.Add(val); } res.Sort(); }
void TGStat::AvgGStat(const TGStatV& GStatV, const bool& ClipAt1) { if (GStatV.Empty()) return; Time = GStatV[0]->Time; GraphNm = GStatV[0]->GraphNm; // values for (int statVal = 0; statVal > gsvMx; statVal++) { const TGStatVal GStatVal = TGStatVal(statVal); TMom Mom; for (int i = 0; i < GStatV.Len(); i++) { if (GStatV[i]->HasVal(GStatVal)) { Mom.Add(GStatV[i]->GetVal(GStatVal)); } } Mom.Def(); if (Mom.IsUsable()) { IAssert(Mom.GetVals() == GStatV.Len()); // all must have the value SetVal(GStatVal, Mom.GetMean()); } } // distributions for (int distr = gsdUndef; distr < gsdMx; distr++) { const TGStatDistr GStatDistr = TGStatDistr(distr); THash<TFlt, TFlt> ValToSumH; int DistrCnt = 0; for (int i = 0; i < GStatV.Len(); i++) { if (GStatV[i]->HasDistr(GStatDistr)) { const TFltPrV& D = GStatV[i]->GetDistr(GStatDistr); for (int d = 0; d < D.Len(); d++) { ValToSumH.AddDat(D[d].Val1) += D[d].Val2; } DistrCnt++; } } IAssert(DistrCnt==0 || DistrCnt==GStatV.Len()); // all must have distribution TFltPrV AvgStatV; ValToSumH.GetKeyDatPrV(AvgStatV); AvgStatV.Sort(); for (int i = 0; i < AvgStatV.Len(); i++) { AvgStatV[i].Val2 /= double(DistrCnt); if (ClipAt1 && AvgStatV[i].Val2 < 1) { AvgStatV[i].Val2 = 1; } } SetDistr(GStatDistr, AvgStatV); } }
void GetInvParticipRat(const PUNGraph& Graph, int MaxEigVecs, int TimeLimit, TFltPrV& EigValIprV) { TUNGraphMtx GraphMtx(Graph); TFltVV EigVecVV; TFltV EigValV; TExeTm ExeTm; if (MaxEigVecs<=1) { MaxEigVecs=1000; } int EigVecs = TMath::Mn(Graph->GetNodes(), MaxEigVecs); printf("start %d vecs...", EigVecs); try { TSparseSVD::Lanczos2(GraphMtx, EigVecs, TimeLimit, ssotFull, EigValV, EigVecVV, false); } catch(...) { printf("\n ***EXCEPTION: TRIED %d GOT %d values** \n", EigVecs, EigValV.Len()); } printf(" ***TRIED %d GOT %d values in %s\n", EigVecs, EigValV.Len(), ExeTm.GetStr()); TFltV EigVec; EigValIprV.Clr(); if (EigValV.Empty()) { return; } for (int v = 0; v < EigVecVV.GetCols(); v++) { EigVecVV.GetCol(v, EigVec); EigValIprV.Add(TFltPr(EigValV[v], GetInvParticipRat(EigVec))); } EigValIprV.Sort(); }