jagua_rs/probs/spp/io/
import.rs1use crate::entities::Item;
2use crate::geometry::shape_modification::ShapeModifyConfig;
3use crate::io::import::Importer;
4use crate::probs::spp::entities::{SPInstance, Strip};
5use crate::probs::spp::io::ext_repr::ExtSPInstance;
6use anyhow::{Result, ensure};
7use itertools::Itertools;
8use rayon::prelude::*;
9
10pub fn import(importer: &Importer, ext_instance: &ExtSPInstance) -> Result<SPInstance> {
12 let items: Vec<(Item, usize)> = {
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 total_item_area = items
33 .iter()
34 .map(|(item, demand)| item.area() * *demand as f32)
35 .sum::<f32>();
36
37 let fixed_height = ext_instance.strip_height;
38
39 let width = total_item_area / fixed_height;
41
42 let base_strip = Strip {
43 fixed_height,
44 cde_config: importer.cde_config,
45 shape_modify_config: ShapeModifyConfig {
46 offset: importer.shape_modify_config.offset,
47 simplify_tolerance: None,
48 },
49 width,
50 };
51
52 Ok(SPInstance::new(items, base_strip))
53}