mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-12-01 19:27:11 +03:00
validation for traffic signal assignments too
This commit is contained in:
parent
4d7c1203a6
commit
1489f2fe7f
@ -16,10 +16,12 @@ pub struct ControlTrafficSignal {
|
||||
|
||||
impl ControlTrafficSignal {
|
||||
pub fn new(map: &Map, id: IntersectionID) -> ControlTrafficSignal {
|
||||
ControlTrafficSignal {
|
||||
let ts = ControlTrafficSignal {
|
||||
id,
|
||||
cycles: greedy_assignment(map, id),
|
||||
}
|
||||
};
|
||||
ts.validate(map);
|
||||
ts
|
||||
}
|
||||
|
||||
pub fn is_changed(&self) -> bool {
|
||||
@ -36,6 +38,33 @@ impl ControlTrafficSignal {
|
||||
let remaining_cycle_time = next_cycle_time - time;
|
||||
(cycle, remaining_cycle_time)
|
||||
}
|
||||
|
||||
fn validate(&self, map: &Map) {
|
||||
// Does the assignment cover the correct set of turns?
|
||||
let expected_turns: BTreeSet<TurnID> = map.get_i(self.id).turns.iter().cloned().collect();
|
||||
let mut actual_turns: BTreeSet<TurnID> = BTreeSet::new();
|
||||
for cycle in &self.cycles {
|
||||
actual_turns.extend(cycle.priority_turns.clone());
|
||||
actual_turns.extend(cycle.yield_turns.clone());
|
||||
}
|
||||
if expected_turns != actual_turns {
|
||||
panic!("Traffic signal assignment for {} broken. Missing turns {:?}, contains irrelevant turns {:?}", self.id, expected_turns.difference(&actual_turns), actual_turns.difference(&expected_turns));
|
||||
}
|
||||
|
||||
// Do any of the priority turns in one cycle conflict?
|
||||
for cycle in &self.cycles {
|
||||
for t1 in &cycle.priority_turns {
|
||||
for t2 in &cycle.priority_turns {
|
||||
if map.get_t(*t1).conflicts_with(map.get_t(*t2)) {
|
||||
panic!(
|
||||
"Traffic signal has conflicting priority turns {:?} and {:?} in one cycle",
|
||||
t1, t2
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
|
Loading…
Reference in New Issue
Block a user