code: def _evaluate(self) -> None:
      delta = float("inf")
      while delta >= self._threshold:
          delta = 0.0
          for state in self._env.states:
              old_value = self._state_value(state)
              new_value = 0.0
              a_dist = self._policy(state)
              for a, ap in a_dist:
                  s_dist = self._model(state, a)
                  a_value = 0.0
                  for s, rp in s_dist.items():
                      a_value += rp.prob * (
                          rp.reward + self._gamma * self._state_value(s)
                      )
                  new_value += ap * a_value
              delta = max(delta, abs(old_value - new_value))
              self._state_values[state] = new_value
      self._evaluated = True
  
imports: import pickle
  from functools import reduce
  from typing import List, Mapping, Sequence
  import torch
  from reagent.ope.estimators.sequential_estimators import Model, RLPolicy, State, ValueFunction
  from reagent.ope.estimators.types import Action, ActionDistribution, ActionSpace
  from reagent.ope.test.envs import Environment, PolicyLogGenerator
  from reagent.ope.utils import RunningAverage
label_desc: Use image node_id 4 for calling the DPValueFunction obj's underlying member method code with example usage: obj._evaluate() without return types