use omicsx::protein::{AminoAcid, Protein};
use omicsx::scoring::{ScoringMatrix, MatrixType};
use omicsx::alignment::SmithWaterman;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== NEON-Optimized Alignment Example ===\n");
let seq1_str = "MVHLTPEEKS";
let seq2_str = "MGHLTPEEKS";
println!("Sequence 1: {}", seq1_str);
println!("Sequence 2: {}\n", seq2_str);
let seq1 = Protein::from_string(seq1_str)?;
let seq2 = Protein::from_string(seq2_str)?;
let matrix = ScoringMatrix::new(MatrixType::Blosum62)?;
let aligner = SmithWaterman::with_matrix(matrix);
let result = aligner.align(&seq1, &seq2)?;
println!("Alignment Score: {}", result.score);
println!("Identity: {:.1}%\n", result.identity());
let mut result_with_cigar = result.clone();
result_with_cigar.generate_cigar();
println!("CIGAR: {}", result_with_cigar.cigar);
if cfg!(target_arch = "aarch64") {
println!("\n✓ Running on ARM64 with NEON acceleration");
} else {
println!("\n✓ Running on non-ARM system using scalar implementation");
println!(" (For NEON acceleration, compile and run on aarch64 hardware)");
}
println!("\n=== Batch Processing Example ===\n");
use omicsx::alignment::batch::*;
let reference_seq = "MVHLTPEEKS";
let batch_aligner =
BatchSmithWaterman::new(reference_seq, BatchConfig::new().with_threads(4))?;
let queries = vec![
BatchQuery {
name: "query1".to_string(),
sequence: "MGHLTPEEKS".to_string(),
},
BatchQuery {
name: "query2".to_string(),
sequence: "MVHLTPEEKS".to_string(),
},
BatchQuery {
name: "query3".to_string(),
sequence: "MVXLTPEEKS".to_string(),
},
];
let results = batch_aligner.align_batch(queries)?;
println!("Processed {} queries:", results.len());
for result in &results {
println!(
" {}: score={}, identity={:.1}%",
result.query_name,
result.alignment.score,
result.alignment.identity()
);
}
let high_scoring = BatchSmithWaterman::filter_by_score(&results, 40);
println!("\nHigh-scoring results (score >= 40): {}", high_scoring.len());
let high_identity = BatchSmithWaterman::filter_by_identity(&results, 80.0);
println!("High-identity results (>= 80% identity): {}", high_identity.len());
println!("\n=== Performance Notes ===");
println!("NEON Alignment Characteristics:");
println!(" • 128-bit vectors: 4× int32 parallelism");
println!(" • Anti-diagonal approach: Independent cell computation");
println!(" • Expected speedup: 2-4× over scalar on ARM64");
println!(" • Platforms: AWS Graviton, Apple Silicon, Ampere, Raspberry Pi 4/5");
Ok(())
}