tract_core/axes/
mod.rs

1use crate::internal::*;
2
3mod mapping;
4mod model;
5
6pub use mapping::AxesMapping;
7pub use model::{for_model, full_axis_tracking};
8
9#[derive(Debug, Clone, PartialEq, Eq, Default, Hash)]
10pub struct Axis {
11    pub inputs: TVec<TVec<usize>>,
12    pub outputs: TVec<TVec<usize>>,
13    pub repr: char,
14}
15
16impl Axis {
17    pub fn new(repr: char, inputs: usize, outputs: usize) -> Axis {
18        Axis { repr, inputs: tvec!(tvec!(); inputs), outputs: tvec!(tvec!(); outputs) }
19    }
20
21    pub fn natural(inputs: usize, outputs: usize, repr: char, axis_id: usize) -> Axis {
22        let inputs = tvec!(tvec!(axis_id); inputs);
23        let outputs = tvec!(tvec!(axis_id); outputs);
24        Axis { inputs, outputs, repr }
25    }
26
27    #[allow(dead_code)]
28    pub fn input(mut self, input_id: usize, axis: usize) -> Axis {
29        self.add_input(input_id, axis);
30        self
31    }
32
33    pub fn output(mut self, output_id: usize, axis: usize) -> Axis {
34        self.add_output(output_id, axis);
35        self
36    }
37
38    pub fn inputs_count(mut self, inputs: usize) -> Axis {
39        self.inputs.resize(inputs, tvec!());
40        self
41    }
42
43    pub fn outputs_count(mut self, outputs: usize) -> Axis {
44        self.outputs.resize(outputs, tvec!());
45        self
46    }
47
48    pub fn ensure_inputs_count(&mut self, inputs: usize) {
49        if self.inputs.len() < inputs {
50            self.inputs.resize(inputs, tvec!())
51        }
52    }
53
54    pub fn ensure_outputs_count(&mut self, outputs: usize) {
55        if self.outputs.len() < outputs {
56            self.outputs.resize(outputs, tvec!())
57        }
58    }
59
60    pub fn add_input(&mut self, input_id: usize, axis: usize) {
61        self.ensure_inputs_count(input_id + 1);
62        self.inputs[input_id].push(axis);
63    }
64
65    pub fn add_output(&mut self, output_id: usize, axis: usize) {
66        self.ensure_outputs_count(output_id + 1);
67        self.outputs[output_id].push(axis);
68    }
69
70    pub fn interface(&self, io: InOut) -> &[usize] {
71        match io {
72            InOut::In(ix) => &self.inputs[ix],
73            InOut::Out(ix) => &self.outputs[ix],
74        }
75    }
76}