///|
/// 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
  }
}