jagua_rs/probs/bpp/io/
import.rs1use 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
9pub 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#[must_use]
65pub fn import_solution(_instance: &BPInstance, _ext_solution: &ExtBPInstance) -> BPSolution {
66 unimplemented!("not yet implemented")
67}