[−][src]Struct sim::analytics::Analytics
As a simulation runs, different pieces emit Events. The Analytics object listens to these, organizing and storing some information from them. The UI queries Analytics to draw time-series and display statistics.
For all maps whose weekday scenario fully runs, the game's release includes some "prebaked results." These are just serialized Analytics after running the simulation on a map without any edits for the full day. This is the basis of A/B testing -- the player can edit the map, start running the simulation, and compare the live Analytics to the prebaked baseline Analytics.
Fields
road_thruput: TimeSeriesCount<RoadID>
intersection_thruput: TimeSeriesCount<IntersectionID>
traffic_signal_thruput: TimeSeriesCount<CompressedMovementID>
demand: BTreeMap<MovementID, usize>
Most fields in Analytics are cumulative over time, but this is just for the current moment in time.
bus_arrivals: Vec<(Time, CarID, BusRouteID, BusStopID)>
passengers_boarding: BTreeMap<BusStopID, Vec<(Time, BusRouteID, Duration)>>
For each passenger boarding, how long did they wait at the stop?
passengers_alighting: BTreeMap<BusStopID, Vec<(Time, BusRouteID)>>
started_trips: BTreeMap<TripID, Time>
finished_trips: Vec<(Time, TripID, Option<TripMode>, Duration)>
Finish time, ID, mode, trip duration
trip_intersection_delays: BTreeMap<TripID, BTreeMap<TurnID, u8>>
Records how long was spent waiting at each turn (Intersection) for a given trip Over a certain threshold TripID, [(TurnID, Time Waiting In Seconds)]
lane_speed_percentage: BTreeMap<TripID, BTreeMap<LaneID, u8>>
Records the average speed/maximum speed for each lane If it is over a certain threshold (<95% of max speed) TripID, [(LaneID, Percent of maximum speed as an integer (0-100)]
trip_log: Vec<(Time, TripID, Option<PathRequest>, TripPhaseType)>
intersection_delays: BTreeMap<IntersectionID, Vec<(u8, Time, Duration, AgentType)>>
Only for traffic signals. The u8 is the movement index from a CompressedMovementID.
parking_lane_changes: BTreeMap<LaneID, Vec<(Time, bool)>>
Per parking lane or lot, when does a spot become filled (true) or free (false)
parking_lot_changes: BTreeMap<ParkingLotID, Vec<(Time, bool)>>
alerts: Vec<(Time, AlertLocation, String)>
record_anything: bool
After we restore from a savestate, don't record anything. This is only going to make sense if savestates are only used for quickly previewing against prebaked results, where we have the full Analytics anyway.
Implementations
impl Analytics
[src]
pub fn new(record_anything: bool) -> Analytics
[src]
pub fn event(&mut self, ev: Event, time: Time, map: &Map)
[src]
pub fn record_demand(&mut self, path: &Path, map: &Map)
[src]
pub fn finished_trip_time(&self, trip: TripID) -> Option<Duration>
[src]
Ignores the current time. Returns None for cancelled trips.
pub fn both_finished_trips(
&self,
now: Time,
before: &Analytics
) -> Vec<(TripID, Duration, Duration, TripMode)>
[src]
&self,
now: Time,
before: &Analytics
) -> Vec<(TripID, Duration, Duration, TripMode)>
Returns pairs of trip times for finished trips in both worlds. (ID, before, after, mode)
pub fn get_trip_phases(&self, trip: TripID, map: &Map) -> Vec<TripPhase>
[src]
If calling on prebaked Analytics, be careful to pass in an unedited map, to match how the simulation was originally run. Otherwise the paths may be nonsense.
pub fn get_all_trip_phases(&self) -> BTreeMap<TripID, Vec<TripPhase>>
[src]
pub fn active_agents(&self, now: Time) -> Vec<(Time, usize)>
[src]
pub fn parking_lane_availability(
&self,
now: Time,
l: LaneID,
capacity: usize
) -> Vec<(Time, usize)>
[src]
&self,
now: Time,
l: LaneID,
capacity: usize
) -> Vec<(Time, usize)>
Returns the free spots over time
pub fn parking_lot_availability(
&self,
now: Time,
pl: ParkingLotID,
capacity: usize
) -> Vec<(Time, usize)>
[src]
&self,
now: Time,
pl: ParkingLotID,
capacity: usize
) -> Vec<(Time, usize)>
fn parking_spot_availability(
now: Time,
changes: &Vec<(Time, bool)>,
capacity: usize
) -> Vec<(Time, usize)>
[src]
now: Time,
changes: &Vec<(Time, bool)>,
capacity: usize
) -> Vec<(Time, usize)>
Trait Implementations
impl Clone for Analytics
[src]
impl Default for Analytics
[src]
impl<'de> Deserialize<'de> for Analytics
[src]
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
[src]
__D: Deserializer<'de>,
impl Serialize for Analytics
[src]
Auto Trait Implementations
impl RefUnwindSafe for Analytics
impl Send for Analytics
impl Sync for Analytics
impl Unpin for Analytics
impl UnwindSafe for Analytics
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> DeserializeOwned for T where
T: for<'de> Deserialize<'de>,
[src]
T: for<'de> Deserialize<'de>,
impl<T> Downcast for T where
T: Any,
T: Any,
fn into_any(self: Box<T>) -> Box<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn as_any(&self) -> &(dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
impl<T> DowncastSync for T where
T: Send + Sync + Any,
T: Send + Sync + Any,
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Same<T> for T
type Output = T
Should always be Self
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,