brk_computer/
lib.rs

1#![doc = include_str!("../README.md")]
2#![doc = "\n## Example\n\n```rust"]
3#![doc = include_str!("../examples/main.rs")]
4#![doc = "```"]
5
6use std::path::{Path, PathBuf};
7
8use brk_core::Version;
9use brk_exit::Exit;
10use brk_fetcher::Fetcher;
11use brk_indexer::Indexer;
12use brk_vec::{AnyCollectableVec, Computation, Format};
13
14mod stores;
15mod utils;
16mod vecs;
17
18use log::info;
19use stores::Stores;
20use vecs::Vecs;
21
22#[derive(Clone)]
23pub struct Computer {
24    path: PathBuf,
25    fetcher: Option<Fetcher>,
26    vecs: Option<Vecs>,
27    stores: Option<Stores>,
28    format: Format,
29}
30
31const VERSION: Version = Version::ONE;
32
33impl Computer {
34    pub fn new(outputs_dir: &Path, fetcher: Option<Fetcher>, format: Format) -> Self {
35        Self {
36            path: outputs_dir.to_owned(),
37            fetcher,
38            vecs: None,
39            stores: None,
40            format,
41        }
42    }
43
44    pub fn import_vecs(
45        &mut self,
46        indexer: &Indexer,
47        computation: Computation,
48    ) -> color_eyre::Result<()> {
49        self.vecs = Some(Vecs::import(
50            // TODO: Give self.path, join inside import
51            &self.path.join("vecs/computed"),
52            VERSION + Version::ZERO,
53            indexer,
54            self.fetcher.is_some(),
55            computation,
56            self.format,
57        )?);
58        Ok(())
59    }
60
61    /// Do NOT import multiple times or things will break !!!
62    /// Clone struct instead
63    pub fn import_stores(&mut self, indexer: &Indexer) -> color_eyre::Result<()> {
64        self.stores = Some(Stores::import(
65            // TODO: Give self.path, join inside import
66            &self.path.join("stores"),
67            VERSION + Version::ZERO,
68            indexer.keyspace(),
69        )?);
70        Ok(())
71    }
72}
73
74impl Computer {
75    pub fn compute(
76        &mut self,
77        indexer: &mut Indexer,
78        starting_indexes: brk_indexer::Indexes,
79        exit: &Exit,
80    ) -> color_eyre::Result<()> {
81        info!("Computing...");
82        self.vecs
83            .as_mut()
84            .unwrap()
85            .compute(indexer, starting_indexes, self.fetcher.as_mut(), exit)
86    }
87
88    pub fn vecs(&self) -> Vec<&dyn AnyCollectableVec> {
89        // pub fn vecs(&self) -> &Vecs {
90        self.vecs.as_ref().unwrap().vecs()
91    }
92
93    // pub fn mut_vecs(&mut self) -> &mut Vecs {
94    //     self.vecs.as_mut().unwrap()
95    // }
96
97    pub fn stores(&self) -> &Stores {
98        self.stores.as_ref().unwrap()
99    }
100
101    pub fn mut_stores(&mut self) -> &mut Stores {
102        self.stores.as_mut().unwrap()
103    }
104}