code: def isValueType(
      typ: CType, properties: "Optional[LazyIrProperties]" = None
  ) -> bool:
      """
      Given a type, determine if it is a Value-like type.  This is equivalent to
      being Tensor-like, but assumes the type has already been transformed.
      """
      if isinstance(typ, BaseCType):
          # I am regretting my naming conventions, but now we are wrapping at::scalar in
          # lazy value, while preserving other 'scalar' types as scalars in the IR
          treat_scalars_as_constants = (
              properties and properties.TreatScalarsAsConstants
          )
          return (
              typ.type == getValueT()
              or (
                  typ.type == scalarT and not treat_scalars_as_constants
              )
              or typ.type == SymIntT
          )
      elif typ == VectorCType(BaseCType(SymIntT)):
          # TODO: report True for this
          return False
      elif isinstance(typ, (OptionalCType, ListCType, VectorCType)):
          return isValueType(typ.elem, properties)
      return False
  
imports: from typing import Any, Dict, List, Optional, Tuple, Union
  from torchgen.api.types import BaseCppType, BaseCType, boolT, CType, deviceT, doubleT, generatorT, layoutT, ListCType, longT, memoryFormatT, NamedCType, OptionalCType, scalarT, scalarTypeT, stringT, SymIntT, VectorCType
  from torchgen.model import Argument, BaseTy, BaseType, FunctionSchema, ListType, OperatorName, OptionalType, Return, TensorOptionsArguments, Type
label_desc: Use image node_id 4 for calling a global function with example usage: isValueType(typ, properties) and returns: False, unknown, False, isValueType