code: def find_state_op_colocation_error(graph, reported_tags=None):
    
    state_op_types = list_registered_stateful_ops_without_inputs()
    state_op_map = {op.name: op for op in graph.get_operations()
                    if op.type in state_op_types}
    for op in state_op_map.values():
      for colocation_group in op.colocation_groups():
        if not (colocation_group.startswith(tf.compat.as_bytes("loc:@")) and
                tf.compat.as_str_any(colocation_group[5:]) in state_op_map):
          tags_prefix = ("" if reported_tags is None else
                         "in the graph for tags %s, " % reported_tags)
          return (
              "A state-holding node x of a module's graph (e.g., a Variable op) "
              "must not be subject to a tf.colocate_with(y) constraint "
              "unless y is also a state-holding node.\n"
              "Details: %snode '%s' has op '%s', which counts as state-holding, "
              "but Operation.colocation_groups() == %s. " %
              (tags_prefix, op.name, op.type, op.colocation_groups()))
    return None
docs: Returns error message for colocation of state ops, or None if ok.