class_docstr: Identify nested, interleaved ``concat`` ops which can be replaced by a single ``concat`` and a `pixel shuffle` layer.
  
  This pattern occurs with the faster up-convolution from the FCRN model (Laina et al., 2016).
  
  .. code-block::
  
      # Before the concat_to_pixel_shuffle pass.
      input(N, C, H, W) -------------------
                                          |
                                          v
      input(N, C, H, W) -----> concat(axis=2, interleave=True) -----> concat(axis=3, interleave=True) ----> output
                                                                                  ^
                                                                                  |
      input(N, C, H, W) -----> concat(axis=2, interleave=True) --------------------
                  |                       ^
                  |                       |
      input(N, C, H, W) -------------------
  
  
      # After the concat_to_pixel_shuffle pass.
      input(N, C, H, W) ---------------
                                      |
                                      v
      input(N, C, H, W) -----> concat(axis=1, interleave=True) -----> pixel_shuffle(upscale_factor=2) ----> output
                                      ^
                                      |
      input(N, C, H, W) --------------|
                                      |
                                      |
      input(N, C, H, W) ---------------
class_docstr_tok: ["Identify","nested",",","interleaved","``","concat","``","ops","which","can","be","replaced","by","a","single","``","concat","``","and","a","`","pixel","shuffle","`","layer",".","This","pattern","occurs","with","the","faster","up-convolution","from","the","FCRN","model","(","Laina","et","al.",",","2016",")",".","..","code-block",":",":","#","Before","the","concat_to_pixel_shuffle","pass",".","input","(","N",",","C",",","H",",","W",")","--","--","--","--","--","--","--","--","--","-","|","v","input","(","N",",","C",",","H",",","W",")","--","--","-",">","concat","(","axis=2",",","interleave=True",")","--","--","-",">","concat","(","axis=3",",","interleave=True",")","--","--",">","output","^","|","input","(","N",",","C",",","H",",","W",")","--","--","-",">","concat","(","axis=2",",","interleave=True",")","--","--","--","--","--","--","--","--","--","--","|","^","|","|","input","(","N",",","C",",","H",",","W",")","--","--","--","--","--","--","--","--","--","-","#","After","the","concat_to_pixel_shuffle","pass",".","input","(","N",",","C",",","H",",","W",")","--","--","--","--","--","--","--","-","|","v","input","(","N",",","C",",","H",",","W",")","--","--","-",">","concat","(","axis=1",",","interleave=True",")","--","--","-",">","pixel_shuffle","(","upscale_factor=2",")","--","--",">","output","^","|","input","(","N",",","C",",","H",",","W",")","--","--","--","--","--","--","--","|","|","|","input","(","N",",","C",",","H",",","W",")","--","--","--","--","--","--","--","-"]
code: def apply(self, prog):
      for f in prog.functions.values():
          self._concat_to_pixel_shuffle_block(f)
  
imports: import numpy
  from coremltools.converters.mil._deployment_compatibility import AvailableTarget
  from coremltools.converters.mil.frontend._utils import value_at
  from coremltools.converters.mil.mil import Builder
  from coremltools.converters.mil.mil.block import is_current_opset_version_compatible_with
  from coremltools.converters.mil.mil.passes.graph_pass import AbstractGraphPass
  from coremltools.converters.mil.mil.passes.helper import _check_child_op_type, _check_var_scalar_value, block_context_manager
  from coremltools.converters.mil.mil.passes.pass_registry import register_pass
  from coremltools.converters.mil.mil.types.symbolic import any_symbolic
label_desc: Use image node_id 1 for calling the concat_to_pixel_shuffle obj's underlying member method code with example usage: obj.apply(prog) without return types