sigalign_core/aligner/local/
local_unlimited.rs

1use crate::results::QueryAlignment;
2use crate::reference::{
3    Reference, PatternIndex, SequenceStorage,
4};
5use crate::algorithm::local_alignment_algorithm;
6use super::{
7    AlignmentRegulator,
8    LocalWorkspace,
9};
10
11#[derive(Clone)]
12pub struct LocalAligner {
13    pub(super) regulator: AlignmentRegulator,
14    pub(super) workspace: LocalWorkspace,
15}
16
17impl LocalAligner {
18    /// Create a new Aligner from alignment regulator
19    pub fn new(regulator: AlignmentRegulator) -> Self {
20        let workspace = LocalWorkspace::init(&regulator);
21        Self {
22            regulator,
23            workspace,
24        }
25    }
26    /// Low-level alignment function
27    #[inline]
28    pub fn align<I: PatternIndex, S: SequenceStorage> (
29        &mut self,
30        // Query
31        query: &[u8],
32        // Targets
33        reference: &Reference<I, S>,
34        sequence_buffer: &mut S::Buffer,
35        sorted_target_indices: &[u32],
36    ) -> QueryAlignment {
37        // Initialization
38        self.workspace.allocate_more_space_if_needed(
39            query.len() as u32,
40            &self.regulator,
41        );
42        
43        // Perform alignment
44        let mut result = local_alignment_algorithm(
45            reference,
46            sequence_buffer,
47            query,
48            sorted_target_indices,
49            self.regulator.pattern_size,
50            &self.regulator.penalties,
51            &self.regulator.cutoff,
52            &mut self.workspace.spare_penalty_calculator,
53            &mut self.workspace.wave_front_buffer_1.as_mut(),
54            &mut self.workspace.wave_front_buffer_2.as_mut(),
55            &mut self.workspace.left_vpc_buffer,
56            &mut self.workspace.right_vpc_buffer,
57            &mut self.workspace.traversed_anchors_buffer,
58            &mut self.workspace.operations_buffer,
59        );
60        self.regulator.decompress_result_with_gcd(&mut result);
61        result
62    }
63    pub fn regulator(&self) -> &AlignmentRegulator {
64        &self.regulator
65    }
66}