+ {sentences.map((sentence, index) => {
+ const source = compileSentence(sentence);
+ const parsed = parseConstraint(source);
+ const perRun = parsed.ok
+ ? traces.map((trace) => traceRobustness(parsed.node, trace))
+ : [];
+ const satisfiedRuns = perRun.filter((value) => value >= 0).length;
+ const rate = perRun.length === 0 ? 0 : satisfiedRuns / perRun.length;
+ const holds = rate >= sentence.quorum - 1e-9;
+ const windowed =
+ sentence.scope === "during" || sentence.scope === "within";
+ return (
+ // eslint-disable-next-line react/no-array-index-key -- fixed slots
+
+
+
+ {windowed ? (
+ <>
+
+ update(index, { from: Number(event.target.value) })
+ }
+ />
+ →
+
+ update(index, { to: Number(event.target.value) })
+ }
+ />
+ >
+ ) : null}
+
+
+
+ update(index, { bound: Number(event.target.value) })
+ }
+ />
+
+
+
+
+
+ {parsed.ok ? printExpression(parsed.node) : source}
+
+ 0 && Math.min(...perRun) >= 0
+ ? "good"
+ : "bad"
+ }
+ />
+
+
+ );
+ })}
+
+
+ {sentences.length > 1 ? (
+
+ ) : null}
+
+
+
+