brainstorming edit-invariant trips. initial work to reference TripIDs,

which are independent of mode.
This commit is contained in:
Dustin Carlino 2018-10-13 19:08:15 -07:00
parent 5a11c705f0
commit 80f6eb95b4
7 changed files with 72 additions and 6 deletions

View File

@ -83,3 +83,23 @@ But let's start super simple: just track total trip time for all agents. What's
- note that sum score alone is a bit meaningless, even between population types. need to A/B test to meaningfully compare. - note that sum score alone is a bit meaningless, even between population types. need to A/B test to meaningfully compare.
- In headless mode, print scores at the end - In headless mode, print scores at the end
- in UI, have an optional OSD to pop up on the right with scores so far - in UI, have an optional OSD to pop up on the right with scores so far
## Edit-Invariant
Back in the day, TurnID went from a number to (Lane, Lane, Intersection), so
that a single edit wouldn't totally throw off all the turn IDs. Now seeing a
similar problem when removing a parking lane -- the same 'seed parked cars'
command has vastly different effects between the same sim, and this tiny change
throws off the RNG and percolates everywhere. Let's think about how to make
more things invariant.
- should cars be the same?
- maybe peds have to travel farther from home to start driving.
- does the car on the far road belong to anyone in the other sim?
- forget debugability for a moment, what do we actually need to compare?
- entire trips! maybe some use a bus or not btwn two worlds
- warp to trip (using the active mode), compare trips
- problem: ped IDs right now differ wildly because the rng gets offset. maybe those should always be chosen first? maybe they should be calculated independently and stuck in the Scenario? that part of a trip is a sim-invariant ID, a spawn time, and a start/goal building. the details (legs of trip) are calculated per sim.
- the RNG is also used after spawning to later roam around for parking
- small road edits shouldnt affect this. per-car rng in an extreme, or maybe just an RNG for sim and for spawning?
- but as soon as two cars have to wander for parking instead of one, everything gets offset completely.

View File

@ -1,5 +1,9 @@
# References # References
## Example use cases
- https://www.reddit.com/r/SeattleWA/comments/9mtgkh/seven_places_to_add_bus_lanes_now/
## Groups that may be eventually interested ## Groups that may be eventually interested
- Seattle Times Traffic Lab - Seattle Times Traffic Lab

View File

@ -5,7 +5,7 @@ use geom::Pt2D;
use kml::ExtraShapeID; use kml::ExtraShapeID;
use map_model::{AreaID, BuildingID, BusStopID, IntersectionID, LaneID, Map, ParcelID, TurnID}; use map_model::{AreaID, BuildingID, BusStopID, IntersectionID, LaneID, Map, ParcelID, TurnID};
use render::DrawMap; use render::DrawMap;
use sim::{CarID, PedestrianID, Sim}; use sim::{CarID, PedestrianID, Sim, TripID};
#[derive(Clone, Copy, Hash, PartialEq, Eq, Debug, PartialOrd, Ord)] #[derive(Clone, Copy, Hash, PartialEq, Eq, Debug, PartialOrd, Ord)]
pub enum ID { pub enum ID {
@ -19,6 +19,7 @@ pub enum ID {
Parcel(ParcelID), Parcel(ParcelID),
BusStop(BusStopID), BusStop(BusStopID),
Area(AreaID), Area(AreaID),
Trip(TripID),
} }
impl ID { impl ID {
@ -51,6 +52,9 @@ impl ID {
ID::Area(id) => { ID::Area(id) => {
map.get_a(id).dump_debug(); map.get_a(id).dump_debug();
} }
ID::Trip(id) => {
sim.debug_trip(id);
}
} }
} }
@ -69,6 +73,7 @@ impl ID {
.maybe_get_bs(id) .maybe_get_bs(id)
.map(|bs| map.get_l(id.sidewalk).dist_along(bs.dist_along).0), .map(|bs| map.get_l(id.sidewalk).dist_along(bs.dist_along).0),
ID::Area(id) => map.maybe_get_a(id).map(|a| Pt2D::center(&a.points)), ID::Area(id) => map.maybe_get_a(id).map(|a| Pt2D::center(&a.points)),
ID::Trip(id) => sim.get_canonical_point_for_trip(id, map),
} }
} }

View File

