class_docstr: A ship that contains simulator, interpreter, and policy, will be sent to trainer.
  This class controls algorithm-related parts of training, while trainer is responsible for runtime part.
  
  The ship also defines the most important logic of the core training part,
  and (optionally) some callbacks to insert customized logics at specific events.
code: def log(self, name: str, value: Any) -> None:
      # FIXME: this is a workaround to make the log at least show somewhere.
      # Need a refactor in logger to formalize this.
      if isinstance(value, (np.ndarray, list)):
          value = np.mean(value)
      _logger.info(
          f"[Iter {self.trainer.current_iter + 1}] {name} = {value}"
      )
  
imports: from __future__ import annotations
  import weakref
  from typing import TYPE_CHECKING, Any, Callable, ContextManager, Dict, Generic, Iterable, Sequence, TypeVar, cast
  import numpy
  from tianshou.data import Collector, VectorReplayBuffer
  from tianshou.env import BaseVectorEnv
  from tianshou.policy import BasePolicy
  from qlib.constant import INF
  from qlib.log import get_module_logger
  from qlib.rl.interpreter import ActionInterpreter, ActType, ObsType, PolicyActType, StateInterpreter, StateType
  from qlib.rl.reward import Reward
  from qlib.rl.simulator import InitialStateType, Simulator
  from qlib.rl.utils import DataQueue
  from qlib.rl.utils.finite_env import FiniteVectorEnv
label_desc: Use image node_id 8 for calling the TrainingVesselBase obj's underlying member method code with example usage: obj.log(name, value) without return types