Tool to add return trips for a scenario. #539

This commit is contained in:
Dustin Carlino 2021-03-01 12:42:17 -08:00
parent 18a0197fba
commit 99bf415ede

View File

@ -9,24 +9,32 @@
//! in; be careful about running this on the correct input. It modifies the given `--input` binary //! in; be careful about running this on the correct input. It modifies the given `--input` binary
//! scenario in-place. //! scenario in-place.
use rand::{Rng, SeedableRng};
use rand_xorshift::XorShiftRng;
use abstutil::{CmdArgs, Timer}; use abstutil::{CmdArgs, Timer};
use geom::Duration;
use map_model::Map; use map_model::Map;
use sim::Scenario; use sim::{IndividTrip, Scenario, TripPurpose};
fn main() { fn main() {
let mut args = CmdArgs::new(); let mut args = CmdArgs::new();
let input = args.required("--input"); let input = args.required("--input");
let should_add_return_trips = args.enabled("--add_return_trips"); let should_add_return_trips = args.enabled("--add_return_trips");
let should_add_lunch_trips = args.enabled("--add_lunch_trips"); let should_add_lunch_trips = args.enabled("--add_lunch_trips");
let rng_seed: u64 = args
.optional_parse("--rng_seed", |s| s.parse())
.unwrap_or(42);
args.done(); args.done();
let mut rng = XorShiftRng::seed_from_u64(rng_seed);
let mut timer = Timer::new("augment scenario"); let mut timer = Timer::new("augment scenario");
let mut scenario: Scenario = abstio::must_read_object(input, &mut timer); let mut scenario: Scenario = abstio::must_read_object(input, &mut timer);
let map = Map::new(scenario.map_name.path(), &mut timer); let map = Map::new(scenario.map_name.path(), &mut timer);
if should_add_return_trips { if should_add_return_trips {
add_return_trips(&mut scenario, &map); add_return_trips(&mut scenario, &mut rng);
} }
if should_add_lunch_trips { if should_add_lunch_trips {
add_lunch_trips(&mut scenario, &map, &mut timer); add_lunch_trips(&mut scenario, &map, &mut timer);
@ -35,6 +43,26 @@ fn main() {
scenario.save(); scenario.save();
} }
fn add_return_trips(scenario: &mut Scenario, map: &Map) {} fn add_return_trips(scenario: &mut Scenario, rng: &mut XorShiftRng) {
for person in &mut scenario.people {
if person.trips.len() != 1 {
continue;
}
// Assume a uniform distribution of 4-12 hour workday
let depart =
person.trips[0].depart + rand_duration(rng, Duration::hours(4), Duration::hours(12));
person.trips.push(IndividTrip::new(
depart,
TripPurpose::Home,
person.origin,
person.trips[0].mode,
));
}
}
fn add_lunch_trips(scenario: &mut Scenario, map: &Map, timer: &mut Timer) {} fn add_lunch_trips(scenario: &mut Scenario, map: &Map, timer: &mut Timer) {}
fn rand_duration(rng: &mut XorShiftRng, low: Duration, high: Duration) -> Duration {
Duration::seconds(rng.gen_range(low.inner_seconds()..high.inner_seconds()))
}