From 22cef74aec4260784c9fcf8521f8d045482a74e8 Mon Sep 17 00:00:00 2001 From: Dustin Carlino Date: Thu, 12 Nov 2020 11:34:17 -0800 Subject: [PATCH] Always allow blocking a degenerate intersection. Visually inspected on the lane-changing test map. #382 Also abandon sim.run_until_done; the only caller was the LC test, and it uses 30s steps inappropriately anyway. --- data/MANIFEST.json | 8 ++-- sim/src/mechanics/intersection.rs | 47 +++++++++++++---------- sim/src/sim/mod.rs | 64 ------------------------------- tests/src/main.rs | 6 ++- 4 files changed, 35 insertions(+), 90 deletions(-) diff --git a/data/MANIFEST.json b/data/MANIFEST.json index dcee9e40f9..8bd8d9e5e9 100644 --- a/data/MANIFEST.json +++ b/data/MANIFEST.json @@ -393,16 +393,16 @@ "size_bytes": 58730351 }, "data/system/seattle/prebaked_results/lakeslice/weekday.bin": { - "checksum": "939bdc606246dcd9cc0f374b999e54e2", - "size_bytes": 67222067 + "checksum": "bd3fe2b14eeb9ed5b64687aa0272fcf7", + "size_bytes": 67221259 }, "data/system/seattle/prebaked_results/montlake/car vs bike contention.bin": { "checksum": "f8cd6330a51448feffddbacd221d809a", "size_bytes": 5226 }, "data/system/seattle/prebaked_results/montlake/weekday.bin": { - "checksum": "57ee0b9c39158817b796f24829f94e89", - "size_bytes": 8973017 + "checksum": "780b7a472b57d7b37ac142876ce0dc0e", + "size_bytes": 8977070 }, "data/system/seattle/scenarios/ballard/weekday.bin": { "checksum": "b1e1b8acd43f99e889961b933d772712", diff --git a/sim/src/mechanics/intersection.rs b/sim/src/mechanics/intersection.rs index f637b911cb..bb060297a6 100644 --- a/sim/src/mechanics/intersection.rs +++ b/sim/src/mechanics/intersection.rs @@ -5,8 +5,8 @@ use serde::{Deserialize, Serialize}; use abstutil::{deserialize_btreemap, retain_btreeset, serialize_btreemap, FixedMap}; use geom::{Duration, Time}; use map_model::{ - ControlStopSign, ControlTrafficSignal, IntersectionID, LaneID, Map, PhaseType, Traversable, - TurnID, TurnPriority, TurnType, + ControlStopSign, ControlTrafficSignal, Intersection, IntersectionID, LaneID, Map, PhaseType, + Traversable, TurnID, TurnPriority, TurnType, }; use crate::mechanics::car::Car; @@ -387,7 +387,7 @@ impl IntersectionSimState { if !queue.try_to_reserve_entry( car, !self.dont_block_the_box - || allow_block_the_box(map.get_i(turn.parent).orig_id.0) + || allow_block_the_box(map.get_i(turn.parent)) || inside_ut, ) { if self.break_turn_conflict_cycles { @@ -823,23 +823,30 @@ impl SignalState { } } -// TODO Sometimes a traffic signal is surrounded by tiny lanes with almost no capacity. Workaround -// for now. -fn allow_block_the_box(osm_node_id: i64) -> bool { +fn allow_block_the_box(i: &Intersection) -> bool { + // Degenerate intersections are often just artifacts of how roads are split up in OSM. Allow + // vehicles to get stuck in them, since the only possible thing they could block is pedestrians + // from using the crosswalk. Those crosswalks usually don't exist in reality, so this behavior + // is more realistic. + if i.roads.len() == 2 { + return true; + } + + // TODO Sometimes a traffic signal is surrounded by tiny lanes with almost no capacity. + // Workaround for now. + let id = i.orig_id.0; // 23rd and Madison, Madison and John, Boren and 12th, Boren and Yesler, Lake Wash and Madison, // Green Lake Way N and 50th, Green Lake Way and N 64th - osm_node_id == 53211693 - || osm_node_id == 53214134 - || osm_node_id == 53214133 - || osm_node_id == 53165712 - || osm_node_id == 281487826 - || osm_node_id == 53209840 - || osm_node_id == 4249361353 - || osm_node_id == 987334546 - || osm_node_id == 848817336 - || osm_node_id == 3393025729 - || osm_node_id == 59995197 - || osm_node_id == 53077575 - || osm_node_id == 2632986818 - || osm_node_id == 4273547929 + id == 53211693 + || id == 53214134 + || id == 53214133 + || id == 53165712 + || id == 53209840 + || id == 4249361353 + || id == 987334546 + || id == 848817336 + || id == 3393025729 + || id == 59995197 + || id == 53077575 + || id == 2632986818 } diff --git a/sim/src/sim/mod.rs b/sim/src/sim/mod.rs index c5b23484c8..890fc15028 100644 --- a/sim/src/sim/mod.rs +++ b/sim/src/sim/mod.rs @@ -741,70 +741,6 @@ impl Sim { } } -// Helpers to run the sim -// TODO Old and gunky -impl Sim { - pub fn run_until_done( - &mut self, - map: &Map, - callback: F, - // Interpreted as a relative time - time_limit: Option, - ) { - let mut last_print = Instant::now(); - let mut last_sim_time = self.time(); - - loop { - // TODO Regular printing doesn't happen if we use a time_limit :\ - let dt = time_limit.unwrap_or_else(|| Duration::seconds(30.0)); - - match panic::catch_unwind(panic::AssertUnwindSafe(|| { - self.timed_step(map, dt, &mut None, &mut Timer::throwaway()); - })) { - Ok(()) => {} - Err(err) => { - println!( - "*************************************************************************\ - *******" - ); - println!("Sim broke:"); - self.dump_before_abort(); - panic::resume_unwind(err); - } - } - - let dt_real = Duration::realtime_elapsed(last_print); - if dt_real >= Duration::seconds(1.0) { - let (finished, unfinished) = self.num_trips(); - println!( - "{}: {} trips finished, {} unfinished, speed = {:.2}x, {}", - self.time(), - prettyprint_usize(finished), - prettyprint_usize(unfinished), - (self.time() - last_sim_time) / dt_real, - self.scheduler.describe_stats() - ); - last_print = Instant::now(); - last_sim_time = self.time(); - } - callback(self, map); - if self.is_done() { - println!( - "{}: speed = {:.2}x, {}", - self.time(), - (self.time() - last_sim_time) / dt_real, - self.scheduler.describe_stats() - ); - break; - } - - if let Some(lim) = time_limit { - panic!("Time limit {} hit", lim); - } - } - } -} - // Savestating impl Sim { pub fn save_dir(&self) -> String { diff --git a/tests/src/main.rs b/tests/src/main.rs index 28e3cf4678..0dbbe9916a 100644 --- a/tests/src/main.rs +++ b/tests/src/main.rs @@ -223,11 +223,13 @@ fn test_lane_changing(map: &Map) -> Result<(), String> { let mut sim = sim::Sim::new(&map, opts, &mut Timer::throwaway()); let mut rng = sim::SimFlags::for_test("test_lane_changing").make_rng(); scenario.instantiate(&mut sim, &map, &mut rng, &mut Timer::throwaway()); - sim.run_until_done(&map, |_, _| {}, None); + while !sim.is_done() { + sim.tiny_step(&map, &mut None); + } // This time limit was determined by watching the scenario manually. This test prevents the // time from regressing, which would probably indicate something breaking related to lane // selection. - let limit = Duration::minutes(8) + Duration::seconds(35.0); + let limit = Duration::minutes(8) + Duration::seconds(10.0); if sim.time() > Time::START_OF_DAY + limit { panic!( "Lane-changing scenario took {} to complete; it should be under {}",