SNAP Library 2.2, Developer Reference
2014-03-11 19:15:55
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
#include <kronecker.h>
Public Member Functions | |
TKronMtx () | |
TKronMtx (const int &Dim) | |
TKronMtx (const TFltV &SeedMatrix) | |
TKronMtx (const TKronMtx &Kronecker) | |
void | SaveTxt (const TStr &OutFNm) const |
TKronMtx & | operator= (const TKronMtx &Kronecker) |
bool | operator== (const TKronMtx &Kronecker) const |
int | GetPrimHashCd () const |
int | GetSecHashCd () const |
int | GetDim () const |
int | Len () const |
bool | Empty () const |
bool | IsProbMtx () const |
TFltV & | GetMtx () |
const TFltV & | GetMtx () const |
void | SetMtx (const TFltV &ParamV) |
void | SetRndMtx (const int &MtxDim, const double &MinProb=0.0) |
void | PutAllMtx (const double &Val) |
void | GenMtx (const int &Dim) |
void | SetEpsMtx (const double &Eps1, const double &Eps0, const int &Eps1Val=1, const int &Eps0Val=0) |
void | SetForEdges (const int &Nodes, const int &Edges) |
void | AddRndNoise (const double &SDev) |
TStr | GetMtxStr () const |
const double & | At (const int &Row, const int &Col) const |
double & | At (const int &Row, const int &Col) |
const double & | At (const int &ValN) const |
double & | At (const int &ValN) |
int | GetNodes (const int &NIter) const |
int | GetEdges (const int &NIter) const |
int | GetKronIter (const int &Nodes) const |
int | GetNZeroK (const PNGraph &Graph) const |
double | GetEZero (const int &Edges, const int &KronIter) const |
double | GetMtxSum () const |
double | GetRowSum (const int &RowId) const |
double | GetColSum (const int &ColId) const |
void | ToOneMinusMtx () |
void | GetLLMtx (TKronMtx &LLMtx) |
void | GetProbMtx (TKronMtx &ProbMtx) |
void | Swap (TKronMtx &KronMtx) |
double | GetEdgeProb (int NId1, int NId2, const int &NKronIters) const |
double | GetNoEdgeProb (int NId1, int NId2, const int &NKronIters) const |
double | GetEdgeLL (int NId1, int NId2, const int &NKronIters) const |
double | GetNoEdgeLL (int NId1, int NId2, const int &NKronIters) const |
double | GetApxNoEdgeLL (int NId1, int NId2, const int &NKronIters) const |
bool | IsEdgePlace (int NId1, int NId2, const int &NKronIters, const double &ProbTresh) const |
double | GetEdgeDLL (const int &ParamId, int NId1, int NId2, const int &NKronIters) const |
double | GetNoEdgeDLL (const int &ParamId, int NId1, int NId2, const int &NKronIters) const |
double | GetApxNoEdgeDLL (const int &ParamId, int NId1, int NId2, const int &NKronIters) const |
double | GetEdgeProb (const uint &NId1Sig, const uint &NId2Sig, const int &NIter) const |
PNGraph | GenThreshGraph (const double &Thresh) const |
PNGraph | GenRndGraph (const double &RndFact=1.0) const |
void | Dump (const TStr &MtxNm=TStr(), const bool &Sort=false) const |
Static Public Member Functions | |
static uint | GetNodeSig (const double &OneProb=0.5) |
static int | GetKronIter (const int &GNodes, const int &SeedMtxSz) |
static PNGraph | GenKronecker (const TKronMtx &SeedMtx, const int &NIter, const bool &IsDir, const int &Seed=0) |
static PNGraph | GenFastKronecker (const TKronMtx &SeedMtx, const int &NIter, const bool &IsDir, const int &Seed=0) |
static PNGraph | GenFastKronecker (const TKronMtx &SeedMtx, const int &NIter, const int &Edges, const bool &IsDir, const int &Seed=0) |
static PNGraph | GenDetKronecker (const TKronMtx &SeedMtx, const int &NIter, const bool &IsDir) |
static void | PlotCmpGraphs (const TKronMtx &SeedMtx, const PNGraph &Graph, const TStr &OutFNm, const TStr &Desc) |
static void | PlotCmpGraphs (const TKronMtx &SeedMtx1, const TKronMtx &SeedMtx2, const PNGraph &Graph, const TStr &OutFNm, const TStr &Desc) |
static void | PlotCmpGraphs (const TVec< TKronMtx > &SeedMtxV, const PNGraph &Graph, const TStr &FNmPref, const TStr &Desc) |
static void | KronMul (const TKronMtx &LeftPt, const TKronMtx &RightPt, TKronMtx &OutMtx) |
static void | KronSum (const TKronMtx &LeftPt, const TKronMtx &RightPt, TKronMtx &OutMtx) |
static void | KronPwr (const TKronMtx &KronPt, const int &NIter, TKronMtx &OutMtx) |
static double | GetAvgAbsErr (const TKronMtx &Kron1, const TKronMtx &Kron2) |
static double | GetAvgFroErr (const TKronMtx &Kron1, const TKronMtx &Kron2) |
static TKronMtx | GetMtx (TStr MatlabMtxStr) |
static TKronMtx | GetRndMtx (const int &Dim, const double &MinProb) |
static TKronMtx | GetInitMtx (const int &Dim, const int &Nodes, const int &Edges) |
static TKronMtx | GetInitMtx (const TStr &MtxStr, const int &Dim, const int &Nodes, const int &Edges) |
static TKronMtx | GetMtxFromNm (const TStr &MtxNm) |
static TKronMtx | LoadTxt (const TStr &MtxFNm) |
static void | PutRndSeed (const int &Seed) |
Static Public Attributes | |
static const double | NInf = -DBL_MAX |
static TRnd | Rnd = TRnd(0) |
Private Attributes | |
TInt | MtxDim |
TFltV | SeedMtx |
Definition at line 11 of file kronecker.h.
TKronMtx::TKronMtx | ( | ) | [inline] |
Definition at line 19 of file kronecker.h.
Referenced by GetMtxFromNm().
TKronMtx::TKronMtx | ( | const int & | Dim | ) | [inline] |
Definition at line 20 of file kronecker.h.
TKronMtx::TKronMtx | ( | const TFltV & | SeedMatrix | ) |
TKronMtx::TKronMtx | ( | const TKronMtx & | Kronecker | ) | [inline] |
void TKronMtx::AddRndNoise | ( | const double & | SDev | ) |
Definition at line 69 of file kronecker.cpp.
References At(), Dump(), TRnd::GetNrmDev(), Len(), and Rnd.
Referenced by GetInitMtx().
{ Dump("before"); double NewVal; int c =0; for (int i = 0; i < Len(); i++) { for(c = 0; ((NewVal = At(i)*Rnd.GetNrmDev(1, SDev, 0.8, 1.2)) < 0.01 || NewVal>0.99) && c <1000; c++) { } if (c < 999) { At(i) = NewVal; } else { printf("XXXXX\n"); } } Dump("after"); }
const double& TKronMtx::At | ( | const int & | Row, |
const int & | Col | ||
) | const [inline] |
Definition at line 46 of file kronecker.h.
References MtxDim, and SeedMtx.
Referenced by AddRndNoise(), GenFastKronecker(), GenRndGraph(), GenThreshGraph(), TKroneckerLL::GetApxEmptyGraphDLL(), TKroneckerLL::GetApxEmptyGraphLL(), GetApxNoEdgeDLL(), GetColSum(), GetEdgeDLL(), GetEdgeLL(), GetEdgeProb(), GetInitMtx(), GetLLMtx(), GetMtx(), GetMtxStr(), GetMtxSum(), GetNoEdgeDLL(), GetProbMtx(), GetRowSum(), TKroneckerLL::GradDescent(), TKroneckerLL::GradDescent2(), TKroneckerLL::GradDescentConvergence(), IsEdgePlace(), IsProbMtx(), KronMul(), KronSum(), LoadTxt(), TKronMaxLL::RoundTheta(), TKroneckerLL::RunMStep(), SaveTxt(), TKroneckerLL::SetBestDegPerm(), SetEpsMtx(), SetForEdges(), TKroneckerLL::SetRandomEdges(), TKroneckerLL::TestKronDescent(), and ToOneMinusMtx().
double& TKronMtx::At | ( | const int & | Row, |
const int & | Col | ||
) | [inline] |
const double& TKronMtx::At | ( | const int & | ValN | ) | const [inline] |
double& TKronMtx::At | ( | const int & | ValN | ) | [inline] |
void TKronMtx::Dump | ( | const TStr & | MtxNm = TStr() , |
const bool & | Sort = false |
||
) | const |
Definition at line 636 of file kronecker.cpp.
References TStr::CStr(), TStr::Empty(), GetDim(), TVec< TVal, TSizeTy >::Len(), SeedMtx, and TVec< TVal, TSizeTy >::Sort().
Referenced by AddRndNoise(), TKroneckerLL::GradDescent(), TKroneckerLL::GradDescent2(), TKroneckerLL::GradDescentConvergence(), TKroneckerLL::RunMStep(), TKroneckerLL::TestBicCriterion(), TKroneckerLL::TestKronDescent(), and TKroneckerLL::TestSamplePerm().
{ /*printf("%s: %d x %d\n", MtxNm.Empty()?"Mtx":MtxNm.CStr(), GetDim(), GetDim()); for (int r = 0; r < GetDim(); r++) { for (int c = 0; c < GetDim(); c++) { printf(" %8.2g", At(r, c)); } printf("\n"); }*/ if (! MtxNm.Empty()) printf("%s\n", MtxNm.CStr()); double Sum=0.0; TFltV ValV = SeedMtx; if (Sort) { ValV.Sort(false); } for (int i = 0; i < ValV.Len(); i++) { printf(" %10.4g", ValV[i]()); Sum += ValV[i]; if ((i+1) % GetDim() == 0) { printf("\n"); } } printf(" (sum:%.4f)\n", Sum); }
bool TKronMtx::Empty | ( | ) | const [inline] |
Definition at line 32 of file kronecker.h.
References TVec< TVal, TSizeTy >::Empty(), and SeedMtx.
Referenced by TKroneckerLL::GradDescentConvergence(), and TKroneckerLL::TestSamplePerm().
PNGraph TKronMtx::GenDetKronecker | ( | const TKronMtx & | SeedMtx, |
const int & | NIter, | ||
const bool & | IsDir | ||
) | [static] |
Definition at line 458 of file kronecker.cpp.
References TNGraph::AddEdge(), TNGraph::AddNode(), GetNodes(), TRnd::GetUniDev(), IsEdgePlace(), TNGraph::New(), Rnd, and SeedMtx.
{ const TKronMtx& SeedGraph = SeedMtx; const int NNodes = SeedGraph.GetNodes(NIter); printf(" Deterministic Kronecker: %d nodes, %s...\n", NNodes, IsDir ? "Directed":"UnDirected"); PNGraph Graph = TNGraph::New(NNodes, -1); TExeTm ExeTm; int edges = 0; for (int node1 = 0; node1 < NNodes; node1++) { Graph->AddNode(node1); } for (int node1 = 0; node1 < NNodes; node1++) { for (int node2 = 0; node2 < NNodes; node2++) { if (SeedGraph.IsEdgePlace(node1, node2, NIter, Rnd.GetUniDev())) { Graph->AddEdge(node1, node2); edges++; } } if (node1 % 1000 == 0) printf("\r...%dk, %dk", node1/1000, edges/1000); } return Graph; }
PNGraph TKronMtx::GenFastKronecker | ( | const TKronMtx & | SeedMtx, |
const int & | NIter, | ||
const bool & | IsDir, | ||
const int & | Seed = 0 |
||
) | [static] |
Definition at line 349 of file kronecker.cpp.
References TVec< TVal, TSizeTy >::Add(), TNGraph::AddEdge(), TNGraph::AddNode(), At(), GetDim(), GetEdges(), TNGraph::GetEdges(), GetMtxSum(), GetNodes(), TRnd::GetUniDev(), TNGraph::IsEdge(), MtxDim, TNGraph::New(), Rnd, and SeedMtx.
Referenced by TKroneckerLL::GradDescentConvergence(), PlotCmpGraphs(), TKronMaxLL::Test(), and TKroneckerLL::TestGradDescent().
{ const TKronMtx& SeedGraph = SeedMtx; const int MtxDim = SeedGraph.GetDim(); const double MtxSum = SeedGraph.GetMtxSum(); const int NNodes = SeedGraph.GetNodes(NIter); const int NEdges = SeedGraph.GetEdges(NIter); //const double DiagEdges = NNodes * pow(SeedGraph.At(0,0), double(NIter)); //const int NEdges = (int) TMath::Round(((pow(double(SeedGraph.GetMtxSum()), double(NIter)) - DiagEdges) /2.0)); printf(" FastKronecker: %d nodes, %d edges, %s...\n", NNodes, NEdges, IsDir ? "Directed":"UnDirected"); PNGraph Graph = TNGraph::New(NNodes, -1); TRnd Rnd(Seed); TExeTm ExeTm; // prepare cell probability vector TVec<TFltIntIntTr> ProbToRCPosV; // row, col position double CumProb = 0.0; for (int r = 0; r < MtxDim; r++) { for (int c = 0; c < MtxDim; c++) { const double Prob = SeedGraph.At(r, c); if (Prob > 0.0) { CumProb += Prob; ProbToRCPosV.Add(TFltIntIntTr(CumProb/MtxSum, r, c)); } } } // add nodes for (int i = 0; i < NNodes; i++) { Graph->AddNode(i); } // add edges int Rng, Row, Col, Collision=0, n = 0; for (int edges = 0; edges < NEdges; ) { Rng=NNodes; Row=0; Col=0; for (int iter = 0; iter < NIter; iter++) { const double& Prob = Rnd.GetUniDev(); n = 0; while(Prob > ProbToRCPosV[n].Val1) { n++; } const int MtxRow = ProbToRCPosV[n].Val2; const int MtxCol = ProbToRCPosV[n].Val3; Rng /= MtxDim; Row += MtxRow * Rng; Col += MtxCol * Rng; } if (! Graph->IsEdge(Row, Col)) { // allow self-loops Graph->AddEdge(Row, Col); edges++; if (! IsDir) { if (Row != Col) Graph->AddEdge(Col, Row); edges++; } } else { Collision++; } //if (edges % 1000 == 0) printf("\r...%dk", edges/1000); } //printf(" %d edges [%s]\n", Graph->GetEdges(), ExeTm.GetTmStr()); printf(" collisions: %d (%.4f)\n", Collision, Collision/(double)Graph->GetEdges()); return Graph; }
PNGraph TKronMtx::GenFastKronecker | ( | const TKronMtx & | SeedMtx, |
const int & | NIter, | ||
const int & | Edges, | ||
const bool & | IsDir, | ||
const int & | Seed = 0 |
||
) | [static] |
Definition at line 404 of file kronecker.cpp.
References TVec< TVal, TSizeTy >::Add(), TNGraph::AddEdge(), TNGraph::AddNode(), At(), GetDim(), TNGraph::GetEdges(), GetMtxSum(), GetNodes(), TRnd::GetUniDev(), TNGraph::IsEdge(), MtxDim, TNGraph::New(), Rnd, and SeedMtx.
{ const TKronMtx& SeedGraph = SeedMtx; const int MtxDim = SeedGraph.GetDim(); const double MtxSum = SeedGraph.GetMtxSum(); const int NNodes = SeedGraph.GetNodes(NIter); const int NEdges = Edges; //const double DiagEdges = NNodes * pow(SeedGraph.At(0,0), double(NIter)); //const int NEdges = (int) TMath::Round(((pow(double(SeedGraph.GetMtxSum()), double(NIter)) - DiagEdges) /2.0)); printf(" RMat Kronecker: %d nodes, %d edges, %s...\n", NNodes, NEdges, IsDir ? "Directed":"UnDirected"); PNGraph Graph = TNGraph::New(NNodes, -1); TRnd Rnd(Seed); TExeTm ExeTm; // prepare cell probability vector TVec<TFltIntIntTr> ProbToRCPosV; // row, col position double CumProb = 0.0; for (int r = 0; r < MtxDim; r++) { for (int c = 0; c < MtxDim; c++) { const double Prob = SeedGraph.At(r, c); if (Prob > 0.0) { CumProb += Prob; ProbToRCPosV.Add(TFltIntIntTr(CumProb/MtxSum, r, c)); } } } // add nodes for (int i = 0; i < NNodes; i++) { Graph->AddNode(i); } // add edges int Rng, Row, Col, Collision=0, n = 0; for (int edges = 0; edges < NEdges; ) { Rng=NNodes; Row=0; Col=0; for (int iter = 0; iter < NIter; iter++) { const double& Prob = Rnd.GetUniDev(); n = 0; while(Prob > ProbToRCPosV[n].Val1) { n++; } const int MtxRow = ProbToRCPosV[n].Val2; const int MtxCol = ProbToRCPosV[n].Val3; Rng /= MtxDim; Row += MtxRow * Rng; Col += MtxCol * Rng; } if (! Graph->IsEdge(Row, Col)) { // allow self-loops Graph->AddEdge(Row, Col); edges++; if (! IsDir) { if (Row != Col) Graph->AddEdge(Col, Row); edges++; } } else { Collision++; } //if (edges % 1000 == 0) printf("\r...%dk", edges/1000); } //printf(" %d edges [%s]\n", Graph->GetEdges(), ExeTm.GetTmStr()); printf(" collisions: %d (%.4f)\n", Collision, Collision/(double)Graph->GetEdges()); return Graph; }
PNGraph TKronMtx::GenKronecker | ( | const TKronMtx & | SeedMtx, |
const int & | NIter, | ||
const bool & | IsDir, | ||
const int & | Seed = 0 |
||
) | [static] |
Definition at line 312 of file kronecker.cpp.
References TNGraph::AddEdge(), TNGraph::AddNode(), TNGraph::GetEdges(), GetNodes(), TExeTm::GetTmStr(), TRnd::GetUniDev(), IsEdgePlace(), TNGraph::New(), Rnd, and SeedMtx.
Referenced by PlotCmpGraphs().
{ const TKronMtx& SeedGraph = SeedMtx; const int NNodes = SeedGraph.GetNodes(NIter); printf(" Kronecker: %d nodes, %s...\n", NNodes, IsDir ? "Directed":"UnDirected"); PNGraph Graph = TNGraph::New(NNodes, -1); TExeTm ExeTm; TRnd Rnd(Seed); int edges = 0; for (int node1 = 0; node1 < NNodes; node1++) { Graph->AddNode(node1); } if (IsDir) { for (int node1 = 0; node1 < NNodes; node1++) { for (int node2 = 0; node2 < NNodes; node2++) { if (SeedGraph.IsEdgePlace(node1, node2, NIter, Rnd.GetUniDev())) { Graph->AddEdge(node1, node2); edges++; } } if (node1 % 1000 == 0) printf("\r...%dk, %dk", node1/1000, edges/1000); } } else { for (int node1 = 0; node1 < NNodes; node1++) { for (int node2 = node1; node2 < NNodes; node2++) { if (SeedGraph.IsEdgePlace(node1, node2, NIter, Rnd.GetUniDev())) { Graph->AddEdge(node1, node2); Graph->AddEdge(node2, node1); edges++; } } if (node1 % 1000 == 0) printf("\r...%dk, %dk", node1/1000, edges/1000); } } printf("\r %d edges [%s]\n", Graph->GetEdges(), ExeTm.GetTmStr()); return Graph; }
void TKronMtx::GenMtx | ( | const int & | Dim | ) | [inline] |
Definition at line 40 of file kronecker.h.
References TVec< TVal, TSizeTy >::Gen(), MtxDim, and SeedMtx.
Referenced by GetLLMtx(), GetProbMtx(), KronMul(), KronSum(), and TKronMaxLL::RoundTheta().
PNGraph TKronMtx::GenRndGraph | ( | const double & | RndFact = 1.0 | ) | const |
Definition at line 295 of file kronecker.cpp.
References TNGraph::AddEdge(), TNGraph::AddNode(), At(), GetDim(), TRnd::GetUniDev(), and TNGraph::New().
{ PNGraph Graph = TNGraph::New(); for (int i = 0; i < GetDim(); i++) { Graph->AddNode(i); } for (int r = 0; r < GetDim(); r++) { for (int c = 0; c < GetDim(); c++) { if (RndFact * At(r, c) >= TKronMtx::Rnd.GetUniDev()) { Graph->AddEdge(r, c); } } } return Graph; }
PNGraph TKronMtx::GenThreshGraph | ( | const double & | Thresh | ) | const |
Definition at line 283 of file kronecker.cpp.
References TNGraph::AddEdge(), TNGraph::AddNode(), At(), GetDim(), and TNGraph::New().
{ PNGraph Graph = TNGraph::New(); for (int i = 0; i < GetDim(); i++) { Graph->AddNode(i); } for (int r = 0; r < GetDim(); r++) { for (int c = 0; c < GetDim(); c++) { if (At(r, c) >= Thresh) { Graph->AddEdge(r, c); } } } return Graph; }
double TKronMtx::GetApxNoEdgeDLL | ( | const int & | ParamId, |
int | NId1, | ||
int | NId2, | ||
const int & | NKronIters | ||
) | const |
Definition at line 240 of file kronecker.cpp.
References At(), GetDim(), IAssert, MtxDim, and NInf.
Referenced by TKroneckerLL::CalcApxGraphDLL(), TKroneckerLL::CalcFullApxGraphDLL(), TKroneckerLL::MetroGibbsSampleNext(), TKroneckerLL::NodeDLLDelta(), and TKroneckerLL::UpdateGraphDLL().
{ const int& ThetaX = ParamId % GetDim(); const int& ThetaY = ParamId / GetDim(); int ThetaCnt = 0; double DLL = 0;//, LL = 0; for (int level = 0; level < NKronIters; level++) { const int X = NId1 % MtxDim; const int Y = NId2 % MtxDim; const double LVal = At(X, Y); IAssert(LVal > NInf); if (X == ThetaX && Y == ThetaY) { if (ThetaCnt != 0) { DLL += LVal; } ThetaCnt++; } else { DLL += LVal; } //LL += LVal; NId1 /= MtxDim; NId2 /= MtxDim; } //return -ThetaCnt*exp(DLL)*(1.0 + exp(LL)); // -x'/(1+x) WRONG! // deriv = -(ax^(a-1)*y^b..) - a*x^(2a-1)*y^2b.. // = - (ax^(a-1)*y^b..) - a*x*(x^(a-1)*y^b..)^2 return -ThetaCnt*exp(DLL) - ThetaCnt*exp(At(ThetaX, ThetaY)+2*DLL); }
double TKronMtx::GetApxNoEdgeLL | ( | int | NId1, |
int | NId2, | ||
const int & | NKronIters | ||
) | const |
Definition at line 191 of file kronecker.cpp.
References GetEdgeLL().
Referenced by TKroneckerLL::CalcApxGraphLL(), TKroneckerLL::MetroGibbsSampleNext(), TKroneckerLL::NodeLLDelta(), and TKroneckerLL::SwapNodesLL().
{ const double EdgeLL = GetEdgeLL(NId1, NId2, NKronIters); return -exp(EdgeLL) - 0.5*exp(2*EdgeLL); }
double TKronMtx::GetAvgAbsErr | ( | const TKronMtx & | Kron1, |
const TKronMtx & | Kron2 | ||
) | [static] |
Definition at line 655 of file kronecker.cpp.
References GetMtx(), IAssert, TVec< TVal, TSizeTy >::Len(), and TVec< TVal, TSizeTy >::Sort().
Referenced by TKroneckerLL::GradDescentConvergence(), and TKroneckerLL::TestKronDescent().
{ TFltV P1 = Kron1.GetMtx(); TFltV P2 = Kron2.GetMtx(); IAssert(P1.Len() == P2.Len()); P1.Sort(); P2.Sort(); double delta = 0.0; for (int i = 0; i < P1.Len(); i++) { delta += fabs(P1[i] - P2[i]); } return delta/P1.Len(); }
double TKronMtx::GetAvgFroErr | ( | const TKronMtx & | Kron1, |
const TKronMtx & | Kron2 | ||
) | [static] |
Definition at line 668 of file kronecker.cpp.
References GetMtx(), IAssert, TVec< TVal, TSizeTy >::Len(), and TVec< TVal, TSizeTy >::Sort().
{ TFltV P1 = Kron1.GetMtx(); TFltV P2 = Kron2.GetMtx(); IAssert(P1.Len() == P2.Len()); P1.Sort(); P2.Sort(); double delta = 0.0; for (int i = 0; i < P1.Len(); i++) { delta += pow(P1[i] - P2[i], 2); } return sqrt(delta/P1.Len()); }
double TKronMtx::GetColSum | ( | const int & | ColId | ) | const |
Definition at line 154 of file kronecker.cpp.
References At(), and GetDim().
Referenced by TKroneckerLL::GetFullColLL().
int TKronMtx::GetDim | ( | ) | const [inline] |
Definition at line 30 of file kronecker.h.
References MtxDim.
Referenced by TKroneckerLL::AppendIsoNodes(), Dump(), GenFastKronecker(), GenRndGraph(), GenThreshGraph(), GetApxNoEdgeDLL(), GetColSum(), TKroneckerLL::GetDim(), GetEdgeDLL(), GetEdgeProb(), TKroneckerLL::GetFullColLL(), TKroneckerLL::GetFullGraphLL(), TKroneckerLL::GetFullRowLL(), GetKronIter(), GetMtxStr(), GetNodes(), GetNoEdgeDLL(), GetRowSum(), KronMul(), KronSum(), TKroneckerLL::MetroGibbsSampleSetup(), TKroneckerLL::RunMStep(), SaveTxt(), TKroneckerLL::SetBestDegPerm(), TKroneckerLL::SetGraph(), and TKroneckerLL::SetRandomEdges().
{ return MtxDim; }
double TKronMtx::GetEdgeDLL | ( | const int & | ParamId, |
int | NId1, | ||
int | NId2, | ||
const int & | NKronIters | ||
) | const |
Definition at line 207 of file kronecker.cpp.
References At(), GetDim(), and MtxDim.
Referenced by TKroneckerLL::CalcApxGraphDLL(), TKroneckerLL::CalcFullApxGraphDLL(), TKroneckerLL::CalcGraphDLL(), TKroneckerLL::MetroGibbsSampleNext(), TKroneckerLL::NodeDLLDelta(), and TKroneckerLL::UpdateGraphDLL().
{ const int ThetaX = ParamId % GetDim(); const int ThetaY = ParamId / GetDim(); int ThetaCnt = 0; for (int level = 0; level < NKronIters; level++) { if ((NId1 % MtxDim) == ThetaX && (NId2 % MtxDim) == ThetaY) { ThetaCnt++; } NId1 /= MtxDim; NId2 /= MtxDim; } return double(ThetaCnt) / exp(At(ParamId)); }
double TKronMtx::GetEdgeLL | ( | int | NId1, |
int | NId2, | ||
const int & | NKronIters | ||
) | const |
Definition at line 175 of file kronecker.cpp.
References At(), MtxDim, and NInf.
Referenced by TKroneckerLL::CalcApxGraphLL(), TKroneckerLL::CalcGraphLL(), GetApxNoEdgeLL(), GetNoEdgeLL(), TKroneckerLL::MetroGibbsSampleNext(), TKroneckerLL::NodeLLDelta(), and TKroneckerLL::SwapNodesLL().
{ double LL = 0.0; for (int level = 0; level < NKronIters; level++) { const double& LLVal = At(NId1 % MtxDim, NId2 % MtxDim); if (LLVal == NInf) return NInf; LL += LLVal; NId1 /= MtxDim; NId2 /= MtxDim; } return LL; }
double TKronMtx::GetEdgeProb | ( | int | NId1, |
int | NId2, | ||
const int & | NKronIters | ||
) | const |
Definition at line 161 of file kronecker.cpp.
Referenced by GetNoEdgeProb().
{ double Prob = 1.0; for (int level = 0; level < NKronIters; level++) { Prob *= At(NId1 % MtxDim, NId2 % MtxDim); if (Prob == 0.0) { return 0.0; } NId1 /= MtxDim; NId2 /= MtxDim; } return Prob; }
double TKronMtx::GetEdgeProb | ( | const uint & | NId1Sig, |
const uint & | NId2Sig, | ||
const int & | NIter | ||
) | const |
Definition at line 271 of file kronecker.cpp.
References Assert, At(), and GetDim().
{ Assert(GetDim() == 2); double Prob = 1.0; for (int i = 0; i < NIter; i++) { const uint Mask = (1u<<i); const uint Bit1 = NId1Sig & Mask; const uint Bit2 = NId2Sig & Mask; Prob *= At(int(Bit1!=0), int(Bit2!=0)); } return Prob; }
int TKronMtx::GetEdges | ( | const int & | NIter | ) | const |
Definition at line 123 of file kronecker.cpp.
References GetMtxSum().
Referenced by GenFastKronecker(), TKroneckerLL::GradDescent(), TKroneckerLL::GradDescent2(), and TKroneckerLL::GradDescentConvergence().
{ return (int) pow(double(GetMtxSum()), double(NIter)); }
double TKronMtx::GetEZero | ( | const int & | Edges, |
const int & | KronIter | ||
) | const |
Definition at line 136 of file kronecker.cpp.
{ return pow((double) Edges, 1.0/double(KronIters)); }
TKronMtx TKronMtx::GetInitMtx | ( | const int & | Dim, |
const int & | Nodes, | ||
const int & | Edges | ||
) | [static] |
Definition at line 705 of file kronecker.cpp.
References TRnd::GetUniDev(), TVec< TVal, TSizeTy >::Len(), TVec< TVal, TSizeTy >::PutAll(), and SetForEdges().
Referenced by GetInitMtx(), and TKroneckerLL::TestBicCriterion().
{ const double MxParam = 0.8+TKronMtx::Rnd.GetUniDev()/5.0; const double MnParam = 0.2-TKronMtx::Rnd.GetUniDev()/5.0; const double Step = (MxParam-MnParam) / (Dim*Dim-1); TFltV ParamV(Dim*Dim); if (Dim == 1) { ParamV.PutAll(0.5); } // random graph else { for (int p = 0; p < ParamV.Len(); p++) { ParamV[p] = MxParam - p*Step; } } //IAssert(ParamV[0]==MxParam && ParamV.Last()==MnParam); TKronMtx Mtx(ParamV); Mtx.SetForEdges(Nodes, Edges); return Mtx; }
TKronMtx TKronMtx::GetInitMtx | ( | const TStr & | MtxStr, |
const int & | Dim, | ||
const int & | Nodes, | ||
const int & | Edges | ||
) | [static] |
Definition at line 721 of file kronecker.cpp.
References AddRndNoise(), At(), FailR, GetInitMtx(), GetMtx(), GetRndMtx(), TRnd::GetUniDev(), TCh::IsNum(), and SetForEdges().
{ TKronMtx Mtx(Dim); if (TCh::IsNum(MtxStr[0])) { Mtx = TKronMtx::GetMtx(MtxStr); } else if (MtxStr[0] == 'r') { Mtx = TKronMtx::GetRndMtx(Dim, 0.1); } else if (MtxStr[0] == 'a') { const double Prob = TKronMtx::Rnd.GetUniDev(); if (Prob < 0.4) { Mtx = TKronMtx::GetInitMtx(Dim, Nodes, Edges); } else { // interpolate so that there are in the corners 0.9, 0.5, 0.1, 0.5 const double Max = 0.9+TKronMtx::Rnd.GetUniDev()/10.0; const double Min = 0.1-TKronMtx::Rnd.GetUniDev()/10.0; const double Med = (Max-Min)/2.0; Mtx.At(0,0) = Max; Mtx.At(0,Dim-1) = Med; Mtx.At(Dim-1, 0) = Med; Mtx.At(Dim-1, Dim-1) = Min; for (int i = 1; i < Dim-1; i++) { Mtx.At(i,i) = Max - double(i)*(Max-Min)/double(Dim-1); Mtx.At(i, 0) = Mtx.At(0, i) = Max - double(i)*(Max-Med)/double(Dim-1); Mtx.At(i, Dim-1) = Mtx.At(Dim-1, i) = Med - double(i)*(Med-Min)/double(Dim-1); } for (int i = 1; i < Dim-1; i++) { for (int j = 1; j < Dim-1; j++) { if (i >= j) { continue; } Mtx.At(i,j) = Mtx.At(j,i) = Mtx.At(i,i) - (j-i)*(Mtx.At(i,i)-Mtx.At(i,Dim-1))/(Dim-i-1); } } Mtx.AddRndNoise(0.1); } } else { FailR("Wrong mtx: matlab str, or random (r), or all (a)"); } Mtx.SetForEdges(Nodes, Edges); return Mtx; }
int TKronMtx::GetKronIter | ( | const int & | Nodes | ) | const |
Definition at line 127 of file kronecker.cpp.
References GetDim().
Referenced by GetNZeroK(), PlotCmpGraphs(), SetForEdges(), and TKronMomentsFit::Test().
{ return (int) ceil(log(double(Nodes)) / log(double(GetDim()))); // upper bound //return (int) TMath::Round(log(double(Nodes)) / log(double(GetDim()))); // round to nearest power }
int TKronMtx::GetKronIter | ( | const int & | GNodes, |
const int & | SeedMtxSz | ||
) | [static] |
Definition at line 307 of file kronecker.cpp.
{ return (int) ceil(log(double(GNodes)) / log(double(SeedMtxSz))); }
void TKronMtx::GetLLMtx | ( | TKronMtx & | LLMtx | ) |
Definition at line 98 of file kronecker.cpp.
References At(), GenMtx(), Len(), MtxDim, and NInf.
Referenced by TKroneckerLL::GradDescent(), TKroneckerLL::GradDescent2(), TKroneckerLL::GradDescentConvergence(), TKroneckerLL::InitLL(), TKroneckerLL::RunMStep(), and TKroneckerLL::TestKronDescent().
{ LLMtx.GenMtx(MtxDim); for (int i = 0; i < Len(); i++) { if (At(i) != 0.0) { LLMtx.At(i) = log(At(i)); } else { LLMtx.At(i) = NInf; } } }
TFltV& TKronMtx::GetMtx | ( | ) | [inline] |
Definition at line 35 of file kronecker.h.
References SeedMtx.
Referenced by GetAvgAbsErr(), GetAvgFroErr(), GetInitMtx(), GetMtxFromNm(), TKronMaxLL::Test(), and TKroneckerLL::TestGradDescent().
{ return SeedMtx; }
const TFltV& TKronMtx::GetMtx | ( | ) | const [inline] |
TKronMtx TKronMtx::GetMtx | ( | TStr | MatlabMtxStr | ) | [static] |
Definition at line 681 of file kronecker.cpp.
References At(), TStr::ChangeChAll(), TVec< TVal, TSizeTy >::Empty(), IAssert, TVec< TVal, TSizeTy >::Len(), and TStr::SplitOnAllCh().
{ TStrV RowStrV, ColStrV; MatlabMtxStr.ChangeChAll(',', ' '); MatlabMtxStr.SplitOnAllCh(';', RowStrV); IAssert(! RowStrV.Empty()); RowStrV[0].SplitOnWs(ColStrV); IAssert(! ColStrV.Empty()); const int Rows = RowStrV.Len(); const int Cols = ColStrV.Len(); IAssert(Rows == Cols); TKronMtx Mtx(Rows); for (int r = 0; r < Rows; r++) { RowStrV[r].SplitOnWs(ColStrV); IAssert(ColStrV.Len() == Cols); for (int c = 0; c < Cols; c++) { Mtx.At(r, c) = (double) ColStrV[c].GetFlt(); } } return Mtx; }
TKronMtx TKronMtx::GetMtxFromNm | ( | const TStr & | MtxNm | ) | [static] |
Definition at line 753 of file kronecker.cpp.
References TStr::CStr(), FailR, TStr::Fmt(), GetMtx(), and TKronMtx().
{ if (MtxNm == "3chain") return TKronMtx::GetMtx("1 1 0; 1 1 1; 0 1 1"); else if (MtxNm == "4star") return TKronMtx::GetMtx("1 1 1 1; 1 1 0 0 ; 1 0 1 0; 1 0 0 1"); else if (MtxNm == "4chain") return TKronMtx::GetMtx("1 1 0 0; 1 1 1 0 ; 0 1 1 1; 0 0 1 1"); else if (MtxNm == "4square") return TKronMtx::GetMtx("1 1 0 1; 1 1 1 0 ; 0 1 1 1; 1 0 1 1"); else if (MtxNm == "5star") return TKronMtx::GetMtx("1 1 1 1 1; 1 1 0 0 0; 1 0 1 0 0; 1 0 0 1 0; 1 0 0 0 1"); else if (MtxNm == "6star") return TKronMtx::GetMtx("1 1 1 1 1 1; 1 1 0 0 0 0; 1 0 1 0 0 0; 1 0 0 1 0 0; 1 0 0 0 1 0; 1 0 0 0 0 1"); else if (MtxNm == "7star") return TKronMtx::GetMtx("1 1 1 1 1 1 1; 1 1 0 0 0 0 0; 1 0 1 0 0 0 0; 1 0 0 1 0 0 0; 1 0 0 0 1 0 0; 1 0 0 0 0 1 0; 1 0 0 0 0 0 1"); else if (MtxNm == "5burst") return TKronMtx::GetMtx("1 1 1 1 0; 1 1 0 0 0; 1 0 1 0 0; 1 0 0 1 1; 0 0 0 1 1"); else if (MtxNm == "7burst") return TKronMtx::GetMtx("1 0 0 1 0 0 0; 0 1 0 1 0 0 0; 0 0 1 1 0 0 0; 1 1 1 1 1 0 0; 0 0 0 1 1 1 1; 0 0 0 0 1 1 0; 0 0 0 0 1 0 1"); else if (MtxNm == "7cross") return TKronMtx::GetMtx("1 0 0 1 0 0 0; 0 1 0 1 0 0 0; 0 0 1 1 0 0 0; 1 1 1 1 1 0 0; 0 0 0 1 1 1 0; 0 0 0 0 1 1 1; 0 0 0 0 0 1 1"); FailR(TStr::Fmt("Unknow matrix: '%s'", MtxNm.CStr()).CStr()); return TKronMtx(); }
TStr TKronMtx::GetMtxStr | ( | ) | const |
Definition at line 80 of file kronecker.cpp.
References At(), TStr::Fmt(), GetDim(), and Len().
Referenced by PlotCmpGraphs().
{ TChA ChA("["); for (int i = 0; i < Len(); i++) { ChA += TStr::Fmt("%g", At(i)); if ((i+1)%GetDim()==0 && (i+1<Len())) { ChA += "; "; } else if (i+1<Len()) { ChA += ", "; } } ChA += "]"; return TStr(ChA); }
double TKronMtx::GetMtxSum | ( | ) | const |
Definition at line 140 of file kronecker.cpp.
Referenced by GenFastKronecker(), TKroneckerLL::GetAbsErr(), GetEdges(), TKroneckerLL::GetFullGraphLL(), TKroneckerLL::GradDescent(), TKroneckerLL::GradDescent2(), TKroneckerLL::GradDescentConvergence(), TKroneckerLL::MetroGibbsSampleSetup(), TKroneckerLL::RunMStep(), SetForEdges(), TKroneckerLL::SetRandomEdges(), and TKroneckerLL::TestKronDescent().
int TKronMtx::GetNodes | ( | const int & | NIter | ) | const |
Definition at line 119 of file kronecker.cpp.
References GetDim().
Referenced by GenDetKronecker(), GenFastKronecker(), GenKronecker(), TKroneckerLL::GetEmptyGraphLL(), GetNZeroK(), TKroneckerLL::GradDescent(), TKroneckerLL::GradDescent2(), TKroneckerLL::GradDescentConvergence(), and TKroneckerLL::RunKronEM().
{ return (int) pow(double(GetDim()), double(NIter)); }
uint TKronMtx::GetNodeSig | ( | const double & | OneProb = 0.5 | ) | [static] |
Definition at line 262 of file kronecker.cpp.
{ uint Sig = 0; for (int i = 0; i < (int)(8*sizeof(uint)); i++) { if (TKronMtx::Rnd.GetUniDev() < OneProb) { Sig |= (1u<<i); } } return Sig; }
double TKronMtx::GetNoEdgeDLL | ( | const int & | ParamId, |
int | NId1, | ||
int | NId2, | ||
const int & | NKronIters | ||
) | const |
Definition at line 220 of file kronecker.cpp.
References At(), GetDim(), and MtxDim.
Referenced by TKroneckerLL::CalcGraphDLL(), and TKroneckerLL::GetEmptyGraphDLL().
{ const int& ThetaX = ParamId % GetDim(); const int& ThetaY = ParamId / GetDim(); int ThetaCnt = 0; double DLL = 0, LL = 0; for (int level = 0; level < NKronIters; level++) { const int X = NId1 % MtxDim; const int Y = NId2 % MtxDim; const double LVal = At(X, Y); if (X == ThetaX && Y == ThetaY) { if (ThetaCnt != 0) { DLL += LVal; } ThetaCnt++; } else { DLL += LVal; } LL += LVal; NId1 /= MtxDim; NId2 /= MtxDim; } return -ThetaCnt*exp(DLL) / (1.0 - exp(LL)); }
double TKronMtx::GetNoEdgeLL | ( | int | NId1, |
int | NId2, | ||
const int & | NKronIters | ||
) | const |
Definition at line 186 of file kronecker.cpp.
References GetEdgeLL().
Referenced by TKroneckerLL::CalcGraphLL(), and TKroneckerLL::GetEmptyGraphLL().
{ return log(1.0 - exp(GetEdgeLL(NId1, NId2, NKronIters))); }
double TKronMtx::GetNoEdgeProb | ( | int | NId1, |
int | NId2, | ||
const int & | NKronIters | ||
) | const |
Definition at line 171 of file kronecker.cpp.
References GetEdgeProb().
{ return 1.0 - GetEdgeProb(NId1, NId2, NKronIters); }
int TKronMtx::GetNZeroK | ( | const PNGraph & | Graph | ) | const |
Definition at line 132 of file kronecker.cpp.
References GetKronIter(), GetNodes(), and TNGraph::GetNodes().
{ return GetNodes(GetKronIter(Graph->GetNodes())); }
int TKronMtx::GetPrimHashCd | ( | ) | const [inline] |
Definition at line 26 of file kronecker.h.
References TVec< TVal, TSizeTy >::GetPrimHashCd(), and SeedMtx.
{ return SeedMtx.GetPrimHashCd(); }
void TKronMtx::GetProbMtx | ( | TKronMtx & | ProbMtx | ) |
TKronMtx TKronMtx::GetRndMtx | ( | const int & | Dim, |
const double & | MinProb | ||
) | [static] |
Definition at line 699 of file kronecker.cpp.
References SetRndMtx().
Referenced by GetInitMtx().
double TKronMtx::GetRowSum | ( | const int & | RowId | ) | const |
Definition at line 147 of file kronecker.cpp.
References At(), and GetDim().
Referenced by TKroneckerLL::GetFullRowLL().
int TKronMtx::GetSecHashCd | ( | ) | const [inline] |
Definition at line 27 of file kronecker.h.
References TVec< TVal, TSizeTy >::GetSecHashCd(), and SeedMtx.
{ return SeedMtx.GetSecHashCd(); }
bool TKronMtx::IsEdgePlace | ( | int | NId1, |
int | NId2, | ||
const int & | NKronIters, | ||
const double & | ProbTresh | ||
) | const |
Definition at line 196 of file kronecker.cpp.
Referenced by GenDetKronecker(), and GenKronecker().
{ double Prob = 1.0; for (int level = 0; level < NKronIters; level++) { Prob *= At(NId1 % MtxDim, NId2 % MtxDim); if (ProbTresh > Prob) { return false; } NId1 /= MtxDim; NId2 /= MtxDim; } return true; }
bool TKronMtx::IsProbMtx | ( | ) | const |
Definition at line 33 of file kronecker.cpp.
Referenced by TKroneckerLL::InitLL().
void TKronMtx::KronMul | ( | const TKronMtx & | LeftPt, |
const TKronMtx & | RightPt, | ||
TKronMtx & | OutMtx | ||
) | [static] |
Definition at line 591 of file kronecker.cpp.
References At(), GenMtx(), and GetDim().
Referenced by KronPwr().
{ const int LDim = Left.GetDim(); const int RDim = Right.GetDim(); Result.GenMtx(LDim * RDim); for (int r1 = 0; r1 < LDim; r1++) { for (int c1 = 0; c1 < LDim; c1++) { const double& Val = Left.At(r1, c1); for (int r2 = 0; r2 < RDim; r2++) { for (int c2 = 0; c2 < RDim; c2++) { Result.At(r1*RDim+r2, c1*RDim+c2) = Val * Right.At(r2, c2); } } } } }
void TKronMtx::KronPwr | ( | const TKronMtx & | KronPt, |
const int & | NIter, | ||
TKronMtx & | OutMtx | ||
) | [static] |
void TKronMtx::KronSum | ( | const TKronMtx & | LeftPt, |
const TKronMtx & | RightPt, | ||
TKronMtx & | OutMtx | ||
) | [static] |
Definition at line 607 of file kronecker.cpp.
References At(), GenMtx(), GetDim(), and NInf.
{ const int LDim = Left.GetDim(); const int RDim = Right.GetDim(); Result.GenMtx(LDim * RDim); for (int r1 = 0; r1 < LDim; r1++) { for (int c1 = 0; c1 < LDim; c1++) { const double& Val = Left.At(r1, c1); for (int r2 = 0; r2 < RDim; r2++) { for (int c2 = 0; c2 < RDim; c2++) { if (Val == NInf || Right.At(r2, c2) == NInf) { Result.At(r1*RDim+r2, c1*RDim+c2) = NInf; } else { Result.At(r1*RDim+r2, c1*RDim+c2) = Val + Right.At(r2, c2); } } } } } }
int TKronMtx::Len | ( | ) | const [inline] |
Definition at line 31 of file kronecker.h.
References TVec< TVal, TSizeTy >::Len(), and SeedMtx.
Referenced by AddRndNoise(), TKroneckerLL::CalcApxGraphDLL(), TKroneckerLL::CalcFullApxGraphDLL(), TKroneckerLL::CalcGraphDLL(), TKroneckerLL::GetApxEmptyGraphDLL(), TKroneckerLL::GetApxEmptyGraphLL(), GetLLMtx(), GetMtxStr(), GetMtxSum(), TKroneckerLL::GetParams(), GetProbMtx(), IsProbMtx(), TKroneckerLL::MetroGibbsSampleNext(), TKroneckerLL::SampleGradient(), SetEpsMtx(), SetForEdges(), TKroneckerLL::SetGraph(), ToOneMinusMtx(), and TKroneckerLL::UpdateGraphDLL().
TKronMtx TKronMtx::LoadTxt | ( | const TStr & | MtxFNm | ) | [static] |
Definition at line 768 of file kronecker.cpp.
References At(), IAssert, IAssertR, and ssfTabSep.
{ PSs Ss = TSs::LoadTxt(ssfTabSep, MtxFNm); IAssertR(Ss->GetXLen() == Ss->GetYLen(), "Not a square matrix"); IAssert(Ss->GetYLen() == Ss->GetXLen()); TKronMtx Mtx(Ss->GetYLen()); for (int r = 0; r < Ss->GetYLen(); r++) { for (int c = 0; c < Ss->GetXLen(); c++) { Mtx.At(r, c) = (double) Ss->At(c, r).GetFlt(); } } return Mtx; }
bool TKronMtx::operator== | ( | const TKronMtx & | Kronecker | ) | const [inline] |
Definition at line 25 of file kronecker.h.
References SeedMtx.
void TKronMtx::PlotCmpGraphs | ( | const TKronMtx & | SeedMtx, |
const PNGraph & | Graph, | ||
const TStr & | OutFNm, | ||
const TStr & | Desc | ||
) | [static] |
Definition at line 479 of file kronecker.cpp.
References TStr::CStr(), TSnap::DelZeroDegNodes(), TStr::Fmt(), GenFastKronecker(), GenKronecker(), TNGraph::GetEdges(), GetKronIter(), TSnap::GetMxWcc(), TNGraph::GetNodes(), gpwLinesPoints, gsdClustCf, gsdHops, gsdInDeg, gsdOutDeg, gsdScc, gsdSngVal, gsdSngVec, gsdWcc, and tmuNodes.
{ const int KronIters = SeedMtx.GetKronIter(Graph->GetNodes()); PNGraph KronG, WccG; const bool FastGen = true; if (FastGen) { KronG = TKronMtx::GenFastKronecker(SeedMtx, KronIters, true, 0); } else { KronG = TKronMtx::GenKronecker(SeedMtx, KronIters, true, 0); } TSnap::DelZeroDegNodes(KronG); WccG = TSnap::GetMxWcc(KronG); const TStr Desc1 = TStr::Fmt("%s", Desc.CStr()); TGStatVec GS(tmuNodes, TFSet() | gsdInDeg | gsdOutDeg | gsdWcc | gsdHops | gsdScc | gsdClustCf | gsdSngVec | gsdSngVal); //gsdHops //gsWccHops, gsdSngVal, gsdSngVec, gsdClustCf GS.Add(Graph, TSecTm(1), TStr::Fmt("GRAPH G(%d, %d)", Graph->GetNodes(), Graph->GetEdges())); GS.Add(KronG, TSecTm(2), TStr::Fmt("KRONECKER K(%d, %d)", KronG->GetNodes(), KronG->GetEdges())); GS.Add(WccG, TSecTm(3), TStr::Fmt("KRONECKER wccK(%d, %d)", WccG->GetNodes(), WccG->GetEdges())); const TStr Style = "linewidth 1 pointtype 6 pointsize 1"; GS.ImposeDistr(gsdInDeg, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdInDeg, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdOutDeg, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdOutDeg, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdHops, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdClustCf, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdClustCf, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdSngVal, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdSngVal, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdSngVec, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdSngVec, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdWcc, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdWcc, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdScc, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdScc, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); // typedef enum { distrUndef, distrInDeg, distrOutDeg, distrWcc, distrScc, // distrHops, distrWccHops, distrSngVal, distrSngVec, distrClustCf, distrMx } TGraphDistr;*/ }
void TKronMtx::PlotCmpGraphs | ( | const TKronMtx & | SeedMtx1, |
const TKronMtx & | SeedMtx2, | ||
const PNGraph & | Graph, | ||
const TStr & | OutFNm, | ||
const TStr & | Desc | ||
) | [static] |
!!
Definition at line 514 of file kronecker.cpp.
References TStr::CStr(), TSnap::DelZeroDegNodes(), TStr::Fmt(), GenFastKronecker(), GenKronecker(), TNGraph::GetEdges(), GetKronIter(), GetMtxStr(), TNGraph::GetNodes(), gpwLinesPoints, gsdClustCf, gsdHops, gsdInDeg, gsdOutDeg, gsdScc, gsdSngVal, gsdSngVec, gsdTriadPart, gsdWcc, and tmuNodes.
{ const int KronIters1 = SeedMtx1.GetKronIter(Graph->GetNodes()); const int KronIters2 = SeedMtx2.GetKronIter(Graph->GetNodes()); PNGraph KronG1, KronG2; const bool FastGen = true; if (FastGen) { KronG1 = TKronMtx::GenFastKronecker(SeedMtx1, KronIters1, true, 0); KronG2 = TKronMtx::GenFastKronecker(SeedMtx2, KronIters2, false, 0); } else { KronG1 = TKronMtx::GenKronecker(SeedMtx1, KronIters1, true, 0); KronG2 = TKronMtx::GenKronecker(SeedMtx2, KronIters2, true, 0); } TSnap::DelZeroDegNodes(KronG1); TSnap::DelZeroDegNodes(KronG2); const TStr Desc1 = TStr::Fmt("%s", Desc.CStr()); TGStatVec GS(tmuNodes, TFSet() | gsdInDeg | gsdOutDeg | gsdWcc | gsdScc | gsdHops | gsdClustCf | gsdSngVec | gsdSngVal | gsdTriadPart); //gsdHops //gsWccHops, gsdSngVal, gsdSngVec, gsdClustCf GS.Add(Graph, TSecTm(1), TStr::Fmt("GRAPH G(%d, %d)", Graph->GetNodes(), Graph->GetEdges())); GS.Add(KronG1, TSecTm(2), TStr::Fmt("KRONECKER1 K(%d, %d) %s", KronG1->GetNodes(), KronG1->GetEdges(), SeedMtx1.GetMtxStr().CStr())); GS.Add(KronG2, TSecTm(3), TStr::Fmt("KRONECKER2 K(%d, %d) %s", KronG2->GetNodes(), KronG2->GetEdges(), SeedMtx2.GetMtxStr().CStr())); const TStr Style = "linewidth 1 pointtype 6 pointsize 1"; // raw data GS.ImposeDistr(gsdInDeg, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdOutDeg, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdHops, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdClustCf, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdSngVal, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdSngVec, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdWcc, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdScc, FNmPref, Desc1, false, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdTriadPart, FNmPref, Desc1, false, false, gpwLinesPoints, Style); // smooth GS.ImposeDistr(gsdInDeg, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdOutDeg, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdClustCf, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdScc, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdWcc, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdSngVec, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdSngVal, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); GS.ImposeDistr(gsdTriadPart, FNmPref+"-B", Desc1, true, false, gpwLinesPoints, Style); }
void TKronMtx::PlotCmpGraphs | ( | const TVec< TKronMtx > & | SeedMtxV, |
const PNGraph & | Graph, | ||
const TStr & | FNmPref, | ||
const TStr & | Desc | ||
) | [static] |
Definition at line 556 of file kronecker.cpp.
References TStr::CStr(), TSnap::DelZeroDegNodes(), TStr::Fmt(), GenFastKronecker(), TNGraph::GetEdges(), TNGraph::GetNodes(), gpwLines, gsdClustCf, gsdHops, gsdInDeg, gsdOutDeg, gsdScc, gsdSngVal, gsdSngVec, gsdWcc, TVec< TVal, TSizeTy >::Len(), and tmuNodes.
{ const TStr Desc1 = TStr::Fmt("%s", Desc.CStr()); TGStatVec GS(tmuNodes, TFSet() | gsdInDeg | gsdOutDeg | gsdWcc | gsdScc | gsdHops | gsdClustCf | gsdSngVec | gsdSngVal); GS.Add(Graph, TSecTm(1), TStr::Fmt("GRAPH G(%d, %d)", Graph->GetNodes(), Graph->GetEdges())); //gsdHops //gsWccHops, gsdSngVal, gsdSngVec, gsdClustCf for (int m = 0; m < SeedMtxV.Len(); m++) { const int KronIters = SeedMtxV[m].GetKronIter(Graph->GetNodes()); PNGraph KronG1 = TKronMtx::GenFastKronecker(SeedMtxV[m], KronIters, true, 0); printf("*** K(%d, %d) n0=%d\n", KronG1->GetNodes(), KronG1->GetEdges(), SeedMtxV[m].GetDim()); TSnap::DelZeroDegNodes(KronG1); printf(" del zero deg K(%d, %d) n0=%d\n", KronG1->GetNodes(), KronG1->GetEdges(), m); GS.Add(KronG1, TSecTm(m+2), TStr::Fmt("K(%d, %d) n0^k=%d n0=%d", KronG1->GetNodes(), KronG1->GetEdges(), SeedMtxV[m].GetNZeroK(Graph), SeedMtxV[m].GetDim())); // plot after each Kronecker is done const TStr Style = "linewidth 1 pointtype 6 pointsize 1"; GS.ImposeDistr(gsdInDeg, FNmPref, Desc1, false, false, gpwLines, Style); GS.ImposeDistr(gsdInDeg, FNmPref+"-B", Desc1, true, false, gpwLines, Style); GS.ImposeDistr(gsdOutDeg, FNmPref, Desc1, false, false, gpwLines, Style); GS.ImposeDistr(gsdOutDeg, FNmPref+"-B", Desc1, true, false, gpwLines, Style); GS.ImposeDistr(gsdHops, FNmPref, Desc1, false, false, gpwLines, Style); GS.ImposeDistr(gsdClustCf, FNmPref, Desc1, false, false, gpwLines, Style); GS.ImposeDistr(gsdClustCf, FNmPref+"-B", Desc1, true, false, gpwLines, Style); GS.ImposeDistr(gsdSngVal, FNmPref, Desc1, false, false, gpwLines, Style); GS.ImposeDistr(gsdSngVal, FNmPref+"-B", Desc1, true, false, gpwLines, Style); GS.ImposeDistr(gsdSngVec, FNmPref, Desc1, false, false, gpwLines, Style); GS.ImposeDistr(gsdSngVec, FNmPref+"-B", Desc1, true, false, gpwLines, Style); GS.ImposeDistr(gsdWcc, FNmPref, Desc1, false, false, gpwLines, Style); GS.ImposeDistr(gsdWcc, FNmPref+"-B", Desc1, true, false, gpwLines, Style); GS.ImposeDistr(gsdScc, FNmPref, Desc1, false, false, gpwLines, Style); GS.ImposeDistr(gsdScc, FNmPref+"-B", Desc1, true, false, gpwLines, Style); } // typedef enum { distrUndef, distrInDeg, distrOutDeg, distrWcc, distrScc, // distrHops, distrWccHops, distrSngVal, distrSngVec, distrClustCf, distrMx } TGraphDistr;*/ }
void TKronMtx::PutAllMtx | ( | const double & | Val | ) | [inline] |
Definition at line 39 of file kronecker.h.
References TVec< TVal, TSizeTy >::PutAll(), and SeedMtx.
static void TKronMtx::PutRndSeed | ( | const int & | Seed | ) | [inline, static] |
Definition at line 108 of file kronecker.h.
References TRnd::PutSeed(), and Rnd.
Referenced by TKronMaxLL::Test().
{ TKronMtx::Rnd.PutSeed(Seed); }
void TKronMtx::SaveTxt | ( | const TStr & | OutFNm | ) | const |
Definition at line 14 of file kronecker.cpp.
References At(), TStr::CStr(), and GetDim().
{ FILE *F = fopen(OutFNm.CStr(), "wt"); for (int i = 0; i < GetDim(); i++) { for (int j = 0; j < GetDim(); j++) { if (j > 0) fprintf(F, "\t"); fprintf(F, "%f", At(i,j)); } fprintf(F, "\n"); } fclose(F); }
void TKronMtx::SetEpsMtx | ( | const double & | Eps1, |
const double & | Eps0, | ||
const int & | Eps1Val = 1 , |
||
const int & | Eps0Val = 0 |
||
) |
void TKronMtx::SetForEdges | ( | const int & | Nodes, |
const int & | Edges | ||
) |
Definition at line 59 of file kronecker.cpp.
References At(), GetKronIter(), GetMtxSum(), and Len().
Referenced by GetInitMtx().
{ const int KronIter = GetKronIter(Nodes); const double EZero = pow((double) Edges, 1.0/double(KronIter)); const double Factor = EZero / GetMtxSum(); for (int i = 0; i < Len(); i++) { At(i) *= Factor; if (At(i) > 1) { At(i) = 1; } } }
void TKronMtx::SetMtx | ( | const TFltV & | ParamV | ) | [inline] |
void TKronMtx::SetRndMtx | ( | const int & | MtxDim, |
const double & | MinProb = 0.0 |
||
) |
Definition at line 40 of file kronecker.cpp.
References TVec< TVal, TSizeTy >::Gen(), TRnd::GetUniDev(), TVec< TVal, TSizeTy >::Len(), MtxDim, and SeedMtx.
Referenced by GetRndMtx().
{ MtxDim = PrmMtxDim; SeedMtx.Gen(MtxDim*MtxDim); for (int p = 0; p < SeedMtx.Len(); p++) { do { SeedMtx[p] = TKronMtx::Rnd.GetUniDev(); } while (SeedMtx[p] < MinProb); } }
void TKronMtx::Swap | ( | TKronMtx & | KronMtx | ) |
void TKronMtx::ToOneMinusMtx | ( | ) |
TInt TKronMtx::MtxDim [private] |
Definition at line 16 of file kronecker.h.
Referenced by At(), GenFastKronecker(), GenMtx(), GetApxNoEdgeDLL(), GetDim(), GetEdgeDLL(), GetEdgeLL(), GetEdgeProb(), GetLLMtx(), GetNoEdgeDLL(), GetProbMtx(), IsEdgePlace(), operator=(), SetRndMtx(), Swap(), and TKronMtx().
const double TKronMtx::NInf = -DBL_MAX [static] |
Definition at line 13 of file kronecker.h.
Referenced by GetApxNoEdgeDLL(), GetEdgeLL(), GetLLMtx(), GetProbMtx(), TKroneckerLL::InitLL(), and KronSum().
TRnd TKronMtx::Rnd = TRnd(0) [static] |
Definition at line 14 of file kronecker.h.
Referenced by AddRndNoise(), GenDetKronecker(), GenFastKronecker(), GenKronecker(), and PutRndSeed().
TFltV TKronMtx::SeedMtx [private] |
Definition at line 17 of file kronecker.h.
Referenced by At(), Dump(), Empty(), GenDetKronecker(), GenFastKronecker(), GenKronecker(), GenMtx(), GetMtx(), GetPrimHashCd(), GetSecHashCd(), Len(), operator=(), operator==(), PutAllMtx(), SetMtx(), SetRndMtx(), Swap(), and TKronMtx().