aboutsummaryrefslogtreecommitdiffstats
path: root/tests/check.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/check.py')
-rw-r--r--tests/check.py91
1 files changed, 88 insertions, 3 deletions
diff --git a/tests/check.py b/tests/check.py
index 64e5021..c7a6c79 100644
--- a/tests/check.py
+++ b/tests/check.py
@@ -1079,6 +1079,80 @@ on go {
"""
+# The tier where its first checks missed (module_tier's seeds 17 and 23): a
+# value in a loop made of a phi where an if's ways meet in it (MERGES_SOURCE:
+# taken as made outside the loop, it was made once for every round), and the
+# outermost loop's round past the work budget (BUDGET_SOURCE: given up at the
+# loop's instruction, with nothing on the stack, rather than its iteration).
+MERGES_SOURCE = """record Cell {
+ at = 0
+ v = 0
+}
+state out = 0
+state acc = 0
+input go = message {
+ n: u32
+ m: u32
+ q: u32
+}
+on go {
+ let t: list of Cell by at
+ let f: list of Cell
+ for i in 0 .. go.n {
+ t.add(Cell { at: i, v: i })
+ f.append(Cell { at: i * 2, v: i })
+ }
+ let s = 0
+ let u = 1
+ for i in 0 .. go.m {
+ for j in 0 .. go.n {
+ if t.has(go.q) {
+ acc = acc + u
+ }
+ for c in f {
+ if go.m != u {
+ s = s + (floor(go.n / 7) - max(u, go.m))
+ }
+ t[3].v = 1000
+ }
+ acc = acc + (go.n + go.m)
+ }
+ t[3].v = ((255 - s) + (1000 - 1000))
+ }
+ out = s
+ acc = acc + u
+}
+"""
+
+BUDGET_SOURCE = """record Cell {
+ at = 0
+ v = 0
+}
+state out = 0
+state acc = 0
+input go = message {
+ n: u32
+ m: u32
+ q: u32
+}
+on go {
+ let t: list of Cell by at
+ let f: list of Cell
+ for i in 0 .. go.n {
+ t.add(Cell { at: i, v: i })
+ f.append(Cell { at: i * 2, v: i })
+ }
+ let s = 0
+ let u = 1
+ for i in 0 .. go.m {
+ if !(go.q != s) { break }
+ t[3].v = (t[floor(go.n / 2)].v + (go.m + go.n))
+ }
+ out = s
+ acc = acc + u
+}
+"""
+
def module_assumptions(aup, pure, work):
"""The compiled code's integers (Pure docs/design/022) where they stop
holding: a loop whose columns hold small whole numbers until, halfway,
@@ -1107,6 +1181,15 @@ def module_assumptions(aup, pure, work):
outputs[jit] = done.stdout
assert outputs['all'] == outputs['0'], next((a, b) for a, b in zip(outputs['all'].splitlines(), outputs['0'].splitlines()) if a != b)
assert all(json.loads(line)['fault'] == 'none' for line in outputs['0'].splitlines())
+ messages = ''.join(f'message go {struct.pack("<III", n, m, q).hex()}\nwork\n' for n, m, q in ((70, 40, 3), (130, 25, 2)))
+ for name, text in (('merges', MERGES_SOURCE), ('budget', BUDGET_SOURCE)): # the tier's, as the executor: states, faults, work
+ source, program = work / f'{name}.aup', work / f'{name}.pmod'
+ source.write_text(text)
+ compile_module(aup, source, program)
+ outputs = {jit: subprocess.run([str(pure / 'build/pure-run'), str(program)], input=messages + 'budget 1201\n' + messages,
+ capture_output=True, text=True, timeout=120, env=dict(os.environ, PURE_JIT=jit)).stdout
+ for jit in ('all', '0')}
+ assert outputs['all'] == outputs['0'], (name, next((a, b) for a, b in zip(outputs['all'].splitlines(), outputs['0'].splitlines()) if a != b))
return len(runs)
@@ -1200,7 +1283,8 @@ def module_tier(aup, pure, work, programs=150):
(tier_program) whose loops the tier runs where it can, each run on a few
messages by the executor alone (PURE_JIT=0), with the compiled code
(PURE_JIT=1, all) and without the tier (PURE_TIER=0): the same states,
- faults and errors, byte for byte. Their failures (keys not there, not
+ faults, errors and work, byte for byte, with the default work budget
+ and a few small ones (where each runs out). Their failures (keys not there, not
whole, 0 divided by, cells past their columns' widths, a list not yet
DENSE) are where the tier gives up to the executor."""
import os
@@ -1208,7 +1292,8 @@ def module_tier(aup, pure, work, programs=150):
import struct
rng = random.Random(23)
runs = [(0, 0, 0), (5, 3, 1), (70, 40, 3), (130, 25, 2), (300, 7, 299), (70, 70, 64)]
- commands = ''.join(f'message go {struct.pack("<III", n, m, q).hex()}\n' for n, m, q in runs)
+ messages = ''.join(f'message go {struct.pack("<III", n, m, q).hex()}\nwork\n' for n, m, q in runs)
+ commands = messages + ''.join(f'budget {b}\n' + messages for b in (61, 389, 1201, 4099)) + 'budget 0\n' + messages
checked = failed = 0
for i in range(programs):
source, module = work / f'tier-{i}.aup', work / f'tier-{i}.pmod'
@@ -1228,7 +1313,7 @@ def module_tier(aup, pure, work, programs=150):
assert outputs[name] == outputs['0'], (i, name, source.read_text(),
next((a, b) for a, b in zip(outputs[name].splitlines(), outputs['0'].splitlines()) if a != b))
checked += 1
- failed += sum(json.loads(line)['fault'] != 'none' for line in outputs['0'].splitlines() if line.startswith('{'))
+ failed += sum(json.loads(line).get('fault', 'none') != 'none' for line in outputs['0'].splitlines() if line.startswith('{'))
assert checked >= programs // 2, checked
return {'programs': checked, 'failed_events': failed}