/*********************************************************************** * Normalize an array in log space. ***********************************************************************/ void log_normalize (ATYPE close_enough, ARRAY_T* array) { int i_item; int num_items; ATYPE total; ATYPE this_value; /* Get the sum of the elements. */ total = log_array_total(array); /* If the array already sums to zero, don't bother. */ if (almost_equal(total, 0.0, close_enough)) { return; } /* If there's nothing in the array, then return all zeroes. */ if (total < LOG_SMALL) { init_array(LOG_ZERO, array); return; } num_items = get_array_length(array); for (i_item = 0; i_item < num_items; i_item++) { this_value = get_array_item(i_item, array) - total; /* If this value is small enough, just make it zero. */ if (this_value < LOG_SMALL) { set_array_item(i_item, LOG_ZERO, array); } else { set_array_item(i_item, this_value, array); } } }
BOOLEAN_T verify_trans_matrix (BOOLEAN_T log_form, /* Is the transition matrix in log form? */ int num_states, /* Number of states in the (square) matrix. */ MATRIX_T* trans) /* The matrix. */ { int i_state; PROB_T total; for (i_state = 0; i_state < num_states - 1; i_state++) { /* Cf. Rabiner, formula (43b), p. 265. */ if (log_form) { total = log_array_total(get_matrix_row(i_state, trans)); if ((!almost_equal(total, 0.0, SLOP)) && (!almost_equal(total, 1.0, SLOP)) && // Allow for FIMS. (!almost_equal(EXP2(total), 0.0, SLOP))) { fprintf(stderr, "Warning: Row %d of transition matrix differs from 0.0 by %g.\n", i_state, EXP2(total)); return(FALSE); } } else { total = array_total(get_matrix_row(i_state, trans)); if ((!almost_equal(total, 1.0, SLOP)) && (!almost_equal(total, 2.0, SLOP)) && // Allow FIMs. (!almost_equal(total, 0.0, SLOP))) { // Allow inaccessible motifs. fprintf(stderr, "Warning: Row %d of transition matrix differs from 1.0 by %g.\n", i_state, 1.0 - total); return(FALSE); } } /* All transitions from the end state must be zero. */ if ((log_form) && (get_matrix_cell(num_states - 1, i_state, trans) > LOG_SMALL)) { fprintf(stderr, "Warning: Transition %d from end state is non-zero (%g).\n", i_state, get_matrix_cell(num_states - 1, i_state, trans)); return(FALSE); } else if (!(log_form) && (!almost_equal(get_matrix_cell(num_states - 1, i_state, trans), 0.0, SLOP))) { fprintf(stderr, "Warning: Transition %d from end state is non-zero (%g).\n", i_state, get_matrix_cell(num_states - 1, i_state, trans)); return(FALSE); } } return(TRUE); }