25 #define VAL_MACRO log((default_value == 0) ? (CMath::random(MIN_RAND, MAX_RAND)) : default_value)
26 #define ARRAY_SIZE 65336
28 using namespace shogun;
75 const char Model::FIX_DISALLOWED=0 ;
76 const char Model::FIX_ALLOWED=1 ;
77 const char Model::FIX_DEFAULT=-1 ;
116 fix_pos_state[i] = FIX_DEFAULT ;
138 SG_FREE(fix_pos_state);
150 trans_list_forward_cnt=NULL;
151 trans_list_backward_cnt=NULL;
152 trans_list_forward=NULL;
153 trans_list_backward=NULL;
154 trans_list_forward_val=NULL;
166 #ifdef USE_HMMPARALLEL_STRUCTURES
181 #ifdef USE_HMMPARALLEL_STRUCTURES
199 #ifdef USE_HMMPARALLEL_STRUCTURES
215 #ifdef USE_HMMPARALLEL_STRUCTURES
230 trans_list_forward = NULL ;
231 trans_list_forward_cnt = NULL ;
232 trans_list_forward_val = NULL ;
233 trans_list_backward = NULL ;
234 trans_list_backward_cnt = NULL ;
236 mem_initialized = false ;
245 #ifdef USE_HMMPARALLEL_STRUCTURES
261 mem_initialized = true ;
283 trans_list_forward = NULL ;
284 trans_list_forward_cnt = NULL ;
285 trans_list_forward_val = NULL ;
286 trans_list_backward = NULL ;
287 trans_list_backward_cnt = NULL ;
289 mem_initialized = false ;
298 #ifdef USE_HMMPARALLEL_STRUCTURES
314 mem_initialized = true ;
316 trans_list_forward_cnt=NULL ;
318 trans_list_forward = SG_MALLOC(
T_STATES*,
N);
319 trans_list_forward_val = SG_MALLOC(
float64_t*,
N);
320 trans_list_forward_cnt = SG_MALLOC(
T_STATES,
N);
323 for (int32_t j=0; j<
N; j++)
325 int32_t old_start_idx=start_idx;
327 while (start_idx<num_trans && a_trans[start_idx+num_trans]==j)
331 if (start_idx>1 && start_idx<num_trans)
332 ASSERT(a_trans[start_idx+num_trans-1]<=
333 a_trans[start_idx+num_trans]);
336 if (start_idx>1 && start_idx<num_trans)
337 ASSERT(a_trans[start_idx+num_trans-1]<=
338 a_trans[start_idx+num_trans]);
340 int32_t len=start_idx-old_start_idx;
343 trans_list_forward_cnt[j] = 0 ;
347 trans_list_forward[j] = SG_MALLOC(
T_STATES, len);
348 trans_list_forward_val[j] = SG_MALLOC(
float64_t, len);
352 trans_list_forward[j] = NULL;
353 trans_list_forward_val[j] = NULL;
357 for (int32_t i=0; i<num_trans; i++)
359 int32_t from = (int32_t)a_trans[i+num_trans] ;
360 int32_t to = (int32_t)a_trans[i] ;
366 trans_list_forward[from][trans_list_forward_cnt[from]]=to ;
367 trans_list_forward_val[from][trans_list_forward_cnt[from]]=val ;
368 trans_list_forward_cnt[from]++ ;
386 #ifdef USE_HMMPARALLEL_STRUCTURES
397 if (trans_list_forward_cnt)
398 SG_FREE(trans_list_forward_cnt);
399 if (trans_list_backward_cnt)
400 SG_FREE(trans_list_backward_cnt);
401 if (trans_list_forward)
403 for (int32_t i=0; i<trans_list_len; i++)
404 if (trans_list_forward[i])
405 SG_FREE(trans_list_forward[i]);
406 SG_FREE(trans_list_forward);
408 if (trans_list_forward_val)
410 for (int32_t i=0; i<trans_list_len; i++)
411 if (trans_list_forward_val[i])
412 SG_FREE(trans_list_forward_val[i]);
413 SG_FREE(trans_list_forward_val);
415 if (trans_list_backward)
417 for (int32_t i=0; i<trans_list_len; i++)
418 if (trans_list_backward[i])
419 SG_FREE(trans_list_backward[i]);
420 SG_FREE(trans_list_backward);
427 #ifdef USE_HMMPARALLEL_STRUCTURES
440 #else // USE_HMMPARALLEL_STRUCTURES
445 #endif // USE_HMMPARALLEL_STRUCTURES
451 #ifdef USE_LOGSUMARRAY
452 #ifdef USE_HMMPARALLEL_STRUCTURES
458 #else //USE_HMMPARALLEL_STRUCTURES
460 #endif //USE_HMMPARALLEL_STRUCTURES
461 #endif //USE_LOGSUMARRAY
465 #ifdef USE_HMMPARALLEL_STRUCTURES
470 #endif //USE_HMMPARALLEL_STRUCTURES
482 SG_ERROR(
"Expected features of class string type word\n")
503 #ifdef USE_HMMPARALLEL_STRUCTURES
509 #else //USE_HMMPARALLEL_STRUCTURES
512 #endif //USE_HMMPARALLEL_STRUCTURES
515 #ifdef USE_HMMPARALLEL_STRUCTURES
517 arrayS[i]=SG_MALLOC(
float64_t, (int32_t)(this->
N/2+1));
518 #else //USE_HMMPARALLEL_STRUCTURES
519 arrayS=SG_MALLOC(
float64_t, (int32_t)(this->
N/2+1));
520 #endif //USE_HMMPARALLEL_STRUCTURES
521 #endif //LOG_SUMARRAY
527 #ifdef USE_HMMPARALLEL_STRUCTURES
529 #else //USE_HMMPARALLEL_STRUCTURES
531 #endif //USE_HMMPARALLEL_STRUCTURES
548 #ifdef USE_HMMPARALLEL_STRUCTURES
586 trans_list_forward = NULL ;
587 trans_list_forward_cnt = NULL ;
588 trans_list_forward_val = NULL ;
589 trans_list_backward = NULL ;
590 trans_list_backward_cnt = NULL ;
592 mem_initialized = false ;
603 #ifdef USE_HMMPARALLEL_STRUCTURES
611 this->beta_cache[i].table=NULL;
613 this->beta_cache[i].dimension=0;
614 this->states_per_observation_psi[i]=NULL ;
617 #else // USE_HMMPARALLEL_STRUCTURES
619 this->beta_cache.table=NULL;
621 this->beta_cache.dimension=0;
622 this->states_per_observation_psi=NULL ;
623 #endif //USE_HMMPARALLEL_STRUCTURES
628 #ifdef USE_HMMPARALLEL_STRUCTURES
637 #else // USE_HMMPARALLEL_STRUCTURES
640 #endif //USE_HMMPARALLEL_STRUCTURES
642 #ifdef USE_HMMPARALLEL_STRUCTURES
645 #endif //USE_HMMPARALLEL_STRUCTURES
648 #ifdef USE_HMMPARALLEL_STRUCTURES
650 #endif // USE_HMMPARALLEL_STRUCTURES
651 #endif //LOG_SUMARRAY
656 mem_initialized = true ;
659 return ((files_ok) &&
679 int32_t wanted_time=time;
681 if (ALPHA_CACHE(dimension).table)
683 alpha=&ALPHA_CACHE(dimension).table[0];
684 alpha_new=&ALPHA_CACHE(dimension).table[
N];
698 for (int32_t i=0; i<
N; i++)
705 for (int32_t j=0; j<
N; j++)
707 register int32_t i, num = trans_list_forward_cnt[j] ;
709 for (i=0; i < num; i++)
711 int32_t ii = trans_list_forward[j][i] ;
718 if (!ALPHA_CACHE(dimension).table)
732 if (time<p_observations->get_vector_length(dimension))
734 register int32_t i, num=trans_list_forward_cnt[state];
736 for (i=0; i<num; i++)
738 int32_t ii = trans_list_forward[state][i] ;
753 if (!ALPHA_CACHE(dimension).table)
757 ALPHA_CACHE(dimension).dimension=dimension;
758 ALPHA_CACHE(dimension).updated=
true;
759 ALPHA_CACHE(dimension).sum=sum;
761 if (wanted_time<p_observations->get_vector_length(dimension))
762 return ALPHA_CACHE(dimension).table[wanted_time*N+state];
764 return ALPHA_CACHE(dimension).sum;
782 int32_t wanted_time=time;
784 if (ALPHA_CACHE(dimension).table)
786 alpha=&ALPHA_CACHE(dimension).table[0];
787 alpha_new=&ALPHA_CACHE(dimension).table[
N];
801 for (int32_t i=0; i<
N; i++)
808 for (int32_t j=0; j<
N; j++)
811 #ifdef USE_LOGSUMARRAY
812 for (i=0; i<(N>>1); i++)
814 alpha[(i<<1)+1] +
get_a((i<<1)+1,j));
818 CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1)) ;
821 #else //USE_LOGSUMARRAY
827 #endif //USE_LOGSUMARRAY
830 if (!ALPHA_CACHE(dimension).table)
844 if (time<p_observations->get_vector_length(dimension))
847 #ifdef USE_LOGSUMARRAY
848 for (i=0; i<(N>>1); i++)
850 alpha[(i<<1)+1] +
get_a((i<<1)+1,state));
854 CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1)) ;
857 #else //USE_LOGSUMARRAY
863 #endif //USE_LOGSUMARRAY
870 #ifdef USE_LOGSUMARRAY
871 for (i=0; i<(N>>1); i++)
873 alpha[(i<<1)+1] +
get_q((i<<1)+1));
876 CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1)) ;
878 sum=CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1) ;
879 #else //USE_LOGSUMARRAY
883 #endif //USE_LOGSUMARRAY
885 if (!ALPHA_CACHE(dimension).table)
889 ALPHA_CACHE(dimension).dimension=dimension;
890 ALPHA_CACHE(dimension).updated=
true;
891 ALPHA_CACHE(dimension).sum=sum;
893 if (wanted_time<p_observations->get_vector_length(dimension))
894 return ALPHA_CACHE(dimension).table[wanted_time*N+state];
896 return ALPHA_CACHE(dimension).sum;
911 int32_t wanted_time=time;
914 forward(time, state, dimension);
916 if (BETA_CACHE(dimension).table)
935 for (
register int32_t i=0; i<
N; i++)
941 for (
register int32_t i=0; i<
N; i++)
943 register int32_t j, num=trans_list_backward_cnt[i] ;
945 for (j=0; j<num; j++)
947 int32_t jj = trans_list_backward[i][j] ;
953 if (!BETA_CACHE(dimension).table)
968 register int32_t j, num=trans_list_backward_cnt[state] ;
970 for (j=0; j<num; j++)
972 int32_t jj = trans_list_backward[state][j] ;
979 if (BETA_CACHE(dimension).table)
982 for (
register int32_t j=0; j<
N; j++)
984 BETA_CACHE(dimension).sum=sum;
985 BETA_CACHE(dimension).dimension=dimension;
986 BETA_CACHE(dimension).updated=
true;
988 if (wanted_time<p_observations->get_vector_length(dimension))
989 return BETA_CACHE(dimension).table[wanted_time*N+state];
991 return BETA_CACHE(dimension).sum;
996 for (
register int32_t j=0; j<
N; j++)
1006 int32_t time, int32_t state, int32_t dimension)
1011 int32_t wanted_time=time;
1014 forward(time, state, dimension);
1016 if (BETA_CACHE(dimension).table)
1031 return get_q(state);
1035 for (
register int32_t i=0; i<
N; i++)
1041 for (
register int32_t i=0; i<
N; i++)
1043 register int32_t j ;
1044 #ifdef USE_LOGSUMARRAY
1045 for (j=0; j<(N>>1); j++)
1051 CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1)) ;
1053 beta_new[i]=CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1) ;
1054 #else //USE_LOGSUMARRAY
1060 #endif //USE_LOGSUMARRAY
1063 if (!BETA_CACHE(dimension).table)
1078 register int32_t j ;
1079 #ifdef USE_LOGSUMARRAY
1080 for (j=0; j<(N>>1); j++)
1086 CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1)) ;
1088 return CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1) ;
1089 #else //USE_LOGSUMARRAY
1095 #endif //USE_LOGSUMARRAY
1099 if (BETA_CACHE(dimension).table)
1101 #ifdef USE_LOGSUMARRAY//AAA
1102 for (int32_t j=0; j<(N>>1); j++)
1107 CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1)) ;
1109 BETA_CACHE(dimension).sum=CMath::logarithmic_sum_array(ARRAYS(dimension), N>>1) ;
1110 #else //USE_LOGSUMARRAY
1112 for (
register int32_t j=0; j<
N; j++)
1114 BETA_CACHE(dimension).sum=sum;
1115 #endif //USE_LOGSUMARRAY
1116 BETA_CACHE(dimension).dimension=dimension;
1117 BETA_CACHE(dimension).updated=
true;
1119 if (wanted_time<p_observations->get_vector_length(dimension))
1120 return BETA_CACHE(dimension).table[wanted_time*N+state];
1122 return BETA_CACHE(dimension).sum;
1127 for (
register int32_t j=0; j<
N; j++)
1146 SG_INFO(
"computing full viterbi likelihood\n")
1158 if (!STATES_PER_OBSERVATION_PSI(dimension))
1164 if (PATH_PROB_UPDATED(dimension) && dimension==PATH_PROB_DIMENSION(dimension))
1169 register float64_t* delta_new= ARRAYN1(dimension);
1172 for (
register int32_t i=0; i<
N; i++)
1179 #ifdef USE_PATHDEBUG
1186 register int32_t NN=
N ;
1187 for (
register int32_t j=0; j<NN; j++)
1190 register float64_t maxj=delta[0] + matrix_a[0];
1191 register int32_t argmax=0;
1193 for (
register int32_t i=1; i<NN; i++)
1195 register float64_t temp = delta[i] + matrix_a[i];
1204 if ((!
model) || (
model->get_fix_pos_state(t,j,NN)!=Model::FIX_DISALLOWED))
1211 set_psi(t, j, argmax, dimension);
1214 #ifdef USE_PATHDEBUG
1216 for (int32_t jj=0; jj<
N; jj++)
1217 if (delta_new[jj]>best)
1218 best=delta_new[jj] ;
1222 SG_DEBUG(
"worst case at %i: %e:%e\n", t, best, worst)
1235 register int32_t argmax=0;
1237 for (
register int32_t i=1; i<
N; i++)
1255 PATH(dimension)[t-1]=
get_psi(t, PATH(dimension)[t], dimension);
1258 PATH_PROB_UPDATED(dimension)=
true;
1259 PATH_PROB_DIMENSION(dimension)=dimension;
1264 #ifndef USE_HMMPARALLEL
1283 SG_INFO(
"computing full model probablity\n")
1286 for (int32_t cpu=0; cpu<
parallel->get_num_threads(); cpu++)
1288 params[cpu].hmm=this ;
1295 pthread_create(&threads[cpu], NULL, bw_dim_prefetch, (
void*)¶ms[cpu]);
1300 pthread_join(threads[cpu], NULL);
1306 SG_FREE(params[i].p_buf);
1307 SG_FREE(params[i].q_buf);
1308 SG_FREE(params[i].a_buf);
1309 SG_FREE(params[i].b_buf);
1319 void* CHMM::bw_dim_prefetch(
void* params)
1321 CHMM* hmm=((S_BW_THREAD_PARAM*) params)->hmm;
1322 int32_t start=((S_BW_THREAD_PARAM*) params)->dim_start;
1323 int32_t stop=((S_BW_THREAD_PARAM*) params)->dim_stop;
1324 float64_t* p_buf=((S_BW_THREAD_PARAM*) params)->p_buf;
1325 float64_t* q_buf=((S_BW_THREAD_PARAM*) params)->q_buf;
1326 float64_t* a_buf=((S_BW_THREAD_PARAM*) params)->a_buf;
1327 float64_t* b_buf=((S_BW_THREAD_PARAM*) params)->b_buf;
1328 ((S_BW_THREAD_PARAM*)params)->ret=0;
1330 for (int32_t dim=start; dim<stop; dim++)
1335 hmm->ab_buf_comp(p_buf, q_buf, a_buf, b_buf, dim) ;
1336 ((S_BW_THREAD_PARAM*)params)->ret+= modprob;
1341 void* CHMM::bw_single_dim_prefetch(
void * params)
1343 CHMM* hmm=((S_BW_THREAD_PARAM*)params)->hmm ;
1344 int32_t dim=((S_DIM_THREAD_PARAM*)params)->dim ;
1349 void* CHMM::vit_dim_prefetch(
void * params)
1351 CHMM* hmm=((S_DIM_THREAD_PARAM*)params)->hmm ;
1352 int32_t dim=((S_DIM_THREAD_PARAM*)params)->dim ;
1353 ((S_DIM_THREAD_PARAM*)params)->prob_sum = hmm->
best_path(dim);
1357 #endif //USE_HMMPARALLEL
1360 #ifdef USE_HMMPARALLEL
1362 void CHMM::ab_buf_comp(
1388 a_buf[N*i+j]=a_sum-dimmodprob ;
1402 b_buf[M*i+j]=b_sum-dimmodprob ;
1440 pthread_t *threads=SG_MALLOC(pthread_t, num_threads);
1441 S_BW_THREAD_PARAM *params=SG_MALLOC(S_BW_THREAD_PARAM, num_threads);
1446 for (cpu=0; cpu<num_threads; cpu++)
1448 params[cpu].p_buf=SG_MALLOC(
float64_t, N);
1449 params[cpu].q_buf=SG_MALLOC(
float64_t, N);
1450 params[cpu].a_buf=SG_MALLOC(
float64_t, N*N);
1451 params[cpu].b_buf=SG_MALLOC(
float64_t, N*M);
1453 params[cpu].hmm=hmm;
1461 params[cpu].dim_start=start;
1462 params[cpu].dim_stop=stop;
1464 pthread_create(&threads[cpu], NULL, bw_dim_prefetch, ¶ms[cpu]);
1467 for (cpu=0; cpu<num_threads; cpu++)
1469 pthread_join(threads[cpu], NULL);
1486 fullmodprob+=params[cpu].ret;
1490 for (cpu=0; cpu<num_threads; cpu++)
1492 SG_FREE(params[cpu].p_buf);
1493 SG_FREE(params[cpu].q_buf);
1494 SG_FREE(params[cpu].a_buf);
1495 SG_FREE(params[cpu].b_buf);
1510 #else // USE_HMMPARALLEL
1549 fullmodprob+=dimmodprob ;
1557 int32_t num = trans_list_backward_cnt[i] ;
1560 for (j=0; j<num; j++)
1562 int32_t jj = trans_list_backward[i][j] ;
1635 fullmodprob+=dimmodprob ;
1680 #endif // USE_HMMPARALLEL
1717 fullmodprob+=dimmodprob ;
1725 int32_t num = trans_list_backward_cnt[i] ;
1727 for (j=0; j<num; j++)
1729 int32_t jj = trans_list_backward[i][j] ;
1756 int32_t i,j,old_i,k,t,dim;
1790 #ifdef USE_HMMPARALLEL
1792 pthread_t *threads=SG_MALLOC(pthread_t, num_threads);
1793 S_DIM_THREAD_PARAM *params=SG_MALLOC(S_DIM_THREAD_PARAM, num_threads);
1802 #ifdef USE_HMMPARALLEL
1803 if (dim%num_threads==0)
1805 for (i=0; i<num_threads; i++)
1807 if (dim+i<p_observations->get_num_vectors())
1809 params[i].hmm=estimate ;
1810 params[i].dim=dim+i ;
1811 pthread_create(&threads[i], NULL, bw_single_dim_prefetch, (
void*)¶ms[i]) ;
1814 for (i=0; i<num_threads; i++)
1816 if (dim+i<p_observations->get_num_vectors())
1818 pthread_join(threads[i], NULL);
1819 dimmodprob = params[i].prob_sum;
1825 #endif // USE_HMMPARALLEL
1828 fullmodprob+= dimmodprob;
1895 #ifdef USE_HMMPARALLEL
1954 #ifdef USE_HMMPARALLEL
1956 pthread_t *threads=SG_MALLOC(pthread_t, num_threads);
1957 S_DIM_THREAD_PARAM *params=SG_MALLOC(S_DIM_THREAD_PARAM, num_threads);
1966 #ifdef USE_HMMPARALLEL
1967 if (dim%num_threads==0)
1969 for (i=0; i<num_threads; i++)
1971 if (dim+i<p_observations->get_num_vectors())
1973 params[i].hmm=estimate ;
1974 params[i].dim=dim+i ;
1975 pthread_create(&threads[i], NULL, vit_dim_prefetch, (
void*)¶ms[i]) ;
1978 for (i=0; i<num_threads; i++)
1980 if (dim+i<p_observations->get_num_vectors())
1982 pthread_join(threads[i], NULL);
1983 allpatprob += params[i].prob_sum;
1990 #endif // USE_HMMPARALLEL
1995 set_A(estimate->PATH(dim)[t], estimate->PATH(dim)[t+1],
get_A(estimate->PATH(dim)[t], estimate->PATH(dim)[t+1])+1);
2001 P[estimate->PATH(dim)[0]]++;
2005 #ifdef USE_HMMPARALLEL
2042 set_p(i, log(P[i]/sum));
2050 set_q(i, log(Q[i]/sum));
2079 #ifdef USE_HMMPARALLEL
2081 pthread_t *threads=SG_MALLOC(pthread_t, num_threads);
2082 S_DIM_THREAD_PARAM *params=SG_MALLOC(S_DIM_THREAD_PARAM, num_threads);
2089 #ifdef USE_HMMPARALLEL
2090 if (dim%num_threads==0)
2092 for (i=0; i<num_threads; i++)
2094 if (dim+i<p_observations->get_num_vectors())
2096 params[i].hmm=estimate ;
2097 params[i].dim=dim+i ;
2098 pthread_create(&threads[i], NULL, vit_dim_prefetch, (
void*)¶ms[i]) ;
2101 for (i=0; i<num_threads; i++)
2103 if (dim+i<p_observations->get_num_vectors())
2105 pthread_join(threads[i], NULL);
2106 allpatprob += params[i].prob_sum;
2110 #else // USE_HMMPARALLEL
2113 #endif // USE_HMMPARALLEL
2119 set_A(estimate->PATH(dim)[t], estimate->PATH(dim)[t+1],
get_A(estimate->PATH(dim)[t], estimate->PATH(dim)[t+1])+1);
2125 P[estimate->PATH(dim)[0]]++;
2129 #ifdef USE_HMMPARALLEL
2245 SG_INFO(
"log(Pr[O|model])=%e, #states: %i, #observationssymbols: %i, #observations: %ix%i\n",
2252 SG_INFO(
"\ntransition matrix\n")
2265 if (fabs(checksum)>1e-5)
2266 SG_DEBUG(
" checksum % E ******* \n",checksum)
2268 SG_DEBUG(
" checksum % E\n",checksum)
2272 SG_INFO(
"\ndistribution of start states\n")
2281 if (fabs(checksum)>1e-5)
2282 SG_DEBUG(
" checksum % E ******* \n",checksum)
2284 SG_DEBUG(
" checksum=% E\n", checksum)
2287 SG_INFO(
"\ndistribution of terminal states\n")
2296 if (fabs(checksum)>1e-5)
2297 SG_DEBUG(
" checksum % E ******* \n",checksum)
2299 SG_DEBUG(
" checksum=% E\n", checksum)
2302 SG_INFO(
"\ndistribution of observations given the state\n")
2313 if (fabs(checksum)>1e-5)
2314 SG_DEBUG(
" checksum % E ******* \n",checksum)
2316 SG_DEBUG(
" checksum % E\n",checksum)
2330 SG_INFO(
"log(Pr[O|model])=%e, #states: %i, #observationssymbols: %i, #observations: %ix%i\n",
2337 SG_INFO(
"\ntransition matrix\n")
2355 SG_INFO(
"\n\ndistribution of observations given the state\n")
2542 SG_FREE(R); R=NULL ;
2571 SG_FREE(R); R=NULL ;
2706 if (mem_initialized)
2708 if (trans_list_forward_cnt)
2709 SG_FREE(trans_list_forward_cnt);
2710 trans_list_forward_cnt=NULL ;
2711 if (trans_list_backward_cnt)
2712 SG_FREE(trans_list_backward_cnt);
2713 trans_list_backward_cnt=NULL ;
2714 if (trans_list_forward)
2716 for (int32_t i=0; i<trans_list_len; i++)
2717 if (trans_list_forward[i])
2718 SG_FREE(trans_list_forward[i]);
2719 SG_FREE(trans_list_forward);
2720 trans_list_forward=NULL ;
2722 if (trans_list_backward)
2724 for (int32_t i=0; i<trans_list_len; i++)
2725 if (trans_list_backward[i])
2726 SG_FREE(trans_list_backward[i]);
2727 SG_FREE(trans_list_backward);
2728 trans_list_backward = NULL ;
2731 trans_list_len =
N ;
2732 trans_list_forward = SG_MALLOC(
T_STATES*, N);
2733 trans_list_forward_cnt = SG_MALLOC(
T_STATES, N);
2735 for (int32_t j=0; j<
N; j++)
2737 trans_list_forward_cnt[j]= 0 ;
2738 trans_list_forward[j]= SG_MALLOC(
T_STATES, N);
2739 for (int32_t i=0; i<
N; i++)
2742 trans_list_forward[j][trans_list_forward_cnt[j]]=i ;
2743 trans_list_forward_cnt[j]++ ;
2747 trans_list_backward = SG_MALLOC(
T_STATES*, N);
2748 trans_list_backward_cnt = SG_MALLOC(
T_STATES, N);
2750 for (int32_t i=0; i<
N; i++)
2752 trans_list_backward_cnt[i]= 0 ;
2753 trans_list_backward[i]= SG_MALLOC(
T_STATES, N);
2754 for (int32_t j=0; j<
N; j++)
2757 trans_list_backward[i][trans_list_backward_cnt[i]]=j ;
2758 trans_list_backward_cnt[i]++ ;
2768 #ifdef USE_HMMPARALLEL_STRUCTURES
2778 #else // USE_HMMPARALLEL_STRUCTURES
2784 #endif // USE_HMMPARALLEL_STRUCTURES
2790 while (((value=fgetc(file)) != EOF) && (value!=
'['))
2797 error(
line,
"expected \"[\" in input file");
2799 while (((value=fgetc(file)) != EOF) && (isspace(value)))
2805 ungetc(value, file);
2811 while (((value=fgetc(file)) != EOF) && (value!=
']'))
2818 error(
line,
"expected \"]\" in input file");
2824 while (((value=fgetc(file)) != EOF) && (value!=
',') && (value!=
';') && (value!=
']'))
2831 ungetc(value, file);
2832 SG_ERROR(
"found ']' instead of ';' or ','\n")
2837 error(
line,
"expected \";\" or \",\" in input file");
2839 while (((value=fgetc(file)) != EOF) && (isspace(value)))
2844 ungetc(value, file);
2852 while (((value=fgetc(file)) != EOF) &&
2853 !isdigit(value) && (value!=
'A')
2854 && (value!=
'C') && (value!=
'G') && (value!=
'T')
2855 && (value!=
'N') && (value!=
'n')
2856 && (value!=
'.') && (value!=
'-') && (value!=
'e') && (value!=
']'))
2863 ungetc(value,file) ;
2887 while (((value=fgetc(file)) != EOF) &&
2888 (isdigit(value) || (value==
'.') || (value==
'-') || (value==
'e')
2889 || (value==
'A') || (value==
'C') || (value==
'G')|| (value==
'T')
2890 || (value==
'N') || (value==
'n')) && (i<length))
2906 case '1':
case '2':
case'3':
case '4':
case'5':
2907 case '6':
case '7':
case'8':
case '9':
case '0': break ;
2908 case '.':
case 'e':
case '-': break ;
2910 SG_ERROR(
"found crap: %i %c (pos:%li)\n",i,value,ftell(file))
2914 ungetc(value, file);
2917 return (i<=length) && (i>0);
2959 int32_t received_params=0;
2972 int32_t value=fgetc(file);
2984 if (received_params &
GOTN)
2985 error(
line,
"in model file: \"p double defined\"");
2989 else if (value==
'M')
2991 if (received_params &
GOTM)
2992 error(
line,
"in model file: \"p double defined\"");
2996 else if (value==
'%')
3003 if (received_params &
GOTp)
3004 error(
line,
"in model file: \"p double defined\"");
3010 if (received_params &
GOTq)
3011 error(
line,
"in model file: \"q double defined\"");
3015 else if (value==
'a')
3017 if (received_params &
GOTa)
3018 error(
line,
"in model file: \"a double defined\"");
3022 else if (value==
'b')
3024 if (received_params &
GOTb)
3025 error(
line,
"in model file: \"b double defined\"");
3029 else if (value==
'%')
3039 this->N= atoi(buffer);
3040 received_params|=
GOTN;
3052 this->M= atoi(buffer);
3053 received_params|=
GOTM;
3067 for (i=0; i<this->
N; i++)
3071 for (j=0; j<this->
N ; j++)
3074 if (fscanf( file,
"%le", &f ) != 1)
3090 received_params|=
GOTa;
3101 for (i=0; i<this->
N; i++)
3105 for (j=0; j<this->
M ; j++)
3108 if (fscanf( file,
"%le", &f ) != 1)
3124 received_params|=
GOTb;
3135 for (i=0; i<this->
N ; i++)
3137 if (fscanf( file,
"%le", &f ) != 1)
3147 received_params|=
GOTp;
3158 for (i=0; i<this->
N ; i++)
3160 if (fscanf( file,
"%le", &f ) != 1)
3170 received_params|=
GOTq;
3177 else if (value==
'\n')
3191 SG_WARNING(
"not normalizing anymore, call normalize_hmm to make sure the hmm is valid!!\n")
3261 int32_t received_params=0x0000000;
3288 int32_t value=fgetc(file);
3301 if (fgetc(file)==
'e' && fgetc(file)==
'a' && fgetc(file)==
'r' && fgetc(file)==
'n' && fgetc(file)==
'_')
3318 error(
line,
"a,b,p or q expected in train definition file");
3322 else if (value==
'c')
3324 if (fgetc(file)==
'o' && fgetc(file)==
'n' && fgetc(file)==
's'
3325 && fgetc(file)==
't' && fgetc(file)==
'_')
3342 error(
line,
"a,b,p or q expected in train definition file");
3346 else if (value==
'%')
3350 else if (value==EOF)
3359 bool finished=
false;
3363 SG_DEBUG(
"\nlearn for transition matrix: ")
3379 SG_ERROR(
"invalid value for learn_a(%i,0): %i\n",i/2,(
int)value)
3397 SG_ERROR(
"invalid value for learn_a(%i,1): %i\n",i/2-1,(
int)value)
3422 bool finished=
false;
3426 SG_DEBUG(
"\nlearn for emission matrix: ")
3434 for (int32_t j=0; j<2; j++)
3450 SG_ERROR(
"invalid value for learn_b(%i,0): %i\n",i/2,(
int)value)
3466 SG_ERROR(
"invalid value for learn_b(%i,1): %i\n",i/2-1,(
int)value)
3470 SG_DEBUG(
"%i Entries",(
int)(i/2-1))
3485 bool finished=
false;
3504 SG_ERROR(
"invalid value for learn_p(%i): %i\n",i-1,(
int)value)
3529 bool finished=
false;
3533 SG_DEBUG(
"\nlearn terminal states: ")
3547 SG_ERROR(
"invalid value for learn_q(%i): %i\n",i-1,(
int)value)
3572 bool finished=
false;
3577 SG_DEBUG(
"\nconst for transition matrix: \n")
3579 SG_DEBUG(
"\nconst for transition matrix: ")
3598 SG_ERROR(
"invalid value for const_a(%i,0): %i\n",i/2,(
int)value)
3617 SG_ERROR(
"invalid value for const_a(%i,1): %i\n",i/2-1,(
int)value)
3634 if ((dvalue>1.0) || (dvalue<0.0))
3635 SG_ERROR(
"invalid value for const_a_val(%i): %e\n",(
int)i/2-1,dvalue)
3664 bool finished=
false;
3669 SG_DEBUG(
"\nconst for emission matrix: \n")
3671 SG_DEBUG(
"\nconst for emission matrix: ")
3677 for (int32_t j=0; j<3; j++)
3694 SG_ERROR(
"invalid value for const_b(%i,0): %i\n",i/2-1,(
int)value)
3705 if ((dvalue>1.0) || (dvalue<0.0))
3706 SG_ERROR(
"invalid value for const_b_val(%i,1): %e\n",i/2-1,dvalue)
3730 SG_ERROR(
"invalid value for const_b(%i,1): %i\n",i/2-1, combine)
3732 if (verbose && !finished)
3753 bool finished=
false;
3758 SG_DEBUG(
"\nconst for start states: \n")
3760 SG_DEBUG(
"\nconst for start states: ")
3778 SG_ERROR(
"invalid value for const_p(%i): %i\n",i,(
int)value)
3796 if ((dvalue>1) || (dvalue<0))
3797 SG_ERROR(
"invalid value for const_p_val(%i): %e\n",i,dvalue)
3827 bool finished=
false;
3830 SG_DEBUG(
"\nconst for terminal states: \n")
3832 SG_DEBUG(
"\nconst for terminal states: ")
3850 SG_ERROR(
"invalid value for const_q(%i): %i\n",i,(
int)value)
3867 if ((dvalue>1) || (dvalue<0))
3868 SG_ERROR(
"invalid value for const_q_val(%i): %e\n",i,(
double) dvalue)
3896 else if (value==
'\n')
3968 fprintf(file,
"%s",
"% HMM - specification\n% N - number of states\n% M - number of observation_tokens\n% a is state_transition_matrix\n% size(a)= [N,N]\n%\n% b is observation_per_state_matrix\n% size(b)= [N,M]\n%\n% p is initial distribution\n% size(p)= [1, N]\n\n% q is distribution of end states\n% size(q)= [1, N]\n");
3969 fprintf(file,
"N=%d;\n",N);
3970 fprintf(file,
"M=%d;\n",M);
3972 fprintf(file,
"p=[");
3977 fprintf(file,
"%e,", (
double)
get_p(i));
3979 fprintf(file,
"%f,", NAN_REPLACEMENT);
3983 fprintf(file,
"%e", (
double)
get_p(i));
3985 fprintf(file,
"%f", NAN_REPLACEMENT);
3989 fprintf(file,
"];\n\nq=[");
3994 fprintf(file,
"%e,", (
double)
get_q(i));
3996 fprintf(file,
"%f,", NAN_REPLACEMENT);
4000 fprintf(file,
"%e", (
double)
get_q(i));
4002 fprintf(file,
"%f", NAN_REPLACEMENT);
4005 fprintf(file,
"];\n\na=[");
4009 fprintf(file,
"\t[");
4015 fprintf(file,
"%e,", (
double)
get_a(i,j));
4017 fprintf(file,
"%f,", NAN_REPLACEMENT);
4021 fprintf(file,
"%e];\n", (
double)
get_a(i,j));
4023 fprintf(file,
"%f];\n", NAN_REPLACEMENT);
4028 fprintf(file,
" ];\n\nb=[");
4032 fprintf(file,
"\t[");
4038 fprintf(file,
"%e,", (
double)
get_b(i,j));
4040 fprintf(file,
"%f,", NAN_REPLACEMENT);
4044 fprintf(file,
"%e];\n", (
double)
get_b(i,j));
4046 fprintf(file,
"%f];\n", NAN_REPLACEMENT);
4050 result= (fprintf(file,
" ];\n") == 5);
4064 result[i]=PATH(dim)[i];
4080 fprintf(file,
"%i. path probability:%e\nstate sequence:\n", dim, prob);
4082 fprintf(file,
"%d ", PATH(dim)[i]);
4084 fprintf(file,
"\n\n") ;
4102 fwrite(&prob,
sizeof(
float32_t), 1, file);
4116 fprintf(file,
"%% likelihood of model per observation\n%% P[O|model]=[ P[O|model]_1 P[O|model]_2 ... P[O|model]_dim ]\n%%\n");
4118 fprintf(file,
"P=[");
4129 #define FLOATWRITE(file, value) { float32_t rrr=float32_t(value); fwrite(&rrr, sizeof(float32_t), 1, file); num_floats++;}
4133 int32_t i,j,q, num_floats=0 ;
4145 SG_INFO(
"wrote %i parameters for p\n",N)
4149 SG_INFO(
"wrote %i parameters for q\n",N)
4155 SG_INFO(
"wrote %i parameters for a\n",N*N)
4160 SG_INFO(
"wrote %i parameters for b\n",N*M)
4179 int32_t num_p, num_q, num_a, num_b ;
4187 SG_INFO(
"wrote %i parameters for p\n",num_p)
4192 SG_INFO(
"wrote %i parameters for q\n",num_q)
4204 SG_INFO(
"wrote %i parameters for a\n",num_a)
4215 SG_INFO(
"wrote %i parameters for b\n",num_b)
4239 fprintf(logfile,
"%% lambda denotes the model\n%% O denotes the observation sequence\n%% Q denotes the path\n%% \n%% calculating derivatives of P[O,Q|lambda]=p_{Q1}b_{Q1}(O_1}*a_{Q1}{Q2}b_{Q2}(O2)*...*q_{T-1}{T}b_{QT}(O_T}q_{Q_T} against p,q,a,b\n%%\n");
4240 fprintf(logfile,
"%% dPr[...]=[ [dp_1,...,dp_N,dq_1,...,dq_N, da_11,da_12,..,da_1N,..,da_NN, db_11,.., db_NN]\n");
4241 fprintf(logfile,
"%% [dp_1,...,dp_N,dq_1,...,dq_N, da_11,da_12,..,da_1N,..,da_NN, db_11,.., db_NN]\n");
4242 fprintf(logfile,
"%% ............................. \n");
4243 fprintf(logfile,
"%% [dp_1,...,dp_N,dq_1,...,dq_N, da_11,da_12,..,da_1N,..,da_NN, db_11,.., db_MM]\n");
4244 fprintf(logfile,
"%% ];\n%%\n\ndPr(log()) = [\n");
4253 fprintf(logfile,
"[ ");
4271 fseek(logfile,ftell(logfile)-1,SEEK_SET);
4272 fprintf(logfile,
" ];\n");
4275 fprintf(logfile,
"];");
4285 int32_t num_floats=0 ;
4289 SG_WARNING(
"No definitions loaded -- writing derivatives of all weights\n")
4291 SG_INFO(
"writing derivatives of changed weights only\n")
4367 int32_t num_floats=0 ;
4370 SG_WARNING(
"No definitions loaded -- writing derivatives of all weights\n")
4372 SG_INFO(
"writing derivatives of changed weights only\n")
4374 #ifdef USE_HMMPARALLEL
4376 pthread_t *threads=SG_MALLOC(pthread_t, num_threads);
4377 S_DIM_THREAD_PARAM *params=SG_MALLOC(S_DIM_THREAD_PARAM, num_threads);
4391 #ifdef USE_HMMPARALLEL
4392 if (dim%num_threads==0)
4394 for (i=0; i<num_threads; i++)
4396 if (dim+i<p_observations->get_num_vectors())
4398 params[i].hmm=this ;
4399 params[i].dim=dim+i ;
4400 pthread_create(&threads[i], NULL, bw_dim_prefetch, (
void*)¶ms[i]) ;
4404 for (i=0; i<num_threads; i++)
4406 if (dim+i<p_observations->get_num_vectors())
4407 pthread_join(threads[i], NULL);
4437 SG_INFO(
"Number of parameters (including posterior prob.): %i\n", num_floats)
4468 SG_INFO(
"Number of parameters (including posterior prob.): %i\n", num_floats)
4474 #ifdef USE_HMMPARALLEL
4492 fprintf(file,
"%% lambda denotes the model\n%% O denotes the observation sequence\n%% Q denotes the path\n%%\n%% calculating derivatives of P[O|lambda]=sum_{all Q}p_{Q1}b_{Q1}(O_1}*a_{Q1}{Q2}b_{Q2}(O2)*...*q_{T-1}{T}b_{QT}(O_T}q_{Q_T} against p,q,a,b\n%%\n");
4493 fprintf(file,
"%% dPr[...]=[ [dp_1,...,dp_N,dq_1,...,dq_N, da_11,da_12,..,da_1N,..,da_NN, db_11,.., db_NN]\n");
4494 fprintf(file,
"%% [dp_1,...,dp_N,dq_1,...,dq_N, da_11,da_12,..,da_1N,..,da_NN, db_11,.., db_NN]\n");
4495 fprintf(file,
"%% ............................. \n");
4496 fprintf(file,
"%% [dp_1,...,dp_N,dq_1,...,dq_N, da_11,da_12,..,da_1N,..,da_NN, db_11,.., db_MM]\n");
4497 fprintf(file,
"%% ];\n%%\n\nlog(dPr) = [\n");
4502 fprintf(file,
"[ ");
4520 fseek(file,ftell(file)-1,SEEK_SET);
4521 fprintf(file,
" ];\n");
4525 fprintf(file,
"];");
4571 for (int32_t j=0; j<
M; j++)
4575 set_b(i,j, log(exp(old_b)-delta)) ;
4579 set_b(i,j, log(exp(old_b)+delta)) ;
4583 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4593 SG_INFO(
"deriv_calc[%i]=%e\n",dim,deriv_calc)
4596 SG_ERROR(
"b(%i,%i)=%e db(%i,%i) = %e:%e\t (%1.5f%%)\n", i,j,exp(old_b),i,j, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/deriv_calc)
4613 for (int32_t j=0; j<
N; j++)
4617 set_a(i,j, log(exp(old_a)-delta)) ;
4621 set_a(i,j, log(exp(old_a)+delta)) ;
4625 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4631 SG_DEBUG(
"da(%i,%i) = %e:%e\t (%1.5f%%)\n", i,j, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/deriv_calc)
4637 for (int32_t j=0; j<
M; j++)
4641 set_b(i,j, log(exp(old_b)-delta)) ;
4645 set_b(i,j, log(exp(old_b)+delta)) ;
4649 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4655 SG_DEBUG(
"db(%i,%i) = %e:%e\t (%1.5f%%)\n", i,j, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/(deriv_calc))
4664 set_p(i, log(exp(old_p)-delta)) ;
4668 set_p(i, log(exp(old_p)+delta)) ;
4671 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4678 SG_DEBUG(
"dp(%i) = %e:%e\t (%1.5f%%)\n", i, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/deriv_calc)
4684 set_q(i, log(exp(old_q)-delta)) ;
4688 set_q(i, log(exp(old_q)+delta)) ;
4692 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4699 SG_DEBUG(
"dq(%i) = %e:%e\t (%1.5f%%)\n", i, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/deriv_calc)
4707 bool CHMM::check_path_derivatives()
4718 for (int32_t j=0; j<
N; j++)
4722 set_a(i,j, log(exp(old_a)-delta)) ;
4726 set_a(i,j, log(exp(old_a)+delta)) ;
4730 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4736 SG_DEBUG(
"da(%i,%i) = %e:%e\t (%1.5f%%)\n", i,j, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/deriv_calc)
4741 for (int32_t j=0; j<
M; j++)
4745 set_b(i,j, log(exp(old_b)-delta)) ;
4749 set_b(i,j, log(exp(old_b)+delta)) ;
4753 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4759 SG_DEBUG(
"db(%i,%i) = %e:%e\t (%1.5f%%)\n", i,j, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/(deriv_calc))
4767 set_p(i, log(exp(old_p)-delta)) ;
4771 set_p(i, log(exp(old_p)+delta)) ;
4774 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4781 SG_DEBUG(
"dp(%i) = %e:%e\t (%1.5f%%)\n", i, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/deriv_calc)
4787 set_q(i, log(exp(old_q)-delta)) ;
4791 set_q(i, log(exp(old_q)+delta)) ;
4795 float64_t deriv = (prob_new-prob_old)/(2*delta) ;
4802 SG_DEBUG(
"dq(%i) = %e:%e\t (%1.5f%%)\n", i, deriv_calc, deriv, 100.0*(deriv-deriv_calc)/deriv_calc)
4807 #endif // USE_HMMDEBUG
4848 const int32_t num_states=app_model->
get_N();
4862 for (i=0; i<N+num_states; i++)
4867 for (j=0; j<N+num_states; j++)
4884 n_a[(N+num_states)*j+i]=
get_a(i,j);
4888 n_b[M*i+j]=
get_b(i,j);
4893 for (i=0; i<app_model->
get_N(); i++)
4895 n_q[i+
N]=app_model->
get_q(i);
4897 for (j=0; j<app_model->
get_N(); j++)
4898 n_a[(N+num_states)*(j+
N)+(i+N)]=app_model->
get_a(i,j);
4899 for (j=0; j<app_model->
get_M(); j++)
4900 n_b[M*(i+N)+j]=app_model->
get_b(i,j);
4907 for (j=N; j<N+num_states; j++)
4927 SG_WARNING(
"not normalizing anymore, call normalize_hmm to make sure the hmm is valid!!\n")
4932 SG_ERROR(
"number of observations is different for append model, doing nothing!\n")
4940 const int32_t num_states=app_model->
get_N()+2;
4952 for (i=0; i<N+num_states; i++)
4957 for (j=0; j<N+num_states; j++)
4974 n_a[(N+num_states)*j+i]=
get_a(i,j);
4978 n_b[M*i+j]=
get_b(i,j);
4983 for (i=0; i<app_model->
get_N(); i++)
4985 n_q[i+N+2]=app_model->
get_q(i);
4987 for (j=0; j<app_model->
get_N(); j++)
4988 n_a[(N+num_states)*(j+N+2)+(i+N+2)]=app_model->
get_a(i,j);
4989 for (j=0; j<app_model->
get_M(); j++)
4990 n_b[M*(i+N+2)+j]=app_model->
get_b(i,j);
4998 n_b[M*N+i]=cur_out[i];
4999 n_b[M*(N+1)+i]=app_out[i];
5003 for (i=0; i<N+num_states; i++)
5007 n_a[(N+num_states)*i + N]=0;
5012 n_a[(N+num_states)*N+i]=
get_q(i);
5017 n_a[(N+num_states)*i+(N+1)]=app_model->
get_p(i-(N+2));
5036 SG_WARNING(
"not normalizing anymore, call normalize_hmm to make sure the hmm is valid!!\n")
5065 n_a[(N+num_states)*j+i]=
get_a(i,j);
5068 n_b[M*i+j]=
get_b(i,j);
5071 for (i=N; i<N+num_states; i++)
5079 for (j=0; j<N+num_states; j++)
5107 for (int32_t i=0; i<
N; i++)
5111 if (exp(
get_p(i)) < value)
5114 if (exp(
get_q(i)) < value)
5119 if (exp(
get_a(i,j)) < value)
5125 if (exp(
get_b(i,j)) < value)
5138 int32_t* hist=SG_MALLOC(int32_t, histsize);
5139 int32_t* startendhist=SG_MALLOC(int32_t,
get_N());
5144 for (i=0; i<histsize; i++)
5147 for (i=0; i<
get_N(); i++)
5159 startendhist[(
get_N()-len)]++;
5168 for (i=0; i<
get_N()-1; i++)
5171 for (i=0; i<
get_N(); i++)
5174 for (i=0;i<
get_N();i++)
5176 for (int32_t j=0; j<
get_N(); j++)
5195 hist[i*
get_M() + *obs++]++;
5197 startendhist[len-1]++;
5203 for (i=1; i<
get_N(); i++)
5206 for (i=0; i<
get_N(); i++)
5211 for (i=0;i<
get_N();i++)
5213 total-= startendhist[i] ;
5215 for (int32_t j=0; j<
get_N(); j++)
5226 for (i=0;i<
get_N();i++)
5228 for (int32_t j=0; j<
get_M(); j++)
5241 SG_FREE(startendhist);
5262 #ifdef USE_HMMPARALLEL_STRUCTURES
5286 #endif //USE_HMMPARALLEL_STRUCTURES
5318 #ifdef USE_HMMPARALLEL_STRUCTURES
5342 #endif //USE_HMMPARALLEL_STRUCTURES
5351 #ifdef USE_HMMPARALLEL_STRUCTURES
5364 #endif //USE_HMMPARALLEL_STRUCTURES
5371 #ifdef USE_HMMPARALLEL_STRUCTURES
5372 SG_INFO(
"allocating mem for path-table of size %.2f Megabytes (%d*%d) each:\n", ((
float32_t)max_T)*N*
sizeof(
T_STATES)/(1024*1024), max_T, N)
5376 SG_DEBUG(
"path_table[%i] successfully allocated\n",i)
5378 SG_ERROR(
"failed allocating memory for path_table[%i].\n",i)
5381 #else // no USE_HMMPARALLEL_STRUCTURES
5382 SG_INFO(
"allocating mem of size %.2f Megabytes (%d*%d) for path-table ....", ((
float32_t)max_T)*N*
sizeof(
T_STATES)/(1024*1024), max_T, N)
5389 #endif // USE_HMMPARALLEL_STRUCTURES
5393 #ifdef USE_HMMPARALLEL_STRUCTURES
5397 SG_DEBUG(
"alpha_cache[%i].table successfully allocated\n",i)
5399 SG_ERROR(
"allocation of alpha_cache[%i].table failed\n",i)
5402 SG_DEBUG(
"beta_cache[%i].table successfully allocated\n",i)
5404 SG_ERROR(
"allocation of beta_cache[%i].table failed\n",i)
5406 #else // USE_HMMPARALLEL_STRUCTURES
5408 SG_DEBUG(
"alpha_cache.table successfully allocated\n")
5410 SG_ERROR(
"allocation of alpha_cache.table failed\n")
5413 SG_DEBUG(
"beta_cache.table successfully allocated\n")
5415 SG_ERROR(
"allocation of beta_cache.table failed\n")
5417 #endif // USE_HMMPARALLEL_STRUCTURES
5418 #else // USE_HMMCACHE
5419 #ifdef USE_HMMPARALLEL_STRUCTURES
5425 #else //USE_HMMPARALLEL_STRUCTURES
5428 #endif //USE_HMMPARALLEL_STRUCTURES
5429 #endif //USE_HMMCACHE
5440 ( sequence_number<0 || sequence_number < p_observations->get_num_vectors()))
5442 int32_t min_sequence=sequence_number;
5443 int32_t max_sequence=sequence_number;
5445 if (sequence_number<0)
5449 SG_INFO(
"numseq: %d\n", max_sequence)
5452 SG_INFO(
"min_sequence: %d max_sequence: %d\n", min_sequence, max_sequence)
5453 for (sequence_number=min_sequence; sequence_number<max_sequence; sequence_number++)
5455 int32_t sequence_length=0;
5459 int32_t histsize=
get_M();
5460 int64_t* hist=SG_MALLOC(int64_t, histsize);
5463 for (i=0; i<sequence_length-window_width; i++)
5465 for (j=0; j<histsize; j++)
5468 uint16_t* ptr=&obs[i];
5469 for (j=0; j<window_width; j++)
5475 for (j=0; j<
get_M(); j++)
5480 perm_entropy+=p*log(p);
5499 else if (num_param<2*N)
5501 else if (num_param<N*(N+2))
5503 int32_t k=num_param-2*
N;
5508 else if (num_param<N*(N+2+M))
5510 int32_t k=num_param-N*(N+2);
5523 return get_p(num_param);
5524 else if (num_param<2*N)
5525 return get_q(num_param-N);
5526 else if (num_param<N*(N+2))
5528 else if (num_param<N*(N+2+M))
5590 if (prob_max<prob_train)
5591 prob_max=prob_train;
5594 if (estimate ==
this)