vrp_cli/extensions/generate/
mod.rs

1//! Generate command helpers.
2
3mod 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
17/// Generates a pragmatic problem.
18pub 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}