use vulture::manual::SimpleTimetable;
use vulture::{Duration, Journey, RaptorCache, SecondOfDay, Timetable};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
enum S {
A,
B,
C,
}
fn main() {
let tt = SimpleTimetable::new()
.route(
"R_AB",
&[S::A, S::B],
&[(
"T_AB",
&[
(SecondOfDay(0), SecondOfDay(0)),
(SecondOfDay(60), SecondOfDay(60)),
],
)],
)
.route(
"R_BC",
&[S::B, S::C],
&[(
"T_BC",
&[
(SecondOfDay(120), SecondOfDay(120)),
(SecondOfDay(180), SecondOfDay(180)),
],
)],
);
let a = tt.stop_idx_of(&S::A);
let c = tt.stop_idx_of(&S::C);
let mut cache: RaptorCache<vulture::ArrivalTime> = RaptorCache::for_timetable(&tt);
let n = 50usize;
let mut one_shot_results: Vec<Vec<Journey<vulture::ArrivalTime>>> = Vec::with_capacity(n);
let mut cached_results: Vec<Vec<Journey<vulture::ArrivalTime>>> = Vec::with_capacity(n);
for _ in 0..n {
let one_shot = tt
.query()
.from(&[(a, Duration::ZERO)])
.to(&[(c, Duration::ZERO)])
.max_transfers(2)
.depart_at(SecondOfDay(0))
.run();
one_shot_results.push(one_shot);
let cached = tt
.query()
.from(&[(a, Duration::ZERO)])
.to(&[(c, Duration::ZERO)])
.max_transfers(2)
.depart_at(SecondOfDay(0))
.run_with_cache(&mut cache);
cached_results.push(cached);
}
println!(
"Ran {} A→C queries, one-shot vs. cached: result-set sizes match = {}",
n,
one_shot_results
.iter()
.zip(cached_results.iter())
.all(|(o, c)| o.len() == c.len()),
);
if let Some(first) = one_shot_results.first().and_then(|v| v.first()) {
println!(
" example journey: A → C, arrives {}, plan {} legs",
first.label.0,
first.plan.len(),
);
}
assert_eq!(one_shot_results.len(), cached_results.len());
for (one, cached) in one_shot_results.iter().zip(cached_results.iter()) {
assert_eq!(one.len(), cached.len());
for (a_j, b_j) in one.iter().zip(cached.iter()) {
assert_eq!(a_j.origin, b_j.origin);
assert_eq!(a_j.target, b_j.target);
assert_eq!(a_j.label, b_j.label);
assert_eq!(a_j.plan, b_j.plan);
}
}
let final_journey = one_shot_results
.last()
.and_then(|v| v.first())
.expect("expected at least one A→C journey");
assert_eq!(final_journey.label.0.0, 180);
assert_eq!(final_journey.plan.len(), 2);
}