mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-11-24 09:24:26 +03:00
Handle bike trips that wind up with no actual biking portion due to live
edits. #312 ... And with this, traffic seitan makes it through an entire day at montlake! Next up, lakeslice I guess.
This commit is contained in:
parent
8b0d6c6e92
commit
5973da0717
@ -11,9 +11,9 @@ use crate::mechanics::Queue;
|
||||
use crate::sim::Ctx;
|
||||
use crate::{
|
||||
ActionAtEnd, AgentID, AgentProperties, CarID, Command, CreateCar, DistanceInterval,
|
||||
DrawCarInput, Event, IntersectionSimState, ParkedCar, ParkingSim, ParkingSimState, ParkingSpot,
|
||||
PersonID, Scheduler, SimOptions, TimeInterval, TransitSimState, TripID, TripManager,
|
||||
UnzoomedAgent, Vehicle, WalkingSimState, FOLLOWING_DISTANCE,
|
||||
DrawCarInput, Event, IntersectionSimState, ParkedCar, ParkingSim, ParkingSpot, PersonID,
|
||||
SimOptions, TimeInterval, TransitSimState, TripID, TripManager, UnzoomedAgent, Vehicle,
|
||||
WalkingSimState, FOLLOWING_DISTANCE,
|
||||
};
|
||||
|
||||
const TIME_TO_WAIT_AT_BUS_STOP: Duration = Duration::const_seconds(10.0);
|
||||
@ -89,14 +89,14 @@ impl DrivingSimState {
|
||||
&mut self,
|
||||
now: Time,
|
||||
mut params: CreateCar,
|
||||
map: &Map,
|
||||
intersections: &IntersectionSimState,
|
||||
parking: &ParkingSimState,
|
||||
scheduler: &mut Scheduler,
|
||||
ctx: &mut Ctx,
|
||||
) -> Option<CreateCar> {
|
||||
let first_lane = params.router.head().as_lane();
|
||||
|
||||
if !intersections.nobody_headed_towards(first_lane, map.get_l(first_lane).src_i) {
|
||||
if !ctx
|
||||
.intersections
|
||||
.nobody_headed_towards(first_lane, ctx.map.get_l(first_lane).src_i)
|
||||
{
|
||||
return Some(params);
|
||||
}
|
||||
if let Some(idx) = self.queues[&Traversable::Lane(first_lane)].get_idx_to_insert_car(
|
||||
@ -134,8 +134,8 @@ impl DrivingSimState {
|
||||
match car.router.maybe_handle_end(
|
||||
params.start_dist,
|
||||
&car.vehicle,
|
||||
parking,
|
||||
map,
|
||||
ctx.parking,
|
||||
ctx.map,
|
||||
car.trip_and_person,
|
||||
&mut self.events,
|
||||
) {
|
||||
@ -165,9 +165,10 @@ impl DrivingSimState {
|
||||
}
|
||||
}
|
||||
|
||||
car.state = car.crossing_state(params.start_dist, now, map);
|
||||
car.state = car.crossing_state(params.start_dist, now, ctx.map);
|
||||
}
|
||||
scheduler.push(car.state.get_end_time(), Command::UpdateCar(car.vehicle.id));
|
||||
ctx.scheduler
|
||||
.push(car.state.get_end_time(), Command::UpdateCar(car.vehicle.id));
|
||||
{
|
||||
let queue = self.queues.get_mut(&Traversable::Lane(first_lane)).unwrap();
|
||||
queue.cars.insert(idx, car.vehicle.id);
|
||||
@ -180,6 +181,7 @@ impl DrivingSimState {
|
||||
}
|
||||
Some(params)
|
||||
}
|
||||
|
||||
/// State transitions for this car:
|
||||
///
|
||||
/// Crossing -> Queued or WaitingToAdvance
|
||||
|
@ -475,14 +475,10 @@ impl Sim {
|
||||
let maybe_parked_car = create_car.maybe_parked_car.clone();
|
||||
let req = create_car.req.clone();
|
||||
|
||||
if let Some(create_car) = self.driving.start_car_on_lane(
|
||||
self.time,
|
||||
create_car,
|
||||
map,
|
||||
&self.intersections,
|
||||
&self.parking,
|
||||
&mut self.scheduler,
|
||||
) {
|
||||
if let Some(create_car) = self
|
||||
.driving
|
||||
.start_car_on_lane(self.time, create_car, &mut ctx)
|
||||
{
|
||||
// Starting the car failed for some reason.
|
||||
if retry_if_no_room {
|
||||
// TODO Record this in the trip log
|
||||
@ -493,14 +489,6 @@ impl Sim {
|
||||
} else {
|
||||
// Buses don't use Command::SpawnCar, so this must exist.
|
||||
let (trip, person) = create_car.trip_and_person.unwrap();
|
||||
// Have to redeclare for the borrow checker
|
||||
let mut ctx = Ctx {
|
||||
parking: &mut self.parking,
|
||||
intersections: &mut self.intersections,
|
||||
cap: &mut self.cap,
|
||||
scheduler: &mut self.scheduler,
|
||||
map,
|
||||
};
|
||||
self.trips.cancel_trip(
|
||||
self.time,
|
||||
trip,
|
||||
|
@ -372,11 +372,15 @@ impl TripManager {
|
||||
end,
|
||||
constraints: PathConstraints::Bike,
|
||||
};
|
||||
if let Some(router) = ctx
|
||||
.map
|
||||
.pathfind(req.clone())
|
||||
.map(|path| drive_to.make_router(bike, path, ctx.map))
|
||||
{
|
||||
let maybe_router = if req.start == req.end {
|
||||
// TODO Convert to a walking trip!
|
||||
None
|
||||
} else {
|
||||
ctx.map
|
||||
.pathfind(req.clone())
|
||||
.map(|path| drive_to.make_router(bike, path, ctx.map))
|
||||
};
|
||||
if let Some(router) = maybe_router {
|
||||
ctx.scheduler.push(
|
||||
now,
|
||||
Command::SpawnCar(
|
||||
|
@ -6,7 +6,7 @@
|
||||
use rand::seq::SliceRandom;
|
||||
use rand_xorshift::XorShiftRng;
|
||||
|
||||
use abstutil::{CmdArgs, Timer};
|
||||
use abstutil::{prettyprint_usize, CmdArgs, Timer};
|
||||
use geom::Duration;
|
||||
use map_model::{LaneID, LaneType, Map, MapEdits};
|
||||
use sim::{Sim, SimFlags};
|
||||
@ -60,6 +60,21 @@ fn run(map: &mut Map, sim: &mut Sim, rng: &mut XorShiftRng, timer: &mut Timer) {
|
||||
sim.handle_live_edited_traffic_signals(&map);
|
||||
sim.handle_live_edits(&map);
|
||||
}
|
||||
|
||||
let mut finished = 0;
|
||||
let mut cancelled = 0;
|
||||
for (_, _, maybe_mode, _) in &sim.get_analytics().finished_trips {
|
||||
if maybe_mode.is_some() {
|
||||
finished += 1;
|
||||
} else {
|
||||
cancelled += 1;
|
||||
}
|
||||
}
|
||||
println!(
|
||||
"\nDone! {} finished trips, {} cancelled",
|
||||
prettyprint_usize(finished),
|
||||
prettyprint_usize(cancelled)
|
||||
);
|
||||
}
|
||||
|
||||
fn alter_turn_destinations(sim: &Sim, map: &Map, rng: &mut XorShiftRng, edits: &mut MapEdits) {
|
||||
@ -96,8 +111,6 @@ fn alter_turn_destinations(sim: &Sim, map: &Map, rng: &mut XorShiftRng, edits: &
|
||||
}
|
||||
}
|
||||
|
||||
// TODO This doesn't cause any interesting crash yet. Find somebody in the act of
|
||||
// parking/unparking/going to a spot, and nuke that instead.
|
||||
fn nuke_random_parking(map: &Map, rng: &mut XorShiftRng, edits: &mut MapEdits) {
|
||||
let num_edits = 5;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user