docstr: concat operations/modules may concatenate along the channel dimension, which requires special handling (like grouped convs)
code: def fixup_concats(cls, fx_graph):
      """concat operations/modules may concatenate along the channel dimension, which requires special handling (like grouped convs)"""
  
      if cls.__verbosity > 0:
          print("[fixup_concats]")
  
      for node_name in fx_graph.keys():
          fx_node = fx_graph[node_name]
          if fx_node.get("module_type") == "concat":
              # get real parents, find GCD of their Ks
              node_real_parents = fx_node["real_parents"]
  
              # some concats are at the front of networks (googlenet)
              if len(node_real_parents) == 0:
                  continue
  
              parents_K_params = []
              for parent in node_real_parents:
                  parent_K_param = int(fx_graph[parent]["K_param"])
                  parents_K_params.append(parent_K_param)
                  fx_graph[parent]["allow_K_mismatch"] = "concat op"
  
              # if grouped convolutions make the input channels different among siblings different sizes,
              # restrict the permutation atom to the greatest common divisor so it can be tiled as needed for each sibling (and parent)
              if cls.__verbosity > 2:
                  print(
                      f"\tfixing up concat node {node_name}, found parents' {node_real_parents} Ks: {parents_K_params}"
                  )
  
              children_GCD_param = str(np.gcd.reduce(parents_K_params))
  
              # set this to GCD of children's sibling group
              sibling_group_id = -1
              node_real_children = fx_node["real_children"]
              for child in node_real_children:
                  sibling_group_id = fx_graph[child]["sibling_group_id"]
                  fx_graph[child]["C_param"] = children_GCD_param
  
              old_children_GCD = cls.__group_data[
                  "sibling_group_C_params"
              ][sibling_group_id]
              cls.__group_data["sibling_group_C_params"][
                  sibling_group_id
              ] = children_GCD_param
  
              # fixup this node's dimensions
              # use the functionality of grouped convolutions
              fx_node["C_param"] = children_GCD_param
              fx_node["K_param"] = old_children_GCD
              fx_node["groups_param"] = str(
                  int(old_children_GCD) // int(children_GCD_param)
              )
  
              if cls.__verbosity > 2:
                  print(
                      f"\tfixed up concat node {node_name}, found GCD of parents' {node_real_parents} K to be {children_GCD_param}, updated children's {node_real_children} C_params and sibling group {sibling_group_id} GCD"
                  )
                  print(f"\tthis node now: {fx_node}")
  
      return fx_graph
  
imports: import os
  import torch
  import json
  import string
  import time
  import numpy
  import sys
  import builtins
  import io
label_desc: Use image node_id 31 for calling the Permutation obj's underlying member method code with example usage: obj.fixup_concats(cls, fx_graph) and returns: fx_graph