use std::{num::ParseIntError, path::Path, fs::File, io::{BufReader, BufRead}};
#[derive(Debug, Clone)]
pub struct AlpInstance {
pub nb_classes: usize,
pub nb_aircrafts: usize,
pub nb_runways: usize,
pub classes: Vec<usize>,
pub target: Vec<isize>,
pub latest: Vec<isize>,
pub separation: Vec<Vec<isize>>,
}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("io error {0}")]
Io(#[from] std::io::Error),
#[error("parse int {0}")]
ParseInt(#[from] ParseIntError),
}
pub fn read_instance<P: AsRef<Path>>(fname: P) -> Result<AlpInstance, Error> {
let f = File::open(fname)?;
let f = BufReader::new(f);
let lines = f.lines();
let mut data = vec![];
for line in lines {
let line = line?;
let mut numbers = line.split_ascii_whitespace().map(|x| x.parse::<usize>().unwrap()).collect::<Vec<usize>>();
data.append(&mut numbers);
}
let nb_aircrafts = data[0];
let nb_classes = data[1];
let nb_runways = data[2];
let mut target = vec![];
let mut latest = vec![];
let mut classes = vec![];
let mut cnt = 3;
for _ in 0..nb_aircrafts {
target.push(data[cnt] as isize);
latest.push(data[cnt + 1] as isize);
classes.push(data[cnt + 2]);
cnt += 3;
}
let mut separation = vec![];
for _ in 0..nb_classes {
let mut sep = vec![];
for _ in 0..nb_classes {
sep.push(data[cnt] as isize);
cnt += 1;
}
separation.push(sep);
}
Ok(AlpInstance { nb_classes, nb_aircrafts, nb_runways, classes, target, latest, separation })
}