/* constantHMM - * Initialises an HMM with constant transition log probabilities. */ void constantHMM(Hmm *m, int upper_triangular) { int u, v; zeroHMM(m); for (u = 0; u<m->uu; u++) { VECTOR(m->logB)[u] = 0; for (v = upper_triangular?u:0; v<m->uu; v++) MATRIX(m->logA)[u][v] = 0;} normaliseHMM(m, upper_triangular);}
/* randomiseHMM - * Initialises an HMM with normalised random transition log probabilities. */ void randomiseHMM(Hmm *m, int upper_triangular) { int u, v; zeroHMM(m); for (u = 0; u<m->uu; u++) { VECTOR(m->logB)[u] = my_log(RANDOM); for (v = upper_triangular?u:0; v<m->uu; v++) { MATRIX(m->logA)[u][v] = my_log(RANDOM);}} normaliseHMM(m, upper_triangular);}
/* Add noise to m */ void noiseHMM(Hmm *m, int upper_triangular, Real delta){ int u, v; for (u = 0; u < m->uu; u ++){ VECTOR(m->logB)[u] = add_exp(VECTOR(m->logB)[u], my_log(delta * RANDOM)); for (v = (upper_triangular? u: 0); v < m->uu; v ++){ MATRIX(m->logA)[u][v] = add_exp(MATRIX(m->logA)[u][v], my_log(delta * RANDOM)); } } normaliseHMM(m, upper_triangular); }
void smoothHMM(Hmm *m, int upper_triangular, Real eps){ int u, v; for (u = 0; u < m->uu; u ++){ if (VECTOR(m->logB)[u] == NEGATIVE_INFINITY) VECTOR(m->logB)[u] = my_log(eps); for (v = (upper_triangular? u: 0); v < m->uu; v ++) if (MATRIX(m->logA)[u][v] == NEGATIVE_INFINITY) MATRIX(m->logA)[u][v] = my_log(eps); } normaliseHMM(m, upper_triangular); }