-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprodHHMM.cpp
109 lines (91 loc) · 2.19 KB
/
prodHHMM.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "prodHHMM.h"
#include <cmath>
#include <iostream>
namespace hhmm{
prodHHMM::prodHHMM(uint32_t _level,uint32_t _dim,baseHHMM* _parent)
:baseHHMM(_level,_parent),
mean(_dim),
var(_dim)
{}
long double prodHHMM::emit(VectorXld const& O) const
{
long double mom = sqrt(pow(2 * M_PI,mean.size()) * var.diagonal().prod());
long double son = exp(-0.5 * (O - mean).transpose() * var.inverse() * (O - mean));
return son/mom;
}
VectorXld const& prodHHMM::getMean() const
{
return mean;
}
VectorXld& prodHHMM::setMean()
{
return mean;
}
DM const& prodHHMM::getVariance() const
{
return var;
}
DM& prodHHMM::setVariance()
{
return var;
}
void prodHHMM::cpyMean(VectorXld const& args)
{
mean = args;
}
void prodHHMM::cpyVar(DM const& args)
{
var = args;
}
void prodHHMM::swpMean(VectorXld& args)
{
mean.swap(args);
}
void prodHHMM::swpVar(DM& args)
{
var.diagonal().swap(args.diagonal());
}
// void prodHHMM::setEmit(vector<long double> const& x)
// {
// testemit = x;
// }
// long double prodHHMM::emit(uint32_t i) const
// {
// return testemit[i];
// }
void prodHHMM::clearParam()
{
pi = 0.0;
emitParent = 0.0;
mean.setZero();
//for(uint32_t i=0;i<testemit.size();++i){testemit[i] = 0.0;}
var.setZero();
}
void prodHHMM::check()
{
cout << "mean" << endl;
cout << mean.transpose() << endl;
cout << "variance" << endl;
cout << var.diagonal().transpose() << endl;
}
void prodHHMM::initParam(vector<long double> const& xs)
{
mt19937 gen((uint64_t)this);
for(uint32_t i=0;i<xs.size();++i){
normal_distribution<long double> nd(xs[i],1.0);
mean(i) = nd(gen);
}
for(uint32_t i=0;i<var.diagonal().size();++i){
var.diagonal()(i) = 1.0;
}
}
void prodHHMM::log(uint32_t loop,uint32_t ID,string const& toDir)
{
ofstream ofs(toDir + "state/" + to_string(ID),ios::out | ios::app);
ofs << "loop " << loop << endl;
ofs << "emitParent " << emitParent << endl;
ofs << "mean " << mean.transpose() << endl;
ofs << "variance " << var.diagonal().transpose() << endl;
ofs.close();
}
}