@ -4,7 +4,7 @@ use objects::{DEBUG, ID};
use piston::input::Key; use piston::input::Key;
use plugins::Colorizer; use plugins::Colorizer;
use render::DrawMap; use render::DrawMap;
use sim::{CarID, PedestrianID, Sim}; use sim::{CarID, PedestrianID, Sim, TripID};
use std::usize; use std::usize;
pub enum WarpState { pub enum WarpState {
@ -93,8 +93,9 @@ fn warp(
'e' => ID::Parcel(ParcelID(idx)), 'e' => ID::Parcel(ParcelID(idx)),
'p' => ID::Pedestrian(PedestrianID(idx)), 'p' => ID::Pedestrian(PedestrianID(idx)),
'c' => ID::Car(CarID(idx)), 'c' => ID::Car(CarID(idx)),
't' => ID::Trip(TripID(idx)),
_ => { _ => {
warn!("{} isn't a valid ID; Should be [libepc][0-9]+", line); warn!("{} isn't a valid ID; Should be [libepct][0-9]+", line);
return; return;
} }
}, },

View File

@ -182,7 +182,9 @@ impl DrawMap {
ID::BusStop(id) => Box::new(self.get_bs(id)), ID::BusStop(id) => Box::new(self.get_bs(id)),
ID::Parcel(id) => Box::new(self.get_p(id)), ID::Parcel(id) => Box::new(self.get_p(id)),
ID::Area(id) => Box::new(self.get_a(id)), ID::Area(id) => Box::new(self.get_a(id)),
ID::Car(_) | ID::Pedestrian(_) => panic!("get_obj doesn't work for dynamic {:?}", id), ID::Car(_) | ID::Pedestrian(_) | ID::Trip(_) => {
panic!("get_obj doesn't work for dynamic {:?}", id)
}
} }
} }
@ -284,7 +286,7 @@ impl DrawMap {
ID::ExtraShape(id) => extra_shapes.push(Box::new(self.get_es(*id))), ID::ExtraShape(id) => extra_shapes.push(Box::new(self.get_es(*id))),
ID::BusStop(id) => bus_stops.push(Box::new(self.get_bs(*id))), ID::BusStop(id) => bus_stops.push(Box::new(self.get_bs(*id))),
ID::Turn(_) | ID::Car(_) | ID::Pedestrian(_) => { ID::Turn(_) | ID::Car(_) | ID::Pedestrian(_) | ID::Trip(_) => {
panic!("{:?} shouldn't be in the quadtree", id) panic!("{:?} shouldn't be in the quadtree", id)
} }
} }

View File

@ -5,6 +5,7 @@ use abstutil::Error;
use control::ControlMap; use control::ControlMap;
use dimensioned::si; use dimensioned::si;
use driving::DrivingSimState; use driving::DrivingSimState;
use geom::Pt2D;
use instrument::capture_backtrace; use instrument::capture_backtrace;
use intersections::IntersectionSimState; use intersections::IntersectionSimState;
use map_model::{IntersectionID, LaneID, LaneType, Map, Trace, Turn, TurnID}; use map_model::{IntersectionID, LaneID, LaneType, Map, Trace, Turn, TurnID};
@ -21,7 +22,7 @@ use view::WorldView;
use walking::WalkingSimState; use walking::WalkingSimState;
use { use {
AgentID, CarID, CarState, Distance, DrawCarInput, DrawPedestrianInput, Event, PedestrianID, AgentID, CarID, CarState, Distance, DrawCarInput, DrawPedestrianInput, Event, PedestrianID,
ScoreSummary, Tick, TIMESTEP, ScoreSummary, Tick, TripID, TIMESTEP,
}; };
#[derive(Serialize, Deserialize, Derivative)] #[derive(Serialize, Deserialize, Derivative)]
@ -367,6 +368,29 @@ impl Sim {
pub fn get_name(&self) -> &str { pub fn get_name(&self) -> &str {
&self.run_name &self.run_name
} }
// TODO dont toggle state in debug_car
pub fn debug_trip(&mut self, id: TripID) {
match self.trips_state.current_mode(id) {
Some(AgentID::Car(id)) => self.debug_car(id),
Some(AgentID::Pedestrian(id)) => self.debug_ped(id),
None => println!("{} doesn't exist", id),
}
}
pub fn get_canonical_point_for_trip(&self, id: TripID, map: &Map) -> Option<Pt2D> {
// Don't unwrap(); the trip might be registered before the agent has started.
match self.trips_state.current_mode(id) {
Some(AgentID::Car(id)) => self
.driving_state
.get_draw_car(id, self.time, map)
.map(|c| c.front),
Some(AgentID::Pedestrian(id)) => {
self.walking_state.get_draw_ped(id, map).map(|p| p.pos)
}
None => None,
}
}
} }
pub struct Benchmark { pub struct Benchmark {

View File

@ -225,6 +225,16 @@ impl TripManager {
pub fn active_agents(&self) -> Vec<AgentID> { pub fn active_agents(&self) -> Vec<AgentID> {
self.active_trip_mode.keys().cloned().collect() self.active_trip_mode.keys().cloned().collect()
} }
pub fn current_mode(&self, id: TripID) -> Option<AgentID> {
let trip = self.trips.get(id.0)?;
match trip.legs[0] {
TripLeg::Walk(_) => Some(AgentID::Pedestrian(trip.ped)),
TripLeg::Drive(ref parked, _) => Some(AgentID::Car(parked.car)),
// TODO Should be the bus, but apparently transit sim tracks differently?
TripLeg::RideBus(_, _) => Some(AgentID::Pedestrian(trip.ped)),
}
}
} }
#[derive(Serialize, Deserialize, PartialEq, Eq, Debug)] #[derive(Serialize, Deserialize, PartialEq, Eq, Debug)]