Spaces:
Runtime error
Runtime error
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 | |