docstr: Run the off-policy evaluation estimators to get a prediction for the performance of the current policy based on
  an evaluation dataset, which was collected by another policy(ies).
  :return: None
docstr_tok: ["Run","the","off-policy","evaluation","estimators","to","get","a","prediction","for","the","performance","of","the","current","policy","based","on","an","evaluation","dataset",",","which","was","collected","by","another","policy","(","ies",")",".",":","return",":","None"]
code: def run_off_policy_evaluation(self):
      """
      Run the off-policy evaluation estimators to get a prediction for the performance of the current policy based on
      an evaluation dataset, which was collected by another policy(ies).
      :return: None
      """
      assert self.ope_manager
  
      if (
          not isinstance(self.pre_network_filter, NoInputFilter)
          and len(self.pre_network_filter.reward_filters) != 0
      ):
          raise ValueError(
              "Defining a pre-network reward filter when OPEs are calculated will result in a mismatch "
              "between q values (which are scaled), and actual rewards, which are not. It is advisable "
              "to use an input_filter, if possible, instead, which will filter the transitions directly "
              "in the replay buffer, affecting both the q_values and the rewards themselves. "
          )
  
      ips, dm, dr, seq_dr, wis = self.ope_manager.evaluate(
          evaluation_dataset_as_episodes=self.memory.evaluation_dataset_as_episodes,
          evaluation_dataset_as_transitions=self.memory.evaluation_dataset_as_transitions,
          batch_size=self.ap.network_wrappers["main"].batch_size,
          discount_factor=self.ap.algorithm.discount,
          q_network=self.networks["main"].online_network,
          network_keys=list(
              self.ap.network_wrappers[
                  "main"
              ].input_embedders_parameters.keys()
          ),
      )
  
      # get the estimators out to the screen
      log = OrderedDict()
      log["Epoch"] = self.training_epoch
      log["IPS"] = ips
      log["DM"] = dm
      log["DR"] = dr
      log["WIS"] = wis
      log["Sequential-DR"] = seq_dr
      screen.log_dict(log, prefix="Off-Policy Evaluation")
  
      # get the estimators out to dashboard
      self.agent_logger.set_current_time(self.get_current_time() + 1)
      self.agent_logger.create_signal_value(
          "Inverse Propensity Score", ips
      )
      self.agent_logger.create_signal_value("Direct Method Reward", dm)
      self.agent_logger.create_signal_value("Doubly Robust", dr)
      self.agent_logger.create_signal_value(
          "Sequential Doubly Robust", seq_dr
      )
      self.agent_logger.create_signal_value(
          "Weighted Importance Sampling", wis
      )
  
imports: from collections import OrderedDict
  from typing import Union, List
  import numpy
  from rl_coach.agents.agent import Agent
  from rl_coach.core_types import ActionInfo, StateType, Batch
  from rl_coach.filters.filter import NoInputFilter
  from rl_coach.logger import screen
  from rl_coach.memories.non_episodic.prioritized_experience_replay import PrioritizedExperienceReplay
  from rl_coach.spaces import DiscreteActionSpace
  from copy import deepcopy, copy
label_desc: Use image node_id 10 for calling the ValueOptimizationAgent obj's underlying member method code with example usage: obj.run_off_policy_evaluation() without return types