25 #ifdef USE_HMMPARALLEL
26 #define USE_HMMPARALLEL_STRUCTURES 1
32 template <
class ST>
class CStringFeatures;
39 #ifndef DOXYGEN_SHOULD_SKIP_THIS
55 #endif // DOXYGEN_SHOULD_SKIP_THIS
115 return learn_a[line*2 + column];
121 return learn_b[line*2 + column];
139 return const_a[line*2 + column];
145 return const_b[line*2 + column];
185 inline char get_fix_pos_state(int32_t pos,
T_STATES state,
T_STATES num_states)
188 if ((pos<0)||(pos*num_states+state>65336))
189 SG_DEBUG(
"index out of range in get_fix_pos_state(%i,%i,%i) \n", pos,state,num_states) ;
191 return fix_pos_state[pos*num_states+state] ;
273 inline void set_fix_pos_state(
277 if ((pos<0)||(pos*num_states+state>65336))
278 SG_DEBUG(
"index out of range in set_fix_pos_state(%i,%i,%i,%i) [%i]\n", pos,state,num_states,(
int)value, pos*num_states+state) ;
280 fix_pos_state[pos*num_states+state]=value;
281 if (value==FIX_ALLOWED)
282 for (int32_t i=0; i<num_states; i++)
283 if (get_fix_pos_state(pos,i,num_states)==FIX_DEFAULT)
284 set_fix_pos_state(pos,i,num_states,FIX_DISALLOWED) ;
289 const static char FIX_DISALLOWED ;
292 const static char FIX_ALLOWED ;
295 const static char FIX_DEFAULT ;
298 const static float64_t DISALLOWED_PENALTY ;
381 bool mem_initialized ;
383 #ifdef USE_HMMPARALLEL_STRUCTURES
386 struct S_DIM_THREAD_PARAM
394 struct S_BW_THREAD_PARAM
408 inline T_ALPHA_BETA & ALPHA_CACHE(int32_t dim) {
410 inline T_ALPHA_BETA & BETA_CACHE(int32_t dim) {
412 #ifdef USE_LOGSUMARRAY
420 inline T_STATES* STATES_PER_OBSERVATION_PSI(int32_t dim) {
422 inline const T_STATES* STATES_PER_OBSERVATION_PSI(int32_t dim)
const {
424 inline T_STATES* PATH(int32_t dim) {
426 inline bool & PATH_PROB_UPDATED(int32_t dim) {
428 inline int32_t & PATH_PROB_DIMENSION(int32_t dim) {
431 inline T_ALPHA_BETA & ALPHA_CACHE(int32_t ) {
433 inline T_ALPHA_BETA & BETA_CACHE(int32_t ) {
435 #ifdef USE_LOGSUMARRAY
443 inline T_STATES* STATES_PER_OBSERVATION_PSI(int32_t ) {
445 inline const T_STATES* STATES_PER_OBSERVATION_PSI(int32_t )
const {
449 inline bool & PATH_PROB_UPDATED(int32_t ) {
451 inline int32_t & PATH_PROB_DIMENSION(int32_t ) {
547 int32_t time, int32_t state, int32_t dimension);
558 int32_t time, int32_t state, int32_t dimension);
605 for (int32_t i=0; i<
N; i++)
646 #ifdef USE_HMMPARALLEL_STRUCTURES
694 void normalize(
bool keep_dead_states=
false);
765 #ifdef USE_HMMPARALLEL_STRUCTURES
766 static void* bw_dim_prefetch(
void * params);
767 static void* bw_single_dim_prefetch(
void * params);
768 static void* vit_dim_prefetch(
void * params);
775 inline bool set_fix_pos_state(int32_t pos,
T_STATES state,
char value)
779 model->set_fix_pos_state(pos, state, N, value) ;
962 bool check_path_derivatives() ;
963 #endif //USE_HMMDEBUG
986 inline int32_t
get_M()
const {
return M ; }
996 SG_DEBUG(
"index out of range in set_q(%i,%e) [%i]\n", offset,value,N) ;
1009 SG_DEBUG(
"index out of range in set_p(%i,.) [%i]\n", offset,N) ;
1022 if ((line_>N)||(column>N))
1023 SG_DEBUG(
"index out of range in set_A(%i,%i,.) [%i,%i]\n",line_,column,N,N) ;
1036 if ((line_>N)||(column>N))
1037 SG_DEBUG(
"index out of range in set_a(%i,%i,.) [%i,%i]\n",line_,column,N,N) ;
1050 if ((line_>=N)||(column>=M))
1051 SG_DEBUG(
"index out of range in set_B(%i,%i) [%i,%i]\n", line_, column,N,M) ;
1064 if ((line_>=N)||(column>=M))
1065 SG_DEBUG(
"index out of range in set_b(%i,%i) [%i,%i]\n", line_, column,N,M) ;
1083 STATES_PER_OBSERVATION_PSI(dimension)[time*N+state]=value;
1107 SG_DEBUG(
"index out of range in get_p(%i,.) [%i]\n", offset,N) ;
1120 if ((line_>N)||(column>N))
1121 SG_DEBUG(
"index out of range in get_A(%i,%i) [%i,%i]\n",line_,column,N,N) ;
1134 if ((line_>N)||(column>N))
1135 SG_DEBUG(
"index out of range in get_a(%i,%i) [%i,%i]\n",line_,column,N,N) ;
1148 if ((line_>=N)||(column>=M))
1149 SG_DEBUG(
"index out of range in get_B(%i,%i) [%i,%i]\n", line_, column,N,M) ;
1162 if ((line_>=N)||(column>=M))
1163 SG_DEBUG(
"index out of range in get_b(%i,%i) [%i,%i]\n", line_, column,N,M) ;
1176 int32_t time,
T_STATES state, int32_t dimension)
const
1182 return STATES_PER_OBSERVATION_PSI(dimension)[time*N+state];
1188 inline virtual const char*
get_name()
const {
return "HMM"; }
1270 #ifdef USE_HMMPARALLEL_STRUCTURES
1275 #else //USE_HMMPARALLEL_STRUCTURES
1280 #endif //USE_HMMPARALLEL_STRUCTURES
1282 #ifdef USE_LOGSUMARRAY
1283 #ifdef USE_HMMPARALLEL_STRUCTURES
1289 #endif // USE_HMMPARALLEL_STRUCTURES
1290 #endif // USE_LOGSUMARRAY
1292 #ifdef USE_HMMPARALLEL_STRUCTURES
1311 #else //USE_HMMPARALLEL_STRUCTURES
1329 #endif //USE_HMMPARALLEL_STRUCTURES
1372 int32_t time, int32_t state, int32_t dimension)
1379 int32_t time, int32_t state_i, int32_t state_j, int32_t dimension)
1381 return forward(time, state_i, dimension) +
1382 backward(time+1, state_j, dimension) +
1396 T_STATES i, uint16_t j, int32_t dimension)
1400 for (int32_t k=0; k<
N; k++)
1462 return (i==PATH(dimension)[0]) ? (exp(-
get_p(PATH(dimension)[0]))) : (0) ;
1495 bool get_numbuffer(FILE* file,
char* buffer, int32_t length);
1507 inline void error(int32_t p_line,
const char* str)
1510 SG_ERROR(
"error in line %d %s\n", p_line, str);
1535 set_A(PATH(dim)[t], PATH(dim)[t+1],
get_A(PATH(dim)[t], PATH(dim)[t+1])+1);
1550 if (ALPHA_CACHE(dimension).table && (dimension==ALPHA_CACHE(dimension).dimension) && ALPHA_CACHE(dimension).updated)
1552 if (time<p_observations->get_vector_length(dimension))
1553 return ALPHA_CACHE(dimension).table[time*N+state];
1555 return ALPHA_CACHE(dimension).sum;
1564 if (BETA_CACHE(dimension).table && (dimension==BETA_CACHE(dimension).dimension) && (BETA_CACHE(dimension).updated))
1567 return BETA_CACHE(dimension).sum;
1568 if (time<p_observations->get_vector_length(dimension))
1569 return BETA_CACHE(dimension).table[time*N+state];