Skip to content

Commit

Permalink
Issue #18: Maintain current action by selecting None action
Browse files Browse the repository at this point in the history
  • Loading branch information
Mark2000 committed Dec 1, 2023
1 parent b8b34e1 commit 37adacb
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 4 deletions.
14 changes: 12 additions & 2 deletions bsk_rl/envs/general_satellite_tasking/gym_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from gymnasium import Env, spaces

from bsk_rl.envs.general_satellite_tasking.scenario.communication import NoCommunication
from bsk_rl.envs.general_satellite_tasking.scenario.satellites import REQUIRES_RETASKING
from bsk_rl.envs.general_satellite_tasking.simulation.simulator import Simulator
from bsk_rl.envs.general_satellite_tasking.types import (
CommunicationMethod,
Expand Down Expand Up @@ -220,16 +221,25 @@ def step(
"""Propagate the simulation, update information, and get rewards
Args:
Joint action for satellites
Joint action for satellites. Can be none to maintain current task.
Returns:
observation, reward, terminated, truncated, info
"""
if len(actions) != len(self.satellites):
raise ValueError("There must be the same number of actions and satellites")
for satellite, action in zip(self.satellites, actions):
old_info = satellite.info
satellite.info = [] # reset satellite info log
satellite.set_action(action)
if action is not None:
satellite.set_action(action)
else:
if REQUIRES_RETASKING in old_info:
print(
f"Satellite {satellite.id} requires retasking "
"but received no task."
)
satellite.info.append(REQUIRES_RETASKING)

previous_time = self.simulator.sim_time # should these be recorded in simulator
self.simulator.run()
Expand Down
6 changes: 5 additions & 1 deletion bsk_rl/envs/general_satellite_tasking/scenario/satellites.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
SatObs = Any
SatAct = Any

REQUIRES_RETASKING = "REQUIRES_RETASKING"


class Satellite(ABC):
dyn_type: type["DynamicsModel"] # Type of dynamics model used by this satellite
Expand Down Expand Up @@ -153,7 +155,7 @@ def set_fsw(self, fsw_rate: float) -> "FSWModel":

def reset_post_sim(self) -> None:
"""Called in environment reset, after simulator initialization"""
pass
self.info.append(REQUIRES_RETASKING)

@property
def observation_space(self) -> spaces.Box:
Expand Down Expand Up @@ -235,6 +237,7 @@ def _update_timed_terminal_event(
[f"self.TotalSim.CurrentNanos * {macros.NANO2SEC} >= {t_close}"],
[
self._info_command(f"timed termination at {t_close:.1f} " + info),
self._satellite_command + f".info.append('{REQUIRES_RETASKING}')",
]
+ extra_actions,
terminal=self.variable_interval,
Expand Down Expand Up @@ -747,6 +750,7 @@ def _update_image_event(self, target: Target) -> None:
[
self._info_command(f"imaged {target}"),
self._satellite_command + ".imaged += 1",
self._satellite_command + f".info.append('{REQUIRES_RETASKING}')",
],
terminal=self.variable_interval,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,12 +100,14 @@ def test_init(self, sat_init):

def test_explicit_normalization(self, sat_init):
sat = so.TimeState(normalization_time=10.0)
sat.info = MagicMock()
sat.simulator = MagicMock(sim_time=1.0)
sat.reset_post_sim()
assert sat.normalized_time() == 0.1

def test_implicit_normalization(self, sat_init):
sat = so.TimeState(normalization_time=None)
sat.info = MagicMock()
sat.simulator = MagicMock(sim_time=1.0, time_limit=10.0)
sat.reset_post_sim()
assert sat.normalized_time() == 0.1
Expand Down
22 changes: 21 additions & 1 deletion tests/unittest/envs/general_satellite_tasking/test_gym_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
GeneralSatelliteTasking,
SingleSatelliteTasking,
)
from bsk_rl.envs.general_satellite_tasking.scenario.satellites import Satellite
from bsk_rl.envs.general_satellite_tasking.scenario.satellites import (
REQUIRES_RETASKING,
Satellite,
)


class TestGeneralSatelliteTasking:
Expand Down Expand Up @@ -144,6 +147,23 @@ def test_step_bad_action(self):
with pytest.raises(ValueError):
env.step((0,))

@patch.multiple(Satellite, __abstractmethods__=set())
def test_step_retask_needed(self, capfd):
mock_sat = MagicMock()
env = SingleSatelliteTasking(
satellites=[mock_sat],
env_type=MagicMock(),
env_features=MagicMock(),
data_manager=MagicMock(reward=MagicMock(return_value=25.0)),
)
env.simulator = MagicMock(sim_time=101.0)
env.step(None)
assert REQUIRES_RETASKING not in mock_sat.info
mock_sat.info = [REQUIRES_RETASKING]
env.step(None)
assert REQUIRES_RETASKING in mock_sat.info
assert "requires retasking but received no task" in capfd.readouterr().out

@pytest.mark.parametrize("sat_death", [True, False])
@pytest.mark.parametrize("timeout", [True, False])
@pytest.mark.parametrize("terminate_on_time_limit", [True, False])
Expand Down

0 comments on commit 37adacb

Please sign in to comment.