pub struct Analytics {Show 16 fields
pub road_thruput: TimeSeriesCount<RoadID>,
pub intersection_thruput: TimeSeriesCount<IntersectionID>,
pub traffic_signal_thruput: TimeSeriesCount<CompressedMovementID>,
pub demand: BTreeMap<MovementID, usize>,
pub bus_arrivals: Vec<(Time, CarID, TransitRouteID, TransitStopID)>,
pub passengers_boarding: BTreeMap<TransitStopID, Vec<(Time, TransitRouteID, Duration)>>,
pub passengers_alighting: BTreeMap<TransitStopID, Vec<(Time, TransitRouteID)>>,
pub started_trips: BTreeMap<TripID, Time>,
pub finished_trips: Vec<(Time, TripID, TripMode, Option<Duration>)>,
pub problems_per_trip: BTreeMap<TripID, Vec<(Time, Problem)>>,
pub trip_log: Vec<(Time, TripID, Option<PathRequest>, TripPhaseType)>,
pub intersection_delays: BTreeMap<IntersectionID, Vec<(u8, Time, Duration, AgentType)>>,
pub parking_lane_changes: BTreeMap<LaneID, Vec<(Time, bool)>>,
pub parking_lot_changes: BTreeMap<ParkingLotID, Vec<(Time, bool)>>,
pub(crate) alerts: Vec<(Time, AlertLocation, String)>,
record_anything: bool,
}
Expand description
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, TransitRouteID, TransitStopID)>
§passengers_boarding: BTreeMap<TransitStopID, Vec<(Time, TransitRouteID, Duration)>>
For each passenger boarding, how long did they wait at the stop?
passengers_alighting: BTreeMap<TransitStopID, Vec<(Time, TransitRouteID)>>
§started_trips: BTreeMap<TripID, Time>
§finished_trips: Vec<(Time, TripID, TripMode, Option<Duration>)>
Finish time, ID, mode, trip duration if successful (or None if cancelled)
problems_per_trip: BTreeMap<TripID, Vec<(Time, Problem)>>
Record different problems that each trip encounters.
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
For benchmarking, we may want to disable collecting data.
Implementations§
source§impl Analytics
impl Analytics
pub fn new(record_anything: bool) -> Analytics
pub fn event(&mut self, ev: Event, time: Time, map: &Map)
pub fn record_demand(&mut self, path: &Path, map: &Map)
sourcepub fn finished_trip_time(&self, trip: TripID) -> Option<Duration>
pub fn finished_trip_time(&self, trip: TripID) -> Option<Duration>
Ignores the current time. Returns None for cancelled trips.
sourcepub fn both_finished_trips(
&self,
now: Time,
before: &Analytics
) -> Vec<(TripID, Duration, Duration, TripMode)>
pub fn both_finished_trips( &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)
sourcepub fn get_trip_phases(&self, trip: TripID, map: &Map) -> Vec<TripPhase>
pub fn get_trip_phases(&self, trip: TripID, map: &Map) -> Vec<TripPhase>
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>>
pub fn active_agents(&self, now: Time) -> Vec<(Time, usize)>
sourcepub fn parking_lane_availability(
&self,
now: Time,
l: LaneID,
capacity: usize
) -> Vec<(Time, usize)>
pub fn parking_lane_availability( &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)>
fn parking_spot_availability( now: Time, changes: &[(Time, bool)], capacity: usize ) -> Vec<(Time, usize)>
pub fn problems_per_intersection( &self, now: Time, id: IntersectionID ) -> Vec<(ProblemType, Vec<(Time, usize)>)>
pub fn problems_per_lane( &self, now: Time, id: LaneID ) -> Vec<(ProblemType, Vec<(Time, usize)>)>
Trait Implementations§
source§impl<'de> Deserialize<'de> for Analytics
impl<'de> Deserialize<'de> for Analytics
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for Analytics
impl RefUnwindSafe for Analytics
impl Send for Analytics
impl Sync for Analytics
impl Unpin for Analytics
impl UnwindSafe for Analytics
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.