code: def expect_equals(self, left: Expr, right: Expr, *, msg: str) -> Expr:
      # Prefer returning the expression without unbacked symints
      if self.shape_env.is_unbacked_symint(left):
          self.expect_true(sympy.Eq(left, right), msg=msg)
          return right
      elif self.shape_env.is_unbacked_symint(right):
          self.expect_true(sympy.Eq(left, right), msg=msg)
          return left
      else:
          return self.guard_equals(left, right)
  
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 17 for calling the SizeVarAllocator obj's underlying member method code with example usage: obj.expect_equals(left, right) and returns: right, left, self