SNAP Library, User Reference  2012-10-02 12:56:23
SNAP, a general purpose network analysis and graph mining library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
kronecker.h
Go to the documentation of this file.
00001 #ifndef snap_kronecker_h
00002 #define snap_kronecker_h
00003 
00004 #include "Snap.h"
00005 
00007 // Dense Kronecker Matrix
00008 class TKroneckerLL;
00009 typedef TPt<TKroneckerLL> PKroneckerLL;
00010 
00011 class TKronMtx {
00012 public:
00013   static const double NInf;
00014   static TRnd Rnd;
00015 private:
00016   TInt MtxDim;
00017   TFltV SeedMtx;
00018 public:
00019   TKronMtx() : MtxDim(-1), SeedMtx() { }
00020   TKronMtx(const int& Dim) : MtxDim(Dim), SeedMtx(Dim*Dim) { }
00021   TKronMtx(const TFltV& SeedMatrix);
00022   TKronMtx(const TKronMtx& Kronecker) : MtxDim(Kronecker.MtxDim), SeedMtx(Kronecker.SeedMtx) { }
00023   void SaveTxt(const TStr& OutFNm) const;
00024   TKronMtx& operator = (const TKronMtx& Kronecker);
00025   bool operator == (const TKronMtx& Kronecker) const { return SeedMtx==Kronecker.SeedMtx; }
00026   int GetPrimHashCd() const { return SeedMtx.GetPrimHashCd(); }
00027   int GetSecHashCd() const { return SeedMtx.GetSecHashCd(); }
00028 
00029   // seed matrix
00030   int GetDim() const { return MtxDim; }
00031   int Len() const { return SeedMtx.Len(); }
00032   bool Empty() const { return SeedMtx.Empty(); }
00033   bool IsProbMtx() const; // probability (not log-lihelihood) matrix
00034 
00035   TFltV& GetMtx() { return SeedMtx; }
00036   const TFltV& GetMtx() const { return SeedMtx; }
00037   void SetMtx(const TFltV& ParamV) { SeedMtx = ParamV; }
00038   void SetRndMtx(const int& MtxDim, const double& MinProb = 0.0);
00039   void PutAllMtx(const double& Val) { SeedMtx.PutAll(Val); }
00040   void GenMtx(const int& Dim) { MtxDim=Dim;  SeedMtx.Gen(Dim*Dim); }
00041   void SetEpsMtx(const double& Eps1, const double& Eps0, const int& Eps1Val=1, const int& Eps0Val=0);
00042   void SetForEdges(const int& Nodes, const int& Edges); // scales the values to allow E edges
00043   void AddRndNoise(const double& SDev);
00044   TStr GetMtxStr() const;
00045 
00046   const double& At(const int& Row, const int& Col) const { return SeedMtx[MtxDim*Row+Col].Val; }
00047   double& At(const int& Row, const int& Col) { return SeedMtx[MtxDim*Row+Col].Val; }
00048   const double& At(const int& ValN) const { return SeedMtx[ValN].Val; }
00049   double& At(const int& ValN) { return SeedMtx[ValN].Val; }
00050 
00051   int GetNodes(const int& NIter) const;
00052   int GetEdges(const int& NIter) const;
00053   int GetKronIter(const int& Nodes) const;
00054   int GetNZeroK(const PNGraph& Graph) const; // n0^k so that > Graph->GetNodes
00055   double GetEZero(const int& Edges, const int& KronIter) const;
00056   double GetMtxSum() const;
00057   double GetRowSum(const int& RowId) const;
00058   double GetColSum(const int& ColId) const;
00059 
00060   void ToOneMinusMtx();
00061   void GetLLMtx(TKronMtx& LLMtx);
00062   void GetProbMtx(TKronMtx& ProbMtx);
00063   void Swap(TKronMtx& KronMtx);
00064 
00065   // edge probability and log-likelihood
00066   double GetEdgeProb(int NId1, int NId2, const int& NKronIters) const; // given ProbMtx
00067   double GetNoEdgeProb(int NId1, int NId2, const int& NKronIters) const; // given ProbMtx
00068   double GetEdgeLL(int NId1, int NId2, const int& NKronIters) const; // given LLMtx
00069   double GetNoEdgeLL(int NId1, int NId2, const int& NKronIters) const; // given LLMtx
00070   double GetApxNoEdgeLL(int NId1, int NId2, const int& NKronIters) const; // given LLMtx
00071   bool IsEdgePlace(int NId1, int NId2, const int& NKronIters, const double& ProbTresh) const; // place an edge
00072   // derivative of edge log-likelihood
00073   double GetEdgeDLL(const int& ParamId, int NId1, int NId2, const int& NKronIters) const; // given LLMtx
00074   double GetNoEdgeDLL(const int& ParamId, int NId1, int NId2, const int& NKronIters) const; // given LLMtx
00075   double GetApxNoEdgeDLL(const int& ParamId, int NId1, int NId2, const int& NKronIters) const; // given LLMtx
00076 
00077   // edge prob from node signature
00078   static uint GetNodeSig(const double& OneProb = 0.5);
00079   double GetEdgeProb(const uint& NId1Sig, const uint& NId2Sig, const int& NIter) const;
00080 
00081   // from the current (probabilistic) adjacency matrix
00082   PNGraph GenThreshGraph(const double& Thresh) const;
00083   PNGraph GenRndGraph(const double& RndFact=1.0) const;
00084 
00085   static int GetKronIter(const int& GNodes, const int& SeedMtxSz);
00086   // from the seed matrix
00087   static PNGraph GenKronecker(const TKronMtx& SeedMtx, const int& NIter, const bool& IsDir, const int& Seed=0);
00088   static PNGraph GenFastKronecker(const TKronMtx& SeedMtx, const int& NIter, const bool& IsDir, const int& Seed=0);
00089   static PNGraph GenFastKronecker(const TKronMtx& SeedMtx, const int& NIter, const int& Edges, const bool& IsDir, const int& Seed=0);
00090   static PNGraph GenDetKronecker(const TKronMtx& SeedMtx, const int& NIter, const bool& IsDir);
00091   static void PlotCmpGraphs(const TKronMtx& SeedMtx, const PNGraph& Graph, const TStr& OutFNm, const TStr& Desc);
00092   static void PlotCmpGraphs(const TKronMtx& SeedMtx1, const TKronMtx& SeedMtx2, const PNGraph& Graph, const TStr& OutFNm, const TStr& Desc);
00093   static void PlotCmpGraphs(const TVec<TKronMtx>& SeedMtxV, const PNGraph& Graph, const TStr& FNmPref, const TStr& Desc);
00094 
00095   static void KronMul(const TKronMtx& LeftPt, const TKronMtx& RightPt, TKronMtx& OutMtx);
00096   static void KronSum(const TKronMtx& LeftPt, const TKronMtx& RightPt, TKronMtx& OutMtx); // log powering
00097   static void KronPwr(const TKronMtx& KronPt, const int& NIter, TKronMtx& OutMtx);
00098 
00099   void Dump(const TStr& MtxNm = TStr(), const bool& Sort = false) const;
00100   static double GetAvgAbsErr(const TKronMtx& Kron1, const TKronMtx& Kron2); // avg L1 on (sorted) parameters
00101   static double GetAvgFroErr(const TKronMtx& Kron1, const TKronMtx& Kron2); // avg L2 on (sorted) parameters
00102   static TKronMtx GetMtx(TStr MatlabMtxStr);
00103   static TKronMtx GetRndMtx(const int& Dim, const double& MinProb);
00104   static TKronMtx GetInitMtx(const int& Dim, const int& Nodes, const int& Edges);
00105   static TKronMtx GetInitMtx(const TStr& MtxStr, const int& Dim, const int& Nodes, const int& Edges);
00106   static TKronMtx GetMtxFromNm(const TStr& MtxNm);
00107   static TKronMtx LoadTxt(const TStr& MtxFNm);
00108   static void PutRndSeed(const int& Seed) { TKronMtx::Rnd.PutSeed(Seed); }
00109 };
00110 
00112 // Kronecker Log Likelihood
00113 
00114 enum TKronEMType {  kronNodeMiss = 0, kronFutureLink, kronEdgeMiss }; 
00115 
00116 class TKroneckerLL {
00117 public:
00118 private:
00119   TCRef CRef;
00120   PNGraph Graph;         // graph to fit
00121   TInt Nodes, KronIters;
00122 
00123   TFlt PermSwapNodeProb; // permutation proposal distribution (swap edge endpoins vs. swap random nodes)
00124 //  TIntPrV GEdgeV;        // edge vector (for swap edge permutation proposal)
00125   TIntTrV GEdgeV;        // edge vector (for swap edge permutation proposal) /// !!!!! MYUNGHWAN, CHECK!
00126   TIntTrV LEdgeV;        // latent edge vector
00127   TInt LSelfEdge;        // latent self edges
00128   TIntV NodePerm;        // current permutation
00129   TIntV InvertPerm;      // current invert permutation
00130 
00131   TInt RealNodes;       // # of observed nodes (for KronEM)
00132   TInt RealEdges;       // # of observed edges (for link prediction)
00133 
00134   TKronMtx ProbMtx, LLMtx; // Prob and LL matrices (parameters)
00135   TFlt LogLike; // LL at ProbMtx
00136   TFltV GradV;  // DLL at ProbMtx (gradient)
00137 
00138   TKronEMType EMType;   // Latent setting type for EM
00139   TInt MissEdges;               // # of missing edges (if unknown, -1)
00140 
00141   TBool DebugMode;              // Debug mode flag
00142   TFltV LLV;                    // Log-likelihood (per EM iteration)
00143   TVec<TKronMtx> MtxV;  // Kronecker initiator matrix (per EM iteration)
00144 
00145 public:
00146   // RS 07/03/12, changed the order in the constructor initializer list
00147   //    so that it matches the declaration order. This changes also
00148   //    got rid of the compilation warnings. This is the old order:
00149   // TKroneckerLL() : Nodes(-1), KronIters(-1), PermSwapNodeProb(0.2), LogLike(TKronMtx::NInf), EMType(kronNodeMiss), RealNodes(-1), RealEdges(-1), MissEdges(-1), DebugMode(false) { }
00150   TKroneckerLL() : Nodes(-1), KronIters(-1), PermSwapNodeProb(0.2), RealNodes(-1), RealEdges(-1), LogLike(TKronMtx::NInf), EMType(kronNodeMiss), MissEdges(-1), DebugMode(false) { }
00151   TKroneckerLL(const PNGraph& GraphPt, const TFltV& ParamV, const double& PermPSwapNd=0.2);
00152   TKroneckerLL(const PNGraph& GraphPt, const TKronMtx& ParamMtx, const double& PermPSwapNd=0.2);
00153   TKroneckerLL(const PNGraph& GraphPt, const TKronMtx& ParamMtx, const TIntV& NodeIdPermV, const double& PermPSwapNd=0.2);
00154   static PKroneckerLL New() { return new TKroneckerLL(); }
00155   static PKroneckerLL New(const PNGraph& GraphPt, const TKronMtx& ParamMtx, const double& PermPSwapNd=0.1);
00156   static PKroneckerLL New(const PNGraph& GraphPt, const TKronMtx& ParamMtx, const TIntV& NodeIdPermV, const double& PermPSwapNd=0.2);
00157 
00158   int GetNodes() const { return Nodes; }
00159   int GetKronIters() const { return KronIters; }
00160   PNGraph GetGraph() const { return Graph; }
00161   void SetGraph(const PNGraph& GraphPt);
00162   const TKronMtx& GetProbMtx() const { return ProbMtx; }
00163   const TKronMtx& GetLLMtx() const { return LLMtx; }
00164   int GetParams() const { return ProbMtx.Len(); }
00165   int GetDim() const { return ProbMtx.GetDim(); }
00166 
00167   void SetDebug(const bool Debug) { DebugMode = Debug; }
00168   const TFltV& GetLLHist() const { return LLV; }
00169   const TVec<TKronMtx>& GetParamHist() const { return MtxV; }
00170 
00171   // check actual nodes and edges (for KronEM)
00172   bool IsObsNode(const int& NId) const { IAssert(RealNodes > 0);        return (NId < RealNodes);       }
00173   bool IsObsEdge(const int& NId1, const int& NId2) const { IAssert(RealNodes > 0);      return ((NId1 < RealNodes) && (NId2 < RealNodes));      }
00174   bool IsLatentNode(const int& NId) const { return !IsObsNode(NId);     }
00175   bool IsLatentEdge(const int& NId1, const int& NId2) const { return !IsObsEdge(NId1, NId2);    }
00176 
00177   // node permutation
00178   void SetPerm(const char& PermId);
00179   void SetOrderPerm(); // identity
00180   void SetRndPerm();   // random
00181   void SetDegPerm();   // node degrees
00182   void SetBestDegPerm();        // best matched degrees
00183   void SetPerm(const TIntV& NodePermV) { NodePerm = NodePermV; SetIPerm(NodePerm); }
00184   void SetIPerm(const TIntV& Perm);     // construct invert permutation
00185   const TIntV& GetPermV() const { return NodePerm; }
00186 
00187   // handling isolated nodes to fit # of nodes to Kronecker graphs model
00188   void AppendIsoNodes();
00189   void RestoreGraph(const bool RestoreNodes = true);
00190 
00191   // full graph LL
00192   double GetFullGraphLL() const;
00193   double GetFullRowLL(int RowId) const;
00194   double GetFullColLL(int ColId) const;
00195   // empty graph LL
00196   double GetEmptyGraphLL() const;
00197   double GetApxEmptyGraphLL() const;
00198   // graph LL
00199   void InitLL(const TFltV& ParamV);
00200   void InitLL(const TKronMtx& ParamMtx);
00201   void InitLL(const PNGraph& GraphPt, const TKronMtx& ParamMtx);
00202   double CalcGraphLL();
00203   double CalcApxGraphLL();
00204   double GetLL() const { return LogLike; }
00205   double GetAbsErr() const { return fabs(pow((double)Graph->GetEdges(), 1.0/double(KronIters)) - ProbMtx.GetMtxSum()); }
00206   double NodeLLDelta(const int& NId) const;
00207   double SwapNodesLL(const int& NId1, const int& NId2);
00208   bool SampleNextPerm(int& NId1, int& NId2); // sampling from P(perm|graph)
00209 
00210   // derivative of the log-likelihood
00211   double GetEmptyGraphDLL(const int& ParamId) const;
00212   double GetApxEmptyGraphDLL(const int& ParamId) const;
00213   const TFltV& CalcGraphDLL();
00214   const TFltV& CalcFullApxGraphDLL();
00215   const TFltV& CalcApxGraphDLL();
00216   double NodeDLLDelta(const int ParamId, const int& NId) const;
00217   void UpdateGraphDLL(const int& SwapNId1, const int& SwapNId2);
00218   const TFltV& GetDLL() const { return GradV; }
00219   double GetDLL(const int& ParamId) const { return GradV[ParamId]; }
00220 
00221   // gradient
00222   void SampleGradient(const int& WarmUp, const int& NSamples, double& AvgLL, TFltV& GradV);
00223   double GradDescent(const int& NIter, const double& LrnRate, double MnStep, double MxStep, const int& WarmUp, const int& NSamples);
00224   double GradDescent2(const int& NIter, const double& LrnRate, double MnStep, double MxStep, const int& WarmUp, const int& NSamples);
00225 
00226   // KronEM
00227   void SetRandomEdges(const int& NEdges, const bool isDir = true);
00228   void MetroGibbsSampleSetup(const int& WarmUp);
00229   void MetroGibbsSampleNext(const int& WarmUp, const bool DLLUpdate = false);
00230   void RunEStep(const int& GibbsWarmUp, const int& WarmUp, const int& NSamples, TFltV& LLV, TVec<TFltV>& DLLV);
00231   double RunMStep(const TFltV& LLV, const TVec<TFltV>& DLLV, const int& GradIter, const double& LrnRate, double MnStep, double MxStep);
00232   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);
00233 
00234 
00235 
00236   TFltV TestSamplePerm(const TStr& OutFNm, const int& WarmUp, const int& NSamples, const TKronMtx& TrueMtx, const bool& DoPlot=true);
00237   static double CalcChainR2(const TVec<TFltV>& ChainLLV);
00238   static void ChainGelmapRubinPlot(const TVec<TFltV>& ChainLLV, const TStr& OutFNm, const TStr& Desc);
00239   TFltQu TestKronDescent(const bool& DoExact, const bool& TruePerm, double LearnRate, const int& WarmUp, const int& NSamples, const TKronMtx& TrueParam);
00240   void GradDescentConvergence(const TStr& OutFNm, const TStr& Desc1, const bool& SamplePerm, const int& NIters,
00241     double LearnRate, const int& WarmUp, const int& NSamples, const int& AvgKGraphs, const TKronMtx& TrueParam);
00242   static void TestBicCriterion(const TStr& OutFNm, const TStr& Desc1, const PNGraph& G, const int& GradIters,
00243     double LearnRate, const int& WarmUp, const int& NSamples, const int& TrueN0);
00244   static void TestGradDescent(const int& KronIters, const int& KiloSamples, const TStr& Permutation);
00245   friend class TPt<TKroneckerLL>;
00246 };
00247 
00248 
00250 // Add Noise to Graph
00251 class TKronNoise {
00252 public:
00253         TKronNoise() {};
00254         static int RemoveNodeNoise(PNGraph& Graph, const int& NNodes, const bool Random = true);
00255         static int RemoveNodeNoise(PNGraph& Graph, const double& Rate, const bool Random = true);
00256         static int FlipEdgeNoise(PNGraph& Graph, const int& NEdges, const bool Random = true);
00257         static int FlipEdgeNoise(PNGraph& Graph, const double& Rate, const bool Random = true);
00258         static int RemoveEdgeNoise(PNGraph& Graph, const int& NEdges);
00259         static int RemoveEdgeNoise(PNGraph& Graph, const double& Rate);
00260 };
00261 
00262 
00264 // Kronecker Log Likelihood Maximization
00265 class TKronMaxLL {
00266 public:
00267   class TFEval {
00268   public:
00269     TFlt LogLike;
00270     TFltV GradV;
00271   public:
00272     TFEval() : LogLike(0), GradV() { }
00273     TFEval(const TFlt& LL, const TFltV& DLL) : LogLike(LL), GradV(DLL) { }
00274     TFEval(const TFEval& FEval) : LogLike(FEval.LogLike), GradV(FEval.GradV) { }
00275     TFEval& operator = (const TFEval& FEval) { if (this!=&FEval) {
00276       LogLike=FEval.LogLike; GradV=FEval.GradV; } return *this; }
00277   };
00278 private:
00279   //TInt WarmUp, NSamples;
00280   THash<TKronMtx, TFEval> FEvalH; // cached gradients
00281   TKroneckerLL KronLL;
00282 public:
00283   TKronMaxLL(const PNGraph& GraphPt, const TKronMtx& StartParam) : KronLL(GraphPt, StartParam) { }
00284   void SetPerm(const char& PermId);
00285 
00286   void GradDescent(const int& NIter, const double& LrnRate, const double& MnStep, const double& MxStep,
00287     const double& WarmUp, const double& NSamples);
00288 
00289   /*void EvalNewEdgeP(const TKronMtx& ProbMtx);
00290   double GetLL(const TFltV& ThetaV);
00291   void GetDLL(const TFltV& ThetaV, TFltV& DerivV);
00292   double GetDLL(const TFltV& ThetaV, const int& ParamId);
00293   //void MaximizeLL(const int& NWarmUp, const int& Samples);//*/
00294 
00295   static void RoundTheta(const TFltV& ThetaV, TFltV& NewThetaV);
00296   static void RoundTheta(const TFltV& ThetaV, TKronMtx& Kronecker);
00297 
00298   static void Test();
00299 };
00300 
00302 // Kronecker Fitting using Metrod of Moments (by Art Owen)
00303 class TKronMomentsFit {
00304 public:
00305   double Edges, Hairpins, Tripins, Triads;
00306 public:
00307   TKronMomentsFit(const PUNGraph& G) {
00308     Edges=0; Hairpins=0; Tripins=0; Triads=0;
00309     for (TUNGraph::TNodeI NI = G->BegNI(); NI < G->EndNI(); NI++) {
00310       const int d = NI.GetOutDeg();
00311       Edges += d;
00312       Hairpins += d*(d-1.0);
00313       Tripins += d*(d-1.0)*(d-2.0);
00314     }
00315     Edges /= 2.0;
00316     Hairpins /= 2.0;
00317     Tripins /= 6.0;
00318     int ot,ct;
00319     Triads = TSnap::GetTriads(G, ot, ct)/3.0;
00320     printf("E:%g\tH:%g\tT:%g\tD:%g\n", Edges, Hairpins, Tripins, Triads);
00321   }
00322 
00323   TFltQu EstABC(const int& R) {
00324     const double Step = 0.01;
00325     double MinScore=TFlt::Mx;
00326     double A=0, B=0, C=0;
00327     //Edges=log(Edges);  Hairpins=log(Hairpins);  Tripins=log(Tripins);  Triads=log(Triads);
00328     for (double a = 1.0; a > Step; a-=Step) {
00329       for (double b = Step; b <= 1.0; b+=Step) {
00330         for (double c = Step; c <= a; c+=Step) {
00331           double EE = ( pow(a+2*b+c, R) - pow(a+c, R) ) / 2.0;
00332           double EH = ( pow(pow(a+b,2) + pow(b+c,2), R)
00333                              -2*pow(a*(a+b)+c*(c+b), R)
00334                              -pow(a*a + 2*b*b + c*c, R)
00335                              +2*pow(a*a + c*c, R) ) / 2.0;
00336           double ET = ( pow(pow(a+b,3)+pow(b+c,3), R)
00337                              -3*pow(a*pow(a+b,2)+c*pow(b+c,2), R)
00338                              -3*pow(a*a*a + c*c*c + b*(a*a+c*c) + b*b*(a+c) + 2*b*b*b ,R)
00339                              +2*pow(a*a*a + 2*b*b*b + c*c*c, R)
00340                              +5*pow(a*a*a + c*c*c + b*b*(a+c), R)
00341                              +4*pow(a*a*a + c*c*c + b*(a*a+c*c), R)
00342                              -6*pow(a*a*a + c*c*c, R) ) / 6.0;
00343           double ED = ( pow(a*a*a + 3*b*b*(a+c) + c*c*c, R)
00344                              -3*pow(a*(a*a+b*b) + c*(b*b+c*c), R)
00345                              +2*pow(a*a*a+c*c*c, R) ) / 6.0;
00346           if (EE < 0) { EE = 1; }
00347           if (EH < 0) { EH = 1; }
00348           if (ET < 0) { ET = 1; }
00349           if (ED < 0) { ED = 1; }
00350           //EE=log(EE); EH=log(EH); ET=log(ET); ED=log(ED);
00351           double Score = pow(Edges-EE,2)/EE + pow(Hairpins-EH ,2)/EH + pow(Tripins-ET, 2)/ET + pow(Triads-ED, 2)/ED;
00352           //double Score = fabs(Edges-EE)/EE + fabs(Hairpins-EH)/EH + fabs(Tripins-ET)/ET + fabs(Triads-ED)/ED;
00353           //double Score = log(pow(Edges-EE,2)/EE) + log(pow(Hairpins-EH,2)/EH) + log(pow(Tripins-ET, 2)/ET) + log(pow(Triads-ED, 2)/ED);
00354           if (MinScore > Score || (a==0.9 && b==0.6 && c==0.2) || (TMath::IsInEps(a-0.99,1e-6) && TMath::IsInEps(b-0.57,1e-6) && TMath::IsInEps(c-0.05,1e-6)))
00355           {
00356             printf("%.03f %.03f %0.03f %10.4f  %10.10g\t%10.10g\t%10.10g\t%10.10g\n", a,b,c, log10(Score), EE, EH, ET, ED);
00357             //printf("%.03f %.03f %0.03f %g\n", a,b,c, log(Score));
00358             A=a; B=b; C=c; MinScore=Score;
00359           }
00360         }
00361       }
00362     }
00363     printf("\t\t\t      %10.10g\t%10.10g\t%10.10g\t%10.10g\n", Edges, Hairpins, Tripins, Triads);
00364     return TFltQu(A,B,C,MinScore);
00365   }
00366 
00367   static void Test() {
00368     TFIn FIn("as20.ngraph");
00369     PUNGraph G = TSnap::ConvertGraph<PUNGraph>(TNGraph::Load(FIn));
00370     //PUNGraph G = TKronMtx::GenFastKronecker(TKronMtx::GetMtx("0.9, 0.6; 0.6, 0.2"), 14, false, 0)->GetUNGraph();
00371     //PUNGraph G = TUNGraph::GetSmallGraph();
00372     TSnap::PrintInfo(G);
00373     TSnap::DelSelfEdges(G);
00374     TSnap::PrintInfo(G);
00375     TKronMomentsFit Fit(G);
00376     printf("iter %d\n", TKronMtx::GetKronIter(G->GetNodes(), 2));
00377     Fit.EstABC(TKronMtx::GetKronIter(G->GetNodes(), 2)); //*/
00378   }
00379 };
00380 
00381 
00383 // Kronecker Phase Plot
00384 /*class TKronPhasePlot {
00385 public:
00386   class TPhasePoint {
00387   public:
00388     TFlt Alpha, Beta;
00389     TGrowthStat GrowthStat;
00390   public:
00391     TPhasePoint() { }
00392     TPhasePoint(const double& A, const double& B, const TGrowthStat& GS) : Alpha(A), Beta(B), GrowthStat(GS) { }
00393     TPhasePoint(TSIn& SIn) : Alpha(SIn), Beta(SIn), GrowthStat(SIn) { }
00394     void Save(TSOut& SOut) const { Alpha.Save(SOut);  Beta.Save(SOut);  GrowthStat.Save(SOut); }
00395   };
00396   typedef TVec<TPhasePoint> TPhasePointV;
00397 public:
00398   TPhasePointV PhaseV;
00399 public:
00400   TKronPhasePlot() { }
00401   TKronPhasePlot(const TKronPhasePlot& Phase) : PhaseV(Phase.PhaseV) { }
00402   TKronPhasePlot(TSIn& SIn) : PhaseV(SIn) { }
00403   void Save(TSOut& SOut) const { PhaseV.Save(SOut);  }
00404   void SaveMatlab(const TStr& OutFNm) const;
00405 
00406   static void KroneckerPhase(const TStr& MtxId, const int& MxIter,
00407     const double& MnAlpha, const double& MxAlpha, const double& AlphaStep,
00408     const double& MnBeta, const double& MxBeta, const double& BetaStep,
00409     const TStr& FNmPref);
00410 };*/
00411 
00412 /*// for conjugate gradient
00413   class TFunc {
00414   private:
00415     TKronMaxLL* CallBack;
00416   public:
00417     TFunc(TKronMaxLL* CallBackPt) : CallBack(CallBackPt) { }
00418     TFunc(const TFunc& Func) : CallBack(Func.CallBack) { }
00419     TFunc& operator = (const TFunc& Func) { CallBack=Func.CallBack; return *this; }
00420     double FVal(const TFltV& Point) { return -CallBack->GetLL(Point); }
00421     void FDeriv(const TFltV& Point, TFltV& DerivV);
00422   };
00423 public:
00424   // log barier
00425   class TLogBarFunc {
00426   private:
00427     TKronMaxLL* CallBack;
00428     double T;
00429   public:
00430     TLogBarFunc(TKronMaxLL* CallBackPt, const double& t=0.5) : CallBack(CallBackPt), T(t) { }
00431     TLogBarFunc(const TLogBarFunc& Func) : CallBack(Func.CallBack), T(Func.T) { }
00432     TLogBarFunc& operator = (const TLogBarFunc& Func) { CallBack=Func.CallBack; T=Func.T; return *this; }
00433     double FVal(const TFltV& Point);
00434     void FDeriv(const TFltV& Point, TFltV& DerivV);
00435   };*/
00436 
00437 #endif