fastsim_core/simdrive/
simdrive_iter.rs

1//! Module containing structs with parallel and serial iteration methods for batch
2//! running of `sim_drive` method
3// crate local
4use super::RustSimDrive;
5use crate::imports::*;
6use crate::proc_macros::add_pyo3_api;
7#[cfg(feature = "pyo3")]
8use crate::pyo3imports::*;
9use rayon::prelude::*;
10
11#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
12#[add_pyo3_api(
13    #[pyo3(name = "sim_drive")]
14    #[pyo3(signature = (parallelize=None))]
15    /// Calls `sim_drive` method for each simdrive instance in vec.
16    /// # Arguments:
17    /// * parallelize: whether to parallelize `sim_drive` calls, defaults to `true`
18    fn sim_drive_py(&mut self, parallelize: Option<bool>) -> anyhow::Result<()> {
19        self.sim_drive(parallelize)
20    }
21
22    #[pyo3(name = "push")]
23    fn push_py(&mut self, sd: RustSimDrive) {
24        self.push(sd)
25    }
26
27    #[pyo3(name = "pop")]
28    fn pop_py(&mut self) -> Option<RustSimDrive> {
29        self.pop()
30    }
31
32    #[pyo3(name = "remove")]
33    fn remove_py(&mut self, idx: usize) {
34        self.remove(idx);
35    }
36
37    #[pyo3(name = "insert")]
38    fn insert_py(&mut self, idx: usize, sd: RustSimDrive) {
39        self.insert(idx, sd);
40    }
41)]
42pub struct SimDriveVec(pub Vec<RustSimDrive>);
43
44impl SimDriveVec {
45    /// Calls `sim_drive` method for each simdrive instance in vec.
46    /// # Arguments:
47    /// * parallelize: whether to parallelize `sim_drive` calls
48    pub fn sim_drive(&mut self, parallelize: Option<bool>) -> anyhow::Result<()> {
49        let parallelize = parallelize.unwrap_or(true);
50        if parallelize {
51            self.0.par_iter_mut().enumerate().try_for_each(|(i, sd)| {
52                sd.sim_drive(None, None)
53                    .with_context(|| format!("simdrive idx: {}", i))
54            })?;
55        } else {
56            self.0.iter_mut().enumerate().try_for_each(|(i, sd)| {
57                sd.sim_drive(None, None)
58                    .with_context(|| format!("simdrive idx: {}", i))
59            })?;
60        }
61        Ok(())
62    }
63
64    pub fn push(&mut self, sd: RustSimDrive) {
65        self.0.push(sd);
66    }
67
68    pub fn pop(&mut self) -> Option<RustSimDrive> {
69        self.0.pop()
70    }
71
72    pub fn remove(&mut self, idx: usize) {
73        self.0.remove(idx);
74    }
75
76    pub fn insert(&mut self, idx: usize, sd: RustSimDrive) {
77        self.0.insert(idx, sd);
78    }
79}
80
81impl SerdeAPI for SimDriveVec {}