mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-12-27 00:12:55 +03:00
intersection delay is broken down by agent type, not trip mode
This commit is contained in:
parent
233b662bfa
commit
68d3c5b340
@ -49,9 +49,9 @@ data/system/maps/montlake.bin,1232e900355ba1cb9837e2790c16870c,https://www.dropb
|
||||
data/system/maps/south_seattle.bin,bb701fcf4abe9330cfb58121d3e5bad7,https://www.dropbox.com/s/2kfgbtz2jd3xav2/south_seattle.bin.zip?dl=0
|
||||
data/system/maps/udistrict.bin,0dbd16d4b45a2efbf9d98d89054231bc,https://www.dropbox.com/s/1651xn91s8ihr2n/udistrict.bin.zip?dl=0
|
||||
data/system/maps/west_seattle.bin,57411a6e8a0ed843c96d35cf929af6ff,https://www.dropbox.com/s/iulfhcgsn4atduk/west_seattle.bin.zip?dl=0
|
||||
data/system/prebaked_results/lakeslice/weekday.bin,6a9d066ef0f34ddce4611961a5fbee2e,https://www.dropbox.com/s/tnxikn11hjv3mmz/weekday.bin.zip?dl=0
|
||||
data/system/prebaked_results/lakeslice/weekday.bin,119f695d602c0fbd6ff60ad0733b533a,https://www.dropbox.com/s/auuq2enda6t45gg/weekday.bin.zip?dl=0
|
||||
data/system/prebaked_results/montlake/car vs bike contention.bin,fba6493b919e8cc50854088367e38d95,https://www.dropbox.com/s/jefg0ikjy9dsrdd/car%20vs%20bike%20contention.bin.zip?dl=0
|
||||
data/system/prebaked_results/montlake/weekday.bin,4153a77f3b781172ce59da33c6dc4a38,https://www.dropbox.com/s/nbe8u7eptc50pwj/weekday.bin.zip?dl=0
|
||||
data/system/prebaked_results/montlake/weekday.bin,e7f975ccf56b67dc31563286742118f1,https://www.dropbox.com/s/t3os651iqdck801/weekday.bin.zip?dl=0
|
||||
data/system/scenarios/ballard/weekday.bin,97f3262146d9b84fe61326a81d9eef1a,https://www.dropbox.com/s/rmhxak4i3at7c76/weekday.bin.zip?dl=0
|
||||
data/system/scenarios/downtown/weekday.bin,18563e48427406a9ecf162f0e33a9649,https://www.dropbox.com/s/n36jlq6q7ghai21/weekday.bin.zip?dl=0
|
||||
data/system/scenarios/huge_seattle/weekday.bin,844d779efe4d20d3a40586dcca7d4ad5,https://www.dropbox.com/s/elf3cir98xyx7xj/weekday.bin.zip?dl=0
|
||||
|
@ -1,5 +1,5 @@
|
||||
use crate::app::App;
|
||||
use crate::helpers::color_for_mode;
|
||||
use crate::helpers::color_for_agent_type;
|
||||
use crate::info::{header_btns, make_tabs, throughput, DataOptions, Details, Tab};
|
||||
use abstutil::prettyprint_usize;
|
||||
use ezgui::{
|
||||
@ -7,7 +7,7 @@ use ezgui::{
|
||||
};
|
||||
use geom::{ArrowCap, Distance, Duration, PolyLine, Time};
|
||||
use map_model::{IntersectionID, IntersectionType};
|
||||
use sim::TripMode;
|
||||
use sim::AgentType;
|
||||
use std::collections::{BTreeMap, BTreeSet};
|
||||
|
||||
pub fn info(ctx: &EventCtx, app: &App, details: &mut Details, id: IntersectionID) -> Vec<Widget> {
|
||||
@ -221,9 +221,9 @@ fn delay_plot(ctx: &EventCtx, app: &App, i: IntersectionID, opts: &DataOptions)
|
||||
} else {
|
||||
app.primary.sim.get_analytics()
|
||||
};
|
||||
let mut by_mode: BTreeMap<TripMode, Vec<(Time, Duration)>> = TripMode::all()
|
||||
let mut by_type: BTreeMap<AgentType, Vec<(Time, Duration)>> = AgentType::all()
|
||||
.into_iter()
|
||||
.map(|m| (m, Vec::new()))
|
||||
.map(|t| (t, Vec::new()))
|
||||
.collect();
|
||||
let limit = if opts.show_end_of_day {
|
||||
app.primary.sim.get_end_of_day()
|
||||
@ -231,18 +231,18 @@ fn delay_plot(ctx: &EventCtx, app: &App, i: IntersectionID, opts: &DataOptions)
|
||||
app.primary.sim.time()
|
||||
};
|
||||
if let Some(list) = data.intersection_delays.get(&i) {
|
||||
for (t, dt, mode) in list {
|
||||
for (t, dt, agent_type) in list {
|
||||
if *t > limit {
|
||||
break;
|
||||
}
|
||||
by_mode.get_mut(mode).unwrap().push((*t, *dt));
|
||||
by_type.get_mut(agent_type).unwrap().push((*t, *dt));
|
||||
}
|
||||
}
|
||||
let series: Vec<Series<Duration>> = by_mode
|
||||
let series: Vec<Series<Duration>> = by_type
|
||||
.into_iter()
|
||||
.map(|(mode, pts)| Series {
|
||||
label: mode.noun().to_string(),
|
||||
color: color_for_mode(app, mode),
|
||||
.map(|(agent_type, pts)| Series {
|
||||
label: agent_type.noun().to_string(),
|
||||
color: color_for_agent_type(app, agent_type),
|
||||
pts,
|
||||
})
|
||||
.collect();
|
||||
|
@ -23,7 +23,8 @@ pub struct Analytics {
|
||||
pub finished_trips: Vec<(Time, TripID, Option<TripMode>, Duration)>,
|
||||
// TODO This subsumes finished_trips
|
||||
pub trip_log: Vec<(Time, TripID, Option<PathRequest>, TripPhaseType)>,
|
||||
pub intersection_delays: BTreeMap<IntersectionID, Vec<(Time, Duration, TripMode)>>,
|
||||
// TODO Transit riders aren't represented here yet, just the vehicle they're riding.
|
||||
pub intersection_delays: BTreeMap<IntersectionID, Vec<(Time, Duration, AgentType)>>,
|
||||
// Per parking lane or lot, when does a spot become filled (true) or free (false)
|
||||
pub parking_lane_changes: BTreeMap<LaneID, Vec<(Time, bool)>>,
|
||||
pub parking_lot_changes: BTreeMap<ParkingLotID, Vec<(Time, bool)>>,
|
||||
@ -138,11 +139,11 @@ impl Analytics {
|
||||
}
|
||||
|
||||
// Intersection delays
|
||||
if let Event::IntersectionDelayMeasured(id, delay, mode) = ev {
|
||||
if let Event::IntersectionDelayMeasured(id, delay, agent) = ev {
|
||||
self.intersection_delays
|
||||
.entry(id)
|
||||
.or_insert_with(Vec::new)
|
||||
.push((time, delay, mode));
|
||||
.push((time, delay, agent.to_type()));
|
||||
}
|
||||
|
||||
// Parking spot changes
|
||||
|
@ -38,7 +38,7 @@ pub enum Event {
|
||||
// If the agent is a transit vehicle, then include a count of how many passengers are on
|
||||
// board.
|
||||
AgentEntersTraversable(AgentID, Traversable, Option<usize>),
|
||||
IntersectionDelayMeasured(IntersectionID, Duration, TripMode),
|
||||
IntersectionDelayMeasured(IntersectionID, Duration, AgentID),
|
||||
|
||||
TripFinished {
|
||||
trip: TripID,
|
||||
|
@ -1,6 +1,6 @@
|
||||
use crate::mechanics::car::Car;
|
||||
use crate::mechanics::Queue;
|
||||
use crate::{AgentID, AlertLocation, CarID, Command, Event, Scheduler, Speed, TripMode};
|
||||
use crate::{AgentID, AlertLocation, CarID, Command, Event, Scheduler, Speed};
|
||||
use abstutil::{deserialize_btreemap, retain_btreeset, serialize_btreemap};
|
||||
use geom::{Duration, Time};
|
||||
use map_model::{
|
||||
@ -392,11 +392,8 @@ impl IntersectionSimState {
|
||||
let state = self.state.get_mut(&turn.parent).unwrap();
|
||||
let delay = now - state.waiting.remove(&req).unwrap();
|
||||
if map.maybe_get_traffic_signal(state.id).is_some() {
|
||||
self.events.push(Event::IntersectionDelayMeasured(
|
||||
turn.parent,
|
||||
delay,
|
||||
TripMode::from_agent(agent),
|
||||
));
|
||||
self.events
|
||||
.push(Event::IntersectionDelayMeasured(turn.parent, delay, agent));
|
||||
}
|
||||
state.accepted.insert(req);
|
||||
if self.break_turn_conflict_cycles {
|
||||
|
@ -1373,21 +1373,6 @@ impl TripMode {
|
||||
]
|
||||
}
|
||||
|
||||
pub(crate) fn from_agent(id: AgentID) -> TripMode {
|
||||
match id {
|
||||
AgentID::Pedestrian(_) => TripMode::Walk,
|
||||
AgentID::Car(id) => match id.1 {
|
||||
VehicleType::Car => TripMode::Drive,
|
||||
VehicleType::Bike => TripMode::Bike,
|
||||
// TODO Little confusing; this means buses, not bus riders.
|
||||
VehicleType::Bus => TripMode::Transit,
|
||||
VehicleType::Train => TripMode::Transit,
|
||||
},
|
||||
// TODO Now we can detangle this, right?
|
||||
AgentID::BusPassenger(_, _) => TripMode::Transit,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn verb(self) -> &'static str {
|
||||
match self {
|
||||
TripMode::Walk => "walk",
|
||||
|
Loading…
Reference in New Issue
Block a user