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
10/// Imports an instance into the library
11pub 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        items.retain(|(_, demand)| *demand > 0);
25
26        ensure!(
27            items.iter().enumerate().all(|(i, (item, _))| item.id == i),
28            "All items should have consecutive IDs starting from 0. IDs: {:?}",
29            items.iter().map(|(item, _)| item.id).sorted().collect_vec()
30        );
31        ensure!(
32            !items.is_empty(),
33            "ExtBPInstance must have at least one item with positive demand"
34        );
35
36        items
37    };
38
39    let bins = {
40        let mut bins: Vec<Bin> = ext_instance
41            .bins
42            .par_iter()
43            .map(|ext_bin| {
44                let container = importer.import_container(&ext_bin.base)?;
45                Ok(Bin::new(container, ext_bin.stock, ext_bin.cost))
46            })
47            .collect::<Result<Vec<Bin>>>()?;
48
49        bins.sort_by_key(|bin| bin.id);
50        bins.retain(|bin| bin.stock > 0);
51        ensure!(
52            bins.iter().enumerate().all(|(i, bin)| bin.id == i),
53            "All bins should have consecutive IDs starting from 0. IDs: {:?}",
54            bins.iter().map(|bin| bin.id).sorted().collect_vec()
55        );
56        ensure!(
57            !bins.is_empty(),
58            "ExtBPInstance must have at least one bin with positive stock"
59        );
60
61        bins
62    };
63
64    Ok(BPInstance::new(items, bins))
65}