vrp_cli/extensions/generate/
mod.rs1mod plan;
4use self::plan::generate_plan;
5
6mod fleet;
7use self::fleet::generate_fleet;
8
9mod prototype;
10use self::prototype::generate_from_prototype;
11
12use std::io::{BufReader, Read};
13use vrp_core::prelude::{Float, GenericError};
14use vrp_core::utils::{DefaultRandom, Random};
15use vrp_pragmatic::format::problem::*;
16
17pub fn generate_problem<R: Read>(
19 input_format: &str,
20 prototype_readers: Option<Vec<BufReader<R>>>,
21 locations_reader: Option<BufReader<R>>,
22 job_size: usize,
23 vehicles_size: usize,
24 area_size: Option<Float>,
25) -> Result<Problem, GenericError> {
26 let locations = if let Some(locations_reader) = locations_reader {
27 Some(deserialize_locations(locations_reader).map_err(|errs| errs.to_string())?)
28 } else {
29 None
30 };
31
32 let problem_proto = match (input_format, prototype_readers) {
33 (_, Some(readers)) if readers.len() != 1 => {
34 Err(format!("expecting one input file, specified: '{}'", readers.len()))
35 }
36 ("pragmatic", Some(mut readers)) if readers.len() == 1 => {
37 deserialize_problem(readers.swap_remove(0)).map_err(|errs| errs.to_string())
38 }
39 _ => Err(format!("unknown format: '{input_format}'")),
40 }?;
41
42 generate_from_prototype(&problem_proto, locations, job_size, vehicles_size, area_size)
43}
44
45fn get_random_item<'a, T>(items: &'a [T], rnd: &DefaultRandom) -> Option<&'a T> {
46 if items.is_empty() {
47 return None;
48 }
49
50 let idx = rnd.uniform_int(0, items.len() as i32 - 1) as usize;
51 items.get(idx)
52}