| import sys; | |
| from graph import Graph; | |
| import score.core; | |
| def tuples(graph, explode = False): | |
| identities = dict(); | |
| names = set(); | |
| tops = set(); | |
| arguments = set(); | |
| properties = set(); | |
| for node in graph.nodes: | |
| if graph.input and explode: | |
| identity = score.core.explode(graph.input, | |
| score.core.anchor(node)); | |
| else: | |
| identity = tuple(score.core.anchor(node)); | |
| identities[node.id] = identity; | |
| if node.label is not None: names.add((identity, node.label)); | |
| if node.is_top: tops.add(identity); | |
| if node.properties and node.values: | |
| for property, value in zip(node.properties, node.values): | |
| properties.add((identity, property, value)) | |
| for edge in graph.edges: | |
| arguments.add((identities[edge.src], identities[edge.tgt], edge.lab)); | |
| return names, arguments, properties, tops; | |
| def evaluate(golds, systems, format = "json", trace = 0): | |
| tgn = tsn = tcn = 0; | |
| tga = tsa = tca = 0; | |
| tgt = tst = tct = 0; | |
| tgp = tsp = tcp = 0; | |
| scores = dict() if trace else None; | |
| result = {"n": 0}; | |
| for gold, system in score.core.intersect(golds, systems): | |
| explode = gold.input and system.input; | |
| gnames, garguments, gproperties, gtops = tuples(gold, explode = explode); | |
| snames, sarguments, sproperties, stops = tuples(system, explode = explode); | |
| if trace > 1: | |
| print("[{}] gold:\n{}\n{}\n{}\n{}\n\n" | |
| "".format(gold.id, gtops, | |
| gnames, garguments, gproperties)); | |
| print("[{}] system:\n{}\n{}\n{}\n{}\n\n" | |
| "".format(gold.id, stops, | |
| snames, sarguments, sproperties)); | |
| gn = len(gnames); sn = len(snames); | |
| cn = len(gnames & snames); | |
| ga = len(garguments); sa = len(sarguments); | |
| ca = len(garguments & sarguments); | |
| gt = len(gtops); st = len(stops); | |
| ct = len(gtops & stops); | |
| gp = len(gproperties); sp = len(sproperties); | |
| cp = len(gproperties & sproperties); | |
| tgn += gn; tsn += sn; tcn += cn; | |
| tga += ga; tsa += sa; tca += ca; | |
| tgt += gt; tst += st; tct += ct; | |
| tgp += gp; tsp += sp; tcp += cp; | |
| result["n"] += 1; | |
| if trace: | |
| if gold.id in scores: | |
| print("edm.evaluate(): duplicate graph identifier: {}" | |
| "".format(gold.id), file = sys.stderr); | |
| scores[gold.id] = {"names": {"g": gn, "s": sn, "c": cn}, | |
| "arguments": {"g": ga, "s": sa, "c": ca}, | |
| "tops": {"g": gt, "s": st, "c": ct}, | |
| "properties": {"g": gp, "s": sp, "c": cp}}; | |
| if scores is not None: result["scores"] = scores; | |
| p, r, f = score.core.fscore(tgn, tsn, tcn); | |
| result["names"] = {"g": tgn, "s": tsn, "c": tcn, "p": p, "r": r, "f": f}; | |
| p, r, f = score.core.fscore(tga, tsa, tca); | |
| result["arguments"] = {"g": tga, "s": tsa, "c": tca, "p": p, "r": r, "f": f}; | |
| p, r, f = score.core.fscore(tgt, tst, tct); | |
| result["tops"] = {"g": tgt, "s": tst, "c": tct, "p": p, "r": r, "f": f}; | |
| p, r, f = score.core.fscore(tgp, tsp, tcp); | |
| result["properties"] = {"g": tgp, "s": tsp, "c": tcp, "p": p, "r": r, "f": f}; | |
| tga = tgn + tga + tgt + tgp; | |
| tsa = tsn + tsa + tst + tsp; | |
| tca = tcn + tca + tct + tcp; | |
| p, r, f = score.core.fscore(tga, tsa, tca); | |
| result["all"] = {"g": tga, "s": tsa, "c": tca, "p": p, "r": r, "f": f}; | |
| return result; | |