#bioinformatics #bindings #wavefront #algorithm #affine #allocator #wfa


Bindings to the C implementation of the WFA alignment algorithm

3 releases

0.1.2 Oct 30, 2020
0.1.1 Oct 28, 2020
0.1.0 Oct 28, 2020

#247 in Biology

Download history 9/week @ 2024-02-19 48/week @ 2024-02-26 10/week @ 2024-03-04 15/week @ 2024-03-11 8/week @ 2024-03-18 8/week @ 2024-03-25 72/week @ 2024-04-01

104 downloads per month

MIT license

4.5K SLoC

C 4K SLoC // 0.3% comments Rust 289 SLoC // 0.0% comments Shell 7 SLoC // 0.3% comments


Rust bindings for the wavefront algorithm for pairwise sequence alignment.


This crate will handle compiling the C library, and statically link it.

Just add libwfa to your Cargo dependencies:

libwfa = "0.1"


As a binding, llvm and libclang are required on Unix systems. These can be installed by package managers, for example on Ubuntu with:

sudo apt install llvm
sudo apt install libclang-dev


At this stage, usage maps closely to the C library.

This is equivalent to the basic example from the WFA readme:

use libwfa::{affine_wavefront::*, bindings::*, mm_allocator::*, penalties::*};

fn main() {
    let alloc = MMAllocator::new(BUFFER_SIZE_8M as u64);

    let pattern = String::from("TCTTTACTCGCGCGTTGGAGAAATACAATAGT");

    let mut penalties = AffinePenalties {
        match_: 0,
        mismatch: 4,
        gap_opening: 6,
        gap_extension: 2,

    let pat_len = pattern.as_bytes().len();
    let text_len = text.as_bytes().len();

    let mut wavefronts = AffineWavefronts::new_complete(
        &mut penalties,

        .align(pattern.as_bytes(), text.as_bytes())

    let score = wavefronts.edit_cigar_score(&mut penalties);

    println!("score: {}", score);
    wavefronts.print_cigar(pattern.as_bytes(), text.as_bytes());

    // The cigar can also be extracted as a byte vector
    let cigar = wavefronts.cigar_bytes_raw();
    let cg_str = std::str::from_utf8(&cigar).unwrap();
    println!("cigar: {}", cg_str);

    // Or as a prettier byte vector

    let cigar = wavefronts.cigar_bytes();
    let cg_str = std::str::from_utf8(&cigar).unwrap();
    println!("cigar: {}", cg_str);


See the tests for more examples.

Build from source

Make sure to clone with the WFA submodule:

git clone --recursive https://github.com/chfi/wfa-rs
cd wfa-rs
cargo build


~35K SLoC