mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-12-18 03:41:52 +03:00
Remove unused RNG stuff from abstutil, and start to think about how to tease it apart a bit
This commit is contained in:
parent
a5cf5877e6
commit
178404bd0e
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -30,8 +30,6 @@ dependencies = [
|
||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rand_xorshift 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -15,8 +15,6 @@ itertools = "0.9.0"
|
||||
lazy_static = "1.4.0"
|
||||
log = { version = "0.4.11", features=["std"] }
|
||||
num_cpus = "1.13.0"
|
||||
rand = "0.7.0"
|
||||
rand_xorshift = "0.2.0"
|
||||
scoped_threadpool = "0.1.9"
|
||||
serde = "1.0.116"
|
||||
serde_json = "1.0.57"
|
||||
|
@ -1,7 +1,13 @@
|
||||
// The contents of this crate need to be organized better:
|
||||
//
|
||||
// - Timer (a mix of logging, profiling, and even parallel execution)
|
||||
// - IO utilities, some of which have web equivalents using include_dir
|
||||
// - A/B Street-specific filesystem paths
|
||||
// - true utility functions (collections, prettyprinting, CLI parsing
|
||||
|
||||
mod cli;
|
||||
mod collections;
|
||||
mod io;
|
||||
mod random;
|
||||
mod time;
|
||||
|
||||
pub use crate::cli::CmdArgs;
|
||||
@ -16,7 +22,6 @@ pub use crate::io::{
|
||||
serialize_btreemap, serialize_multimap, serialize_usize, serialized_size_bytes, slurp_file,
|
||||
to_json, write_binary, write_json, FileWithProgress,
|
||||
};
|
||||
pub use crate::random::{fork_rng, WeightedUsizeChoice};
|
||||
pub use crate::time::{
|
||||
elapsed_seconds, prettyprint_usize, start_profiler, stop_profiler, Parallelism, Profiler,
|
||||
Timer, TimerSink,
|
||||
|
@ -1,36 +0,0 @@
|
||||
use rand::distributions::{Distribution, WeightedIndex};
|
||||
use rand::{RngCore, SeedableRng};
|
||||
use rand_xorshift::XorShiftRng;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
// Need to explain this trick -- basically keeps consistency between two different simulations when
|
||||
// each one might make slightly different sequences of calls to the RNG.
|
||||
pub fn fork_rng(base_rng: &mut XorShiftRng) -> XorShiftRng {
|
||||
XorShiftRng::from_seed([base_rng.next_u32() as u8; 16])
|
||||
}
|
||||
|
||||
// Represents the probability of sampling 0, 1, 2, 3... The sum can be anything.
|
||||
// TODO Now unused
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
pub struct WeightedUsizeChoice {
|
||||
pub weights: Vec<usize>,
|
||||
}
|
||||
|
||||
impl WeightedUsizeChoice {
|
||||
pub fn parse(string: &str) -> Option<WeightedUsizeChoice> {
|
||||
let parts: Vec<&str> = string.split(',').collect();
|
||||
if parts.is_empty() {
|
||||
return None;
|
||||
}
|
||||
let mut weights: Vec<usize> = Vec::new();
|
||||
for x in parts.into_iter() {
|
||||
let x = x.parse::<usize>().ok()?;
|
||||
weights.push(x);
|
||||
}
|
||||
Some(WeightedUsizeChoice { weights })
|
||||
}
|
||||
|
||||
pub fn sample(&self, rng: &mut XorShiftRng) -> usize {
|
||||
WeightedIndex::new(&self.weights).unwrap().sample(rng)
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
use crate::make::fork_rng;
|
||||
use crate::{
|
||||
IndividTrip, PersonID, PersonSpec, Scenario, ScenarioGenerator, SpawnTrip, TripEndpoint,
|
||||
TripMode, TripPurpose,
|
||||
@ -153,7 +154,7 @@ impl ScenarioGenerator {
|
||||
}
|
||||
};
|
||||
|
||||
(home, work, abstutil::fork_rng(rng))
|
||||
(home, work, fork_rng(rng))
|
||||
})
|
||||
.collect();
|
||||
|
||||
|
@ -16,3 +16,11 @@ pub use self::scenario::{
|
||||
IndividTrip, OffMapLocation, PersonSpec, Scenario, SpawnTrip, TripPurpose,
|
||||
};
|
||||
pub use self::spawner::{TripSpawner, TripSpec};
|
||||
use rand::{RngCore, SeedableRng};
|
||||
use rand_xorshift::XorShiftRng;
|
||||
|
||||
// Need to explain this trick -- basically keeps consistency between two different simulations when
|
||||
// each one might make slightly different sequences of calls to the RNG.
|
||||
pub fn fork_rng(base_rng: &mut XorShiftRng) -> XorShiftRng {
|
||||
XorShiftRng::from_seed([base_rng.next_u32() as u8; 16])
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
use crate::make::fork_rng;
|
||||
use crate::{
|
||||
CarID, DrivingGoal, OrigPersonID, ParkingSpot, PersonID, SidewalkPOI, SidewalkSpot, Sim,
|
||||
TripEndpoint, TripMode, TripSpec, Vehicle, VehicleSpec, VehicleType, BIKE_LENGTH,
|
||||
@ -181,7 +182,7 @@ impl Scenario {
|
||||
for (t, maybe_idx) in p.trips.iter().zip(vehicle_foreach_trip) {
|
||||
// The RNG call might change over edits for picking the spawning lane from a border
|
||||
// with multiple choices for a vehicle type.
|
||||
let mut tmp_rng = abstutil::fork_rng(rng);
|
||||
let mut tmp_rng = fork_rng(rng);
|
||||
let spec = t.trip.clone().to_trip_spec(
|
||||
maybe_idx.map(|idx| person.vehicles[idx].id),
|
||||
&mut tmp_rng,
|
||||
@ -351,7 +352,7 @@ fn seed_parked_cars(
|
||||
}
|
||||
// Changing parking on one road shouldn't affect far-off roads. Fork carefully.
|
||||
for r in map.all_roads() {
|
||||
let mut tmp_rng = abstutil::fork_rng(base_rng);
|
||||
let mut tmp_rng = fork_rng(base_rng);
|
||||
if let Some(ref mut spots) = open_spots_per_road.get_mut(&r.id) {
|
||||
spots.shuffle(&mut tmp_rng);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user