code: def dump_policy(self, policy) -> str:
      dump = ""
      for x in range(self.size[0]):
          for y in range(self.size[1]):
              pos = (x, y)
              if pos == self.start:
                  dump += "\u2b28"
              elif pos == self.goal:
                  dump += "\u2b27"
              elif pos in self.walls:
                  dump += "\u2588"
              else:
                  action = policy(State(pos)).greedy()[0]
                  if action.value == 0:
                      dump += "\u21e9"
                  elif action.value == 1:
                      dump += "\u21e8"
                  elif action.value == 2:
                      dump += "\u21e7"
                  else:
                      dump += "\u21e6"
          dump += "\n"
      return dump
  
imports: import logging
  import random
  from typing import Iterable, Optional, Sequence, Tuple
  import numpy
  import torch
  from reagent.ope.estimators.sequential_estimators import DMEstimator, DoublyRobustEstimator, EpsilonGreedyRLPolicy, IPSEstimator, MAGICEstimator, NeuralDualDICE, RewardProbability, RLEstimatorInput, State, StateDistribution, StateReward, ValueFunction
  from reagent.ope.estimators.types import Action, ActionSpace
  from reagent.ope.test.envs import Environment, PolicyLogGenerator
  from reagent.ope.trainers.rl_tabular_trainers import DPTrainer, DPValueFunction, EstimatedStateValueFunction, TabularPolicy
label_desc: Use image node_id 16 for calling the GridWorld obj's underlying member method code with example usage: obj.dump_policy(policy) and returns: dump