docstr: MHA nodes have a hidden out_proj node, so insert it and fix up neighboring nodes
code: def insert_MHA_out_proj(fx_graph, MHA_node, verbosity):
      """MHA nodes have a hidden out_proj node, so insert it and fix up neighboring nodes"""
  
      if verbosity > 1:
          print(f"Inserting MHA out_proj for node {MHA_node}")
      out_proj_node_name = MHA_node + ".out_proj"
      # insert the new node
      fx_graph[out_proj_node_name] = {}
      fx_graph[out_proj_node_name]["parents"] = [MHA_node]
      fx_graph[out_proj_node_name]["children"] = fx_graph[MHA_node][
          "children"
      ]
      fx_graph[MHA_node]["children"] = [out_proj_node_name]
  
      # set the new node's properties
      fx_graph[out_proj_node_name]["fx_op"] = "call_module"
      fx_graph[out_proj_node_name][
          "module_type"
      ] = "torch.nn.modules.linear.Linear"
      fx_graph[out_proj_node_name]["groups_param"] = "None"
      fx_graph[out_proj_node_name]["C_param"] = fx_graph[MHA_node][
          "C_param"
      ]
      fx_graph[out_proj_node_name]["K_param"] = fx_graph[MHA_node][
          "K_param"
      ]
      fx_graph[out_proj_node_name]["sibling_group_id"] = None
      fx_graph[out_proj_node_name]["coparent_group_id"] = None
  
      # set permutation flags
      fx_graph[out_proj_node_name]["C_permutable"] = False
      fx_graph[MHA_node]["K_permutable"] = False
      fx_graph[MHA_node]["C_permutable"] = True
      fx_graph[out_proj_node_name]["K_permutable"] = True
      fx_graph[out_proj_node_name]["K_passthru"] = False
      fx_graph[out_proj_node_name]["C_permuted"] = False
      fx_graph[out_proj_node_name]["K_permuted"] = False
      fx_graph[out_proj_node_name]["is_real"] = True
  
      if verbosity > 2:
          print(f"\tUpdated: {MHA_node}: {fx_graph[MHA_node]}")
          print(
              f"\tAdded: {out_proj_node_name}: {fx_graph[out_proj_node_name]}"
          )
  
      # update any nodes that thought their parent was the MHA node
      for node in fx_graph.keys():
          parents = fx_graph[node]["parents"]
          if node != out_proj_node_name and MHA_node in parents:
              parents.remove(MHA_node)
              parents.append(out_proj_node_name)
              fx_graph[node]["parents"] = parents
              if verbosity > 2:
                  print(
                      f"\tUpdated parents of {node}: {fx_graph[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 24 for calling the Permutation obj's underlying member method code with example usage: obj.insert_MHA_out_proj(fx_graph, MHA_node, verbosity) and returns: fx_graph