@elaraai/east 1.0.84 → 1.0.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/analyze.d.ts.map +1 -1
- package/dist/src/analyze.js +48 -0
- package/dist/src/analyze.js.map +1 -1
- package/dist/src/ast_to_ir.coerce_to.spec.js +4 -4
- package/dist/src/ast_to_ir.coerce_to.spec.js.map +1 -1
- package/dist/src/ast_to_ir.d.ts +6 -1
- package/dist/src/ast_to_ir.d.ts.map +1 -1
- package/dist/src/ast_to_ir.js +20 -7
- package/dist/src/ast_to_ir.js.map +1 -1
- package/dist/src/builtins.d.ts +1 -1
- package/dist/src/builtins.d.ts.map +1 -1
- package/dist/src/builtins.js +52 -0
- package/dist/src/builtins.js.map +1 -1
- package/dist/src/codegen/canonical.d.ts +37 -0
- package/dist/src/codegen/canonical.d.ts.map +1 -0
- package/dist/src/codegen/canonical.js +208 -0
- package/dist/src/codegen/canonical.js.map +1 -0
- package/dist/src/codegen/codegen.spec.js +132 -201
- package/dist/src/codegen/codegen.spec.js.map +1 -1
- package/dist/src/codegen/printer.d.ts.map +1 -1
- package/dist/src/codegen/printer.js +142 -24
- package/dist/src/codegen/printer.js.map +1 -1
- package/dist/src/codegen/spellings.d.ts +4 -1
- package/dist/src/codegen/spellings.d.ts.map +1 -1
- package/dist/src/codegen/spellings.js +5 -1
- package/dist/src/codegen/spellings.js.map +1 -1
- package/dist/src/compile/builtins/index.d.ts.map +1 -1
- package/dist/src/compile/builtins/index.js +2 -0
- package/dist/src/compile/builtins/index.js.map +1 -1
- package/dist/src/compile/builtins/primitives.d.ts.map +1 -1
- package/dist/src/compile/builtins/primitives.js +2 -1
- package/dist/src/compile/builtins/primitives.js.map +1 -1
- package/dist/src/compile/builtins/query.d.ts +10 -0
- package/dist/src/compile/builtins/query.d.ts.map +1 -0
- package/dist/src/compile/builtins/query.js +5 -0
- package/dist/src/compile/builtins/query.js.map +1 -0
- package/dist/src/expr/block.d.ts.map +1 -1
- package/dist/src/expr/block.js +2 -1
- package/dist/src/expr/block.js.map +1 -1
- package/dist/src/expr/index.d.ts +75 -47
- package/dist/src/expr/index.d.ts.map +1 -1
- package/dist/src/expr/index.js +31 -0
- package/dist/src/expr/index.js.map +1 -1
- package/dist/src/expr/libs/datetime.d.ts +20 -20
- package/dist/src/expr/libs/datetime.d.ts.map +1 -1
- package/dist/src/expr/libs/datetime.js +208 -167
- package/dist/src/expr/libs/datetime.js.map +1 -1
- package/dist/src/expr/libs/float.d.ts +15 -15
- package/dist/src/expr/libs/float.d.ts.map +1 -1
- package/dist/src/expr/libs/float.js +298 -267
- package/dist/src/expr/libs/float.js.map +1 -1
- package/dist/src/expr/libs/integer.d.ts +12 -12
- package/dist/src/expr/libs/integer.d.ts.map +1 -1
- package/dist/src/expr/libs/integer.js +219 -194
- package/dist/src/expr/libs/integer.js.map +1 -1
- package/dist/src/expr/libs/lazy.d.ts +28 -0
- package/dist/src/expr/libs/lazy.d.ts.map +1 -0
- package/dist/src/expr/libs/lazy.js +55 -0
- package/dist/src/expr/libs/lazy.js.map +1 -0
- package/dist/src/expr/libs/lazy.spec.d.ts +6 -0
- package/dist/src/expr/libs/lazy.spec.d.ts.map +1 -0
- package/dist/src/expr/libs/lazy.spec.js +102 -0
- package/dist/src/expr/libs/lazy.spec.js.map +1 -0
- package/dist/src/expr/query.d.ts +60 -0
- package/dist/src/expr/query.d.ts.map +1 -0
- package/dist/src/expr/query.js +84 -0
- package/dist/src/expr/query.js.map +1 -0
- package/dist/src/functions.crossimport.spec.js +8 -0
- package/dist/src/functions.crossimport.spec.js.map +1 -1
- package/dist/src/functions.d.ts +45 -8
- package/dist/src/functions.d.ts.map +1 -1
- package/dist/src/functions.js +138 -28
- package/dist/src/functions.js.map +1 -1
- package/dist/src/functions.spec.js +60 -2
- package/dist/src/functions.spec.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/internal.d.ts +4 -0
- package/dist/src/internal.d.ts.map +1 -1
- package/dist/src/internal.js +9 -0
- package/dist/src/internal.js.map +1 -1
- package/dist/src/location.d.ts +22 -0
- package/dist/src/location.d.ts.map +1 -1
- package/dist/src/location.js +31 -0
- package/dist/src/location.js.map +1 -1
- package/dist/src/naming.d.ts +5 -3
- package/dist/src/naming.d.ts.map +1 -1
- package/dist/src/naming.js.map +1 -1
- package/dist/src/portable.spec.d.ts +6 -0
- package/dist/src/portable.spec.d.ts.map +1 -0
- package/dist/src/portable.spec.js +181 -0
- package/dist/src/portable.spec.js.map +1 -0
- package/dist/src/query/evaluate.d.ts +98 -0
- package/dist/src/query/evaluate.d.ts.map +1 -0
- package/dist/src/query/evaluate.js +193 -0
- package/dist/src/query/evaluate.js.map +1 -0
- package/dist/src/query/index.d.ts +17 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/index.js +17 -0
- package/dist/src/query/index.js.map +1 -0
- package/dist/src/query/jq/catalog.d.ts +174 -0
- package/dist/src/query/jq/catalog.d.ts.map +1 -0
- package/dist/src/query/jq/catalog.js +1740 -0
- package/dist/src/query/jq/catalog.js.map +1 -0
- package/dist/src/query/jq/check.d.ts +210 -0
- package/dist/src/query/jq/check.d.ts.map +1 -0
- package/dist/src/query/jq/check.js +2261 -0
- package/dist/src/query/jq/check.js.map +1 -0
- package/dist/src/query/jq/complete.d.ts +89 -0
- package/dist/src/query/jq/complete.d.ts.map +1 -0
- package/dist/src/query/jq/complete.js +320 -0
- package/dist/src/query/jq/complete.js.map +1 -0
- package/dist/src/query/jq/describe.d.ts +53 -0
- package/dist/src/query/jq/describe.d.ts.map +1 -0
- package/dist/src/query/jq/describe.js +149 -0
- package/dist/src/query/jq/describe.js.map +1 -0
- package/dist/src/query/jq/lex.d.ts +118 -0
- package/dist/src/query/jq/lex.d.ts.map +1 -0
- package/dist/src/query/jq/lex.js +371 -0
- package/dist/src/query/jq/lex.js.map +1 -0
- package/dist/src/query/jq/literals.d.ts +49 -0
- package/dist/src/query/jq/literals.d.ts.map +1 -0
- package/dist/src/query/jq/literals.js +78 -0
- package/dist/src/query/jq/literals.js.map +1 -0
- package/dist/src/query/jq/messages.d.ts +126 -0
- package/dist/src/query/jq/messages.d.ts.map +1 -0
- package/dist/src/query/jq/messages.js +172 -0
- package/dist/src/query/jq/messages.js.map +1 -0
- package/dist/src/query/jq/parse.d.ts +70 -0
- package/dist/src/query/jq/parse.d.ts.map +1 -0
- package/dist/src/query/jq/parse.js +1013 -0
- package/dist/src/query/jq/parse.js.map +1 -0
- package/dist/src/query/jq/print.d.ts +59 -0
- package/dist/src/query/jq/print.d.ts.map +1 -0
- package/dist/src/query/jq/print.js +587 -0
- package/dist/src/query/jq/print.js.map +1 -0
- package/dist/src/query/jq/shapes.d.ts +345 -0
- package/dist/src/query/jq/shapes.d.ts.map +1 -0
- package/dist/src/query/jq/shapes.js +584 -0
- package/dist/src/query/jq/shapes.js.map +1 -0
- package/dist/src/query/jq/spans.d.ts +133 -0
- package/dist/src/query/jq/spans.d.ts.map +1 -0
- package/dist/src/query/jq/spans.js +195 -0
- package/dist/src/query/jq/spans.js.map +1 -0
- package/dist/src/query/jq/split.d.ts +334 -0
- package/dist/src/query/jq/split.d.ts.map +1 -0
- package/dist/src/query/jq/split.js +2108 -0
- package/dist/src/query/jq/split.js.map +1 -0
- package/dist/src/query/jq/strftime.d.ts +20 -0
- package/dist/src/query/jq/strftime.d.ts.map +1 -0
- package/dist/src/query/jq/strftime.js +65 -0
- package/dist/src/query/jq/strftime.js.map +1 -0
- package/dist/src/query/jq/summary.d.ts +139 -0
- package/dist/src/query/jq/summary.d.ts.map +1 -0
- package/dist/src/query/jq/summary.js +222 -0
- package/dist/src/query/jq/summary.js.map +1 -0
- package/dist/src/query/jq/translate-builtins.d.ts +21 -0
- package/dist/src/query/jq/translate-builtins.d.ts.map +1 -0
- package/dist/src/query/jq/translate-builtins.js +1873 -0
- package/dist/src/query/jq/translate-builtins.js.map +1 -0
- package/dist/src/query/jq/translate.d.ts +627 -0
- package/dist/src/query/jq/translate.d.ts.map +1 -0
- package/dist/src/query/jq/translate.js +3364 -0
- package/dist/src/query/jq/translate.js.map +1 -0
- package/dist/src/query/types.d.ts +505 -0
- package/dist/src/query/types.d.ts.map +1 -0
- package/dist/src/query/types.js +231 -0
- package/dist/src/query/types.js.map +1 -0
- package/dist/src/runner_exec.d.ts +134 -0
- package/dist/src/runner_exec.d.ts.map +1 -0
- package/dist/src/runner_exec.js +371 -0
- package/dist/src/runner_exec.js.map +1 -0
- package/dist/src/runner_exec.spec.d.ts +6 -0
- package/dist/src/runner_exec.spec.d.ts.map +1 -0
- package/dist/src/runner_exec.spec.js +198 -0
- package/dist/src/runner_exec.spec.js.map +1 -0
- package/dist/src/runner_io.d.ts +370 -0
- package/dist/src/runner_io.d.ts.map +1 -0
- package/dist/src/runner_io.js +563 -0
- package/dist/src/runner_io.js.map +1 -0
- package/dist/src/runner_io.spec.d.ts +6 -0
- package/dist/src/runner_io.spec.d.ts.map +1 -0
- package/dist/src/runner_io.spec.js +224 -0
- package/dist/src/runner_io.spec.js.map +1 -0
- package/dist/src/runner_merge.d.ts +95 -0
- package/dist/src/runner_merge.d.ts.map +1 -0
- package/dist/src/runner_merge.js +238 -0
- package/dist/src/runner_merge.js.map +1 -0
- package/dist/src/runner_protocol.d.ts +11 -4
- package/dist/src/runner_protocol.d.ts.map +1 -1
- package/dist/src/runner_protocol.js +11 -4
- package/dist/src/runner_protocol.js.map +1 -1
- package/dist/src/serialization/beast2/index.d.ts +1 -1
- package/dist/src/serialization/beast2/index.d.ts.map +1 -1
- package/dist/src/serialization/beast2/index.js.map +1 -1
- package/dist/src/serialization/beast2/v5/frames.d.ts +10 -6
- package/dist/src/serialization/beast2/v5/frames.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/frames.js +10 -6
- package/dist/src/serialization/beast2/v5/frames.js.map +1 -1
- package/dist/src/serialization/beast2/v5/frames.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/frames.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/frames.spec.js +42 -0
- package/dist/src/serialization/beast2/v5/frames.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/index.spec.js +108 -0
- package/dist/src/serialization/beast2/v5/index.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.d.ts +12 -7
- package/dist/src/serialization/beast2/v5/lazy.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.js +16 -6
- package/dist/src/serialization/beast2/v5/lazy.js.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.spec.js +159 -18
- package/dist/src/serialization/beast2/v5/lazy.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/stream.d.ts +110 -21
- package/dist/src/serialization/beast2/v5/stream.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/stream.js +153 -42
- package/dist/src/serialization/beast2/v5/stream.js.map +1 -1
- package/dist/src/serialization/beast2/v5/weight.d.ts +36 -0
- package/dist/src/serialization/beast2/v5/weight.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/weight.js +238 -0
- package/dist/src/serialization/beast2/v5/weight.js.map +1 -0
- package/dist/src/serialization/crc32.d.ts +38 -0
- package/dist/src/serialization/crc32.d.ts.map +1 -0
- package/dist/src/serialization/crc32.js +70 -0
- package/dist/src/serialization/crc32.js.map +1 -0
- package/dist/src/serialization/crc32.spec.d.ts +6 -0
- package/dist/src/serialization/crc32.spec.d.ts.map +1 -0
- package/dist/src/serialization/crc32.spec.js +92 -0
- package/dist/src/serialization/crc32.spec.js.map +1 -0
- package/dist/src/serialization/east-inferred.spec.js +4 -0
- package/dist/src/serialization/east-inferred.spec.js.map +1 -1
- package/dist/src/serialization/east.d.ts.map +1 -1
- package/dist/src/serialization/east.js +134 -110
- package/dist/src/serialization/east.js.map +1 -1
- package/dist/src/serialization/east.spec.js +185 -4
- package/dist/src/serialization/east.spec.js.map +1 -1
- package/dist/src/serialization/east_text.d.ts +25 -0
- package/dist/src/serialization/east_text.d.ts.map +1 -0
- package/dist/src/serialization/east_text.js +29 -0
- package/dist/src/serialization/east_text.js.map +1 -0
- package/dist/src/serialization/index.d.ts +1 -1
- package/dist/src/serialization/index.d.ts.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +7 -6
- package/dist/src/types.js.map +1 -1
- package/package.json +6 -3
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Executing a unit of the runner protocol: {@link executeUnit}, the one
|
|
7
|
+
* TypeScript unit runner, over a {@link UnitIO}.
|
|
8
|
+
*
|
|
9
|
+
* A unit (`UnitType`) runs a program on its inputs, merges the parts of one
|
|
10
|
+
* output that earlier units wrote, or takes a delivered collection in, and
|
|
11
|
+
* names where its output and its result go. A program's output is written by
|
|
12
|
+
* its kind:
|
|
13
|
+
* - a value as one blob, or as a manifest directory when it is a collection;
|
|
14
|
+
* - an array through the Writer;
|
|
15
|
+
* - a set or a dict through the RunSorter, as sorted runs;
|
|
16
|
+
* - a fold by folding every emitted value into an accumulator.
|
|
17
|
+
*
|
|
18
|
+
* A delivery taken in is read a segment at a time from its file, and written
|
|
19
|
+
* through the Writer as a manifest directory (`intakeBeast2For`).
|
|
20
|
+
*
|
|
21
|
+
* Collections are written as manifest directories, which a store takes in by
|
|
22
|
+
* linking their files. The result (`UnitResultType`) records the outcome —
|
|
23
|
+
* `ok`, or the failure's message and source locations — with where the time
|
|
24
|
+
* went and the host's peak memory. east-c and east-py implement the same
|
|
25
|
+
* protocol, and the conformance corpus holds the three to the same output
|
|
26
|
+
* bytes and outcomes.
|
|
27
|
+
*
|
|
28
|
+
* The work reaches its files only through the UnitIO it is given, its
|
|
29
|
+
* platform functions only through the host's resolver, and the host's memory
|
|
30
|
+
* only through the gauges it is given, so the same code runs as east-node's
|
|
31
|
+
* `exec` over this machine's files and in a browser's Web Worker over an
|
|
32
|
+
* `InMemoryUnitIO` — east-c's shape (`east/unit.h`), where the unit machinery
|
|
33
|
+
* is library code and its CLI wires it to files.
|
|
34
|
+
*/
|
|
35
|
+
import { EastTypeValueType, isTypeValueEqual } from "./type_of_type.js";
|
|
36
|
+
import { variant } from "./containers/variant.js";
|
|
37
|
+
import { SortedMap } from "./containers/sortedmap.js";
|
|
38
|
+
import { SortedSet } from "./containers/sortedset.js";
|
|
39
|
+
import { compareFor } from "./comparison.js";
|
|
40
|
+
import { EastError } from "./error.js";
|
|
41
|
+
import { printTypeValue } from "./compile/runtime.js";
|
|
42
|
+
import { Beast2ManifestWriter, Beast2RunSorter, beast2LazyStats, configureFramePool, decodeBeast2For, encodeBeast2For, intakeBeast2For, } from "./serialization/beast2/index.js";
|
|
43
|
+
import { lazyInputBytesRead, loadUnitInput, loadUnitProgram, openUnitInputs, segmentPath, } from "./runner_io.js";
|
|
44
|
+
import { loadUnitMergeFunction, mergeUnitParts } from "./runner_merge.js";
|
|
45
|
+
/**
|
|
46
|
+
* Executes a unit: does its work over `io`, writes its output there, and says
|
|
47
|
+
* how it went.
|
|
48
|
+
*
|
|
49
|
+
* @param unit - the unit; the files it names are read and written through `io`
|
|
50
|
+
* @param io - the unit's files
|
|
51
|
+
* @param options - the host's platform resolver, its memory gauges, the
|
|
52
|
+
* decoded weight a lazy input's pager keeps, and who hears how the inputs
|
|
53
|
+
* are read
|
|
54
|
+
* @returns the result — a failure is its outcome, never a throw. The host
|
|
55
|
+
* writes it where the unit's `result` says, if it keeps it
|
|
56
|
+
*
|
|
57
|
+
* @remarks
|
|
58
|
+
* The unit's thread grant caps the frame pool for the rest of the process: a
|
|
59
|
+
* grant of one frames every output inline. A unit whose host places its
|
|
60
|
+
* segments as they are read (`fetch`) has `io` asked for each segment of a
|
|
61
|
+
* staged manifest before it is read ({@link UnitIO.segment}).
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* const io = new InMemoryUnitIO(files); // the unit and every file it names
|
|
66
|
+
* const unit = decodeBeast2For(UnitType)(io.read("unit.beast2"));
|
|
67
|
+
* const result = await executeUnit(unit, io, { platforms: (name) => packages.get(name)! });
|
|
68
|
+
* if (result.outcome.type === "ok") io.files.get("output.beast2"); // the output
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export async function executeUnit(unit, io, options) {
|
|
72
|
+
configureFramePool({ workers: Number(unit.threads) });
|
|
73
|
+
const timings = { load: 0, compile: 0, execute: 0, output: 0 };
|
|
74
|
+
let mark = performance.now();
|
|
75
|
+
const lap = (phase) => {
|
|
76
|
+
const now = performance.now();
|
|
77
|
+
timings[phase] += now - mark;
|
|
78
|
+
mark = now;
|
|
79
|
+
};
|
|
80
|
+
let outcome;
|
|
81
|
+
try {
|
|
82
|
+
const platforms = [];
|
|
83
|
+
for (const name of unit.platforms)
|
|
84
|
+
platforms.push(...await options.platforms(name));
|
|
85
|
+
const host = { io, platforms, fetch: unit.fetch, resident: options.resident, cacheBytes: options.cacheBytes, report: options.report, lap };
|
|
86
|
+
if (unit.work.type === "run") {
|
|
87
|
+
await runWork(unit.work.value, host);
|
|
88
|
+
}
|
|
89
|
+
else if (unit.work.type === "merge") {
|
|
90
|
+
mergeWork(unit.work.value, host);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
intakeWork(unit.work.value, host);
|
|
94
|
+
}
|
|
95
|
+
outcome = variant("ok", null);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
outcome = err instanceof EastError
|
|
99
|
+
? variant("failed", { message: err.eastMessage, locations: err.location })
|
|
100
|
+
: variant("failed", { message: err?.message ?? String(err), locations: [] });
|
|
101
|
+
}
|
|
102
|
+
return { outcome, peakBytes: options.peakBytes?.() ?? 0n, timings };
|
|
103
|
+
}
|
|
104
|
+
/** Runs a program on its inputs and writes what it produces. */
|
|
105
|
+
async function runWork(work, host) {
|
|
106
|
+
const { io, platforms, report, lap } = host;
|
|
107
|
+
const program = loadUnitProgram(io, work.program);
|
|
108
|
+
const signature = program.ir.value.type.value;
|
|
109
|
+
// Every kind but a value is emitted, through the trailing parameter.
|
|
110
|
+
const emitted = work.output.type !== "value";
|
|
111
|
+
if (emitted && signature.inputs.length === 0) {
|
|
112
|
+
throw new Error(`exec: a ${work.output.type} output is emitted: the program's trailing parameter must be emit, a function`);
|
|
113
|
+
}
|
|
114
|
+
const params = emitted ? signature.inputs.slice(0, -1) : signature.inputs;
|
|
115
|
+
if (work.inputs.length !== params.length) {
|
|
116
|
+
const printed = `(${signature.inputs.map((type) => printTypeValue(type)).join(", ")}) -> ${printTypeValue(signature.output)}`;
|
|
117
|
+
throw new Error(`Function expects ${params.length} inputs, got ${work.inputs.length}\nSignature: ${printed}`);
|
|
118
|
+
}
|
|
119
|
+
// Inputs are frozen: each collection opened lazily, or every input decoded
|
|
120
|
+
// whole, as the unit's `decode` says.
|
|
121
|
+
report?.running(work.program, work.inputs.map((path, i) => ({ path, type: params[i] })));
|
|
122
|
+
const inputs = openUnitInputs(io, work.inputs, params, work.decode, {
|
|
123
|
+
fetch: host.fetch,
|
|
124
|
+
...(host.resident !== undefined && { resident: host.resident }),
|
|
125
|
+
...(host.cacheBytes !== undefined && { cacheBytes: host.cacheBytes }),
|
|
126
|
+
...(report !== undefined && { report }),
|
|
127
|
+
});
|
|
128
|
+
lap("load");
|
|
129
|
+
const compiled = program.compile(platforms);
|
|
130
|
+
const output = openOutput(work.output, emitted ? signature.inputs.at(-1) : signature.output, host);
|
|
131
|
+
lap("compile");
|
|
132
|
+
try {
|
|
133
|
+
const result = await compiled(...inputs, ...(output.emit !== undefined ? [output.emit] : []));
|
|
134
|
+
lap("execute");
|
|
135
|
+
output.finish(result);
|
|
136
|
+
lap("output");
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
// What reading each lazy input came to, the output's writing included —
|
|
140
|
+
// or up to the failure.
|
|
141
|
+
if (report !== undefined) {
|
|
142
|
+
inputs.forEach((input, i) => {
|
|
143
|
+
const read = lazyInputBytesRead(input);
|
|
144
|
+
const stats = beast2LazyStats(input);
|
|
145
|
+
if (read !== undefined && stats !== undefined)
|
|
146
|
+
report.lazyReads(i, work.inputs[i], stats, read);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Opens a running program's output.
|
|
153
|
+
*
|
|
154
|
+
* @param output - the output
|
|
155
|
+
* @param type - the program's result type, for a value; its emit parameter's
|
|
156
|
+
* type otherwise
|
|
157
|
+
* @param host - the unit's files, and the platforms a fold's functions
|
|
158
|
+
* compile with
|
|
159
|
+
* @returns the sink
|
|
160
|
+
* @throws {Error} When the emit parameter does not fit the kind, a fold's
|
|
161
|
+
* function does not fit the emitted type, or an output directory holds
|
|
162
|
+
* anything already.
|
|
163
|
+
*/
|
|
164
|
+
function openOutput(output, type, host) {
|
|
165
|
+
const { io, platforms } = host;
|
|
166
|
+
if (output.type === "value") {
|
|
167
|
+
const path = output.value;
|
|
168
|
+
return { finish: (result) => writeValue(io, path, type, result) };
|
|
169
|
+
}
|
|
170
|
+
const arity = output.type === "dict" ? 2 : 1;
|
|
171
|
+
const emitInputs = type.type === "Function" ? type.value.inputs : null;
|
|
172
|
+
if (emitInputs === null || emitInputs.length !== arity) {
|
|
173
|
+
throw new Error(`exec: a ${output.type} output is emitted: the program's trailing parameter must be emit, a function of ${arity} argument${arity === 1 ? "" : "s"}, got ${printTypeValue(type)}`);
|
|
174
|
+
}
|
|
175
|
+
const element = emitInputs[0];
|
|
176
|
+
switch (output.type) {
|
|
177
|
+
case "array": {
|
|
178
|
+
const writer = new Beast2ManifestWriter(variant("Array", element), manifestDirectory(io, `${outputDirectory(io, output.value)}/0.beast2`), { parallel: true });
|
|
179
|
+
return {
|
|
180
|
+
emit: (value) => { writer.add(value); return null; },
|
|
181
|
+
finish: () => writer.finish(),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
case "set": {
|
|
185
|
+
const dir = outputDirectory(io, output.value);
|
|
186
|
+
const sorter = new Beast2RunSorter(variant("Set", element), (run) => manifestDirectory(io, `${dir}/${run}.beast2`), { union: true, parallel: true });
|
|
187
|
+
return {
|
|
188
|
+
emit: (value) => { sorter.add(value); return null; },
|
|
189
|
+
finish: () => sorter.finish(),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
case "dict": {
|
|
193
|
+
const value = emitInputs[1];
|
|
194
|
+
const merge = output.value.merge.type === "some"
|
|
195
|
+
? loadUnitMergeFunction(io, output.value.merge.value, element, value, platforms, "the emit parameter")
|
|
196
|
+
: undefined;
|
|
197
|
+
const dir = outputDirectory(io, output.value.dir);
|
|
198
|
+
const sorter = new Beast2RunSorter(variant("Dict", { key: element, value }), (run) => manifestDirectory(io, `${dir}/${run}.beast2`), { ...(merge !== undefined && { merge }), parallel: true });
|
|
199
|
+
return {
|
|
200
|
+
emit: (key, entry) => { sorter.add([key, entry]); return null; },
|
|
201
|
+
finish: () => sorter.finish(),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
case "fold": {
|
|
205
|
+
const { combine } = loadCombineFunction(io, output.value.combine, element, platforms);
|
|
206
|
+
const path = output.value.path;
|
|
207
|
+
let acc = loadUnitInput(io, output.value.zero, element, host.fetch);
|
|
208
|
+
return {
|
|
209
|
+
emit: (value) => { acc = combine(acc, value); return null; },
|
|
210
|
+
finish: () => writeValue(io, path, element, acc),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/** Assembles the parts of one output into one. */
|
|
216
|
+
function mergeWork(work, host) {
|
|
217
|
+
const { io, platforms, lap } = host;
|
|
218
|
+
const output = work.output;
|
|
219
|
+
switch (output.type) {
|
|
220
|
+
case "set":
|
|
221
|
+
case "dict": {
|
|
222
|
+
const dir = outputDirectory(io, output.type === "set" ? output.value : output.value.dir);
|
|
223
|
+
lap("load");
|
|
224
|
+
mergeUnitParts(io, work.parts, manifestDirectory(io, `${dir}/0.beast2`), {
|
|
225
|
+
union: output.type === "set",
|
|
226
|
+
...(output.type === "dict" && output.value.merge.type === "some" && { merge: output.value.merge.value }),
|
|
227
|
+
...(work.range.type === "some" && { range: work.range.value }),
|
|
228
|
+
platforms,
|
|
229
|
+
fetch: host.fetch,
|
|
230
|
+
});
|
|
231
|
+
lap("execute");
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
case "fold": {
|
|
235
|
+
const { combine, type } = loadCombineFunction(io, output.value.combine, null, platforms);
|
|
236
|
+
let acc = loadUnitInput(io, output.value.zero, type, host.fetch);
|
|
237
|
+
lap("compile");
|
|
238
|
+
for (const part of work.parts)
|
|
239
|
+
acc = combine(acc, loadUnitInput(io, part, type, host.fetch));
|
|
240
|
+
lap("execute");
|
|
241
|
+
writeValue(io, output.value.path, type, acc);
|
|
242
|
+
lap("output");
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
case "array":
|
|
246
|
+
throw new Error("exec: an array's parts are concatenated, never merged: a merge unit takes set, dict or fold parts");
|
|
247
|
+
case "value":
|
|
248
|
+
throw new Error("exec: a value has no parts: a merge unit takes set, dict or fold parts");
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Takes a delivered collection in: the file read a segment at a time, through
|
|
253
|
+
* ranged reads, and written through the Writer as the manifest directory the
|
|
254
|
+
* unit names.
|
|
255
|
+
*
|
|
256
|
+
* @throws {Error} When the type file does not hold a type, the delivery cannot
|
|
257
|
+
* be read, or the intake refuses it — every refusal in the words each runner
|
|
258
|
+
* uses.
|
|
259
|
+
*/
|
|
260
|
+
function intakeWork(work, host) {
|
|
261
|
+
const { io, lap } = host;
|
|
262
|
+
let type;
|
|
263
|
+
try {
|
|
264
|
+
type = decodeBeast2For(EastTypeValueType)(io.read(work.type));
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
throw new Error("exec: intake: its type file does not hold a type");
|
|
268
|
+
}
|
|
269
|
+
const intake = intakeBeast2For(type);
|
|
270
|
+
const delivery = {
|
|
271
|
+
size: io.size(work.input),
|
|
272
|
+
read: (offset, length) => io.readRange(work.input, offset, length),
|
|
273
|
+
};
|
|
274
|
+
lap("load");
|
|
275
|
+
const segments = work.segments.type === "some"
|
|
276
|
+
? { segments: { from: Number(work.segments.value.from), to: Number(work.segments.value.to) } }
|
|
277
|
+
: {};
|
|
278
|
+
intake(delivery, manifestDirectory(io, work.output), { ...segments, parallel: true });
|
|
279
|
+
lap("execute");
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Loads a fold's `combine`: an IR file holding a `(T, T) -> T` East function,
|
|
283
|
+
* compiled with the unit's platforms.
|
|
284
|
+
*
|
|
285
|
+
* @param io - the unit's files
|
|
286
|
+
* @param path - the IR file
|
|
287
|
+
* @param type - the emitted type, or `null` to take `T` from the function —
|
|
288
|
+
* a merge of fold partials has no program to say what was emitted
|
|
289
|
+
* @param platforms - the unit's platform functions
|
|
290
|
+
* @returns the compiled function, and `T`
|
|
291
|
+
* @throws {Error} When the IR is not a function of that shape.
|
|
292
|
+
*/
|
|
293
|
+
function loadCombineFunction(io, path, type, platforms) {
|
|
294
|
+
const bundle = loadUnitProgram(io, path);
|
|
295
|
+
const fnType = bundle.ir.value.type;
|
|
296
|
+
const shape = fnType.type === "Function" ? fnType.value : null;
|
|
297
|
+
const t = type ?? shape?.output;
|
|
298
|
+
if (shape === null || t === undefined || shape.inputs.length !== 2 ||
|
|
299
|
+
!isTypeValueEqual(shape.inputs[0], t) ||
|
|
300
|
+
!isTypeValueEqual(shape.inputs[1], t) ||
|
|
301
|
+
!isTypeValueEqual(shape.output, t)) {
|
|
302
|
+
const expected = t !== undefined ? ` (T = ${printTypeValue(t)})` : "";
|
|
303
|
+
throw new Error(`exec: combine: expected a function (T, T) -> T${expected}, got ${printTypeValue(fnType)}`);
|
|
304
|
+
}
|
|
305
|
+
return { combine: bundle.compile(platforms), type: t };
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Writes a value output: a collection as a manifest directory at `path`,
|
|
309
|
+
* anything else as one blob there.
|
|
310
|
+
*
|
|
311
|
+
* @param io - the unit's files
|
|
312
|
+
* @param path - the output's file
|
|
313
|
+
* @param type - the value's type
|
|
314
|
+
* @param value - the value
|
|
315
|
+
*/
|
|
316
|
+
function writeValue(io, path, type, value) {
|
|
317
|
+
if (type.type !== "Array" && type.type !== "Set" && type.type !== "Dict") {
|
|
318
|
+
io.write(path, encodeBeast2For(type)(value));
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
// A collection goes in canonical order: a Set or Dict an East program
|
|
322
|
+
// built is sorted already, and a plain one is sorted first.
|
|
323
|
+
const key = (type.type === "Dict" ? type.value.key : type.value);
|
|
324
|
+
const cmp = compareFor(key);
|
|
325
|
+
const elements = type.type === "Array" ? value
|
|
326
|
+
: type.type === "Set" ? (value instanceof SortedSet ? value : [...value].sort(cmp))
|
|
327
|
+
: value instanceof SortedMap ? value.entries() : [...value.entries()].sort((a, b) => cmp(a[0], b[0]));
|
|
328
|
+
const writer = new Beast2ManifestWriter(type, manifestDirectory(io, path), { parallel: true });
|
|
329
|
+
for (const element of elements)
|
|
330
|
+
writer.add(element);
|
|
331
|
+
writer.finish();
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* The sink a manifest directory is written through: the manifest at `path`,
|
|
335
|
+
* written last, and every object it names in `<path>.segments/` under its
|
|
336
|
+
* SHA-256 — the layout a store takes in by linking, and every runner's opener
|
|
337
|
+
* reads.
|
|
338
|
+
*
|
|
339
|
+
* @param io - the unit's files
|
|
340
|
+
* @param path - the manifest's file
|
|
341
|
+
* @returns the sink
|
|
342
|
+
*/
|
|
343
|
+
function manifestDirectory(io, path) {
|
|
344
|
+
let made = false;
|
|
345
|
+
return {
|
|
346
|
+
object: (hash, bytes) => {
|
|
347
|
+
if (!made) {
|
|
348
|
+
io.makeDirectory(`${path}.segments`);
|
|
349
|
+
made = true;
|
|
350
|
+
}
|
|
351
|
+
io.write(segmentPath(path, hash), bytes);
|
|
352
|
+
},
|
|
353
|
+
manifest: (bytes) => io.write(path, bytes),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Makes an output directory of runs, which must hold nothing yet: every
|
|
358
|
+
* manifest in it is one of the unit's runs.
|
|
359
|
+
*
|
|
360
|
+
* @param io - the unit's files
|
|
361
|
+
* @param dir - the directory
|
|
362
|
+
* @returns the directory
|
|
363
|
+
* @throws {Error} When it holds anything already.
|
|
364
|
+
*/
|
|
365
|
+
function outputDirectory(io, dir) {
|
|
366
|
+
io.makeDirectory(dir);
|
|
367
|
+
if (io.list(dir).length > 0)
|
|
368
|
+
throw new Error(`exec: the output directory ${dir} is not empty`);
|
|
369
|
+
return dir;
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=runner_exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner_exec.js","sourceRoot":"","sources":["../../src/runner_exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner_exec.spec.d.ts","sourceRoot":"","sources":["../../src/runner_exec.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* `executeUnit` and what it asks of its host: the platform functions of each
|
|
7
|
+
* package a unit lists, the host's memory gauges, who hears how a run unit's
|
|
8
|
+
* inputs are read, and the segments a unit whose host places them as they are
|
|
9
|
+
* read asks for. What a unit's work comes to — its outputs and outcome, byte
|
|
10
|
+
* for byte — the runner corpus holds it to (`test/runner_corpus.spec.ts`).
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it } from "node:test";
|
|
13
|
+
import assert from "node:assert/strict";
|
|
14
|
+
import { DictType, IntegerType, StringType, East, InMemoryUnitIO, UnitOutcomeType, Beast2ManifestWriter, decodeBeast2For, decodeCollectionManifest, encodeBeast2For, encodeEastIR, equalFor, executeUnit, isTypeValueEqual, none, printFor, toEastTypeValue, variant, } from "./index.js";
|
|
15
|
+
const DT = DictType(IntegerType, StringType);
|
|
16
|
+
/** An outcome as a message shows it. */
|
|
17
|
+
const printOutcome = printFor(UnitOutcomeType);
|
|
18
|
+
/** A unit's files: a Dict staged as e3 stages one, as `table.beast2` and the
|
|
19
|
+
* segments beside it, and whatever else is given. */
|
|
20
|
+
function staged(rows, others = []) {
|
|
21
|
+
const files = new Map(others);
|
|
22
|
+
const writer = new Beast2ManifestWriter(DT, {
|
|
23
|
+
object: (hash, blob) => { files.set(`table.beast2.segments/${hash}.beast2`, blob.slice()); },
|
|
24
|
+
manifest: (blob) => { files.set("table.beast2", blob.slice()); },
|
|
25
|
+
});
|
|
26
|
+
for (let i = 0; i < rows; i++)
|
|
27
|
+
writer.add([BigInt(i), `row-${i}`]);
|
|
28
|
+
writer.finish();
|
|
29
|
+
return files;
|
|
30
|
+
}
|
|
31
|
+
/** A run unit over `inputs`, its output a value. */
|
|
32
|
+
function runUnit(inputs, options = {}) {
|
|
33
|
+
return {
|
|
34
|
+
work: variant("run", {
|
|
35
|
+
program: "program.beast2",
|
|
36
|
+
inputs,
|
|
37
|
+
output: variant("value", "out.beast2"),
|
|
38
|
+
decode: options.decode === "whole" ? variant("whole", null) : variant("lazy", null),
|
|
39
|
+
}),
|
|
40
|
+
platforms: options.platforms ?? [],
|
|
41
|
+
threads: 1n,
|
|
42
|
+
fetch: options.fetch ?? false,
|
|
43
|
+
result: "result.beast2",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** A resolver for units that list no platform package. */
|
|
47
|
+
const noPackages = (name) => {
|
|
48
|
+
throw new Error(`no platform package ${name} here`);
|
|
49
|
+
};
|
|
50
|
+
/** An IO that records every segment it is asked to make there. */
|
|
51
|
+
class AskedIO extends InMemoryUnitIO {
|
|
52
|
+
asked = [];
|
|
53
|
+
segment(path, fetch) {
|
|
54
|
+
this.asked.push([path, fetch]);
|
|
55
|
+
super.segment(path, fetch);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
describe("executeUnit", () => {
|
|
59
|
+
it("resolves each platform package the unit lists, once and in order, and runs the program with their functions", async () => {
|
|
60
|
+
const double = East.platform("exec_spec_double", [IntegerType], IntegerType);
|
|
61
|
+
const inc = East.platform("exec_spec_inc", [IntegerType], IntegerType);
|
|
62
|
+
const program = East.function([IntegerType], IntegerType, ($, x) => inc(double(x)));
|
|
63
|
+
const io = new InMemoryUnitIO([
|
|
64
|
+
["program.beast2", encodeEastIR(program.toIR())],
|
|
65
|
+
["x.beast2", encodeBeast2For(IntegerType)(7n)],
|
|
66
|
+
]);
|
|
67
|
+
const resolved = [];
|
|
68
|
+
const result = await executeUnit(runUnit(["x.beast2"], { platforms: ["pkg-double", "pkg-inc"] }), io, {
|
|
69
|
+
platforms: (name) => {
|
|
70
|
+
resolved.push(name);
|
|
71
|
+
// A host may resolve a package at once, or later.
|
|
72
|
+
return name === "pkg-double"
|
|
73
|
+
? [double.implement((x) => x * 2n)]
|
|
74
|
+
: Promise.resolve([inc.implement((x) => x + 1n)]);
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("ok", null)), printOutcome(result.outcome));
|
|
78
|
+
assert.deepEqual(resolved, ["pkg-double", "pkg-inc"]);
|
|
79
|
+
assert.equal(decodeBeast2For(IntegerType)(io.read("out.beast2")), 15n);
|
|
80
|
+
});
|
|
81
|
+
it("fails a unit whose package its host cannot resolve, in the host's words, before any work", async () => {
|
|
82
|
+
// The program the unit names is not there: the resolver's refusal comes
|
|
83
|
+
// first, so its words are the outcome's.
|
|
84
|
+
const io = new InMemoryUnitIO([["x.beast2", encodeBeast2For(IntegerType)(7n)]]);
|
|
85
|
+
const result = await executeUnit(runUnit(["x.beast2"], { platforms: ["pkg-missing"] }), io, { platforms: noPackages });
|
|
86
|
+
assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("failed", { message: "no platform package pkg-missing here", locations: [] })), printOutcome(result.outcome));
|
|
87
|
+
assert.deepEqual([...io.files.keys()], ["x.beast2"], "nothing is written");
|
|
88
|
+
});
|
|
89
|
+
it("tells its report how a run unit reads its inputs, and weighs them by the host's gauges", async () => {
|
|
90
|
+
const program = East.function([DT, IntegerType], StringType, ($, table, key) => table.get(key));
|
|
91
|
+
const io = new InMemoryUnitIO(staged(20_000, [
|
|
92
|
+
["program.beast2", encodeEastIR(program.toIR())],
|
|
93
|
+
["x.beast2", encodeBeast2For(IntegerType)(123n)],
|
|
94
|
+
]));
|
|
95
|
+
const segments = decodeCollectionManifest(io.read("table.beast2")).entries.length;
|
|
96
|
+
const heard = [];
|
|
97
|
+
let inputTypes = [];
|
|
98
|
+
const report = {
|
|
99
|
+
running: (path, inputs) => {
|
|
100
|
+
heard.push(["running", path, inputs.map((input) => input.path)]);
|
|
101
|
+
inputTypes = inputs.map((input) => input.type);
|
|
102
|
+
},
|
|
103
|
+
openedLazily: (i) => { heard.push(["lazily", i]); },
|
|
104
|
+
decodedWhole: (i, grown) => { heard.push(["whole", i, grown]); },
|
|
105
|
+
lazyReads: (i, path, stats, read) => { heard.push(["reads", i, path, stats, read > 0]); },
|
|
106
|
+
};
|
|
107
|
+
let gauge = 1_000;
|
|
108
|
+
const result = await executeUnit(runUnit(["table.beast2", "x.beast2"]), io, {
|
|
109
|
+
platforms: noPackages,
|
|
110
|
+
resident: () => (gauge += 10),
|
|
111
|
+
peakBytes: () => 42n,
|
|
112
|
+
report,
|
|
113
|
+
});
|
|
114
|
+
assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("ok", null)), printOutcome(result.outcome));
|
|
115
|
+
assert.equal(decodeBeast2For(StringType)(io.read("out.beast2")), "row-123");
|
|
116
|
+
assert.equal(result.peakBytes, 42n, "the peak is the host's gauge's");
|
|
117
|
+
assert.deepEqual(heard, [
|
|
118
|
+
["running", "program.beast2", ["table.beast2", "x.beast2"]],
|
|
119
|
+
["lazily", 0],
|
|
120
|
+
["whole", 1, 10],
|
|
121
|
+
["reads", 0, "table.beast2", { segments, segmentsDecoded: 1, fencesProbed: segments, hydrated: false, hydratedBytes: 0 }, true],
|
|
122
|
+
], "the collection opened lazily, and its one keyed read decoded one segment; the Integer decoded whole, weighed by the gauge");
|
|
123
|
+
assert.equal(inputTypes.length, 2);
|
|
124
|
+
assert.ok(isTypeValueEqual(inputTypes[0], toEastTypeValue(DT)), "the table is read as its parameter's type");
|
|
125
|
+
assert.ok(isTypeValueEqual(inputTypes[1], toEastTypeValue(IntegerType)), "the key is read as its parameter's type");
|
|
126
|
+
});
|
|
127
|
+
it("gives each lazily opened input's pager the decoded weight its host keeps", async () => {
|
|
128
|
+
// Keyed reads that cycle over three segments far apart, so no run of reads
|
|
129
|
+
// in key order forms: kept, each segment decodes once; at a budget of 1,
|
|
130
|
+
// every read decodes its segment again.
|
|
131
|
+
const program = East.function([DT], IntegerType, ($, table) => {
|
|
132
|
+
const hits = $.let(0n);
|
|
133
|
+
$.for(East.Array.range(0n, 30n), ($, i) => {
|
|
134
|
+
$.if(table.has(i.remainder(3n).multiply(9000n)), ($) => {
|
|
135
|
+
$.assign(hits, hits.add(1n));
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
return hits;
|
|
139
|
+
});
|
|
140
|
+
for (const [cacheBytes, decodes] of [[1, 30], [undefined, 3]]) {
|
|
141
|
+
const io = new InMemoryUnitIO(staged(20_000, [["program.beast2", encodeEastIR(program.toIR())]]));
|
|
142
|
+
let stats;
|
|
143
|
+
const report = {
|
|
144
|
+
running: () => { },
|
|
145
|
+
openedLazily: () => { },
|
|
146
|
+
decodedWhole: () => { },
|
|
147
|
+
lazyReads: (_i, _path, read) => { stats = read; },
|
|
148
|
+
};
|
|
149
|
+
const result = await executeUnit(runUnit(["table.beast2"]), io, {
|
|
150
|
+
platforms: noPackages,
|
|
151
|
+
report,
|
|
152
|
+
...(cacheBytes !== undefined && { cacheBytes }),
|
|
153
|
+
});
|
|
154
|
+
assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("ok", null)), printOutcome(result.outcome));
|
|
155
|
+
assert.equal(decodeBeast2For(IntegerType)(io.read("out.beast2")), 30n);
|
|
156
|
+
assert.equal(stats?.segmentsDecoded, decodes, `at a budget of ${cacheBytes ?? "256 MiB"}`);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
it("measures nothing its host gives it no gauge for", async () => {
|
|
160
|
+
const io = new InMemoryUnitIO([["program.beast2", encodeEastIR(East.function([], IntegerType, (_$) => 1n).toIR())]]);
|
|
161
|
+
const result = await executeUnit(runUnit([]), io, { platforms: noPackages });
|
|
162
|
+
assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("ok", null)), printOutcome(result.outcome));
|
|
163
|
+
assert.equal(result.peakBytes, 0n, "a host that does not measure memory reports no peak");
|
|
164
|
+
for (const phase of ["load", "compile", "execute", "output"])
|
|
165
|
+
assert.ok(result.timings[phase] >= 0, phase);
|
|
166
|
+
});
|
|
167
|
+
it("asks its IO for each segment a unit reads, saying whether the unit's host places them as they are read", async () => {
|
|
168
|
+
const program = East.function([DT], StringType, ($, table) => table.get(9999n));
|
|
169
|
+
const files = staged(20_000, [["program.beast2", encodeEastIR(program.toIR())]]);
|
|
170
|
+
const segments = decodeCollectionManifest(files.get("table.beast2")).entries.map((entry) => `table.beast2.segments/${entry.hash}.beast2`);
|
|
171
|
+
assert.ok(segments.length > 2, `several segments, got ${segments.length}`);
|
|
172
|
+
// Lazily, one keyed read reads one segment.
|
|
173
|
+
const lazy = new AskedIO(files);
|
|
174
|
+
const fetched = await executeUnit(runUnit(["table.beast2"], { fetch: true }), lazy, { platforms: noPackages });
|
|
175
|
+
assert.ok(equalFor(UnitOutcomeType)(fetched.outcome, variant("ok", null)), printOutcome(fetched.outcome));
|
|
176
|
+
assert.equal(lazy.asked.length, 1, `one segment asked for: ${JSON.stringify(lazy.asked)}`);
|
|
177
|
+
assert.ok(segments.includes(lazy.asked[0][0]) && lazy.asked[0][1], "a segment the manifest names, asked of a host that places them");
|
|
178
|
+
// Decoded whole, every segment is read, and the unit's host places none.
|
|
179
|
+
const whole = new AskedIO(files);
|
|
180
|
+
const decoded = await executeUnit(runUnit(["table.beast2"], { decode: "whole" }), whole, { platforms: noPackages });
|
|
181
|
+
assert.ok(equalFor(UnitOutcomeType)(decoded.outcome, variant("ok", null)), printOutcome(decoded.outcome));
|
|
182
|
+
assert.deepEqual(whole.asked, segments.map((path) => [path, false]));
|
|
183
|
+
});
|
|
184
|
+
it("refuses an output directory that holds anything already", async () => {
|
|
185
|
+
const io = new InMemoryUnitIO([["out/stale.beast2", new Uint8Array([1])]]);
|
|
186
|
+
const unit = {
|
|
187
|
+
work: variant("merge", { parts: ["part.beast2"], range: none, output: variant("set", "out") }),
|
|
188
|
+
platforms: [],
|
|
189
|
+
threads: 1n,
|
|
190
|
+
fetch: false,
|
|
191
|
+
result: "result.beast2",
|
|
192
|
+
};
|
|
193
|
+
const result = await executeUnit(unit, io, { platforms: noPackages });
|
|
194
|
+
assert.ok(equalFor(UnitOutcomeType)(result.outcome, variant("failed", { message: "exec: the output directory out is not empty", locations: [] })), printOutcome(result.outcome));
|
|
195
|
+
assert.deepEqual([...io.files.keys()], ["out/stale.beast2"], "nothing is written");
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=runner_exec.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner_exec.spec.js","sourceRoot":"","sources":["../../src/runner_exec.spec.ts"],"names":[],"mappings":"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"}
|