sigalign_core/aligner/local/
local_unlimited.rs1use 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 pub fn new(regulator: AlignmentRegulator) -> Self {
20 let workspace = LocalWorkspace::init(®ulator);
21 Self {
22 regulator,
23 workspace,
24 }
25 }
26 #[inline]
28 pub fn align<I: PatternIndex, S: SequenceStorage> (
29 &mut self,
30 query: &[u8],
32 reference: &Reference<I, S>,
34 sequence_buffer: &mut S::Buffer,
35 sorted_target_indices: &[u32],
36 ) -> QueryAlignment {
37 self.workspace.allocate_more_space_if_needed(
39 query.len() as u32,
40 &self.regulator,
41 );
42
43 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}