///|
/// Hidden Markov Model Demo - Gene Prediction
///
/// This demo shows how to use HMM for gene prediction and sequence analysis.
fn main {
println("=== Hidden Markov Model (HMM) Demo ===")
println("")
println("1. Create gene prediction HMM:")
let hmm = @src.create_gene_prediction_hmm()
println(" States: \{Repr(hmm.states)}")
println(" Observations: \{Repr(hmm.observations)}")
println("")
println("2. Forward algorithm - compute probability:")
let obs = ["A", "T", "C", "G"]
let prob = hmm.forward(obs)
println(" Observation: \{Repr(obs)}")
println(" Probability: \{prob}")
println("")
println("3. Backward algorithm:")
let beta = hmm.backward(obs)
println(" Number of states: \{beta.length()}")
println("")
println("4. Viterbi algorithm - most probable state sequence:")
let path = hmm.viterbi(obs)
println(" Observation: \{Repr(obs)}")
println(" State path: \{Repr(path)}")
println("")
println("5. Gene prediction on DNA sequence:")
let dna = "AAATTTCCCGGGAAATTT"
println(" DNA: \{dna}")
let prediction = @src.predict_genes(hmm, dna)
println(" Prediction: \{Repr(prediction)}")
println("")
println("6. Extract exons from prediction:")
let exons = @src.extract_exons(prediction, dna)
println(" Exons found: \{exons.length()}")
for i = 0; i < exons.length(); i = i + 1 {
println(" Exon \{i}: \{exons[i]}")
}
println("")
println("7. Baum-Welch training:")
let training_obs = ["A", "T", "C", "G", "A", "T", "C", "G"]
let trained_hmm = hmm.baum_welch(training_obs, 10, 0.000001)
println(" Training observations: \{Repr(training_obs)}")
println(" Trained states: \{trained_hmm.states.length()}")
println("")
println("8. Predict on trained model:")
let trained_prediction = @src.predict_genes(trained_hmm, "ATCG")
println(" DNA: ATCG")
println(" Prediction: \{Repr(trained_prediction)}")
println("")
println("=== Demo Complete ===")
}