code: def define_simulation_graph(batch_env, algo_cls, config):
    
    # pylint: disable=unused-variable
    step = tf.Variable(0, False, dtype=tf.int32, name='global_step')
    is_training = tf.placeholder(tf.bool, name='is_training')
    should_log = tf.placeholder(tf.bool, name='should_log')
    do_report = tf.placeholder(tf.bool, name='do_report')
    force_reset = tf.placeholder(tf.bool, name='force_reset')
    algo = algo_cls(batch_env, step, is_training, should_log, config)
    done, score, summary = tools.simulate(
        batch_env, algo, should_log, force_reset)
    message = 'Graph contains {} trainable variables.'
    tf.logging.info(message.format(tools.count_weights()))
    # pylint: enable=unused-variable
    return tools.AttrDict(locals())
docs: Define the algorithm and environment interaction.
  
    Args:
      batch_env: In-graph environments object.
      algo_cls: Constructor of a batch algorithm.
      config: Configuration object for the algorithm.
  
    Returns:
      Object providing graph elements via attributes.