docstr: Disallow sibling groups from having different C_permutable flags and coparent groups from having different K_permutable flags within the groups
code: def propagate_permutation_flags(cls, fx_graph):
      """Disallow sibling groups from having different C_permutable flags and coparent groups from having different K_permutable flags within the groups"""
  
      made_change = True  # will we need to repeat this propagation?
      # TODO: just propagate to sibling groups and coparent groups directly, instead of iteratively to direct real_parents and siblings
      while made_change:
          made_change = False
  
          if cls.__verbosity > 0:
              print("Making a pass at propagating permutation flags")
  
          for node_name in fx_graph.keys():
              fx_node = fx_graph.get(node_name)
  
              node_parents = fx_graph.get(node_name).get("parents")
              node_real_parents = fx_graph.get(node_name).get(
                  "real_parents"
              )
              node_children = fx_graph.get(node_name).get("children")
              node_real_children = fx_graph.get(node_name).get(
                  "real_children"
              )
  
              # input layers can't be permuted along C without a runtime fixup, skip them
              if node_parents is None or (
                  "x" in node_parents
                  and "C_permutable" in fx_graph[node_name].keys()
                  and fx_graph[node_name]["C_permutable"]
              ):
                  if cls.__verbosity > 1:
                      print(
                          f"{node_name} has no parents, or only an input, disabling permutations in C"
                      )
                  made_change = True
                  fx_graph[node_name]["C_permutable"] = False
  
              # output layers can't be permuted along K without a runtime fixup, skip them
              if node_children is None or (
                  "output" in node_children
                  and "K_permutable" in fx_graph[node_name].keys()
                  and fx_graph[node_name]["K_permutable"]
              ):
                  if cls.__verbosity > 1:
                      print(
                          f"{node_name} has no children, or only an output, disabling permutations in K"
                      )
                  made_change = True
                  fx_graph[node_name]["K_permutable"] = False
                  fx_graph[node_name]["K_passthru"] = False
  
              if "is_real" in fx_node.keys() and fx_node["is_real"]:
                  # siblings must share C-flags; if one cannot be permuted along C, none can
                  sibling_group_id = fx_graph[node_name][
                      "sibling_group_id"
                  ]
                  all_siblings = cls.__group_data["sibling_groups"][
                      sibling_group_id
                  ]
                  made_change = (
                      cls.propagate_sibling_group(
                          fx_graph, all_siblings, cls.__verbosity
                      )
                      or made_change
                  )
  
                  # coparents must share K-flags; if one cannot be permuted along K, none can
                  coparent_group_id = fx_graph[node_name][
                      "coparent_group_id"
                  ]
                  all_coparents = cls.__group_data["coparent_groups"][
                      coparent_group_id
                  ]
                  made_change = (
                      cls.propagate_coparent_group(
                          fx_graph, all_coparents, cls.__verbosity
                      )
                      or made_change
                  )
  
      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 34 for calling the Permutation obj's underlying member method code with example usage: obj.propagate_permutation_flags(cls, fx_graph) and returns: fx_graph