10   MtxDim = (int) sqrt((
double)SeedMatrix.
Len());
 
   15   FILE *F = fopen(OutFNm.
CStr(), 
"wt");
 
   16   for (
int i = 0; i < 
GetDim(); i++) {
 
   17     for (
int j = 0; j < 
GetDim(); j++) {
 
   18       if (j > 0) fprintf(F, 
"\t");
 
   19       fprintf(F, 
"%f", 
At(i,j)); }
 
   26   if (
this != &Kronecker){
 
   34   for (
int i = 0; i < 
Len(); i++) {
 
   35     if (
At(i) < 0.0 || 
At(i) > 1.0) 
return false;
 
   50 void TKronMtx::SetEpsMtx(
const double& Eps1, 
const double& Eps0, 
const int& Eps1Val, 
const int& Eps0Val) {
 
   51   for (
int i = 0; i < 
Len(); i++) {
 
   53     if (Val == Eps1Val) Val = double(Eps1);
 
   54     else if (Val == Eps0Val) Val = double(Eps0);
 
   61   const double EZero = pow((
double) Edges, 1.0/
double(KronIter));
 
   62   const double Factor = EZero / 
GetMtxSum();
 
   63   for (
int i = 0; i < 
Len(); i++) {
 
   65     if (
At(i) > 1) { 
At(i) = 1; }
 
   73   for (
int i = 0; i < 
Len(); i++) {
 
   74     for(c = 0; ((NewVal = 
At(i)*
Rnd.
GetNrmDev(1, SDev, 0.8, 1.2)) < 0.01 || NewVal>0.99) && c <1000; c++) { }
 
   75     if (c < 999) { 
At(i) = NewVal; } 
else { printf(
"XXXXX\n"); }
 
   82   for (
int i = 0; i < 
Len(); i++) {
 
   84     if ((i+1)%
GetDim()==0 && (i+1<
Len())) { ChA += 
"; "; }
 
   85     else if (i+1<
Len()) { ChA += 
", "; }
 
   92   for (
int i = 0; i < 
Len(); i++) {
 
  100   for (
int i = 0; i < 
Len(); i++) {
 
  101     if (
At(i) != 0.0) { LLMtx.
At(i) = log(
At(i)); }
 
  102     else { LLMtx.
At(i) = 
NInf; }
 
  108   for (
int i = 0; i < 
Len(); i++) {
 
  109     if (
At(i) != 
NInf) { ProbMtx.
At(i) = exp(
At(i)); }
 
  110     else { ProbMtx.
At(i) = 0.0; }
 
  120   return (
int) pow(
double(
GetDim()), 
double(NIter));
 
  124   return (
int) pow(
double(
GetMtxSum()), 
double(NIter));
 
  128   return (
int) ceil(log(
double(Nodes)) / log(
double(
GetDim()))); 
 
  137   return pow((
double) Edges, 1.0/
double(KronIters));
 
  142   for (
int i = 0; i < 
Len(); i++) {
 
  149   for (
int c = 0; c < 
GetDim(); c++) {
 
  150     Sum += 
At(RowId, c); }
 
  156   for (
int r = 0; r < 
GetDim(); r++) {
 
  157     Sum += 
At(r, ColId); }
 
  163   for (
int level = 0; level < NKronIters; level++) {
 
  164     Prob *= 
At(NId1 % 
MtxDim, NId2 % MtxDim);
 
  165     if (Prob == 0.0) { 
return 0.0; }
 
  177   for (
int level = 0; level < NKronIters; level++) {
 
  178     const double& LLVal = 
At(NId1 % 
MtxDim, NId2 % MtxDim);
 
  187   return log(1.0 - exp(
GetEdgeLL(NId1, NId2, NKronIters)));
 
  192   const double EdgeLL = 
GetEdgeLL(NId1, NId2, NKronIters);
 
  193   return -exp(EdgeLL) - 0.5*exp(2*EdgeLL);
 
  198   for (
int level = 0; level < NKronIters; level++) {
 
  199     Prob *= 
At(NId1 % 
MtxDim, NId2 % MtxDim);
 
  200     if (ProbTresh > Prob) { 
return false; }
 
  208   const int ThetaX = ParamId % 
GetDim();
 
  209   const int ThetaY = ParamId / 
GetDim();
 
  211   for (
int level = 0; level < NKronIters; level++) {
 
  212     if ((NId1 % 
MtxDim) == ThetaX && (NId2 % MtxDim) == ThetaY) {
 
  216   return double(ThetaCnt) / exp(
At(ParamId));
 
  221   const int& ThetaX = ParamId % 
GetDim();
 
  222   const int& ThetaY = ParamId / 
GetDim();
 
  224   double DLL = 0, LL = 0;
 
  225   for (
int level = 0; level < NKronIters; level++) {
 
  226     const int X = NId1 % 
MtxDim;
 
  227     const int Y = NId2 % 
MtxDim;
 
  228     const double LVal = 
At(X, Y);
 
  229     if (X == ThetaX && Y == ThetaY) {
 
  230       if (ThetaCnt != 0) { DLL += LVal; }
 
  232     } 
else { DLL += LVal; }
 
  236   return -ThetaCnt*exp(DLL) / (1.0 - exp(LL));
 
  241   const int& ThetaX = ParamId % 
GetDim();
 
  242   const int& ThetaY = ParamId / 
GetDim();
 
  245   for (
int level = 0; level < NKronIters; level++) {
 
  246     const int X = NId1 % 
MtxDim;
 
  247     const int Y = NId2 % 
MtxDim;
 
  249     if (X == ThetaX && Y == ThetaY) {
 
  250       if (ThetaCnt != 0) { DLL += LVal; }
 
  252     } 
else { DLL += LVal; }
 
  259   return -ThetaCnt*exp(DLL) - ThetaCnt*exp(
At(ThetaX, ThetaY)+2*DLL);
 
  264   for (
int i = 0; i < (int)(8*
sizeof(
uint)); i++) {
 
  265     if (TKronMtx::Rnd.GetUniDev() < OneProb) {
 
  274   for (
int i = 0; i < NIter; i++) {
 
  275     const uint Mask = (1u<<i);
 
  276     const uint Bit1 = NId1Sig & Mask;
 
  277     const uint Bit2 = NId2Sig & Mask;
 
  278     Prob *= 
At(
int(Bit1!=0), 
int(Bit2!=0));
 
  285   for (
int i = 0; i < 
GetDim(); i++) {
 
  287   for (
int r = 0; r < 
GetDim(); r++) {
 
  288     for (
int c = 0; c < 
GetDim(); c++) {
 
  289       if (
At(r, c) >= Thresh) { Graph->
AddEdge(r, c); }
 
  297   for (
int i = 0; i < 
GetDim(); i++) {
 
  299   for (
int r = 0; r < 
GetDim(); r++) {
 
  300     for (
int c = 0; c < 
GetDim(); c++) {
 
  308   return (
int) ceil(log(
double(GNodes)) / log(
double(SeedMtxSz)));
 
  314   const int NNodes = SeedGraph.
GetNodes(NIter);
 
  315   printf(
"  Kronecker: %d nodes, %s...\n", NNodes, IsDir ? 
"Directed":
"UnDirected");
 
  320   for (
int node1 = 0; node1 < NNodes; node1++) {
 
  323     for (
int node1 = 0; node1 < NNodes; node1++) {
 
  324       for (
int node2 = 0; node2 < NNodes; node2++) {
 
  330       if (node1 % 1000 == 0) printf(
"\r...%dk, %dk", node1/1000, edges/1000);
 
  333     for (
int node1 = 0; node1 < NNodes; node1++) {
 
  334       for (
int node2 = node1; node2 < NNodes; node2++) {
 
  341       if (node1 % 1000 == 0) printf(
"\r...%dk, %dk", node1/1000, edges/1000);
 
  352   const double MtxSum = SeedGraph.
GetMtxSum();
 
  353   const int NNodes = SeedGraph.
GetNodes(NIter);
 
  354   const int NEdges = SeedGraph.
GetEdges(NIter);
 
  357   printf(
"  FastKronecker: %d nodes, %d edges, %s...\n", NNodes, NEdges, IsDir ? 
"Directed":
"UnDirected");
 
  363   double CumProb = 0.0;
 
  364   for (
int r = 0; r < 
MtxDim; r++) {
 
  365     for (
int c = 0; c < 
MtxDim; c++) {
 
  366       const double Prob = SeedGraph.
At(r, c);
 
  374   for (
int i = 0; i < NNodes; i++) {
 
  377   int Rng, Row, Col, Collision=0, n = 0;
 
  378   for (
int edges = 0; edges < NEdges; ) {
 
  379     Rng=NNodes;  Row=0;  Col=0;
 
  380     for (
int iter = 0; iter < NIter; iter++) {
 
  382       n = 0; 
while(Prob > ProbToRCPosV[n].Val1) { n++; }
 
  383       const int MtxRow = ProbToRCPosV[n].Val2;
 
  384       const int MtxCol = ProbToRCPosV[n].Val3;
 
  389     if (! Graph->
IsEdge(Row, Col)) { 
 
  390       Graph->
AddEdge(Row, Col);  edges++;
 
  392         if (Row != Col) Graph->
AddEdge(Col, Row);
 
  395     } 
else { Collision++; }
 
  399   printf(
"             collisions: %d (%.4f)\n", Collision, Collision/(
double)Graph->
GetEdges());
 
  407   const double MtxSum = SeedGraph.
GetMtxSum();
 
  408   const int NNodes = SeedGraph.
GetNodes(NIter);
 
  409   const int NEdges = Edges;
 
  412   printf(
"  RMat Kronecker: %d nodes, %d edges, %s...\n", NNodes, NEdges, IsDir ? 
"Directed":
"UnDirected");
 
  418   double CumProb = 0.0;
 
  419   for (
int r = 0; r < 
MtxDim; r++) {
 
  420     for (
int c = 0; c < 
MtxDim; c++) {
 
  421       const double Prob = SeedGraph.
At(r, c);
 
  429   for (
int i = 0; i < NNodes; i++) {
 
  432   int Rng, Row, Col, Collision=0, n = 0;
 
  433   for (
int edges = 0; edges < NEdges; ) {
 
  434     Rng=NNodes;  Row=0;  Col=0;
 
  435     for (
int iter = 0; iter < NIter; iter++) {
 
  437       n = 0; 
while(Prob > ProbToRCPosV[n].Val1) { n++; }
 
  438       const int MtxRow = ProbToRCPosV[n].Val2;
 
  439       const int MtxCol = ProbToRCPosV[n].Val3;
 
  444     if (! Graph->
IsEdge(Row, Col)) { 
 
  445       Graph->
AddEdge(Row, Col);  edges++;
 
  447         if (Row != Col) Graph->
AddEdge(Col, Row);
 
  450     } 
else { Collision++; }
 
  454   printf(
"             collisions: %d (%.4f)\n", Collision, Collision/(
double)Graph->
GetEdges());
 
  460   const int NNodes = SeedGraph.
GetNodes(NIter);
 
  461   printf(
"  Deterministic Kronecker: %d nodes, %s...\n", NNodes, IsDir ? 
"Directed":
"UnDirected");
 
  465   for (
int node1 = 0; node1 < NNodes; node1++) { Graph->
AddNode(node1); }
 
  467   for (
int node1 = 0; node1 < NNodes; node1++) {
 
  468     for (
int node2 = 0; node2 < NNodes; node2++) {
 
  474     if (node1 % 1000 == 0) printf(
"\r...%dk, %dk", node1/1000, edges/1000);
 
  482   const bool FastGen = 
true;
 
  494   const TStr Style = 
"linewidth 1 pointtype 6 pointsize 1";
 
  518   const bool FastGen = 
true;
 
  534   const TStr Style = 
"linewidth 1 pointtype 6 pointsize 1";
 
  562   for (
int m = 0; m < SeedMtxV.
Len(); m++) {
 
  563     const int KronIters = SeedMtxV[m].GetKronIter(Graph->
GetNodes());
 
  565     printf(
"*** K(%d, %d) n0=%d\n", KronG1->
GetNodes(), KronG1->
GetEdges(), SeedMtxV[m].GetDim());
 
  567     printf(
" del zero deg K(%d, %d) n0=%d\n", KronG1->
GetNodes(), KronG1->
GetEdges(), m);
 
  568     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()));
 
  570     const TStr Style = 
"linewidth 1 pointtype 6 pointsize 1";
 
  572     GS.ImposeDistr(
gsdInDeg, FNmPref+
"-B", Desc1, 
true, 
false, 
gpwLines, Style);
 
  575     GS.ImposeDistr(
gsdHops, FNmPref, Desc1, 
false, 
false, 
gpwLines, Style);
 
  582     GS.ImposeDistr(
gsdWcc, FNmPref, Desc1, 
false, 
false, 
gpwLines, Style);
 
  583     GS.ImposeDistr(
gsdWcc, FNmPref+
"-B", Desc1, 
true, 
false, 
gpwLines, Style);
 
  584     GS.ImposeDistr(
gsdScc, FNmPref, Desc1, 
false, 
false, 
gpwLines, Style);
 
  585     GS.ImposeDistr(
gsdScc, FNmPref+
"-B", Desc1, 
true, 
false, 
gpwLines, Style);
 
  592   const int LDim = Left.
GetDim();
 
  593   const int RDim = Right.
GetDim();
 
  594   Result.
GenMtx(LDim * RDim);
 
  595   for (
int r1 = 0; r1 < LDim; r1++) {
 
  596     for (
int c1 = 0; c1 < LDim; c1++) {
 
  597       const double& Val = Left.
At(r1, c1);
 
  598       for (
int r2 = 0; r2 < RDim; r2++) {
 
  599         for (
int c2 = 0; c2 < RDim; c2++) {
 
  600           Result.
At(r1*RDim+r2, c1*RDim+c2) = Val * Right.
At(r2, c2);
 
  608   const int LDim = Left.
GetDim();
 
  609   const int RDim = Right.
GetDim();
 
  610   Result.
GenMtx(LDim * RDim);
 
  611   for (
int r1 = 0; r1 < LDim; r1++) {
 
  612     for (
int c1 = 0; c1 < LDim; c1++) {
 
  613       const double& Val = Left.
At(r1, c1);
 
  614       for (
int r2 = 0; r2 < RDim; r2++) {
 
  615         for (
int c2 = 0; c2 < RDim; c2++) {
 
  616           if (Val == 
NInf || Right.
At(r2, c2) == 
NInf) {
 
  617             Result.
At(r1*RDim+r2, c1*RDim+c2) = 
NInf; }
 
  619             Result.
At(r1*RDim+r2, c1*RDim+c2) = Val + Right.
At(r2, c2); }
 
  629   for (
int iter = 0; iter < NIter; iter++) {
 
  630     KronMul(OutMtx, KronMtx, NewOutMtx);
 
  631     NewOutMtx.
Swap(OutMtx);
 
  642   if (! MtxNm.
Empty()) printf(
"%s\n", MtxNm.
CStr());
 
  645   if (Sort) { ValV.
Sort(
false); }
 
  646   for (
int i = 0; i < ValV.
Len(); i++) {
 
  647     printf(
"  %10.4g", ValV[i]());
 
  649     if ((i+1) % 
GetDim() == 0) { printf(
"\n"); }
 
  651   printf(
" (sum:%.4f)\n", Sum);
 
  661   for (
int i = 0; i < P1.
Len(); i++) {
 
  662     delta += fabs(P1[i] - P2[i]);
 
  664   return delta/P1.
Len();
 
  674   for (
int i = 0; i < P1.
Len(); i++) {
 
  675     delta += pow(P1[i] - P2[i], 2);
 
  677   return sqrt(delta/P1.
Len());
 
  682   TStrV RowStrV, ColStrV;
 
  685   RowStrV[0].SplitOnWs(ColStrV);    
IAssert(! ColStrV.
Empty());
 
  686   const int Rows = RowStrV.
Len();
 
  687   const int Cols = ColStrV.
Len();
 
  690   for (
int r = 0; r < Rows; r++) {
 
  691     RowStrV[r].SplitOnWs(ColStrV);
 
  693     for (
int c = 0; c < Cols; c++) {
 
  694       Mtx.
At(r, c) = (double) ColStrV[c].GetFlt(); }
 
  706   const double MxParam = 0.8+TKronMtx::Rnd.
GetUniDev()/5.0;
 
  707   const double MnParam = 0.2-TKronMtx::Rnd.
GetUniDev()/5.0;
 
  708   const double Step = (MxParam-MnParam) / (Dim*Dim-1);
 
  709   TFltV ParamV(Dim*Dim);
 
  710   if (Dim == 1) { ParamV.
PutAll(0.5); } 
 
  712     for (
int p = 0; p < ParamV.
Len(); p++) {
 
  713       ParamV[p] = MxParam - p*Step; }
 
  725   else if (MtxStr[0] == 
'a') {
 
  726     const double Prob = TKronMtx::Rnd.
GetUniDev();
 
  730       const double Max = 0.9+TKronMtx::Rnd.
GetUniDev()/10.0;
 
  731       const double Min = 0.1-TKronMtx::Rnd.
GetUniDev()/10.0;
 
  732       const double Med = (Max-Min)/2.0;
 
  733       Mtx.
At(0,0)      = Max;       Mtx.
At(0,Dim-1) = Med;
 
  734       Mtx.
At(Dim-1, 0) = Med;  Mtx.
At(Dim-1, Dim-1) = Min;
 
  735       for (
int i = 1; i < Dim-1; i++) {
 
  736         Mtx.
At(i,i) = Max - double(i)*(Max-Min)/
double(Dim-1);
 
  737         Mtx.
At(i, 0) = Mtx.
At(0, i) = Max - double(i)*(Max-Med)/
double(Dim-1);
 
  738         Mtx.
At(i, Dim-1) = Mtx.
At(Dim-1, i) = Med - double(i)*(Med-Min)/
double(Dim-1);
 
  740       for (
int i = 1; i < Dim-1; i++) {
 
  741         for (
int j = 1; j < Dim-1; j++) {
 
  742           if (i >= j) { 
continue; }
 
  743           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);
 
  748   } 
else { 
FailR(
"Wrong mtx: matlab str, or random (r), or all (a)"); }
 
  755   else if (MtxNm == 
"4star") 
return TKronMtx::GetMtx(
"1 1 1 1; 1 1 0 0 ; 1 0 1 0; 1 0 0 1");
 
  756   else if (MtxNm == 
"4chain") 
return TKronMtx::GetMtx(
"1 1 0 0; 1 1 1 0 ; 0 1 1 1; 0 0 1 1");
 
  757   else if (MtxNm == 
"4square") 
return TKronMtx::GetMtx(
"1 1 0 1; 1 1 1 0 ; 0 1 1 1; 1 0 1 1");
 
  758   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");
 
  759   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");
 
  760   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");
 
  761   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");
 
  762   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");
 
  763   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");
 
  770   IAssertR(Ss->GetXLen() == Ss->GetYLen(), 
"Not a square matrix");
 
  771   IAssert(Ss->GetYLen() == Ss->GetXLen());
 
  773   for (
int r = 0; r < Ss->GetYLen(); r++) {
 
  774     for (
int c = 0; c < Ss->GetXLen(); c++) {
 
  775       Mtx.
At(r, c) = (double) Ss->At(c, r).GetFlt(); }
 
  788   InitLL(GraphPt, ParamMtx);
 
  792   InitLL(GraphPt, ParamMtx);
 
  798   return new TKroneckerLL(GraphPt, ParamMtx, PermPSwapNd);
 
  802   return new TKroneckerLL(GraphPt, ParamMtx, NodeIdPermV, PermPSwapNd);
 
  810   else FailR(
"Unknown permutation type (o,d,r)");
 
  831     DegNIdV.
Add(
TIntPr(NI.GetDeg(), NI.GetId()));
 
  835   for (
int i = 0; i < DegNIdV.
Len(); i++) {
 
  848   for(
int i = 0; i < NZero; i++) {
 
  849           for(
int j = 0; j < NZero; j++) {
 
  855   for(
int i = 0; i < 
Nodes; i++) {
 
  858           double RowP = 1.0, ColP = 1.0;
 
  860                   int Bit = NId % NZero;
 
  861                   RowP *= Row[Bit];             ColP *= Col[Bit];
 
  867   DegV.Sort(
false);             CDegV.
Sort(
false);
 
  868   for(
int i = 0; i < 
Nodes; i++) {
 
  869           NodePerm[DegV[i].Val2] = CDegV[i].Val2;
 
  877         for (
int i = 0; i < Perm.
Len(); i++) {
 
  887     if (! 
Graph->
IsNode(nid)) { NodesOk=
false; 
break; } }
 
  901       if (EI.GetSrcNId() != EI.GetDstNId()) {
 
  959   for (
int level = 0; level < 
KronIters; level++) {
 
  969   for (
int level = 0; level < 
KronIters; level++) {
 
  988   double Sum=0.0, SumSq=0.0;
 
 1005   if (
GradV.
Len() != ProbMtx.Len()) {
 
 1016   if (
GradV.
Len() != ProbMtx.Len()) {
 
 1024   for (
int nid = 0; nid < 
Nodes; nid++) {
 
 1027     for (
int e = 0; e < Node.
GetOutDeg(); e++) {
 
 1039   for (
int nid = 0; nid < 
Nodes; nid++) {
 
 1042     for (
int e = 0; e < Node.
GetOutDeg(); e++) {
 
 1061   for (
int e = 0; e < Node.
GetOutDeg(); e++) {
 
 1068   for (
int e = 0; e < Node.
GetInDeg(); e++) {
 
 1122   const double U = TKronMtx::Rnd.
GetUniDev();
 
 1125   const double LogU = log(U);
 
 1126   if (LogU > NewLL - OldLL) { 
 
 1138   for (
int NId1 = 0; NId1 < 
Nodes; NId1++) {
 
 1139     for (
int NId2 = 0; NId2 < 
Nodes; NId2++) {
 
 1148   double Sum=0.0, SumSq=0.0;
 
 1159   for (
int ParamId = 0; ParamId < 
LLMtx.
Len(); ParamId++) {
 
 1161     for (
int NId1 = 0; NId1 < 
Nodes; NId1++) {
 
 1162       for (
int NId2 = 0; NId2 < 
Nodes; NId2++) {
 
 1170     GradV[ParamId] = DLL;
 
 1177   for (
int ParamId = 0; ParamId < 
LLMtx.
Len(); ParamId++) {
 
 1179     for (
int NId1 = 0; NId1 < 
Nodes; NId1++) {
 
 1180       for (
int NId2 = 0; NId2 < 
Nodes; NId2++) {
 
 1188     GradV[ParamId] = DLL;
 
 1195   for (
int ParamId = 0; ParamId < 
LLMtx.
Len(); ParamId++) {
 
 1197     for (
int nid = 0; nid < 
Nodes; nid++) {
 
 1200       for (
int e = 0; e < Node.
GetOutDeg(); e++) {
 
 1206     GradV[ParamId] = DLL;
 
 1219   for (
int e = 0; e < Node.
GetOutDeg(); e++) {
 
 1225   for (
int e = 0; e < Node.
GetInDeg(); e++) {
 
 1242   for (
int ParamId = 0; ParamId < 
LLMtx.
Len(); ParamId++) {
 
 1273   int NId1=0, NId2=0, NAccept=0;
 
 1278     printf(
"  warm-up:%s,", ExeTm1.
GetTmStr());  ExeTm1.
Tick();
 
 1285   for (
int s = 0; s < NSamples; s++) {
 
 1288     for (
int m = 0; m < 
LLMtx.
Len(); m++) { AvgGradV[m] += 
GradV[m]; }
 
 1292   AvgLL = AvgLL / double(NSamples);
 
 1293   for (
int m = 0; m < 
LLMtx.
Len(); m++) {
 
 1294     AvgGradV[m] = AvgGradV[m] / double(NSamples); }
 
 1295   printf(
":%s (%.0f/s), accept %.1f%%\n", ExeTm1.
GetTmStr(), double(NSamples)/ExeTm1.
GetSecs(),
 
 1296     double(100*NAccept)/double(NSamples));
 
 1299 double TKroneckerLL::GradDescent(
const int& NIter, 
const double& LrnRate, 
double MnStep, 
double MxStep, 
const int& WarmUp, 
const int& NSamples) {
 
 1300   printf(
"\n----------------------------------------------------------------------\n");
 
 1304   double OldLL=-1e10, CurLL=0;
 
 1307   LearnRateV.PutAll(LrnRate);
 
 1315   for (
int Iter = 0; Iter < NIter; Iter++) {
 
 1316     printf(
"%03d] ", Iter);
 
 1319       LearnRateV[p] *= 0.95;
 
 1321         while (fabs(LearnRateV[p]*CurGradV[p]) > MxStep) { LearnRateV[p] *= 0.95; }
 
 1322         while (fabs(LearnRateV[p]*CurGradV[p]) < 0.02) { LearnRateV[p] *= (1.0/0.95); } 
 
 1325         while (fabs(LearnRateV[p]*CurGradV[p]) > MxStep) { LearnRateV[p] *= 0.95; printf(
".");}
 
 1326         while (fabs(LearnRateV[p]*CurGradV[p]) < MnStep) { LearnRateV[p] *= (1.0/0.95); printf(
"*");}
 
 1327         if (MxStep > 3*MnStep) { MxStep *= 0.95; }
 
 1329       NewProbMtx.
At(p) = 
ProbMtx.
At(p) + LearnRateV[p]*CurGradV[p];
 
 1330       if (NewProbMtx.
At(p) > 0.9999) { NewProbMtx.
At(p)=0.9999; }
 
 1331       if (NewProbMtx.
At(p) < 0.0001) { NewProbMtx.
At(p)=0.0001; }
 
 1333     printf(
"  trueE0: %.2f (%d),  estE0: %.2f (%d),  ERR: %f\n", EZero, 
Graph->
GetEdges(),
 
 1335     printf(
"  currLL: %.4f, deltaLL: %.4f\n", CurLL, CurLL-OldLL); 
 
 1337       printf(
"    %d]  %f  <--  %f + %9f   Grad: %9.1f   Rate: %g\n", p, NewProbMtx.
At(p),
 
 1338         ProbMtx.
At(p), (double)(LearnRateV[p]*CurGradV[p]), CurGradV[p](), LearnRateV[p]());
 
 1340     if (Iter+1 < NIter) { 
 
 1343     printf(
"\n");  fflush(stdout);
 
 1350   printf(
"TotalExeTm: %s %g\n", TotalTm.GetStr(), TotalTm.GetSecs());
 
 1355 double TKroneckerLL::GradDescent2(
const int& NIter, 
const double& LrnRate, 
double MnStep, 
double MxStep, 
const int& WarmUp, 
const int& NSamples) {
 
 1356   printf(
"\n----------------------------------------------------------------------\n");
 
 1357   printf(
"GradDescent2\n");
 
 1359   printf(
"Skip moves that make likelihood smaller\n");
 
 1362   double CurLL=0, NewLL=0;
 
 1365   LearnRateV.PutAll(LrnRate);
 
 1367   bool GoodMove = 
false;
 
 1369   for (
int Iter = 0; Iter < NIter; Iter++) {
 
 1370     printf(
"%03d] ", Iter);
 
 1371     if (! GoodMove) { 
SampleGradient(WarmUp, NSamples, CurLL, CurGradV); }
 
 1375       while (fabs(LearnRateV[p]*CurGradV[p]) > MxStep) { LearnRateV[p] *= 0.95; printf(
".");}
 
 1376       while (fabs(LearnRateV[p]*CurGradV[p]) < MnStep) { LearnRateV[p] *= (1.0/0.95); printf(
"*");}
 
 1377       NewProbMtx.
At(p) = CurProbMtx.At(p) + LearnRateV[p]*CurGradV[p];
 
 1378       if (NewProbMtx.
At(p) > 0.9999) { NewProbMtx.
At(p)=0.9999; }
 
 1379       if (NewProbMtx.
At(p) < 0.0001) { NewProbMtx.
At(p)=0.0001; }
 
 1380       LearnRateV[p] *= 0.95;
 
 1385     if (NewLL > CurLL) { 
 
 1386       printf(
"== Good move:\n");
 
 1387       printf(
"  trueE0: %.2f (%d),  estE0: %.2f (%d),  ERR: %f\n", EZero, 
Graph->
GetEdges(),
 
 1389       printf(
"  currLL: %.4f  deltaLL: %.4f\n", CurLL, NewLL-CurLL); 
 
 1391         printf(
"    %d]  %f  <--  %f + %9f   Grad: %9.1f   Rate: %g\n", p, NewProbMtx.
At(p),
 
 1392           CurProbMtx.At(p), (double)(LearnRateV[p]*CurGradV[p]), CurGradV[p](), LearnRateV[p]()); }
 
 1394       CurGradV = NewGradV;
 
 1397       printf(
"** BAD move:\n");
 
 1398       printf(
"  *trueE0: %.2f (%d),  estE0: %.2f (%d),  ERR: %f\n", EZero, 
Graph->
GetEdges(),
 
 1400       printf(
"  *curLL:  %.4f  deltaLL: %.4f\n", CurLL, NewLL-CurLL); 
 
 1402         printf(
"   b%d]  %f  <--  %f + %9f   Grad: %9.1f   Rate: %g\n", p, NewProbMtx.
At(p),
 
 1403           CurProbMtx.At(p), (double)(LearnRateV[p]*CurGradV[p]), CurGradV[p](), LearnRateV[p]()); }
 
 1408     printf(
"\n");  fflush(stdout);
 
 1410   printf(
"TotalExeTm: %s %g\n", TotalTm.GetStr(), TotalTm.GetSecs());
 
 1418         int count = 0, added = 0, collision = 0;
 
 1422         double CumProb = 0.0;
 
 1424         for(
int r = 0; r < MtxDim; r++) {
 
 1425                 for(
int c = 0; c < MtxDim; c++) {
 
 1434         int Rng, Row, Col, n, NId1, NId2;
 
 1435         while(added < NEdges) {
 
 1436                 Rng = 
Nodes;    Row = 0;        Col = 0;
 
 1437                 for (
int iter = 0; iter < 
KronIters; iter++) {
 
 1438                         const double& Prob = TKronMtx::Rnd.
GetUniDev();
 
 1439                         n = 0; 
while(Prob > ProbToRCPosV[n].Val1) { n++; }
 
 1440                         const int MtxRow = ProbToRCPosV[n].Val2;
 
 1441                         const int MtxCol = ProbToRCPosV[n].Val3;
 
 1443                         Row += MtxRow * Rng;
 
 1444                         Col += MtxCol * Rng;
 
 1470                 } 
else { collision ++; }
 
 1478         int NId1 = 0, NId2 = 0;
 
 1494         NMissing = (NMissing < 1) ? 1 : NMissing;
 
 1504         int NId1 = 0, NId2 = 0, hit = 0, GId = 0;
 
 1505         TIntTr EdgeToRemove, NewEdge;
 
 1509                 for(
int i = 0; i < WarmUp; i++) {
 
 1518                         RndAccept = (RndAccept > 1.0) ? 1.0 : RndAccept;
 
 1520                         if(TKronMtx::Rnd.GetUniDev() > RndAccept) { 
 
 1539                                                 GEdgeV[GId].
Val3 = hit;
 
 1541                                         LEdgeV[GEdgeV[GId].Val3].Val3 = GId;
 
 1549                                         for (
int p = 0; p < 
LLMtx.
Len(); p++) {
 
 1559         for (
int s = 0; s < WarmUp; s++) {
 
 1569         LLV.
Gen(NSamples, 0);
 
 1570         DLLV.
Gen(NSamples, 0);
 
 1574         printf(
"  Warm-Up [%u] : %s\n", WarmUp, ExeTm.
GetTmStr());
 
 1577         printf(
"  Gibbs Warm-Up [%u] : %s\n", GibbsWarmUp, ExeTm.
GetTmStr());
 
 1582         for(
int i = 0; i < NSamples; i++) {
 
 1588                 int OnePercent = (i+1) % (NSamples / 10);
 
 1589                 if(OnePercent == 0) {
 
 1590                         int TenPercent = ((i+1) / (NSamples / 10)) * 10;
 
 1591                         printf(
"  %3u%% done : %s\n", TenPercent, ExeTm.
GetTmStr());
 
 1599         double OldLL=
LogLike, CurLL=0;
 
 1604         LearnRateV.PutAll(LrnRate);
 
 1607         const int NSamples = LLV.
Len();
 
 1608         const int ReCalcLen = NSamples / 10;
 
 1610         for (
int s = 0; s < LLV.
Len(); s++) {
 
 1612                 for(
int p = 0; p < 
GetParams(); p++) { CurGradV[p] += DLLV[s][p]; }
 
 1615         for(
int p = 0; p < 
GetParams(); p++) { CurGradV[p] /= NSamples; }
 
 1617         double MaxLL = CurLL;
 
 1621         for (
int Iter = 0; Iter < GradIter; Iter++) {
 
 1622                 printf(
"    %03d] ", Iter+1);
 
 1627                                 while (fabs(LearnRateV[p]*CurGradV[p]) > MxStep) { LearnRateV[p] *= 0.95; }
 
 1628                                 while (fabs(LearnRateV[p]*CurGradV[p]) < 5 * MnStep) { LearnRateV[p] *= (1.0/0.95); } 
 
 1631                                 while (fabs(LearnRateV[p]*CurGradV[p]) > MxStep) { LearnRateV[p] *= 0.95; printf(
".");}
 
 1632                                 while (fabs(LearnRateV[p]*CurGradV[p]) < MnStep) { LearnRateV[p] *= (1.0/0.95); printf(
"*");}
 
 1633                                 if (MxStep > 3*MnStep) { MxStep *= 0.95; }
 
 1635                         NewProbMtx.
At(p) = 
ProbMtx.
At(p) + LearnRateV[p]*CurGradV[p];
 
 1636                         if (NewProbMtx.
At(p) > 0.9999) { NewProbMtx.
At(p)=0.9999; }
 
 1637                         if (NewProbMtx.
At(p) < 0.0001) { NewProbMtx.
At(p)=0.0001; }
 
 1638                         LearnRateV[p] *= 0.95;
 
 1641                 printf(
"      currLL: %.4f, deltaLL: %.4f\n", CurLL, CurLL-OldLL); 
 
 1643                         printf(
"      %d]  %f  <--  %f + %9f   Grad: %9.1f   Rate: %g\n", p, NewProbMtx.
At(p),
 
 1644                         ProbMtx.
At(p), (double)(LearnRateV[p]*CurGradV[p]), CurGradV[p](), LearnRateV[p]());
 
 1648                 if(Iter == GradIter - 1) {
 
 1653                 CurGradV.PutAll(0.0);
 
 1659                 for(
int s = 0; s < NSamples; s++) {
 
 1663                         if(s % ReCalcLen == ReCalcLen/2) {
 
 1671                                 CurGradV[p] += OneDLL[p];
 
 1677                         MaxLL = CurLL;  MaxProbMtx = 
ProbMtx;
 
 1680                 printf(
"    Time: %s\n", IterTm.
GetTmStr());
 
 1681                 printf(
"\n");  fflush(stdout);
 
 1685         printf(
"    FinalLL : %f,   TotalExeTm: %s\n", MaxLL, TotalTm.
GetTmStr());
 
 1692 void TKroneckerLL::RunKronEM(
const int& EMIter, 
const int& GradIter, 
double LrnRate, 
double MnStep, 
double MxStep, 
const int& GibbsWarmUp, 
const int& WarmUp, 
const int& NSamples, 
const TKronEMType& Type, 
const int& NMissing) {
 
 1693         printf(
"\n----------------------------------------------------------------------\n");
 
 1711         for(
int i = 0; i < EMIter; i++) {
 
 1712                 printf(
"\n----------------------------------------------------------------------\n");
 
 1713                 printf(
"%03d EM-iter] E-Step\n", i+1);
 
 1714                 RunEStep(GibbsWarmUp, WarmUp, NSamples, LLV, DLLV);
 
 1717                 printf(
"%03d EM-iter] M-Step\n", i+1);
 
 1718                 double CurLL = 
RunMStep(LLV, DLLV, GradIter, LrnRate, MnStep, MxStep);
 
 1734   for (
int i = 0; i < XYValV.
Len(); i++) {
 
 1735     Min = 
TMath::Mn(Min, XYValV[i].Val2.Val);
 
 1736     Max = 
TMath::Mx(Max, XYValV[i].Val2.Val);
 
 1741   double Min, Max, Min1, Max1;
 
 1748   GP.
SetXYLabel(
"Sample Index (time)", 
"Log-likelihood");
 
 1751   { 
TGnuPlot GP(
"sAcc-"+OutFNm, 
TStr::Fmt(
"Pct. accepted rnd moves (over 1k samples). %s", Desc.
CStr()), 
true);
 
 1753   GP.
SetXYLabel(
"Sample Index (time)", 
"Pct accept permutation swaps");
 
 1758   for (
int g = 0; g < GradVV.
Len(); g++) {
 
 1760     GetMinMax(GradVV[g], Min1, Max1, 
false);
 
 1764     GP.
SetYRange((
int)floor(Min-1), (
int)ceil(Max+1));
 
 1765     GP.
SetXYLabel(
"Sample Index (time)", 
"Gradient");
 
 1768   GPAll.
SetYRange((
int)floor(Min1-1), (
int)ceil(Max1+1));
 
 1769   GPAll.
SetXYLabel(
"Sample Index (time)", 
"Gradient");
 
 1774   double Avg=0.0, Var=0.0;
 
 1775   for (
int i = 0; i < ValV.
Len(); i++) { Avg += ValV[i]; }
 
 1776   Avg /= (double) ValV.
Len();
 
 1777   for (
int i = 0; i < ValV.
Len(); i++) { Var += 
TMath::Sqr(ValV[i]-Avg); }
 
 1779   for (
int k = 0; k < 
TMath::Mn(ValV.
Len(), MaxK); k++) {
 
 1781     for (
int i = 0; i < ValV.
Len() - k; i++) {
 
 1782       corr += (ValV[i]-Avg)*(ValV[i+k]-Avg);
 
 1789   GP.
SetXYLabel(
"Lag, k", 
"Autocorrelation, r_k");
 
 1797   int NId1=0, NId2=0, NAccept=0;
 
 1799   const int PlotLen = NSamples/1000+1;
 
 1800   double TrueLL=-1, AvgLL=0.0;
 
 1805   TFltV SampleLLV(NSamples, 0);
 
 1808     GradVV[g].
Gen(PlotLen, 0); }
 
 1809   if (! TrueMtx.
Empty()) {
 
 1815   printf(
"LogLike at start:       %f\n", 
LogLike());
 
 1818     if (TrueLL != -1) { TrueLLV.
Add(
TFltPr(0, TrueLL)); }
 
 1820     printf(
"  warm-up:%s,", ExeTm.
GetTmStr());  ExeTm.
Tick();
 
 1822   printf(
"LogLike afterm warm-up: %f\n", 
LogLike());
 
 1826   if (TrueLL != -1) { TrueLLV.
Add(
TFltPr(WarmUp, TrueLL)); }
 
 1827   printf(
"  recalculated:         %f\n", 
LogLike());
 
 1829   printf(
"  sampling (average per 1000 samples)\n");
 
 1831   for (
int s = 0; s < NSamples; s++) {
 
 1834     for (
int m = 0; m < AvgGradV.
Len(); m++) { AvgGradV[m] += 
GradV[m]; }
 
 1842     if (s > 0 && s % 1000 == 0) {
 
 1844       for (
int g = 0; g < AvgGradV.
Len(); g++) {
 
 1845         GradVV[g].
Add(
TFltPr(WarmUp+s, AvgGradV[g] / 1000.0)); }
 
 1846       EstLLV.
Add(
TFltPr(WarmUp+s, AvgLL / 1000.0));
 
 1847       if (TrueLL != -1) { TrueLLV.
Add(
TFltPr(WarmUp+s, TrueLL)); }
 
 1848       AcceptV.
Add(
TFltPr(WarmUp+s, NAccept/1000.0));
 
 1855       if (s % 100000 == 0 && DoPlot) {
 
 1858         PlotGrad(EstLLV, TrueLLV, GradVV, AcceptV, OutFNm, Desc);
 
 1859         for (
int n = 0; n < SamplVV.
Len(); n++) {
 
 1861         printf(
"  samples: %d, time: %s, samples/s: %.1f\n", s, ExeTm.
GetTmStr(), double(s+1)/ExeTm.
GetSecs());
 
 1863       AvgLL = 0;  AvgGradV.
PutAll(0);  NAccept=0;
 
 1869     PlotGrad(EstLLV, TrueLLV, GradVV, AcceptV, OutFNm, Desc);
 
 1870     for (
int n = 0; n < SamplVV.
Len(); n++) {
 
 1878   for (
int j = 0; j < AvgJV.
Len(); j++) {
 
 1879     AvgAvg += AvgJV[j]; }
 
 1880   AvgAvg /= AvgJV.
Len();
 
 1884   for (
int j = 0; j < ChainLLV.
Len(); j++) {
 
 1885     const TFltV& ChainV = ChainLLV[j];
 
 1887     for (
int i = 0; i < ChainV.
Len(); i++) {
 
 1890     AvgJV.
Add(Avg/ChainV.
Len());
 
 1896   const double J = ChainLLV.
Len();
 
 1897   const double K = ChainLLV[0].
Len();
 
 1901   double InChainVar=0, OutChainVar=0;
 
 1903   for (
int j = 0; j < AvgJV.
Len(); j++) {
 
 1904     OutChainVar += 
TMath::Sqr(AvgJV[j] - AvgAvg); }
 
 1905   OutChainVar = OutChainVar * (K/double(J-1));
 
 1906   printf(
"*** %g chains of len %g\n", J, K);
 
 1907   printf(
"  ** between chain var: %f\n", OutChainVar);
 
 1909   for (
int j = 0; j < AvgJV.
Len(); j++) {
 
 1910     const TFltV& ChainV = ChainLLV[j];
 
 1911     for (
int k = 0; k < ChainV.
Len(); k++) {
 
 1912       InChainVar += 
TMath::Sqr(ChainV[k] - AvgJV[j]); }
 
 1914   InChainVar = InChainVar * 1.0/double(J*(K-1));
 
 1915   printf(
"  ** within chain var: %f\n", InChainVar);
 
 1916   const double PostVar = (K-1)/K * InChainVar + 1.0/K * OutChainVar;
 
 1917   printf(
"  ** posterior var: %f\n", PostVar);
 
 1918   const double ScaleRed = sqrt(PostVar/InChainVar);
 
 1919   printf(
"  ** scale reduction (< 1.2): %f\n\n", ScaleRed);
 
 1927   const int K = ChainLLV[0].
Len();
 
 1928   const int Buckets=1000;
 
 1929   const int BucketSz = K/Buckets;
 
 1930   for (
int b = 1; b < Buckets; b++) {
 
 1931     const int End = 
TMath::Mn(BucketSz*b, K-1);
 
 1932     for (
int c = 0; c < ChainLLV.
Len(); c++) {
 
 1933       ChainLLV[c].
GetSubValV(0, End, SmallLLV[c]); }
 
 1938     Desc.
CStr(), ChainLLV.
Len(), ChainLLV[0].
Len(), BucketSz), 
"Chain length", 
"Potential scale reduction");
 
 1943   printf(
"Test gradient descent on a synthetic kronecker graphs:\n");
 
 1944   if (DoExact) { printf(
"  -- Exact gradient calculations\n"); }
 
 1945   else { printf(
"  -- Approximate gradient calculations\n"); }
 
 1946   if (TruePerm) { printf(
"  -- No permutation sampling (use true permutation)\n"); }
 
 1947   else { printf(
"  -- Sample permutations (start with degree permutation)\n"); }
 
 1950   double OldLL=0, MyLL=0, AvgAbsErr, AbsSumErr;
 
 1951   TFltV MyGradV, SDevV;
 
 1966     printf(
"DEGREE  PERMUTATION\n");  
SetDegPerm();
 
 1968   for (Iter = 0; Iter < 100; Iter++) {
 
 1979     printf(
"%d] LL: %g, ", Iter, MyLL);
 
 1982     printf(
"  avgAbsErr: %.4f, absSumErr: %.4f, newLL: %.2f, deltaLL: %.2f\n", AvgAbsErr, AbsSumErr, MyLL, OldLL-MyLL);
 
 1985       LearnRateV[p] *= 0.9;
 
 1987       while (fabs(LearnRateV[p]*MyGradV[p]) > 0.1) { LearnRateV[p] *= 0.9; }
 
 1989       while (fabs(LearnRateV[p]*MyGradV[p]) < 0.001) { LearnRateV[p] *= (1.0/0.9); }
 
 1991       printf(
"    %d]  %f  <--  %f + %f    lrnRate:%g\n", p, 
ProbMtx.
At(p) + LearnRateV[p]*MyGradV[p],
 
 1992         ProbMtx.
At(p), (double)(LearnRateV[p]*MyGradV[p]), LearnRateV[p]());
 
 1999     if (AvgAbsErr < 0.01) { printf(
"***CONVERGED!\n");  
break; }
 
 2000     printf(
"\n");  fflush(stdout);
 
 2002   TrueParam.
Dump(
"True  Thetas", 
true);
 
 2004   printf(
"  AvgAbsErr: %f\n  AbsSumErr: %f\n  Iterations: %d\n", AvgAbsErr, AbsSumErr, Iter);
 
 2005   printf(
"Iteration run time: %s, sec: %g\n\n", IterTm.
GetTmStr(), IterTm.
GetSecs());
 
 2006   return TFltQu(AvgAbsErr, AbsSumErr, Iter, IterTm.
GetSecs());
 
 2012   if (! TrueV.
Empty()) { GP.AddPlot(TrueV, 
gpwLines, 
"TRUE"); }
 
 2013   GP.SetXYLabel(
"Gradient descent iterations", YLabel);
 
 2018  double LearnRate, 
const int& WarmUp, 
const int& NSamples, 
const int& AvgKGraphs, 
const TKronMtx& TrueParam) {
 
 2021   double OldLL=0, MyLL=0, AvgAbsErr=0, AbsSumErr=0;
 
 2022   TFltV MyGradV, SDevV;
 
 2024   TFltPrV EZeroV, DiamV, Lambda1V, Lambda2V, AvgAbsErrV, AvgLLV;
 
 2025   TFltPrV TrueEZeroV, TrueDiamV, TrueLambda1V, TrueLambda2V, TrueLLV;
 
 2029   const double TrueLambda1 = SngValV[0];
 
 2030   const double TrueLambda2 = SngValV[1];
 
 2031   if (! TrueParam.
Empty()) {
 
 2036   const double TrueLL = OldLL;
 
 2038   for (Iter = 0; Iter < NIters; Iter++) {
 
 2047     double SumDiam=0, SumSngVal1=0, SumSngVal2=0;
 
 2048     for (
int trial = 0; trial < AvgKGraphs; trial++) {
 
 2054       SumSngVal1 += SngValV[0];  SumSngVal2 += SngValV[1];
 
 2059     DiamV.
Add(
TFltPr(Iter, SumDiam/
double(AvgKGraphs)));
 
 2060     Lambda1V.
Add(
TFltPr(Iter, SumSngVal1/
double(AvgKGraphs)));
 
 2061     Lambda2V.
Add(
TFltPr(Iter, SumSngVal2/
double(AvgKGraphs)));
 
 2063     TrueEZeroV.
Add(
TFltPr(Iter, TrueEZero));
 
 2064     TrueDiamV.
Add(
TFltPr(Iter, TrueEffDiam));
 
 2065     TrueLambda1V.
Add(
TFltPr(Iter, TrueLambda1));
 
 2066     TrueLambda2V.
Add(
TFltPr(Iter, TrueLambda2));
 
 2067     if (Iter % 10 == 0) {
 
 2070       PlotTrueAndEst(
"LL."+OutFNm, Desc, 
"Average LL", AvgLLV, TrueLLV);
 
 2071       PlotTrueAndEst(
"E0."+OutFNm, Desc, 
"E0 (expected number of edges)", EZeroV, TrueEZeroV);
 
 2072       PlotTrueAndEst(
"Diam."+OutFNm+
"-Diam", Desc, 
"Effective diameter", DiamV, TrueDiamV);
 
 2073       PlotTrueAndEst(
"Lambda1."+OutFNm, Desc, 
"Lambda 1", Lambda1V, TrueLambda1V);
 
 2074       PlotTrueAndEst(
"Lambda2."+OutFNm, Desc, 
"Lambda 2", Lambda2V, TrueLambda2V);
 
 2075       if (! TrueParam.
Empty()) {
 
 2078     if (! TrueParam.
Empty()) {
 
 2080       AvgAbsErrV.
Add(
TFltPr(Iter, AvgAbsErr));
 
 2081     } 
else { AvgAbsErr = 1.0; }
 
 2086       LearnRateV[p] *= 0.99;
 
 2087       while (fabs(LearnRateV[p]*MyGradV[p]) > 0.1) { LearnRateV[p] *= 0.99; printf(
".");}
 
 2088       while (fabs(LearnRateV[p]*MyGradV[p]) < 0.002) { LearnRateV[p] *= (1.0/0.95); printf(
"*");}
 
 2089       printf(
"    %d]  %f  <--  %f + %9f   Grad: %9.1f,  Rate:%g\n", p, 
ProbMtx.
At(p) + LearnRateV[p]*MyGradV[p],
 
 2090         ProbMtx.
At(p), (double)(LearnRateV[p]*MyGradV[p]), MyGradV[p](), LearnRateV[p]());
 
 2096     printf(
"%d] LL: %g, ", Iter, MyLL);
 
 2097     printf(
"  avgAbsErr: %.4f, absSumErr: %.4f, newLL: %.2f, deltaLL: %.2f\n", AvgAbsErr, AbsSumErr, MyLL, OldLL-MyLL);
 
 2098     if (AvgAbsErr < 0.001) { printf(
"***CONVERGED!\n");  
break; }
 
 2099     printf(
"\n");  fflush(stdout);
 
 2102   TrueParam.
Dump(
"True  Thetas", 
true);
 
 2104   printf(
"  AvgAbsErr: %f\n  AbsSumErr: %f\n  Iterations: %d\n", AvgAbsErr, AbsSumErr, Iter);
 
 2105   printf(
"Iteration run time: %s, sec: %g\n\n", IterTm.
GetTmStr(), IterTm.
GetSecs());
 
 2110  double LearnRate, 
const int& WarmUp, 
const int& NSamples, 
const int& TrueN0) {
 
 2117   for (
int NZero = 2; NZero < 10; NZero++) {
 
 2119     InitKronMtx.
Dump(
"INIT PARAM", 
true);
 
 2122     const double LastLL = KronLL.
GradDescent(GradIters, LearnRate, 0.001, 0.01, WarmUp, NSamples);
 
 2126     { 
TGnuPlot GP(
"LL-"+OutFNm, Desc1);
 
 2129     { 
TGnuPlot GP(
"BIC-"+OutFNm, Desc1);
 
 2132     { 
TGnuPlot GP(
"MDL-"+OutFNm, Desc1);
 
 2144   int NId1 = 0, NId2 = 0, NAccept = 0;
 
 2148   else if (Permutation == 
"d") KronLL.
SetDegPerm();
 
 2150   else FailR(
"Unknown permutation (r,d,o)");
 
 2153   for (
int s = 0; s < 1000*KiloSamples; s++) {
 
 2157       for (
int m = 0; m < 4; m++) { GradVV[m].Add(KronLL.
GradV[m]); }
 
 2158       if ((s+1) % 1000 == 0) {
 
 2160         for (
int m = 0; m < 4; m++) { GradVV[m].Add(KronLL.
GradV[m]); }
 
 2162         if ((s+1) % 100000 == 0) {
 
 2164           for (
int g = 0; g < GradVV.Len(); g++) {
 
 2166           GP.
SetXYLabel(
"sample index",
"log Gradient");
 
 2173   for (
int m = 0; m < 4; m++) {
 
 2175     printf(
"grad %d: mean: %12f  sDev: %12f  median: %12f\n", m,
 
 2176       GradMomV[m].GetMean(), GradMomV[m].GetSDev(), GradMomV[m].GetMedian());
 
 2211                 ShufflePerm.
Shuffle(TKronMtx::Rnd);
 
 2212                 for(i = 0; i < NNodes; i++) {
 
 2213                         Graph->
DelNode(
int(ShufflePerm[i]));
 
 2216                 for(i = 0; i < NNodes; i++) {
 
 2217                         Graph->
DelNode(
int(ShufflePerm[ShufflePerm.
Len() - 1 - i]));
 
 2225         IAssert(Rate > 0 && Rate < 0.5);
 
 2230         IAssert(NEdges > 0 && NEdges < Graph->GetEdges());
 
 2232         const int Nodes = Graph->
GetNodes();
 
 2233         const int Edges = Graph->
GetEdges();
 
 2240         ToAdd.
Gen(NEdges / 2, 0);
 
 2241         for(
int i = 0; i < NEdges / 2; i++) {
 
 2244                 if(Graph->
IsEdge(Src, Dst)) {   i--;    
continue;       }
 
 2249         ToDel.
Gen(Edges, 0);
 
 2251                 ToDel.
Add(
TIntPr(EI.GetSrcNId(), EI.GetDstNId()));
 
 2255         for(
int i = 0; i < NEdges / 2; i++) {
 
 2256                 Graph->
DelEdge(ToDel[i].Val1, ToDel[i].Val2);
 
 2257                 Graph->
AddEdge(ToAdd[i].Val1, ToAdd[i].Val2);
 
 2264         IAssert(Rate > 0 && Rate < 0.5);
 
 2269         IAssert(NEdges > 0 && NEdges < Graph->GetEdges());
 
 2275                 if(EI.GetSrcNId() != EI.GetDstNId()) {
 
 2276                         ToDel.
Add(
TIntPr(EI.GetSrcNId(), EI.GetDstNId()));
 
 2281         for(
int i = 0; i < NEdges; i++) {
 
 2282                 Graph->
DelEdge(ToDel[i].Val1, ToDel[i].Val2);
 
 2289         IAssert(Rate > 0 && Rate < 0.5);
 
 2301   else FailR(
"Unknown permutation type (o,d,r)");
 
 2355   NewThetaV.
Gen(ThetaV.
Len());
 
 2356   for (
int i = 0; i < ThetaV.
Len(); i++) {
 
 2362   Kronecker.
GenMtx((
int)sqrt((
double)ThetaV.
Len()));
 
 2363   for (
int i = 0; i < ThetaV.
Len(); i++) {
 
static const T & Mn(const T &LVal, const T &RVal)
 
void SetRndMtx(const int &MtxDim, const double &MinProb=0.0)
 
TPair< TInt, TInt > TIntPr
 
TKronMtx & operator=(const TKronMtx &Kronecker)
 
static int RemoveNodeNoise(PNGraph &Graph, const int &NNodes, const bool Random=true)
!!!!! MYUNGHWAN, CHECK! 
 
static PNGraph GenKronecker(const TKronMtx &SeedMtx, const int &NIter, const bool &IsDir, const int &Seed=0)
 
static PKroneckerLL New()
 
double GetEdgeProb(int NId1, int NId2, const int &NKronIters) const 
 
void GetNIdV(TIntV &NIdV) const 
Gets a vector IDs of all nodes in the graph. 
 
#define IAssertR(Cond, Reason)
 
TPair< TFlt, TInt > TFltIntPr
 
TNodeI BegNI() const 
Returns an iterator referring to the first node in the graph. 
 
int GetEdges(const int &NIter) const 
 
static void TestBicCriterion(const TStr &OutFNm, const TStr &Desc1, const PNGraph &G, const int &GradIters, double LearnRate, const int &WarmUp, const int &NSamples, const int &TrueN0)
 
static TStr GetMegaStr(const int &Val)
 
static void KronMul(const TKronMtx &LeftPt, const TKronMtx &RightPt, TKronMtx &OutMtx)
 
TFltV TestSamplePerm(const TStr &OutFNm, const int &WarmUp, const int &NSamples, const TKronMtx &TrueMtx, const bool &DoPlot=true)
 
static TKronMtx LoadTxt(const TStr &MtxFNm)
 
static PSs LoadTxt(const TSsFmt &SsFmt, const TStr &FNm, const PNotify &Notify=NULL, const bool &IsExcelEoln=true, const int &MxY=-1, const TIntV &AllowedColNV=TIntV(), const bool &IsQStr=true)
 
static bool IsNum(const char &Ch)
 
void SetRandomEdges(const int &NEdges, const bool isDir=true)
!!!!! MYUNGHWAN, CHECK! 
 
void Del(const TSizeTy &ValN)
Removes the element at position ValN. 
 
int GetKronIter(const int &Nodes) const 
 
void SavePng(const int &SizeX=1000, const int &SizeY=800, const TStr &Comment=TStr())
 
PGraph GetMxWcc(const PGraph &Graph)
Returns a graph representing the largest weakly connected component on an input Graph. 
 
static const T & Mx(const T &LVal, const T &RVal)
 
static PNGraph New()
Static constructor that returns a pointer to the graph. Call: PNGraph Graph = TNGraph::New(). 
 
void RunEStep(const int &GibbsWarmUp, const int &WarmUp, const int &NSamples, TFltV &LLV, TVec< TFltV > &DLLV)
 
TNodeI GetNI(const int &NId) const 
Returns an iterator referring to the node of ID NId in the graph. 
 
void UpdateGraphDLL(const int &SwapNId1, const int &SwapNId2)
 
static double CalcChainR2(const TVec< TFltV > &ChainLLV)
 
double GetApxNoEdgeLL(int NId1, int NId2, const int &NKronIters) const 
 
TEdgeI EndEI() const 
Returns an iterator referring to the past-the-end edge in the graph. 
 
double GetFullGraphLL() const 
 
int GetEdges() const 
Returns the number of edges in the graph. 
 
bool IsEdgePlace(int NId1, int NId2, const int &NKronIters, const double &ProbTresh) const 
 
void Swap(TKronMtx &KronMtx)
 
TSizeTy Len() const 
Returns the number of elements in the vector. 
 
void GetMinMax(const TFltPrV &XYValV, double &Min, double &Max, const bool &ResetMinMax)
 
void Dump(const TStr &MtxNm=TStr(), const bool &Sort=false) const 
 
TEdgeI BegEI() const 
Returns an iterator referring to the first edge in the graph. 
 
double GetAnfEffDiam(const PGraph &Graph, const bool &IsDir, const double &Percentile, const int &NApprox)
 
double NodeDLLDelta(const int ParamId, const int &NId) const 
 
double GetFullRowLL(int RowId) const 
 
void SetPerm(const char &PermId)
 
int GetNodes() const 
Returns the number of nodes in the graph. 
 
double GetEdgeLL(int NId1, int NId2, const int &NKronIters) const 
 
void SetXYLabel(const TStr &XLabel, const TStr &YLabel)
 
double GetEmptyGraphDLL(const int &ParamId) const 
 
double GetEmptyGraphLL() const 
 
int AddNode(int NId=-1)
Adds a node of ID NId to the graph. 
 
static uint GetNodeSig(const double &OneProb=0.5)
 
bool SampleNextPerm(int &NId1, int &NId2)
 
static TKronMtx GetInitMtx(const int &Dim, const int &Nodes, const int &Edges)
 
void RunKronEM(const int &EMIter, const int &GradIter, double LrnRate, double MnStep, double MxStep, const int &GibbsWarmUp, const int &WarmUp, const int &NSamples, const TKronEMType &Type=kronNodeMiss, const int &NMissing=-1)
 
static double Sqr(const double &x)
 
void SetIPerm(const TIntV &Perm)
!!!!! MYUNGHWAN, CHECK! 
 
void SetYRange(const double &Min, const double &Max)
 
void SetForEdges(const int &Nodes, const int &Edges)
 
static void KronPwr(const TKronMtx &KronPt, const int &NIter, TKronMtx &OutMtx)
 
int ChangeChAll(const char &SrcCh, const char &DstCh)
 
const double & At(const int &Row, const int &Col) const 
 
void SetEpsMtx(const double &Eps1, const double &Eps0, const int &Eps1Val=1, const int &Eps0Val=0)
 
double GetEdgeDLL(const int &ParamId, int NId1, int NId2, const int &NKronIters) const 
 
void RestoreGraph(const bool RestoreNodes=true)
!!!!! MYUNGHWAN, CHECK! 
 
bool Empty() const 
Tests whether the vector is empty. 
 
static void TestGradDescent(const int &KronIters, const int &KiloSamples, const TStr &Permutation)
 
bool IsObsEdge(const int &NId1, const int &NId2) const 
 
Graph Statistics Sequence. 
 
void DelNode(const int &NId)
Deletes node of ID NId from the graph. 
 
void Swap(TVec< TVal, TSizeTy > &Vec)
Swaps the contents of the vector with Vec. 
 
void GetProbMtx(TKronMtx &ProbMtx)
 
const char * GetTmStr() const 
 
void SetBestDegPerm()
!!!!! MYUNGHWAN, CHECK! 
 
void DelZeroDegNodes(PGraph &Graph)
Removes all the zero-degree nodes, that isolated nodes, from the graph. 
 
void Clr(const bool &DoDel=true, const TSizeTy &NoDelLim=-1)
Clears the contents of the vector. 
 
void SetPerm(const char &PermId)
 
static int FlipEdgeNoise(PNGraph &Graph, const int &NEdges, const bool Random=true)
 
void Sort(const bool &Asc=true)
Sorts the elements of the vector. 
 
double GetApxEmptyGraphLL() const 
 
Edge iterator. Only forward iteration (operator++) is supported. 
 
static void PutRndSeed(const int &Seed)
 
double GetApxNoEdgeDLL(const int &ParamId, int NId1, int NId2, const int &NKronIters) const 
 
static TKronMtx GetMtxFromNm(const TStr &MtxNm)
 
int AddEdge(const int &SrcNId, const int &DstNId)
Adds an edge from node SrcNId to node DstNId to the graph. 
 
void PutAll(const TVal &Val)
Sets all elements of the vector to value Val. 
 
void PlotGrad(const TFltPrV &EstLLV, const TFltPrV &TrueLLV, const TVec< TFltPrV > &GradVV, const TFltPrV &AcceptV, const TStr &OutFNm, const TStr &Desc)
 
void SampleGradient(const int &WarmUp, const int &NSamples, double &AvgLL, TFltV &GradV)
 
PNGraph GenRndGraph(const double &RndFact=1.0) const 
 
double NodeLLDelta(const int &NId) const 
 
void DelEdge(const int &SrcNId, const int &DstNId, const bool &IsDir=true)
Deletes an edge from node IDs SrcNId to DstNId from the graph. 
 
bool IsEdge(const int &SrcNId, const int &DstNId, const bool &IsDir=true) const 
Tests whether an edge from node IDs SrcNId to DstNId exists in the graph. 
 
PUNGraph GetSubGraph(const PUNGraph &Graph, const TIntV &NIdV, const bool &RenumberNodes)
Returns an induced subgraph of an undirected graph Graph with NIdV nodes with an optional node renumb...
 
double GetApxEmptyGraphDLL(const int &ParamId) const 
 
void PlotAutoCorrelation(const TFltV &ValV, const int &MaxK, const TStr &OutFNm, const TStr &Desc)
 
double RunMStep(const TFltV &LLV, const TVec< TFltV > &DLLV, const int &GradIter, const double &LrnRate, double MnStep, double MxStep)
 
static double Round(const double &Val)
 
bool IsNode(const int &NId) const 
Tests whether ID NId is a node. 
 
static double Power(const double &Base, const double &Exponent)
 
void AddRndNoise(const double &SDev)
 
const TVal & Last() const 
Returns a reference to the last element of the vector. 
 
static double GetAvgFroErr(const TKronMtx &Kron1, const TKronMtx &Kron2)
 
void GradDescentConvergence(const TStr &OutFNm, const TStr &Desc1, const bool &SamplePerm, const int &NIters, double LearnRate, const int &WarmUp, const int &NSamples, const int &AvgKGraphs, const TKronMtx &TrueParam)
 
static void ChainGelmapRubinPlot(const TVec< TFltV > &ChainLLV, const TStr &OutFNm, const TStr &Desc)
 
TQuad< TFlt, TFlt, TFlt, TFlt > TFltQu
 
double GetFullColLL(int ColId) const 
 
void InitLL(const TFltV &ParamV)
 
TPair< TFlt, TFlt > TFltPr
 
int GetDeg() const 
Returns degree of the current node, the sum of in-degree and out-degree. 
 
double GetEZero(const int &Edges, const int &KronIter) const 
 
double GetNoEdgeProb(int NId1, int NId2, const int &NKronIters) const 
 
int GetNZeroK(const PNGraph &Graph) const 
 
void GetLLMtx(TKronMtx &LLMtx)
 
const TFltV & CalcGraphDLL()
 
void MetroGibbsSampleSetup(const int &WarmUp)
 
const TFltV & CalcFullApxGraphDLL()
 
void MetroGibbsSampleNext(const int &WarmUp, const bool DLLUpdate=false)
 
void GetSngVals(const PNGraph &Graph, const int &SngVals, TFltV &SngValV)
Computes largest SngVals singular values of the adjacency matrix representing a directed Graph...
 
double GradDescent2(const int &NIter, const double &LrnRate, double MnStep, double MxStep, const int &WarmUp, const int &NSamples)
 
static PNGraph GenDetKronecker(const TKronMtx &SeedMtx, const int &NIter, const bool &IsDir)
 
void GenMtx(const int &Dim)
 
double GetColSum(const int &ColId) const 
 
TNodeI EndNI() const 
Returns an iterator referring to the past-the-end node in the graph. 
 
void PlotTrueAndEst(const TStr &OutFNm, const TStr &Desc, const TStr &YLabel, const TFltPrV &EstV, const TFltPrV &TrueV)
 
int GetOutDeg() const 
Returns out-degree of the current node. 
 
const TFltV & CalcApxGraphDLL()
 
double GetNoEdgeLL(int NId1, int NId2, const int &NKronIters) const 
 
static TKronMtx GetRndMtx(const int &Dim, const double &MinProb)
 
void SaveTxt(const TStr &OutFNm) const 
 
double SwapNodesLL(const int &NId1, const int &NId2)
 
static TStr Fmt(const char *FmtStr,...)
 
void SplitOnAllCh(const char &SplitCh, TStrV &StrV, const bool &SkipEmpty=true) const 
 
void Shuffle(TRnd &Rnd)
Randomly shuffles the elements of the vector. 
 
Node iterator. Only forward iteration (operator++) is supported. 
 
void McMcGetAvgAvg(const TFltV &AvgJV, double &AvgAvg)
 
int AddPlot(const TIntV &YValV, const TGpSeriesTy &SeriesTy=gpwLinesPoints, const TStr &Label=TStr(), const TStr &Style=TStr())
 
static void KronSum(const TKronMtx &LeftPt, const TKronMtx &RightPt, TKronMtx &OutMtx)
 
double GetRowSum(const int &RowId) const 
 
TTriple< TInt, TInt, TInt > TIntTr
 
int GetNodes(const int &NIter) const 
 
void Gen(const TSizeTy &_Vals)
Constructs a vector (an array) of _Vals elements. 
 
int GetUniDevInt(const int &Range=0)
 
PNGraph GenThreshGraph(const double &Thresh) const 
 
double GetNoEdgeDLL(const int &ParamId, int NId1, int NId2, const int &NKronIters) const 
 
static TVec< TFlt, int > GetV(const TFlt &Val1)
Returns a vector on element Val1. 
 
void SetGraph(const PNGraph &GraphPt)
 
int GetInDeg() const 
Returns in-degree of the current node. 
 
int GetInNId(const int &NodeN) const 
Returns ID of NodeN-th in-node (the node pointing to the current node). 
 
TFltQu TestKronDescent(const bool &DoExact, const bool &TruePerm, double LearnRate, const int &WarmUp, const int &NSamples, const TKronMtx &TrueParam)
 
TSizeTy Add()
Adds a new element at the end of the vector, after its current last element. 
 
void DelLast()
Removes the last element of the vector. 
 
static double GetAvgAbsErr(const TKronMtx &Kron1, const TKronMtx &Kron2)
 
static void PlotCmpGraphs(const TKronMtx &SeedMtx, const PNGraph &Graph, const TStr &OutFNm, const TStr &Desc)
 
static void RoundTheta(const TFltV &ThetaV, TFltV &NewThetaV)
 
static void PlotValV(const TVec< TVal1 > &ValV, const TStr &OutFNmPref, const TStr &Desc="", const TStr &XLabel="", const TStr &YLabel="", const TGpScaleTy &ScaleTy=gpsAuto, const bool &PowerFit=false, const TGpSeriesTy &SeriesTy=gpwLinesPoints)
 
double GradDescent(const int &NIter, const double &LrnRate, double MnStep, double MxStep, const int &WarmUp, const int &NSamples)
 
int GetOutNId(const int &NodeN) const 
Returns ID of NodeN-th out-node (the node the current node points to). 
 
TTriple< TFlt, TInt, TInt > TFltIntIntTr
 
void McMcGetAvgJ(const TVec< TFltV > &ChainLLV, TFltV &AvgJV)
 
static int RemoveEdgeNoise(PNGraph &Graph, const int &NEdges)
 
static PNGraph GenFastKronecker(const TKronMtx &SeedMtx, const int &NIter, const bool &IsDir, const int &Seed=0)
 
void GetSubValV(const TSizeTy &BValN, const TSizeTy &EValN, TVec< TVal, TSizeTy > &ValV) const 
Fills ValV with elements at positions BValN...EValN.