class_docstr: Convert symbolic shape in ``reshape`` to integers.
  
  Note: This does not perform any optimization, but simply
  replaces symbols with positive integers if solved from volumetric
  constraint, or -1. Therefore, this pass fails if more than one symbol
  needs to be resolved to -1.
  
  .. code-block::
  
      # Before remove_symbolic_reshape pass.
      main(%x: (s0, 4, fp32)) {
        block0() {
          %reshape_0_shape_0: (3,i32)^ = const(val=(s0, s1, 2))
          %reshape_0: (s0, 2, 2, fp32) = reshape(x=%x, shape=%reshape_0_shape_0)
        } -> (%reshape_0)
      }
  
      # After remove_symbolic_reshape pass.
      main(%x: (s0, 4, fp32)) {
        block0() {
          %reshape_0_shape_0x: (3,i32)* = const(val=[-1, 2, 2])
          %reshape_0: (-1, 2, 2, fp32) = reshape(x=%x, shape=%reshape_0_shape_0x)
        } -> (%reshape_0)
      }
  
  TODO (rdar://59165842): Use expand_dims, squeeze etc to use 0 instead of dynamic reshape with -1.
class_docstr_tok: ["Convert","symbolic","shape","in","``","reshape","``","to","integers",".","Note",":","This","does","not","perform","any","optimization",",","but","simply","replaces","symbols","with","positive","integers","if","solved","from","volumetric","constraint",",","or","-1",".","Therefore",",","this","pass","fails","if","more","than","one","symbol","needs","to","be","resolved","to","-1",".","..","code-block",":",":","#","Before","remove_symbolic_reshape","pass",".","main","(","%","x",":","(","s0",",","4",",","fp32",")",")","{","block0","(",")","{","%","reshape_0_shape_0",":","(","3",",","i32",")","^","=","const","(","val=","(","s0",",","s1",",","2",")",")","%","reshape_0",":","(","s0",",","2",",","2",",","fp32",")","=","reshape","(","x=","%","x",",","shape=","%","reshape_0_shape_0",")","}","-",">","(","%","reshape_0",")","}","#","After","remove_symbolic_reshape","pass",".","main","(","%","x",":","(","s0",",","4",",","fp32",")",")","{","block0","(",")","{","%","reshape_0_shape_0x",":","(","3",",","i32",")","*","=","const","(","val=","[","-1",",","2",",","2","]",")","%","reshape_0",":","(","-1",",","2",",","2",",","fp32",")","=","reshape","(","x=","%","x",",","shape=","%","reshape_0_shape_0x",")","}","-",">","(","%","reshape_0",")","}","TODO","(","rdar",":","\/\/59165842",")",":","Use","expand_dims",",","squeeze","etc","to","use","0","instead","of","dynamic","reshape","with","-1","."]
code: def apply(self, prog: Program):
      for f in prog.functions.values():
          num_changes = self._remove_symbolic_reshape_block(f)
          msg = "remove_symbolic_reshape: changed {} reshapes."
          logger.info(msg.format(num_changes))
  
file_path: coremltools/coremltools/converters/mil/mil/passes/defs/cleanup/remove_symbolic_reshape.py
imports: from coremltools import _logger
  from coremltools.converters.mil.mil import Builder
  from coremltools.converters.mil.mil import Program
  from coremltools.converters.mil.mil.passes.graph_pass import AbstractGraphPass
  from coremltools.converters.mil.mil.passes.helper import block_context_manager
  from coremltools.converters.mil.mil.passes.pass_registry import register_pass
  from coremltools.converters.mil.mil.types.symbolic import any_variadic, is_symbolic, num_symbolic
label_desc: Use image node_id 1 for calling the remove_symbolic_reshape obj's underlying member method code with example usage: obj.apply(prog) without return types