#![feature(test)] extern crate lightmotif; extern crate test; use lightmotif::abc::Dna; use lightmotif::num::ArrayLength; use lightmotif::num::StrictlyPositive; use lightmotif::num::U16; use lightmotif::num::U32; use lightmotif::pli::Maximum; use lightmotif::pli::Pipeline; use lightmotif::pli::Score; use lightmotif::pli::Stripe; use lightmotif::pwm::CountMatrix; use lightmotif::scores::StripedScores; use lightmotif::seq::EncodedSequence; const SEQUENCE: &str = include_str!("ecoli.txt"); mod f32 { use super::*; fn bench + Maximum>( bencher: &mut test::Bencher, pli: &P, ) { let encoded = EncodedSequence::::encode(SEQUENCE).unwrap(); let mut striped = Pipeline::generic().stripe(encoded); let cm = CountMatrix::::from_sequences([ EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(), EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(), ]) .unwrap(); let pbm = cm.to_freq(0.1); let pssm = pbm.to_scoring(None); striped.configure(&pssm); let mut scores = StripedScores::empty(); pli.score_into(&pssm, &striped, &mut scores); bencher.bytes = (std::mem::size_of::() * scores.matrix().rows() * C::USIZE) as u64; bencher.iter(|| { test::black_box(pli.max(&scores)); }); } #[bench] fn generic(bencher: &mut test::Bencher) { let pli = Pipeline::generic(); bench::(bencher, &pli); } #[bench] fn dispatch(bencher: &mut test::Bencher) { let pli = Pipeline::dispatch(); bench(bencher, &pli); } #[cfg(target_feature = "sse2")] #[bench] fn sse2(bencher: &mut test::Bencher) { let pli = Pipeline::sse2().unwrap(); bench::(bencher, &pli); } #[cfg(target_feature = "sse2")] #[bench] fn sse2_32(bencher: &mut test::Bencher) { let pli = Pipeline::sse2().unwrap(); bench::(bencher, &pli); } #[cfg(target_feature = "avx2")] #[bench] fn avx2(bencher: &mut test::Bencher) { let pli = Pipeline::avx2().unwrap(); bench(bencher, &pli); } #[cfg(target_feature = "neon")] #[bench] fn neon(bencher: &mut test::Bencher) { let pli = Pipeline::neon().unwrap(); bench::(bencher, &pli); } } mod u8 { use super::*; fn bench + Maximum>( bencher: &mut test::Bencher, pli: &P, ) { let encoded = EncodedSequence::::encode(SEQUENCE).unwrap(); let mut striped = Pipeline::generic().stripe(encoded); let cm = CountMatrix::::from_sequences([ EncodedSequence::encode("GTTGACCTTATCAAC").unwrap(), EncodedSequence::encode("GTTGATCCAGTCAAC").unwrap(), ]) .unwrap(); let pbm = cm.to_freq(0.1); let pssm = pbm.to_scoring(None); let dm = pssm.to_discrete(); striped.configure(&pssm); let mut scores = StripedScores::empty(); pli.score_into(&dm, &striped, &mut scores); bencher.bytes = (std::mem::size_of::() * scores.matrix().rows() * C::USIZE) as u64; bencher.iter(|| test::black_box(pli.max(&scores))); } #[bench] fn generic(bencher: &mut test::Bencher) { let pli = Pipeline::generic(); bench::(bencher, &pli); } #[bench] fn dispatch(bencher: &mut test::Bencher) { let pli = Pipeline::dispatch(); bench(bencher, &pli); } #[cfg(target_feature = "sse2")] #[bench] fn sse2(bencher: &mut test::Bencher) { let pli = Pipeline::sse2().unwrap(); bench::(bencher, &pli); } #[cfg(target_feature = "sse2")] #[bench] fn sse2_32(bencher: &mut test::Bencher) { let pli = Pipeline::sse2().unwrap(); bench::(bencher, &pli); } #[cfg(target_feature = "avx2")] #[bench] fn avx2(bencher: &mut test::Bencher) { let pli = Pipeline::avx2().unwrap(); bench(bencher, &pli); } #[cfg(target_feature = "neon")] #[bench] fn neon(bencher: &mut test::Bencher) { let pli = Pipeline::neon().unwrap(); bench::(bencher, &pli); } }