'Args:
predictor_io_names (tuple of list of str): input/output names to
predict Q value from state.
player (RLEnvironment): the player.
history_len (int): length of history frames to concat. Zero-filled
initial frames.
update_frequency (int): number of new transitions to add to memory
after sampling a batch of transitions for training.'

def __init__(self, predictor_io_names, player, state_shape, batch_size, memory_size, init_memory_size, init_exploration, update_frequency, history_len):

    init_memory_size = int(init_memory_size)
    for (k, v) in locals().items():
        if (k != 'self'):
            setattr(self, k, v)
    self.exploration = init_exploration
    self.num_actions = player.get_action_space().num_actions()
    logger.info('Number    of    Legal    actions:    {}'.format(self.num_actions))
    self.rng = get_rng(self)
    self._init_memory_flag = threading.Event()
    self._populate_job_queue = queue.Queue(maxsize=5)
    self.mem = ReplayMemory(memory_size, state_shape, history_len)
