def test_conflicts_between_multiple(aircraft_on_collision): for i in range(2): pos, trk, gs, alt, vs, callsign, active, index, ac = copy.deepcopy( aircraft_on_collision) flow = Flow(pos, trk, gs, alt, vs, callsign, active) if i == 1: flow.deactivate('ac4') for step, t_lookahead in zip( [0.0, 0.35, 0.1, 0.05, 0.16, 0.0], [5 / 60, .36, 5 / 60, 5 / 60, 5 / 60, 0.]): individual_conflicts = np.array([[ conflict_between(flow.aircraft[i], flow.aircraft[j], t_lookahead) for i in flow.index ] for j in flow.index]) combined_conflicts = conflicts_between_multiple( flow, t_lookahead=t_lookahead) assert np.alltrue( conflicts_between_multiple(flow, t_lookahead=t_lookahead) == conflicts_between_multiple( flow, copy.deepcopy(flow), t_lookahead=t_lookahead)) flow.t_lookahead = t_lookahead flow._update_collisions_and_conflicts() assert np.alltrue(combined_conflicts == individual_conflicts) assert np.alltrue(flow.conflicts == combined_conflicts) flow.step(step)
def test_flow_collision(aircraft_on_collision): pos, trk, gs, alt, vs, callsign, active, index, ac = copy.deepcopy( aircraft_on_collision) flow = Flow(pos, trk, gs, alt, vs, callsign, active, calculate_collisions=True) assert ~np.any(flow.collisions) flow.step(1.9 / 15) assert ~np.any(flow.collisions) flow.step(0.2 / 15) assert flow.collisions[2, 3] and flow.collisions[3, 2] flow.deactivate('ac4') assert ~np.any(flow.collisions) pos, trk, gs, alt, vs, callsign, active, index, ac = copy.deepcopy( aircraft_on_collision) active[3] = False flow = Flow(pos, trk, gs, alt, vs, callsign, active, calculate_collisions=True) flow.step(0.5) assert flow.collisions[0, 1] and flow.collisions[1, 0] assert np.sum(flow.collisions) == 2 flow.step(0.1) assert np.sum(flow.collisions) == 0
def test_flow(caplog, aircraft_in_flow_list): pos, trk, gs, alt, vs, callsign, active, index, ac = aircraft_in_flow_list flow = Flow(pos, trk, gs, alt, vs, callsign, active) assert flow.position.shape == (3, 2) assert flow.v.shape == (3, 2) assert flow.alt.shape == (3, ) assert flow.vs_fph.shape == (3, ) assert flow.active.shape == (3, ) assert flow.active == approx(np.array([True, True, False])) flow.step(1) v_expected = [[0, 100], [50, 0], [-150, 0]] pos_expected = [[0, 100], [51, 2], [10, 20]] alt_expected = [6000, 2000, 3000] for i in index: assert flow.v[i] == approx(v_expected[i]) assert flow.alt[i] == approx(alt_expected[i]) assert flow.position[i:i + 1] == approx(np.atleast_2d(pos_expected[i])) assert ac[i].position == approx(pos[i:i + 1]) assert ac[i].trk == approx(trk[i]) assert ac[i].gs == approx(gs[i]) assert ac[i].alt == approx(alt[i]) assert ac[i].vs == approx(vs[i]) assert ac[i].callsign == callsign[i] assert ac[i].active == active[i] flow.activate('ac1') assert 'ac1 was already active' in caplog.text flow.activate('ac1', deactivate=True) flow.deactivate('ac3') assert 'ac3 was already inactive' in caplog.text flow.activate('ac3') flow.step(1) assert flow.position == approx(np.array([[0, 100], [101, 2], [-140, 20]]))
def test_conflict_between(aircraft_on_collision): pos, trk, gs, alt, vs, callsign, active, index, ac = copy.deepcopy( aircraft_on_collision) flow = Flow(pos, trk, gs, alt, vs, callsign, active) flow.deactivate('ac4') assert not conflict_between( flow.aircraft[2], flow.aircraft[3], t_lookahead=1) flow.activate('ac4') assert conflict_between(flow.aircraft[2], flow.aircraft[3], t_lookahead=1) assert not conflict_between(flow.aircraft[0], flow.aircraft[1]) assert conflict_between(flow.aircraft[0], flow.aircraft[1], t_lookahead=.36) assert not conflict_between(flow.aircraft[2], flow.aircraft[3]) flow.step(0.35) assert conflict_between(flow.aircraft[0], flow.aircraft[1]) flow.step(0.10) assert conflict_between(flow.aircraft[2], flow.aircraft[3]) flow.step(0.05) assert conflict_between(flow.aircraft[0], flow.aircraft[1]) flow.step(0.16) assert not conflict_between(flow.aircraft[0], flow.aircraft[1])