mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-12-27 00:12:55 +03:00
compare faster trips by baseline over time
This commit is contained in:
parent
3ba33e4bd0
commit
7c6f2c62b6
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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),
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user