def step(self, action):
<EOL>if self.done:<EOL><INDENT>raise ValueError('<STR_LIT>')<EOL><DEDENT>self.controllers[<NUM_LIT:0>][:] = action<EOL>_LIB.Step(self._env)<EOL>reward = self._get_reward()<EOL>self.done = self._get_done()<EOL>info = self._get_info()<EOL>self._did_step(self.done)<EOL>if reward < self.reward_range[<NUM_LIT:0>]:<EOL><INDENT>reward = self.reward_range[<NUM_LIT:0>]<EOL><DEDENT>elif reward > self.reward_range[<NUM_LIT:1>]:<EOL><INDENT>reward = self.reward_range[<NUM_LIT:1>]<EOL><DEDENT>return self.screen, reward, self.done, info<EOL>
Run one frame of the NES and return the relevant observation data.

Args:
    action (byte): the bitmap determining which buttons to press

Returns:
    a tuple of:
    - state (np.ndarray): next frame as a result of the given action
    - reward (float) : amount of reward returned after given action
    - done (boolean): whether the episode has ended
    - info (dict): contains auxiliary diagnostic information