rant_simulator/scan/generators/
mod.rs

1use super::{ParallelVectorGenerator, VectorGenerator};
2
3pub struct ScanOptions {
4    pub resolutions: Vec<usize>,
5}
6
7pub struct VectorGenerator1D {
8    pub resolution: usize,
9}
10
11impl VectorGenerator for VectorGenerator1D {
12    type Vector = (usize, usize);
13
14    fn generate_scan_vectors(self) -> impl Iterator<Item = Self::Vector> {
15        (0..=self.resolution).map(move |p| (p, self.resolution))
16    }
17
18    fn size_hint(&self) -> usize {
19        self.resolution + 1
20    }
21}
22
23pub struct VectorGenerator2D {
24    pub resolution: (usize, usize),
25}
26
27impl VectorGenerator for VectorGenerator2D {
28    type Vector = [(usize, usize); 2];
29
30    fn generate_scan_vectors(self) -> impl Iterator<Item = Self::Vector> {
31        let (resolution_x, resolution_y) = self.resolution;
32        (0..=resolution_x).flat_map(move |x| {
33            (0..=resolution_y).map(move |y| [(x, resolution_x), (y, resolution_y)])
34        })
35    }
36
37    fn size_hint(&self) -> usize {
38        (self.resolution.0 + 1) * (self.resolution.1 + 1)
39    }
40}
41
42// TODO: maybe allow chunking by y?
43#[derive(Debug, Clone)]
44pub struct ParallelVectorGenerator2D {
45    pub resolution: (usize, usize),
46}
47
48impl ParallelVectorGenerator for ParallelVectorGenerator2D {
49    type Vector = [(usize, usize); 2];
50
51    fn generate_scan_vectors(self) -> impl Iterator<Item = impl Iterator<Item = Self::Vector>> {
52        let (resolution_chunks, resolution_points) = self.resolution;
53        (0..=resolution_chunks).map(move |x| {
54            (0..=resolution_points).map(move |y| [(x, resolution_chunks), (y, resolution_points)])
55        })
56    }
57
58    fn num_chunks(&self) -> usize {
59        self.resolution.0 + 1
60    }
61
62    fn size_hint(&self) -> usize {
63        (self.resolution.0 + 1) * (self.resolution.1 + 1)
64    }
65}