import sys from validate.utilities import report CATEGORIES = {'H', 'A', 'P', 'S', 'D', 'G', 'C', 'E', 'F', 'N', 'R', 'T', 'Q', 'L', 'U'} def is_primary(edge): for attribute, value in zip(edge.attributes or (), edge.values or ()): if attribute == "remote" and value != "false": return False return True def is_implicit(node): for prop, value in zip(node.properties or (), node.values or ()): if prop == "implicit" and value != "false": return True return False def test(graph, actions, stream=sys.stderr): n = 0 for edge in graph.edges: if not isinstance(edge.lab, str) or len(edge.lab) == 0: n += 1 report(graph, "missing or invalid label", edge=edge, framework="UCCA", stream=stream) elif edge.lab.upper() not in CATEGORIES: n += 1 report(graph, "edge label is not a UCCA category", edge=edge, framework="UCCA", stream=stream) if edge.is_loop(): n += 1 report(graph, "loop edge", edge=edge, framework="UCCA", stream=stream) roots = [] for node in graph.nodes: primary = [edge for edge in node.incoming_edges if is_primary(edge)] primary_parents = {edge.src for edge in primary} if not primary: roots.append(node) elif len(primary_parents) > 1: n += 1 report(graph, "multiple primary parents for node", node=node, edge=primary[0], framework="UCCA", stream=stream) if not roots: n += 1 report(graph, "no roots in graph", framework="UCCA", stream=stream) elif len(roots) > 1: n += 1 report(graph, "multiple roots in graph", node=roots[0], framework="UCCA", stream=stream) else: for node in roots: remotes = [edge for edge in node.incoming_edges if not is_primary(edge)] if remotes: n += 1 report(graph, "root has remote parents", node=node, edge=remotes[0], framework="UCCA", stream=stream) for node in graph.nodes: if node.is_leaf() and not node.anchors and not is_implicit(node): n += 1 report(graph, "unanchored non-implicit node", node=node, framework="UCCA", stream=stream) return n