def test_update_state_return_new_state(self): # Given state = State([]) # When new_state = state.update_function(None) # Assert assert isinstance(new_state, State) assert new_state is not state
def test_state_method_update_should_return_new_state(self): # Given update = lambda x, n: (e + n for e in x) state = State([0, 1], update_function=update) # When new_state = state.update(1) # Assert assert new_state is not state assert new_state.to_list() == [1, 2]
def test_states_are_iterable(self): # Given state1 = State([1, 2, 3]) state2 = State([0, 1]) my_list = [] # When a, b, c = state1 for element in state2: my_list.append(element) # Assert assert a == 1 assert b == 2 assert c == 3 assert my_list == [0, 1]
def test_run_full_train_experiment(self): # Given state = State([0, 20]).update_function(update_state) agent = Agent(state, RandomQFunction(), state_to_actions) experiment = Experiment(agent) # When experiment.run() # Assert assert experiment.agent.state[1] == 0
def test_update_should_call_update_function(self): # Given mock_function = MagicMock() state = State([], update_function=mock_function) agent = Agent(state=state) # When action = "Do nothing" agent.update_state(action=action) # Assert mock_function.assert_called_once_with([], "Do nothing")
def test_run_full_train_experiment_with_record(self): # Given state = State([0, 20]).update_function(update_state) agent = Agent(state, RandomQFunction(), state_to_actions) recorder = Recorder() experiment = Experiment(agent) # When experiment.run(recorder=recorder) # Assert assert len(list(recorder.all_transitions)) > 0
def test_state_should_cast_to_list(self): # Given state1 = State([1, 2, 3]) state2 = State([]) # Assert assert state1.to_list() == [1, 2, 3] assert state2.to_list() == []
def test_zero_q_function_should_return_vector(self): # Given q_function = ZeroQFunction() state = State([]) two_actions = Actions("Do Nothing", "Do Something") three_actions = Actions("Do Nothing", "Do Something", "Do Something else") # When two_q_values = q_function.evaluate(state, two_actions) three_q_values = q_function.evaluate(state, three_actions) # Check assert len(two_q_values) == 2 assert len(three_q_values) == 3
def state_and_actions_to_matrix(state: State, actions: Actions): return [state.to_list() + [action] for action in actions]
def update_state(state, action): position, speed = state new_speed = max(speed - action, 0) new_position = position + speed return State((new_position, new_speed))