use log::{error, info};
use osmgraphing::{
configs,
helpers::{err, init_logging},
io::network::graph::Parser,
network::NodeIdx,
routing::dijkstra::{self, Dijkstra},
};
use std::{path::PathBuf, time::Instant};
fn main() {
init_logging("INFO", &["dijkstra"]).expect("LogLevel 'INFO' does exist.");
let result = run();
if let Err(msg) = result {
error!("{}", msg);
panic!("{}", msg);
}
}
fn run() -> err::Feedback {
info!("Executing example: Dijkstra");
let raw_cfg = PathBuf::from("resources/simple_stuttgart/fmi.yaml");
let parsing_cfg = configs::parsing::Config::try_from_yaml(&raw_cfg)?;
let now = Instant::now();
let graph = Parser::parse_and_finalize(parsing_cfg)?;
info!(
"Finished parsing in {} seconds ({} µs).",
now.elapsed().as_secs(),
now.elapsed().as_micros(),
);
info!("");
info!("{}", graph);
let routing_cfg = configs::routing::Config::try_from_yaml(&raw_cfg, graph.cfg())?;
let mut dijkstra = Dijkstra::new();
let nodes = graph.nodes();
let src = nodes.create(NodeIdx(1));
let dst = nodes.create(NodeIdx(5));
let now = Instant::now();
let option_path = dijkstra.compute_best_path(dijkstra::Query {
src_idx: src.idx(),
dst_idx: dst.idx(),
graph: &graph,
routing_cfg: &routing_cfg,
});
info!("");
info!(
"Ran Dijkstra-query in {} ms",
now.elapsed().as_micros() as f64 / 1_000.0,
);
if let Some(path) = option_path {
info!(
"Path costs {:?} from ({}) to ({}).",
path.flatten(&graph).costs(),
src,
dst
);
} else {
info!("No path from ({}) to ({}).", src, dst);
}
Ok(())
}