!7 sS pattern = [[ CirclesAndLines(circles=[Circle(text="An operation", traits=[], x=d("0.27"), y=d("0.48")), Circle(text="A standard function", traits=[], x=d("0.72"), y=d("0.48"))], lines=[Arrow(a=t5, b=t31, text="is done by", traits=[])], title="An operation") ]]; sS input = [[ CirclesAndLines(circles=[Circle(text="\"Loading a snippet\"", traits=[], x=d("0.27"), y=d("0.48")), Circle(text="loadSnippet", traits=[], x=d("0.72"), y=d("0.48")), Circle(text="one argument", traits=[], x=d("0.49"), y=d("0.74")), Circle(text="a snippet ID", traits=[], x=d("0.72"), y=d("0.74"))], lines=[Arrow(a=t5, b=t31, text="is done by", traits=[]), Arrow(a=t5, b=t57, text="takes", traits=[]), Arrow(a=t57, b=t83, text="which is", traits=[])], title="\"Loading a snippet\"") ]]; sS then = [[ CirclesAndLines(circles=[Circle(text="An operation", traits=[], x=d("0.27"), y=d("0.48")), Circle(text="some time", traits=[], x=d("0.69"), y=d("0.48"))], lines=[Arrow(a=t5, b=t31, text="takes", traits=[])], title="An operation") ]]; p { Web patternWeb = parseWeb(pattern); Web inputWeb = parseWeb(input), originalInputWeb = cloneWeb(inputWeb); Web thenWeb = parseWeb(then); Map match = web_matchAllPerms_partial(patternWeb, inputWeb, Double.NaN); print("Score: " + web_matchAllPerms_partial_score!); print("Match: " + match); web_addLabelsFromNodeToNode(match); pnl(match); Web step4 = cloneWeb(inputWeb); Pair p = web_bestNodeMatch(thenWeb, step4); if (p != null) web_copyUsingPartialMap(thenWeb, step4, litmap(p.a, p.b)); CirclesAndLines.staticPopupExtender = voidfunc(final CirclesAndLines cal, final Canvas canvas, JPopupMenu menu) { addMenuItem(menu, jmenu("Operations", "First labels only", r { cal_dropSecondaryLabels(cal); canvas.update(); })); }; showTabbedWebs("Pattern", patternWeb, "Input", originalInputWeb, "Result", inputWeb, "Then", step4); print(ai_allUnclearLabels()); }