compare faster trips by baseline over time

This commit is contained in:
Dustin Carlino 2019-11-03 17:17:47 -08:00
parent 3ba33e4bd0
commit 7c6f2c62b6
6 changed files with 55 additions and 16 deletions

View File

@ -167,10 +167,14 @@ pub struct PrebakedResults {
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct FasterTrips(pub BTreeMap<TripMode, DurationStats>); pub struct FasterTrips(pub Vec<(Duration, Option<TripMode>, Duration)>);
impl FasterTrips { impl FasterTrips {
pub fn from(sim: &Sim) -> FasterTrips { pub fn from(sim: &Sim) -> FasterTrips {
FasterTrips(sim.get_analytics().finished_trips.clone())
}
pub fn to_stats(&self, now: Duration) -> BTreeMap<TripMode, DurationStats> {
let mut distribs: BTreeMap<TripMode, DurationHistogram> = BTreeMap::new(); let mut distribs: BTreeMap<TripMode, DurationHistogram> = BTreeMap::new();
for m in vec![ for m in vec![
TripMode::Walk, TripMode::Walk,
@ -180,14 +184,20 @@ impl FasterTrips {
] { ] {
distribs.insert(m, Default::default()); distribs.insert(m, Default::default());
} }
for (_, m, dt) in sim.get_finished_trips().finished_trips { for (t, mode, dt) in &self.0 {
distribs.get_mut(&m).unwrap().add(dt); if *t > now {
break;
}
// Skip aborted trips
if let Some(m) = mode {
distribs.get_mut(&m).unwrap().add(*dt);
}
} }
let mut results = BTreeMap::new(); let mut results = BTreeMap::new();
for (m, distrib) in distribs { for (m, distrib) in distribs {
results.insert(m, distrib.to_stats()); results.insert(m, distrib.to_stats());
} }
FasterTrips(results) results
} }
} }

View File

@ -407,8 +407,15 @@ fn gridlock_panel(ui: &UI, prebaked: &PrebakedResults) -> Text {
} }
fn faster_trips_panel(mode: TripMode, ui: &UI, prebaked: &PrebakedResults) -> Text { fn faster_trips_panel(mode: TripMode, ui: &UI, prebaked: &PrebakedResults) -> Text {
let now = &FasterTrips::from(&ui.primary.sim).0[&mode]; let now = FasterTrips::from(&ui.primary.sim)
let baseline = &prebaked.faster_trips.0[&mode]; .to_stats(ui.primary.sim.time())
.remove(&mode)
.unwrap();
let baseline = prebaked
.faster_trips
.to_stats(ui.primary.sim.time())
.remove(&mode)
.unwrap();
let mut txt = Text::new(); let mut txt = Text::new();
txt.add(Line(format!( txt.add(Line(format!(
@ -417,6 +424,10 @@ fn faster_trips_panel(mode: TripMode, ui: &UI, prebaked: &PrebakedResults) -> Te
mode, mode,
prettyprint_usize(baseline.count), prettyprint_usize(baseline.count),
))); )));
if now.count == 0 || baseline.count == 0 {
return txt;
}
// TODO Which one? // TODO Which one?
if false { if false {
for (stat, dt) in &now.stats { for (stat, dt) in &now.stats {

View File

@ -51,7 +51,7 @@ impl ShowTripStats {
let mut counts = Counter::new(); let mut counts = Counter::new();
let mut pts_per_mode: BTreeMap<Option<TripMode>, Vec<(Duration, usize)>> = let mut pts_per_mode: BTreeMap<Option<TripMode>, Vec<(Duration, usize)>> =
lines.iter().map(|(_, _, m)| (*m, Vec::new())).collect(); lines.iter().map(|(_, _, m)| (*m, Vec::new())).collect();
for (t, m) in &ui.primary.sim.get_analytics().finished_trips { for (t, m, _) in &ui.primary.sim.get_analytics().finished_trips {
counts.inc(*m); counts.inc(*m);
if *t > times[0] { if *t > times[0] {
times.remove(0); times.remove(0);

View File

@ -12,7 +12,8 @@ pub struct Analytics {
pub bus_arrivals: HashMap<(BusStopID, BusRouteID), Vec<Duration>>, pub bus_arrivals: HashMap<(BusStopID, BusRouteID), Vec<Duration>>,
pub total_bus_passengers: Counter<BusRouteID>, pub total_bus_passengers: Counter<BusRouteID>,
// TODO Hack: No TripMode means aborted // TODO Hack: No TripMode means aborted
pub finished_trips: Vec<(Duration, Option<TripMode>)>, // Finish time, mode (or None as aborted), trip duration
pub finished_trips: Vec<(Duration, Option<TripMode>, Duration)>,
} }
pub struct ThruputStats { pub struct ThruputStats {
@ -65,10 +66,10 @@ impl Analytics {
} }
// Finished trips // Finished trips
if let Event::TripFinished(_, mode) = ev { if let Event::TripFinished(_, mode, dt) = ev {
self.finished_trips.push((time, Some(mode))); self.finished_trips.push((time, Some(mode), dt));
} else if let Event::TripAborted(_) = ev { } else if let Event::TripAborted(_) = ev {
self.finished_trips.push((time, None)); self.finished_trips.push((time, None, Duration::ZERO));
} }
} }
} }

View File

@ -1,4 +1,5 @@
use crate::{AgentID, CarID, ParkingSpot, PedestrianID, TripID, TripMode}; use crate::{AgentID, CarID, ParkingSpot, PedestrianID, TripID, TripMode};
use geom::Duration;
use map_model::{BuildingID, BusRouteID, BusStopID, IntersectionID, LaneID, Traversable}; use map_model::{BuildingID, BusRouteID, BusStopID, IntersectionID, LaneID, Traversable};
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
@ -21,6 +22,6 @@ pub enum Event {
AgentEntersTraversable(AgentID, Traversable), AgentEntersTraversable(AgentID, Traversable),
TripFinished(TripID, TripMode), TripFinished(TripID, TripMode, Duration),
TripAborted(TripID), TripAborted(TripID),
} }

View File

@ -138,7 +138,11 @@ impl TripManager {
assert!(!trip.finished_at.is_some()); assert!(!trip.finished_at.is_some());
trip.finished_at = Some(now); trip.finished_at = Some(now);
self.unfinished_trips -= 1; self.unfinished_trips -= 1;
self.events.push(Event::TripFinished(trip.id, trip.mode)); self.events.push(Event::TripFinished(
trip.id,
trip.mode,
now - trip.spawned_at,
));
return; return;
} }
_ => {} _ => {}
@ -309,7 +313,11 @@ impl TripManager {
assert!(!trip.finished_at.is_some()); assert!(!trip.finished_at.is_some());
trip.finished_at = Some(now); trip.finished_at = Some(now);
self.unfinished_trips -= 1; self.unfinished_trips -= 1;
self.events.push(Event::TripFinished(trip.id, trip.mode)); self.events.push(Event::TripFinished(
trip.id,
trip.mode,
now - trip.spawned_at,
));
} }
// If no route is returned, the pedestrian boarded a bus immediately. // If no route is returned, the pedestrian boarded a bus immediately.
@ -389,7 +397,11 @@ impl TripManager {
assert!(!trip.finished_at.is_some()); assert!(!trip.finished_at.is_some());
trip.finished_at = Some(now); trip.finished_at = Some(now);
self.unfinished_trips -= 1; self.unfinished_trips -= 1;
self.events.push(Event::TripFinished(trip.id, trip.mode)); self.events.push(Event::TripFinished(
trip.id,
trip.mode,
now - trip.spawned_at,
));
} }
pub fn car_or_bike_reached_border(&mut self, now: Duration, car: CarID, i: IntersectionID) { pub fn car_or_bike_reached_border(&mut self, now: Duration, car: CarID, i: IntersectionID) {
@ -403,7 +415,11 @@ impl TripManager {
assert!(!trip.finished_at.is_some()); assert!(!trip.finished_at.is_some());
trip.finished_at = Some(now); trip.finished_at = Some(now);
self.unfinished_trips -= 1; self.unfinished_trips -= 1;
self.events.push(Event::TripFinished(trip.id, trip.mode)); self.events.push(Event::TripFinished(
trip.id,
trip.mode,
now - trip.spawned_at,
));
} }
pub fn abort_trip_failed_start(&mut self, id: TripID) { pub fn abort_trip_failed_start(&mut self, id: TripID) {