17 TMAGAffMtx(
const int& Dim) : MtxDim(Dim), SeedMtx(Dim*Dim) { }
27 int Len()
const {
return SeedMtx.
Len(); }
34 void SetRndMtx(
TRnd& Rnd,
const int& PrmMtxDim = 2,
const double& MinProb = 0.0);
36 void GenMtx(
const int& Dim) { MtxDim=Dim; SeedMtx.
Gen(Dim*Dim); }
37 void SetEpsMtx(
const double& Eps1,
const double& Eps0,
const int& Eps1Val=1,
const int& Eps0Val=0);
41 const double&
At(
const int& Row,
const int& Col)
const {
return SeedMtx[MtxDim*Row+Col].Val; }
42 double&
At(
const int& Row,
const int& Col) {
return SeedMtx[MtxDim*Row+Col].Val; }
43 const double&
At(
const int& ValN)
const {
return SeedMtx[ValN].Val; }
44 double&
At(
const int& ValN) {
return SeedMtx[ValN].Val; }
55 void Dump(
const TStr& MtxNm =
TStr(),
const bool& Sort =
false)
const;
75 TMAGNodeSimple(
const int& _Dim,
const double& _Mu = 0.5) : Dim(_Dim) {
IAssert(_Mu >= 0.0 && _Mu <= 1.0); Mu = _Mu; }
96 TMAGNodeBern(
const int& _Dim,
const double& _Mu = 0.5) : MuV(_Dim), Dim(_Dim) {
IAssert(_Mu >= 0.0 && _Mu <= 1.0); MuV.
PutAll(_Mu); }
104 void SetMu(
const int& Attr,
const double& Prob) {
IAssert(Prob >= 0.0 && Prob <= 1.0); MuV[Attr] = Prob; }
105 double GetMu(
const int& Attr)
const {
return MuV[Attr]; }
126 TMAGNodeBeta(
const int& _Dim,
const double& Alpha = 1,
const double& Beta = 1) : AlphaV(_Dim), BetaV(_Dim), MuV(_Dim), Dim(_Dim), Dirty(true) { AlphaV.
PutAll(Alpha); BetaV.
PutAll(Beta); }
131 void SetBeta(
const int& Attr,
const double& Alpha,
const double& Beta);
132 void GetBeta(
const int& Attr,
double& Alpha,
double& Beta)
const {
IAssert(Attr < Dim); Alpha = AlphaV[Attr]; Beta = BetaV[Attr]; }
145 template <
class TNodeAttr>
156 TMAGParam() : NNodes(-1), NAttrs(-1), NodeAttr(), AffMtxV() {}
157 TMAGParam(
const int& NumNodes,
const int& NumAttrs) : NNodes(NumNodes), NAttrs(NumAttrs), NodeAttr(), AffMtxV(NumAttrs) {}
158 TMAGParam(
const int& NumNodes,
const TMAGAffMtxV& MtxV) : NNodes(NumNodes), NAttrs(MtxV.Len()), NodeAttr(), AffMtxV(MtxV) {}
160 TMAGParam(
const TMAGParam<TNodeAttr>& MAGParam) : NNodes(MAGParam.NNodes), NAttrs(MAGParam.NAttrs), NodeAttr(MAGParam.NodeAttr), AffMtxV(MAGParam.AffMtxV) {}
161 TMAGParam(
const int& NumNodes,
const int& NumAttrs,
const TNodeAttr& Dist) : NNodes(NumNodes), NAttrs(NumAttrs), NodeAttr(Dist), AffMtxV(NumAttrs) {}
170 void SetNodes(
const int& Nodes) { NNodes = Nodes; }
179 const int GetDim(
const int& Attr)
const {
return AffMtxV[Attr].GetDim(); }
182 void SetMtxVal(
const int& Attr,
const int& Row,
const int& Col,
const double& Val) { AffMtxV[Attr].At(Row, Col) = Val; }
184 void SetMtxV(
const TMAGAffMtxV& MtxV) { NAttrs = AffMtxV.
Len(); AffMtxV = MtxV; }
186 const double GetMtxVal(
const int& Attr,
const int& Row,
const int& Col)
const {
return AffMtxV[Attr].At(Row, Col); }
194 template <
class TNodeAttr>
204 template <
class TNodeAttr>
206 NodeAttr.LoadTxt(InFNm);
209 FILE *fp = fopen(InFNm.
CStr(),
"r");
212 while(fgets(buf,
sizeof(buf), fp) != NULL) {
214 char *token = strtok(NULL,
"\r\n");
221 template <
class TNodeAttr>
224 NodeAttr.SaveTxt(OutStrV);
226 FILE *fp = fopen(OutFNm.
CStr(),
"w");
227 fprintf(fp,
"# %d nodes with %d attributes\n", NNodes(), NAttrs());
228 for(
int i = 0; i < NAttrs; i++) {
229 TStr MtxStr = AffMtxV[i].GetMtxStr();
230 fprintf(fp,
"%s & %s\n", OutStrV[i].CStr(), MtxStr.
GetSubStr(1, MtxStr.
Len()-2).CStr());
235 template <
class TNodeAttr>
241 template <
class TNodeAttr>
244 for(
int i = 0; i < NAttrs; i++) {
245 DimV[i] = AffMtxV[i].GetDim();
249 template <
class TNodeAttr>
252 for(
int i = 0; i < NNodes; i++) {
257 TNodeAttr::Rnd.PutSeed(Seed);
261 for(
int i = 0; i < NNodes; i++) {
262 for(
int l = 0; l < NAttrs; l++) {
263 IAssert(AttrVV.
At(i, l) < AffMtxV[l].GetDim());
267 for(
int i = 0; i < NNodes; i++) {
268 for(
int j = i; j < NNodes; j++) {
270 for(
int l = 0; l < NAttrs; l++) {
271 Prob *= AffMtxV[l].At(AttrVV.
At(i, l), AttrVV.
At(j, l));
274 if(TNodeAttr::Rnd.GetUniDev() < Prob) {
276 if(! IsDir && i != j) { Graph->
AddEdge(j, i); }
279 if(IsDir && i != j) {
281 for(
int l = 0; l < NAttrs; l++) {
282 Prob *= AffMtxV[l].At(AttrVV.
At(j, l), AttrVV.
At(i, l));
284 if(TNodeAttr::Rnd.GetUniDev() < Prob) {
294 template <
class TNodeAttr>
296 TNodeAttr::Rnd.PutSeed(Seed);
297 NodeAttr.AttrGen(AttrVV, NNodes);
300 for(
int i = 0; i < NNodes; i++) {
301 for(
int l = 0; l < NAttrs; l++) {
302 IAssert(AttrVV.
At(i, l) < AffMtxV[l].GetDim());
306 PNGraph Graph = GenAttrMAG(AttrVV, IsDir, 0);
357 TMAGFitBern() : PhiVV(), KnownVV(), Graph(), Param(), ESpeedUp(true), MSpeedUp(true), Debug(false), AvgPhiV(), AvgPhiPairVV(), NormConst(1.0) { }
358 TMAGFitBern(
const PNGraph& G,
const int& NAttrs) : PhiVV(G->
GetNodes(), NAttrs), KnownVV(G->
GetNodes(), NAttrs), Graph(G), Param(G->
GetNodes(), NAttrs), ESpeedUp(true), MSpeedUp(true), Debug(false), AvgPhiV(NAttrs), AvgPhiPairVV(NAttrs, NAttrs), NormConst(1.0) { }
362 const int NAttrs = Param.
GetAttrs();
364 printf(
"NAttrs = %d\n", NAttrs);
366 PhiVV.
Gen(NNodes, NAttrs);
367 KnownVV.
Gen(NNodes, NAttrs);
369 AvgPhiPairVV.
Gen(NAttrs, NAttrs);
386 void SetDebug(
const bool _Debug) { Debug = _Debug; }
387 void SetAlgConf(
const bool EStep =
true,
const bool MStep =
true) { ESpeedUp = EStep; MSpeedUp = MStep; }
389 void Init(
const TFltV& MuV,
const TMAGAffMtxV& AffMtxV);
391 void RandomInit(
const TFltV& MuV,
const TMAGAffMtxV& AffMtxV,
const int& Seed);
396 const double GetInCoeff(
const int& i,
const int& j,
const int& l,
const int& A,
const TMAGAffMtx& Theta)
const;
398 const double GetOutCoeff(
const int& i,
const int& j,
const int& l,
const int& A,
const TMAGAffMtx& Theta)
const;
400 const double GetProbPhi(
const int& NId1,
const int& NId2,
const int& AId,
const int& Attr1,
const int& Attr2)
const;
401 const double GetProbMu(
const int& NId1,
const int& NId2,
const int& AId,
const int& Attr1,
const int& Attr2,
const bool Left =
false,
const bool Right =
false)
const;
402 const double GetThetaLL(
const int& NId1,
const int& NId2,
const int& AId)
const;
403 const double GetAvgThetaLL(
const int& NId1,
const int& NId2,
const int& AId,
const bool Left =
false,
const bool Right =
false)
const;
404 const double GetSqThetaLL(
const int& NId1,
const int& NId2,
const int& AId)
const;
405 const double GetAvgSqThetaLL(
const int& NId1,
const int& NId2,
const int& AId,
const bool Left =
false,
const bool Right =
false)
const;
407 const double GetAvgProdLinWeight(
const int& NId1,
const int& NId2,
const bool Left =
false,
const bool Right =
false)
const;
409 const double GetAvgProdSqWeight(
const int& NId1,
const int& NId2,
const bool Left =
false,
const bool Right =
false)
const;
411 const double GetEstNoEdgeLL(
const int& NId,
const int& AId)
const;
412 const double GradPhiMI(
const double& x,
const int& NId,
const int& AId,
const double& Lambda,
const double& DeltaQ,
const TFltVV& CntVV);
413 const double ObjPhiMI(
const double& x,
const int& NId,
const int& AId,
const double& Lambda,
const double& Q0,
const double& Q1,
const TFltVV& CntVV);
414 const double UpdatePhiMI(
const double& Lambda,
const int& NId,
const int& AId,
double& Phi);
415 const double UpdateApxPhiMI(
const double& Lambda,
const int& NId,
const int& AId,
double& Phi,
TFltVV& ProdVV);
416 const double UpdatePhi(
const int& NId,
const int& AId,
double& Phi);
417 const double UpdateMu(
const int& AId);
422 const double UpdateAffMtxV(
const int& GradIter,
const double& LrnRate,
const double& MaxGrad,
const double& Lambda,
const int& NReal = 0);
429 double DoEStep(
const TFltV& TrueMuV,
const int& NIter,
double& LL,
const double& Lambda);
430 void DoMStep(
const int& GradIter,
const double& LrnRate,
const double& MaxGrad,
const double& Lambda,
const int& NReal = 0);
431 void DoEMAlg(
const int& NStep,
const int& NEstep,
const int& NMstep,
const double& LrnRate,
const double& MaxGrad,
const double& Lambda,
const double& ReInit,
const int& NReal = 0);
445 static const double ComputeMI(
const TIntVV& AttrV,
const int AId1,
const int AId2);
446 static const double ComputeMI(
const TFltVV& AttrV,
const int AId1,
const int AId2);
455 const double LogSumExp(
const double LogVal1,
const double LogVal2);
457 const double LogSumExp(
const double *LogValArray,
const int Len);
const double ComputeJointAdjLL(const TIntVV &AttrVV) const
const int GetDim(const int &Attr) const
void SetNodeAttr(const TNodeAttr &Dist)
TMAGNodeBern & operator=(const TMAGNodeBern &Dist)
const double GetAvgSqThetaLL(const int &NId1, const int &NId2, const int &AId, const bool Left=false, const bool Right=false) const
void LoadTxt(const TStr &InFNm)
void DoEMAlg(const int &NStep, const int &NEstep, const int &NMstep, const double &LrnRate, const double &MaxGrad, const double &Lambda, const double &ReInit, const int &NReal=0)
void GetBeta(const int &Attr, double &Alpha, double &Beta) const
TMAGNodeSimple(const TMAGNodeSimple &Simple)
const bool NextPermutation(TIntV &IndexV) const
int GetPrimHashCd() const
Returns primary hash code of the vector. Used by THash.
const int GetNodes() const
const int GetAttrs() const
TMAGParam< TMAGNodeBern > Param
TMAGNodeBern(const int &_Dim, const double &_Mu=0.5)
void GetMtxV(TMAGAffMtxV &MtxV) const
const double GetAvgInCoeff(const int &i, const int &AId, const int &A, const TMAGAffMtx &Theta) const
TMAGAffMtx & operator=(const TMAGAffMtx &Kronecker)
const double GetEstNoEdgeLL(const int &NId, const int &AId) const
static PNGraph New()
Static constructor that returns a pointer to the graph. Call: PNGraph Graph = TNGraph::New().
void Swap(TMAGAffMtx &Mtx)
PNGraph GenAttrMAG(const TIntVV &AttrVV, const bool &IsDir=false, const int &Seed=1)
void SetDebug(const bool _Debug)
void SetMuV(const TFltV &MuV)
TMAGFitBern(const PNGraph &G, const TStr &InitFNm)
void Dump(const TStr &MtxNm=TStr(), const bool &Sort=false) const
static double GetAvgAbsErr(const TMAGAffMtx &Mtx1, const TMAGAffMtx &Mtx2)
void NormalizeAffMtxV(TMAGAffMtxV &MtxV, const bool UseMu=false)
void SetAttrs(const int &Attrs)
TMAGAffMtx(const int &Dim)
const double GetOutCoeff(const int &i, const int &j, const int &l, const int &A, const TMAGAffMtx &Theta) const
TMAGParam(const int &NumNodes, const int &NumAttrs, const TNodeAttr &Dist)
TSizeTy Len() const
Returns the number of elements in the vector.
void MakeCCDF(const TFltPrV &RawV, TFltPrV &CcdfV)
int GetSecHashCd() const
Returns secondary hash code of the vector. Used by THash.
bool GetMuV(TFltV &_MuV) const
void CountAttr(TFltV &EstMuV) const
int GetNodes() const
Returns the number of nodes in the graph.
TStr GetSubStr(const int &BChN, const int &EChN) const
void SetNodes(const int &Nodes)
void SaveTxt(TStrV &OutStrV) const
double GetRowSum(const int &RowId) const
int AddNode(int NId=-1)
Adds a node of ID NId to the graph.
TMAGAffMtx(const TMAGAffMtx &Kronecker)
TMAGNodeBeta & operator=(const TMAGNodeBeta &Dist)
const double UpdatePhiMI(const double &Lambda, const int &NId, const int &AId, double &Phi)
TMAGNodeBeta(const TFltV &_AlphaV, const TFltV &_BetaV)
const double GetSqThetaLL(const int &NId1, const int &NId2, const int &AId) const
const double GetProdSqWeight(const int &NId1, const int &NId2) const
TVec< TMAGAffMtxV > MtxHisV
void LoadTxt(const TStr &InFNm)
double & At(const int &ValN)
const void GradApxAffMtx(const int &AId, const TFltVV &ProdVV, const TFltVV &SqVV, const TMAGAffMtx &CurMtx, TFltV &GradV)
TMAGParam(const int &NumNodes, const int &NumAttrs)
bool Empty() const
Tests whether the vector is empty.
void PutAllMtx(const double &Val)
void UnNormalizeAffMtxV(TMAGAffMtxV &MtxV, const bool UseMu=false)
void AttrGen(TIntVV &AttrVV, const int &NNodes)
void SetPhiVV(const TIntVV &AttrVV, const int KnownIds=0)
void RandomInit(const TFltV &MuV, const TMAGAffMtxV &AffMtxV, const int &Seed)
static double GetAvgFroErr(const TMAGAffMtx &Mtx1, const TMAGAffMtx &Mtx2)
void GetMtxV(TMAGAffMtxV &MtxV) const
const TFltV & GetMtx() const
void LoadTxt(const TStr &InFNm)
const TMAGNodeBern & GetNodeAttr() const
void SetGraph(const PNGraph &GraphPt)
const double GetAvgProdSqWeight(const int &NId1, const int &NId2, const bool Left=false, const bool Right=false) const
const double GetInCoeff(const int &i, const int &j, const int &l, const int &A, const TMAGAffMtx &Theta) const
const void GradAffMtx(const int &AId, const TFltVV &ProdVV, const TFltVV &SqVV, const TMAGAffMtx &CurMtx, TFltV &GradV)
TMAGParam(const int &NumNodes, const TStr &ConfFNm)
void Clr(const bool &DoDel=true, const TSizeTy &NoDelLim=-1)
Clears the contents of the vector.
void PlotProperties(const TStr &FNm)
const TFltV & GetMuV() const
void SetAlgConf(const bool EStep=true, const bool MStep=true)
void GetProbMtx(TMAGAffMtx &ProbMtx)
const double GetAvgThetaLL(const int &NId1, const int &NId2, const int &AId, const bool Left=false, const bool Right=false) const
TVec< TMAGAffMtx > TMAGAffMtxV
const double UpdateAffMtx(const int &AId, const double &LrnRate, const double &MaxGrad, const double &Lambda, TFltVV &ProdVV, TFltVV &SqVV, TMAGAffMtx &NewMtx)
TMAGParam(const TMAGParam< TNodeAttr > &MAGParam)
const void PrepareUpdateApxAffMtx(TFltVV &ProdVV, TFltVV &SqVV)
int AddEdge(const int &SrcNId, const int &DstNId)
Adds an edge from node SrcNId to node DstNId to the graph.
const double GetProdLinWeight(const int &NId1, const int &NId2) const
const double UpdateMu(const int &AId)
const double ComputeJointOneLL(const TIntVV &AttrVV) const
void PutAll(const TVal &Val)
Sets all elements of the vector to value Val.
TMAGNodeSimple & operator=(const TMAGNodeSimple &Simple)
const double & At(const int &ValN) const
void SetBetaV(const TFltV &_AlphaV, const TFltV &_BetaV)
const TFltV & GetMuV() const
void PutAll(const TVal &Val)
const double GetThetaLL(const int &NId1, const int &NId2, const int &AId) const
void SetMtx(const TFltV &ParamV)
void GetDimV(TIntV &DimV) const
const double UpdatePhi(const int &NId, const int &AId, double &Phi)
TMAGNodeSimple(const int &_Dim, const double &_Mu=0.5)
const double GetMtxVal(const int &Attr, const int &Row, const int &Col) const
double GetMu(const int &Attr) const
double GetColSum(const int &ColId) const
double DoEStepOneIter(const TFltV &TrueMuV, TFltVV &NewPhi, const double &Lambda)
const TMAGParam< TMAGNodeBern > & GetParams() const
void AttrGen(TIntVV &AttrVV, const int &NNodes)
void SetBeta(const int &Attr, const double &Alpha, const double &Beta)
const double GetProbPhi(const int &NId1, const int &NId2, const int &AId, const int &Attr1, const int &Attr2) const
double DoEStepApxOneIter(const TFltV &TrueMuV, TFltVV &NewPhi, const double &Lambda)
void SetMuV(const TFltV &_MuV)
void AttrGen(TIntVV &AttrVV, const int &NNodes)
void SetMtxV(const TMAGAffMtxV &MtxV)
static TMAGAffMtx GetRndMtx(TRnd &Rnd, const int &Dim=2, const double &MinProb=0.0)
const double ComputeJointLL(int NSample) const
const TMAGAffMtx & GetMtx(const int &Attr) const
const double LogSumExp(const double LogVal1, const double LogVal2)
const double GetAvgProdLinWeight(const int &NId1, const int &NId2, const bool Left=false, const bool Right=false) const
void SetMtxAll(const TMAGAffMtx &Mtx)
void SortAttrOrdering(const TFltV &TrueMuV, TIntV &IndexV) const
TMAGParam< TNodeAttr > & operator=(const TMAGParam< TNodeAttr > &MAGParam)
void SetMtxV(const TMAGAffMtxV &MtxV)
PNGraph GenMAG(TIntVV &AttrVV, const bool &IsDir=false, const int &Seed=1)
const double ComputeApxAdjLL() const
TMAGNodeBeta(const int &_Dim, const double &Alpha=1, const double &Beta=1)
void SaveTxt(const TStr &OutFNm) const
void SetMtxVal(const int &Attr, const int &Row, const int &Col, const double &Val)
void SaveTxt(TStrV &OutStrV) const
void SetPhiVV(const TFltVV &AttrVV, const int KnownIds=0)
TMAGParam(const int &NumNodes, const TMAGAffMtxV &MtxV)
void GetLLMtx(TMAGAffMtx &LLMtx)
TMAGFitBern(const PNGraph &G, const int &NAttrs)
const void PrepareUpdateAffMtx(TFltVV &ProdVV, TFltVV &SqVV)
double DoEStep(const TFltV &TrueMuV, const int &NIter, double &LL, const double &Lambda)
const double GetAvgOutCoeff(const int &i, const int &AId, const int &A, const TMAGAffMtx &Theta) const
const TNodeAttr & GetNodeAttr() const
const TFltVV & GetPhiVV() const
void SetMu(const int &Attr, const double &Prob)
void SetEpsMtx(const double &Eps1, const double &Eps0, const int &Eps1Val=1, const int &Eps0Val=0)
void SetRndMtx(TRnd &Rnd, const int &PrmMtxDim=2, const double &MinProb=0.0)
void SaveTxt(const TStr &FNm)
const int GetNodes() const
const double UpdateApxPhiMI(const double &Lambda, const int &NId, const int &AId, double &Phi, TFltVV &ProdVV)
void Gen(const TSizeTy &_Vals)
Constructs a vector (an array) of _Vals elements.
void DoMStep(const int &GradIter, const double &LrnRate, const double &MaxGrad, const double &Lambda, const int &NReal=0)
const double & At(const int &Row, const int &Col) const
const int GetAttrs() const
int GetPrimHashCd() const
double & At(const int &Row, const int &Col)
void GetBetaV(TFltV &_AlphaV, TFltV &_BetaV) const
void SaveTxt(TStrV &OutStrV) const
TMAGNodeBern(const TMAGNodeBern &Dist)
static const double ComputeMI(const TIntVV &AttrV, const int AId1, const int AId2)
void AddRndNoise(TRnd &Rnd, const double &SDev)
const double UpdateAffMtxV(const int &GradIter, const double &LrnRate, const double &MaxGrad, const double &Lambda, const int &NReal=0)
void SetMtx(const int &Attr, const TMAGAffMtx &Mtx)
bool operator==(const TMAGAffMtx &Kronecker) const
void Init(const TFltV &MuV, const TMAGAffMtxV &AffMtxV)
void Gen(const TSizeTy &_XDim, const TSizeTy &_YDim)
void PutY(const TSizeTy &Y, const TVal &Val)
const double ComputeApxLL() const
const double ObjPhiMI(const double &x, const int &NId, const int &AId, const double &Lambda, const double &Q0, const double &Q1, const TFltVV &CntVV)
void LoadTxt(const TStr &InFNm)
TMAGNodeBern(const TFltV &_MuV)
void GenMtx(const int &Dim)
const double GetProbMu(const int &NId1, const int &NId2, const int &AId, const int &Attr1, const int &Attr2, const bool Left=false, const bool Right=false) const
const double GradPhiMI(const double &x, const int &NId, const int &AId, const double &Lambda, const double &DeltaQ, const TFltVV &CntVV)
const TVal & At(const TSizeTy &X, const TSizeTy &Y) const