jagua_rs/probs/bpp/io/
import.rs
1use crate::entities::Item;
2use crate::io::import::Importer;
3use crate::probs::bpp::entities::{BPInstance, Bin};
4use crate::probs::bpp::io::ext_repr::ExtBPInstance;
5use itertools::Itertools;
6use rayon::prelude::*;
7
8use anyhow::{Result, ensure};
9
10pub fn import(importer: &Importer, ext_instance: &ExtBPInstance) -> Result<BPInstance> {
12 let items = {
13 let mut items = ext_instance
14 .items
15 .par_iter()
16 .map(|ext_item| {
17 let item = importer.import_item(&ext_item.base)?;
18 let demand = ext_item.demand as usize;
19 Ok((item, demand))
20 })
21 .collect::<Result<Vec<(Item, usize)>>>()?;
22
23 items.sort_by_key(|(item, _)| item.id);
24 ensure!(
25 items.iter().enumerate().all(|(i, (item, _))| item.id == i),
26 "All items should have consecutive IDs starting from 0. IDs: {:?}",
27 items.iter().map(|(item, _)| item.id).sorted().collect_vec()
28 );
29 items
30 };
31
32 let bins = {
33 let mut bins: Vec<Bin> = ext_instance
34 .bins
35 .par_iter()
36 .map(|ext_bin| {
37 let container = importer.import_container(&ext_bin.base)?;
38 Ok(Bin::new(container, ext_bin.stock, ext_bin.cost))
39 })
40 .collect::<Result<Vec<Bin>>>()?;
41
42 bins.sort_by_key(|bin| bin.id);
43 ensure!(
44 bins.iter().enumerate().all(|(i, bin)| bin.id == i),
45 "All bins should have consecutive IDs starting from 0. IDs: {:?}",
46 bins.iter().map(|bin| bin.id).sorted().collect_vec()
47 );
48 bins
49 };
50
51 Ok(BPInstance::new(items, bins))
52}