docstr: Register lowering function for complex dialect ops.
docstr_tok: ["Register","lowering","function","for","complex","dialect","ops","."]
code: def register_lower_func(op_type: str) -> Callable:
      """Register lowering function for complex dialect ops."""
  
      def lower_func_wrapper(func):
          @functools.wraps(func)
          def wrapper_inner(*args, **kwargs):
              return func(*args, **kwargs)
  
          if op_type in LowerComplex._lower_map:
              raise ValueError(
                  f"The op {op_type} already got lowering function registered."
              )
          LowerComplex._lower_map[op_type] = func
          return wrapper_inner
  
      return lower_func_wrapper
  
imports: import functools
  from typing import Callable, Dict, Optional, Tuple
  import numpy
  from coremltools.converters.mil.mil import Builder
  from coremltools.converters.mil.mil import types
  from coremltools.converters.mil.mil.operation import Operation
  from coremltools.converters.mil.mil.ops.defs.complex_dialect_ops import fft_canonicalize_length_dim, fft_canonicalize_shapes_dims
  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.var import ComplexVar, Var
label_desc: Use image node_id 1 for calling the LowerComplex obj's underlying member method code with example usage: obj.register_lower_func(op_type) and returns: lower_func_wrapper, wrapper_inner, func