mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-12-25 23:43:25 +03:00
simplify stuff in analytics, removing a major bottleneck in the everyone_weekday scenario
This commit is contained in:
parent
1ecea0a88f
commit
3f48b4bf22
@ -237,8 +237,8 @@ aad8ff309a1b38dc85a5d8a4b37f3c87 data/system/scenarios/downtown/weekday.bin
|
||||
112a8e8a1f8e41f566a03ab83d14fe22 data/system/scenarios/caphill/weekday.bin
|
||||
be38f2352b6ac6071707361472888c4c data/system/scenarios/montlake/everyone_weekday.bin
|
||||
fa8391c0e45db61fabdd466ad81b83fa data/system/scenarios/montlake/weekday.bin
|
||||
80cb748e090072b559b08bdd4bc8c30c data/system/prebaked_results/signal_single/tutorial lvl1.bin
|
||||
ec841305a2dbc37649045f31afce09bd data/system/prebaked_results/signal_single/tutorial lvl2.bin
|
||||
2da75e16bd2620e8ed1f8db58e852538 data/system/prebaked_results/montlake/car vs bike contention.bin
|
||||
06eb9683f2decdcb2ee11b00d4fc2720 data/system/prebaked_results/montlake/weekday.bin
|
||||
02ae8e1b35219ab4934969c07187842b data/system/prebaked_results/montlake/car vs bus contention.bin
|
||||
f9c2c0d6b2beb8260ee35e0e3ec23a3e data/system/prebaked_results/signal_single/tutorial lvl1.bin
|
||||
ff80c3565b243cdbf7a0f0c3fa0f559a data/system/prebaked_results/signal_single/tutorial lvl2.bin
|
||||
9020e5c837e3b41279bd1d0e91838bcd data/system/prebaked_results/montlake/car vs bike contention.bin
|
||||
764a4782af23dfbdf6f4dc15623ade3a data/system/prebaked_results/montlake/weekday.bin
|
||||
a800719d76a09b1a257fc9d831a336e6 data/system/prebaked_results/montlake/car vs bus contention.bin
|
||||
|
@ -16,8 +16,7 @@ pub struct Analytics {
|
||||
pub(crate) test_expectations: VecDeque<Event>,
|
||||
pub bus_arrivals: Vec<(Time, CarID, BusRouteID, BusStopID)>,
|
||||
pub bus_passengers_waiting: Vec<(Time, BusStopID, BusRouteID)>,
|
||||
// TODO Scraping TripMode from TripPhaseStarting is frustrating.
|
||||
pub started_trips: BTreeMap<TripID, (Time, TripMode)>,
|
||||
pub started_trips: BTreeMap<TripID, Time>,
|
||||
// TODO Hack: No TripMode means aborted
|
||||
// Finish time, ID, mode (or None as aborted), trip duration
|
||||
pub finished_trips: Vec<(Time, TripID, Option<TripMode>, Duration)>,
|
||||
@ -117,23 +116,15 @@ impl Analytics {
|
||||
}
|
||||
|
||||
// Bus passengers
|
||||
if let Event::TripPhaseStarting(_, _, _, _, ref tpt) = ev {
|
||||
if let Event::TripPhaseStarting(_, _, _, ref tpt) = ev {
|
||||
if let TripPhaseType::WaitingForBus(route, stop) = tpt {
|
||||
self.bus_passengers_waiting.push((time, *stop, *route));
|
||||
}
|
||||
}
|
||||
|
||||
// Started trips
|
||||
if let Event::TripPhaseStarting(id, _, mode, _, _) = ev {
|
||||
// TODO More efficiently
|
||||
if !self.started_trips.contains_key(&id)
|
||||
&& !self
|
||||
.finished_trips
|
||||
.iter()
|
||||
.any(|(_, trip, _, _)| *trip == id)
|
||||
{
|
||||
self.started_trips.insert(id, (time, mode));
|
||||
}
|
||||
if let Event::TripPhaseStarting(id, _, _, _) = ev {
|
||||
self.started_trips.entry(id).or_insert(time);
|
||||
}
|
||||
|
||||
// Finished trips
|
||||
@ -146,11 +137,9 @@ impl Analytics {
|
||||
{
|
||||
self.finished_trips
|
||||
.push((time, trip, Some(mode), total_time));
|
||||
} else if let Event::TripAborted(id, mode) = ev {
|
||||
} else if let Event::TripAborted(id) = ev {
|
||||
self.started_trips.entry(id).or_insert(time);
|
||||
self.finished_trips.push((time, id, None, Duration::ZERO));
|
||||
if !self.started_trips.contains_key(&id) {
|
||||
self.started_trips.insert(id, (time, mode));
|
||||
}
|
||||
}
|
||||
|
||||
// Intersection delays
|
||||
@ -181,10 +170,10 @@ impl Analytics {
|
||||
|
||||
// TODO Kinda hacky, but these all consume the event, so kinda bundle em.
|
||||
match ev {
|
||||
Event::TripPhaseStarting(id, _, _, maybe_req, phase_type) => {
|
||||
Event::TripPhaseStarting(id, _, maybe_req, phase_type) => {
|
||||
self.trip_log.push((time, id, maybe_req, phase_type));
|
||||
}
|
||||
Event::TripAborted(id, _) => {
|
||||
Event::TripAborted(id) => {
|
||||
self.trip_log.push((time, id, None, TripPhaseType::Aborted));
|
||||
}
|
||||
Event::TripFinished { trip, .. } => {
|
||||
@ -578,7 +567,7 @@ impl Analytics {
|
||||
|
||||
pub fn active_agents(&self, now: Time) -> Vec<(Time, usize)> {
|
||||
let mut starts_stops: Vec<(Time, bool)> = Vec::new();
|
||||
for (_, (t, _)) in &self.started_trips {
|
||||
for t in self.started_trips.values() {
|
||||
if *t <= now {
|
||||
starts_stops.push((*t, false));
|
||||
}
|
||||
|
@ -38,14 +38,8 @@ pub enum Event {
|
||||
total_time: Duration,
|
||||
blocked_time: Duration,
|
||||
},
|
||||
TripAborted(TripID, TripMode),
|
||||
TripPhaseStarting(
|
||||
TripID,
|
||||
PersonID,
|
||||
TripMode,
|
||||
Option<PathRequest>,
|
||||
TripPhaseType,
|
||||
),
|
||||
TripAborted(TripID),
|
||||
TripPhaseStarting(TripID, PersonID, Option<PathRequest>, TripPhaseType),
|
||||
|
||||
// Just use for parking replanning. Not happy about copying the full path in here, but the way
|
||||
// to plumb info into Analytics is Event.
|
||||
|
@ -181,7 +181,7 @@ impl PandemicModel {
|
||||
panic!("{} left {:?}, but they weren't inside", person, loc);
|
||||
}
|
||||
}
|
||||
Event::TripPhaseStarting(_, p, _, _, tpt) => {
|
||||
Event::TripPhaseStarting(_, p, _, tpt) => {
|
||||
let person = *p;
|
||||
match tpt {
|
||||
TripPhaseType::WaitingForBus(_, stop) => {
|
||||
|
@ -1,7 +1,6 @@
|
||||
use crate::mechanics::Queue;
|
||||
use crate::{
|
||||
Event, ParkingSimState, ParkingSpot, PersonID, SidewalkSpot, TripID, TripMode, TripPhaseType,
|
||||
Vehicle,
|
||||
Event, ParkingSimState, ParkingSpot, PersonID, SidewalkSpot, TripID, TripPhaseType, Vehicle,
|
||||
};
|
||||
use geom::Distance;
|
||||
use map_model::{
|
||||
@ -216,7 +215,6 @@ impl Router {
|
||||
events.push(Event::TripPhaseStarting(
|
||||
t,
|
||||
p,
|
||||
TripMode::Drive,
|
||||
Some(PathRequest {
|
||||
start: Position::new(current_lane, front),
|
||||
end: new_pos,
|
||||
@ -240,7 +238,6 @@ impl Router {
|
||||
events.push(Event::TripPhaseStarting(
|
||||
t,
|
||||
p,
|
||||
TripMode::Drive,
|
||||
Some(PathRequest {
|
||||
start: Position::new(current_lane, front),
|
||||
end: new_pos,
|
||||
|
@ -449,12 +449,6 @@ impl Sim {
|
||||
events.push(Event::TripPhaseStarting(
|
||||
trip,
|
||||
person,
|
||||
// TODO sketchy...
|
||||
if create_car.vehicle.id.1 == VehicleType::Car {
|
||||
TripMode::Drive
|
||||
} else {
|
||||
TripMode::Bike
|
||||
},
|
||||
Some(create_car.req.clone()),
|
||||
if create_car.vehicle.id.1 == VehicleType::Car {
|
||||
TripPhaseType::Driving
|
||||
@ -496,7 +490,6 @@ impl Sim {
|
||||
events.push(Event::TripPhaseStarting(
|
||||
create_ped.trip,
|
||||
create_ped.person,
|
||||
TripMode::Walk,
|
||||
Some(create_ped.req.clone()),
|
||||
TripPhaseType::Walking,
|
||||
));
|
||||
|
@ -1,6 +1,6 @@
|
||||
use crate::{
|
||||
CarID, Event, PedestrianID, PersonID, Router, Scheduler, TripID, TripManager, TripMode,
|
||||
TripPhaseType, WalkingSimState,
|
||||
CarID, Event, PedestrianID, PersonID, Router, Scheduler, TripID, TripManager, TripPhaseType,
|
||||
WalkingSimState,
|
||||
};
|
||||
use abstutil::{deserialize_btreemap, serialize_btreemap};
|
||||
use geom::{Distance, Time};
|
||||
@ -187,7 +187,6 @@ impl TransitSimState {
|
||||
self.events.push(Event::TripPhaseStarting(
|
||||
trip,
|
||||
person,
|
||||
TripMode::Transit,
|
||||
Some(PathRequest {
|
||||
start: map.get_bs(stop1).driving_pos,
|
||||
end: map.get_bs(stop2).driving_pos,
|
||||
@ -249,7 +248,6 @@ impl TransitSimState {
|
||||
self.events.push(Event::TripPhaseStarting(
|
||||
trip,
|
||||
person,
|
||||
TripMode::Transit,
|
||||
Some(PathRequest {
|
||||
start: map.get_bs(stop1).driving_pos,
|
||||
end: map.get_bs(stop2).driving_pos,
|
||||
|
@ -447,7 +447,6 @@ impl TripManager {
|
||||
self.events.push(Event::TripPhaseStarting(
|
||||
trip.id,
|
||||
trip.person,
|
||||
trip.mode,
|
||||
None,
|
||||
TripPhaseType::WaitingForBus(route, stop),
|
||||
));
|
||||
@ -642,7 +641,7 @@ impl TripManager {
|
||||
let trip = &mut self.trips[id.0];
|
||||
self.unfinished_trips -= 1;
|
||||
trip.aborted = true;
|
||||
self.events.push(Event::TripAborted(trip.id, trip.mode));
|
||||
self.events.push(Event::TripAborted(trip.id));
|
||||
let person = trip.person;
|
||||
|
||||
// Maintain consistentency for anyone listening to events
|
||||
@ -893,7 +892,6 @@ impl TripManager {
|
||||
self.events.push(Event::TripPhaseStarting(
|
||||
trip,
|
||||
person.id,
|
||||
self.trips[trip.0].mode,
|
||||
None,
|
||||
TripPhaseType::DelayedStart,
|
||||
));
|
||||
@ -1174,7 +1172,6 @@ impl TripManager {
|
||||
self.events.push(Event::TripPhaseStarting(
|
||||
trip,
|
||||
person.id,
|
||||
self.trips[trip.0].mode,
|
||||
None,
|
||||
TripPhaseType::Remote,
|
||||
));
|
||||
|
Loading…
Reference in New Issue
Block a user