-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparameters.cpp
100 lines (89 loc) · 2.7 KB
/
parameters.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
#ifndef PARAMETERS_CPP
#define PARAMETERS_CPP
#include "parameters.h"
namespace hhmm{
//constructor for neither the top nor the deepest
parameters::parameters(vector<uint32_t> const& _stateNum,uint32_t _brosNum,uint32_t _length,uint32_t _dim,parameters* _parent)
:xiContent(_length,_brosNum+1),
tmpTransContent(_stateNum[0],_stateNum[0]+1),
alpha(_length,0.0),
beta(_length,0.0),
etaIn(_length,0.0),
etaOut(_length,0.0),
chi(_length,0.0),
gammaIn(_length,0.0),
gammaOut(_length,0.0),
parent(_parent)
{
if(_stateNum.size() > 1){
vector<uint32_t> nextNum(++begin(_stateNum),end(_stateNum));
for(uint32_t t=0;t<_stateNum[0];++t){
children.push_back(up<parameters>(new parameters(nextNum,_stateNum[0],_length,_dim,this)));
}
children.shrink_to_fit();
}
else if(_stateNum.size() == 1){
for(uint32_t t=0;t<_stateNum[0];++t){
children.push_back(up<parameters>(new parameters(_stateNum[0],_length,_dim,this)));
}
children.shrink_to_fit();
}
}
//constructor for the deepest
parameters::parameters(uint32_t _brosNum,uint32_t _length,uint32_t _dim,parameters* _parent)
:xiContent(_length,_brosNum+1),
alpha(_length,0.0),
beta(_length,0.0),
etaIn(_length,0.0),
etaOut(_length,0.0),
chi(_length,0.0),
gammaIn(_length,0.0),
//gammaOut(_length,0.0),
parent(_parent),
tmpMean(_dim),
tmpVariance(_dim)
{}
//constructor for the top
parameters::parameters(vector<uint32_t> const& _stateNum,uint32_t _length,uint32_t _dim)
:tmpTransContent(_stateNum[0],_stateNum[0]+1),
parent(nullptr)
{
if(_stateNum.size() < 2){exit(1);}
vector<uint32_t> nextNum(++begin(_stateNum),end(_stateNum));
for(uint32_t t=0;t<_stateNum[0];++t){
children.push_back(up<parameters>(new parameters(nextNum,_stateNum[0],_length,_dim,this)));
}
children.shrink_to_fit();
}
void parameters::transform()
{
delta = move(alpha);
beta.clear();
etaIn.clear();
etaOut.clear();
chi.clear();
gammaIn.clear();
gammaOut.clear();
phi.resize(delta.size());
tau.resize(delta.size());
if(not children.empty()){
for(auto& c:children){
c->transform();
}
}
}
long double& parameters::xi(uint32_t x,baseHHMM* y,nprodHHMM* z)
{
return xiContent(x,z->convert[reinterpret_cast<uint64_t>(y)]);
}
long double& parameters::tmpTrans(baseHHMM* x,baseHHMM* y,nprodHHMM* z)
{
return tmpTransContent(z->convert[reinterpret_cast<uint64_t>(x)], \
z->convert[reinterpret_cast<uint64_t>(y)]);
}
MatrixXld& parameters::tmpTrans()
{
return tmpTransContent;
}
}
#endif