Struct sim::mechanics::intersection::IntersectionSimState
source · [−]pub(crate) struct IntersectionSimState {
state: BTreeMap<IntersectionID, State>,
use_freeform_policy_everywhere: bool,
dont_block_the_box: bool,
break_turn_conflict_cycles: bool,
handle_uber_turns: bool,
disable_turn_conflicts: bool,
blocked_by: BTreeSet<(CarID, CarID)>,
events: Vec<Event>,
total_repeat_requests: usize,
not_allowed_requests: usize,
blocked_by_someone_requests: usize,
}
Expand description
Manages conflicts at intersections. When an agent has reached the end of a lane, they call maybe_start_turn to make a Request. Based on the intersection type (stop sign, traffic signal, or a “freeform policy”), the Request gets queued or immediately accepted. When agents finish turns or when some time passes (for traffic signals), the intersection also gets a chance to react, maybe granting one of the pending requests.
Most of the complexity comes from attempting to workaround https://a-b-street.github.io/docs/tech/trafficsim/gridlock.html.
Fields
state: BTreeMap<IntersectionID, State>
use_freeform_policy_everywhere: bool
dont_block_the_box: bool
break_turn_conflict_cycles: bool
handle_uber_turns: bool
disable_turn_conflicts: bool
blocked_by: BTreeSet<(CarID, CarID)>
events: Vec<Event>
total_repeat_requests: usize
not_allowed_requests: usize
blocked_by_someone_requests: usize
Implementations
sourceimpl IntersectionSimState
impl IntersectionSimState
pub fn new(
map: &Map,
scheduler: &mut Scheduler,
opts: &SimOptions
) -> IntersectionSimState
pub fn turn_finished(
&mut self,
now: Time,
agent: AgentID,
turn: TurnID,
scheduler: &mut Scheduler,
map: &Map,
handling_live_edits: bool
)
sourcepub fn cancel_request(&mut self, agent: AgentID, turn: TurnID)
pub fn cancel_request(&mut self, agent: AgentID, turn: TurnID)
For deleting cars
pub fn space_freed(
&mut self,
now: Time,
i: IntersectionID,
scheduler: &mut Scheduler,
map: &Map
)
sourcepub fn vehicle_gone(&mut self, car: CarID)
pub fn vehicle_gone(&mut self, car: CarID)
Vanished at border, stopped biking, etc – a vehicle disappeared, and didn’t have one last turn.
pub fn agent_deleted_mid_turn(&mut self, agent: AgentID, turn: TurnID)
fn wakeup_waiting(
&self,
now: Time,
i: IntersectionID,
scheduler: &mut Scheduler,
map: &Map
)
sourcepub fn update_intersection(
&mut self,
now: Time,
id: IntersectionID,
map: &Map,
scheduler: &mut Scheduler
)
pub fn update_intersection(
&mut self,
now: Time,
id: IntersectionID,
map: &Map,
scheduler: &mut Scheduler
)
This is only triggered for traffic signals.
sourcepub fn maybe_start_turn(
&mut self,
agent: AgentID,
turn: TurnID,
speed: Speed,
now: Time,
map: &Map,
scheduler: &mut Scheduler,
maybe_cars_and_queues: Option<(&Car, &FixedMap<CarID, Car>, &mut HashMap<Traversable, Queue>)>
) -> bool
pub fn maybe_start_turn(
&mut self,
agent: AgentID,
turn: TurnID,
speed: Speed,
now: Time,
map: &Map,
scheduler: &mut Scheduler,
maybe_cars_and_queues: Option<(&Car, &FixedMap<CarID, Car>, &mut HashMap<Traversable, Queue>)>
) -> bool
For cars: The head car calls this when they’re at the end of the lane WaitingToAdvance. If this returns true, then the head car MUST actually start this turn. For peds: Likewise – only called when the ped is at the start of the turn. They must actually do the turn if this returns true.
If this returns false, the agent should NOT retry. IntersectionSimState will schedule a retry event at some point.
pub fn collect_events(&mut self) -> Vec<Event>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
pub fn handle_live_edited_traffic_signals(
&mut self,
now: Time,
map: &Map,
scheduler: &mut Scheduler
)
pub fn handle_live_edits(&self, map: &Map)
pub fn approaching_leader(&mut self, agent: AgentID, turn: TurnID, eta: Time)
sourceimpl IntersectionSimState
impl IntersectionSimState
pub fn nobody_headed_towards(&self, lane: LaneID, i: IntersectionID) -> bool
pub fn debug_json(&self, id: IntersectionID, map: &Map) -> String
pub fn get_accepted_agents(&self, id: IntersectionID) -> Vec<(AgentID, TurnID)>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
pub fn get_waiting_agents(
&self,
id: IntersectionID
) -> Vec<(AgentID, TurnID, Time)>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
sourcepub fn delayed_intersections(
&self,
now: Time,
threshold: Duration
) -> Vec<(IntersectionID, Time)>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
pub fn delayed_intersections(
&self,
now: Time,
threshold: Duration
) -> Vec<(IntersectionID, Time)>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
Returns intersections with travelers waiting for at least threshold
since now
, ordered
so the longest delayed intersection is first.
pub fn current_stage_and_remaining_time(
&self,
now: Time,
i: IntersectionID
) -> (usize, Duration)
pub fn describe_stats(&self) -> Vec<String>ⓘNotable traits for Vec<u8, A>impl<A> Write for Vec<u8, A> where
A: Allocator,
A: Allocator,
pub fn populate_blocked_by(
&self,
now: Time,
graph: &mut BTreeMap<AgentID, (Duration, DelayCause)>,
map: &Map,
cars: &FixedMap<CarID, Car>,
queues: &HashMap<Traversable, Queue>
)
sourceimpl IntersectionSimState
impl IntersectionSimState
fn stop_sign_policy(
&mut self,
req: &Request,
map: &Map,
sign: &ControlStopSign,
speed: Speed,
now: Time,
scheduler: &mut Scheduler
) -> bool
fn traffic_signal_policy(
&mut self,
req: &Request,
map: &Map,
signal: &ControlTrafficSignal,
speed: Speed,
now: Time,
scheduler: Option<&mut Scheduler>
) -> bool
fn handle_accepted_conflicts(
&mut self,
req: &Request,
map: &Map,
maybe_cars_and_queues: Option<(&FixedMap<CarID, Car>, &HashMap<Traversable, Queue>)>,
wakeup_stuck_cycle: Option<(Time, &mut Scheduler)>
) -> bool
fn detect_conflict_cycle(
&self,
car: CarID,
pair: (&FixedMap<CarID, Car>, &HashMap<Traversable, Queue>)
) -> Option<HashSet<CarID>>
Trait Implementations
sourceimpl Clone for IntersectionSimState
impl Clone for IntersectionSimState
sourcefn clone(&self) -> IntersectionSimState
fn clone(&self) -> IntersectionSimState
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source
. Read more
sourceimpl<'de> Deserialize<'de> for IntersectionSimState
impl<'de> Deserialize<'de> for IntersectionSimState
sourcefn 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>,
Deserialize this value from the given Serde deserializer. Read more
sourceimpl Serialize for IntersectionSimState
impl Serialize for IntersectionSimState
Auto Trait Implementations
impl RefUnwindSafe for IntersectionSimState
impl Send for IntersectionSimState
impl Sync for IntersectionSimState
impl Unpin for IntersectionSimState
impl UnwindSafe for IntersectionSimState
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<T> Downcast for T where
T: Any,
impl<T> Downcast for T where
T: Any,
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Convert 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
. Read more
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert &Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read more
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert &mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Instruments this type with the provided Span
, returning an
Instrumented
wrapper. Read more
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
impl<T> Same<T> for T
impl<T> Same<T> for T
type Output = T
type Output = T
Should always be Self
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into
)Uses borrowed data to replace owned data, usually by cloning. Read more