Skip to main content

jagua_rs/probs/bpp/io/
import.rs

1use crate::io::import::Importer;
2use crate::probs::bpp::entities::{BPInstance, BPSolution, Bin};
3use crate::probs::bpp::io::ext_repr::ExtBPInstance;
4use itertools::Itertools;
5use rayon::prelude::*;
6
7use anyhow::{Result, ensure};
8
9/// Imports an instance into the library
10pub fn import_instance(importer: &Importer, ext_instance: &ExtBPInstance) -> Result<BPInstance> {
11    let importer = importer.with_min_item_separation(ext_instance.min_item_separation)?;
12    ensure!(
13        ext_instance
14            .items
15            .iter()
16            .map(|item| item.base.id)
17            .all_unique(),
18        "item IDs must be unique"
19    );
20    let items = ext_instance
21        .items
22        .iter()
23        .filter(|item| item.demand > 0)
24        .collect_vec()
25        .into_par_iter()
26        .enumerate()
27        .map(|(idx, item)| {
28            Ok((
29                importer.import_item(&item.base, idx)?,
30                usize::try_from(item.demand)?,
31            ))
32        })
33        .collect::<Result<Vec<_>>>()?;
34    ensure!(!items.is_empty(), "instance must have positive item demand");
35
36    let bins = {
37        let mut entries = ext_instance.bins.iter().collect_vec();
38        entries.sort_by_key(|bin| bin.base.id);
39        ensure!(
40            entries.windows(2).all(|w| w[0].base.id != w[1].base.id),
41            "bin IDs must be unique"
42        );
43        entries.retain(|bin| bin.stock > 0);
44        ensure!(!entries.is_empty(), "instance must have positive bin stock");
45        entries
46            .par_iter()
47            .enumerate()
48            .map(|(idx, bin)| {
49                Ok(Bin::new(
50                    idx,
51                    bin.base.id,
52                    importer.import_container(&bin.base)?,
53                    bin.stock,
54                    bin.cost,
55                ))
56            })
57            .collect::<Result<Vec<_>>>()?
58    };
59
60    Ok(BPInstance::new(items, bins))
61}
62
63/// Imports a solution into the library.
64#[must_use]
65pub fn import_solution(_instance: &BPInstance, _ext_solution: &ExtBPInstance) -> BPSolution {
66    unimplemented!("not yet implemented")
67}