///|
/// Machine learning feature extraction example.
///
/// Demonstrates extracting features from DNA and protein sequences
/// for machine learning tasks.
///
/// Run: moon run examples/ml_features/main.mbt
fn main {
let dna_seq = "ATGGCCATTGTAATGGGCCGCTGAAAGGGTGCCCGATAG"
println("=== DNA Sequence Features ===")
println("Sequence: \{dna_seq}")
println("Length: \{dna_seq.length()}")
let comp = @bio.nucleotide_composition(dna_seq)
println("\nNucleotide Composition:")
println(" A: \{comp.a}")
println(" T: \{comp.t}")
println(" G: \{comp.g}")
println(" C: \{comp.c}")
println(" GC content: \{comp.g + comp.c}")
let kmer2 = @bio.kmer_frequency(dna_seq, 2, true)
let kmer3 = @bio.kmer_frequency(dna_seq, 3, true)
let kmer4 = @bio.kmer_frequency(dna_seq, 4, true)
println("\nk-mer Frequency:")
println(" Dinucleotides: \{kmer2.keys().count()} unique")
println(" Trinucleotides: \{kmer3.keys().count()} unique")
println(" Tetranucleotides: \{kmer4.keys().count()} unique")
let dinuc_keys = kmer2.keys().collect()
let dinuc_limit = min_int(dinuc_keys.length(), 5)
for i in 0.. 0.0 {
println(" \{aa_order[i].to_char().unwrap_or('?')}: \{val}")
}
}
let dipep = @bio.dipeptide_composition(prot_seq)
let tripep = @bio.tripeptide_composition(prot_seq)
println("\nDipeptide Composition: \{dipep.keys().count()} unique")
println("Tripeptide Composition: \{tripep.keys().count()} unique")
let avg_h = @bio.avg_hydrophobicity(prot_seq)
let avg_c = @bio.avg_charge(prot_seq)
let avg_p = @bio.avg_polarity(prot_seq)
let mw = @bio.molecular_weight(prot_seq)
println("\nPhysical-Chemical Properties:")
println(" Average Hydrophobicity: \{avg_h}")
println(" Average Charge: \{avg_c}")
println(" Average Polarity: \{avg_p}")
println(" Molecular Weight: \{mw}")
let (h, s, c) = @bio.secondary_structure_propensity(prot_seq)
println("\nSecondary Structure Propensity (Chou-Fasman):")
println(" Helix: \{h}")
println(" Sheet: \{s}")
println(" Coil: \{c}")
let pos_feat = @bio.position_specific_features(prot_seq, 5)
println("\nPosition-Specific Features (5 positions):")
println(" Features: \{pos_feat.length()}")
let prot_features = @bio.protein_feature_vector(prot_seq)
let prot_names = @bio.protein_feature_names()
println("\nProtein Feature Vector:")
println(" Dimensions: \{prot_features.length()}")
println("\nFirst 20 features (amino acid composition):")
let prot_limit = min_int(20, prot_features.length())
for i in 0.. Int32 {
if a < b {
a
} else {
b
}
}