code: def __init__(self, shape_env=None):
      super().__init__()
      if shape_env is None:
          shape_env = ShapeEnv()
      self.shape_env = shape_env
      self.var_to_val = self.shape_env.var_to_val
      self.replacements: Dict[
          sympy.Symbol, Expr
      ] = self.shape_env.replacements
      # Maps of dynamic sizes that have to be precomputed on the host to the kernel args.
      # The basic idea is if we have some complicated sympy expression
      # f(s0), we may choose to precompute it on the host and then replace
      # all occurrences of that sympy expression with ps0, so that when we
      # codegen we simply reference ps0 directly without repeating
      # f(s0).  Unlike regular size variables, ps variables cannot be
      # guarded upon; so if we are asked to guard on a Sympy expression
      # which potentially could have already had a precomputed replacement
      # on it, we are obligated to invert the precomputed replacements
      # (inv_precomputed_replacements).
      self.precomputed_replacements: Dict[Expr, sympy.Symbol] = dict()
      self.inv_precomputed_replacements: Dict[
          sympy.Symbol, Expr
      ] = dict()
      self.stride_vars = self.make_stride_vars_cache()
      self.simplify_with_ranges = self.make_simplify_with_ranges_cache()
      self._simplify_loops = self.make_simplify_loops_cache()
  
imports: import functools
  import itertools
  import logging
  from typing import Any, Callable, Dict, Iterable, List, Optional, Set, Tuple, Union
  import sympy
  from sympy import Expr
  from torch.fx.experimental.symbolic_shapes import ShapeEnv
  from torch.utils._sympy.functions import FloorDiv, ModularIndexing
  from torch.utils._sympy.value_ranges import bound_sympy
  from .utils import sympy_subs, sympy_symbol, VarRanges
  from .virtualized import V
label_desc: Use image node_id 1 to create a new SizeVarAllocator object  with example: obj = SizeVarAllocator(shape_env)