class_docstr: GridWorld set up in https://people.cs.umass.edu/~pthomas/papers/Thomas2015c.pdf
class_docstr_tok: ["GridWorld","set","up","in","https",":","\/\/people.cs.umass.edu\/~pthomas\/papers\/Thomas2015c.pdf"]
code: def _transit(
      self, from_pos: Tuple[int, int], to_pos: Tuple[int, int]
  ) -> Tuple[Tuple[int, int], float, bool]:
      if not self._validate(to_pos):
          return from_pos, 0.0, False
      elif to_pos == (1, 2):
          return to_pos, -10.0, False
      elif to_pos == (1, 3):
          return to_pos, 1.0, False
      elif to_pos == self.goal:
          return to_pos, 10.0, True
      else:
          return to_pos, -1.0, False
  
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 2 for calling the ThomasGridWorld obj's underlying member method code with example usage: obj._transit(from_pos, to_pos) and returns: from_pos,  int,  False, to_pos,  unknown,  False, to_pos,  int,  False, to_pos,  int,  True, to_pos,  unknown,  False