def test_get_drones_involved(self): parallel_commands = ParallelDroneCommands() self.assertEqual(set(), parallel_commands.get_drones_involved()) parallel_commands = ParallelDroneCommands( [[SingleDroneCommand("DRONE1", Command.takeoff())], [SingleDroneCommand("DRONE2", Command.takeoff())], [ ParallelDroneCommands( [[SingleDroneCommand("DRONE3", Command.takeoff())], [SingleDroneCommand("DRONE4", Command.takeoff())]]) ]]) self.assertEqual({"DRONE1", "DRONE2", "DRONE3", "DRONE4"}, parallel_commands.get_drones_involved())
def _update_states_to_wait_for_slowest_branch( self, parallel_drone_commands: ParallelDroneCommands, state_updaters: Dict[str, StateUpdater], drone_trajectory_map: Dict[str, List[State]], time_used_in_branches: List[float], drones_involved: Set[str]) -> float: longest_time_used = max(time_used_in_branches) # for each branch, let drones involved in the branch wait until longest_time_used for i, time_used in enumerate(time_used_in_branches): for name in parallel_drone_commands.drones_involved_each_branch[i]: wait_command = Command.wait(longest_time_used - time_used) self._update_states_for_single_drone_command( SingleDroneCommand(name, wait_command), state_updaters, drone_trajectory_map, drones_involved={name}) # let drones not involved in any branch wait for longest_time_used for name in drones_involved.difference( parallel_drone_commands.get_drones_involved()): wait_command = Command.wait(longest_time_used) self._update_states_for_single_drone_command( SingleDroneCommand(name, wait_command), state_updaters, drone_trajectory_map, drones_involved={name}) return longest_time_used
def _update_states_to_wait_for_slowest_branch( self, parallel_drone_commands: ParallelDroneCommands, drone_state_map: Dict[str, State], time_used_in_branches: List[float], drones_involved: Set[str]) -> float: longest_time_used = max(time_used_in_branches) # for each branch, let drones involved in the branch wait until longest_time_used for i, time_used in enumerate(time_used_in_branches): for name in parallel_drone_commands.drones_involved_each_branch[i]: old_state = drone_state_map[name] drone_state_map[ name] = old_state.copy_and_set_time_used_seconds( old_state.time_used_seconds + longest_time_used - time_used) # let drones not involved in any branch wait for longest_time_used for name in drones_involved.difference( parallel_drone_commands.get_drones_involved()): old_state = drone_state_map[name] drone_state_map[name] = old_state.copy_and_set_time_used_seconds( old_state.time_used_seconds + longest_time_used) return longest_time_used