@motebit/protocol 0.7.0 → 0.8.0
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/__tests__/branded-ids.test.d.ts +2 -0
- package/dist/__tests__/branded-ids.test.d.ts.map +1 -0
- package/dist/__tests__/branded-ids.test.js +70 -0
- package/dist/__tests__/branded-ids.test.js.map +1 -0
- package/dist/__tests__/semiring-laws.test.d.ts +25 -0
- package/dist/__tests__/semiring-laws.test.d.ts.map +1 -0
- package/dist/__tests__/semiring-laws.test.js +231 -0
- package/dist/__tests__/semiring-laws.test.js.map +1 -0
- package/dist/__tests__/semiring.test.d.ts +2 -0
- package/dist/__tests__/semiring.test.d.ts.map +1 -0
- package/dist/__tests__/semiring.test.js +201 -0
- package/dist/__tests__/semiring.test.js.map +1 -0
- package/dist/__tests__/traversal.test.d.ts +2 -0
- package/dist/__tests__/traversal.test.d.ts.map +1 -0
- package/dist/__tests__/traversal.test.js +331 -0
- package/dist/__tests__/traversal.test.js.map +1 -0
- package/dist/__tests__/trust-algebra.test.d.ts +2 -0
- package/dist/__tests__/trust-algebra.test.d.ts.map +1 -0
- package/dist/__tests__/trust-algebra.test.js +105 -0
- package/dist/__tests__/trust-algebra.test.js.map +1 -0
- package/dist/credential-anchor.d.ts +86 -0
- package/dist/credential-anchor.d.ts.map +1 -0
- package/dist/credential-anchor.js +8 -0
- package/dist/credential-anchor.js.map +1 -0
- package/dist/graph.d.ts +50 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +95 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +123 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/semiring.d.ts +88 -0
- package/dist/semiring.d.ts.map +1 -0
- package/dist/semiring.js +166 -0
- package/dist/semiring.js.map +1 -0
- package/dist/traversal.d.ts +60 -0
- package/dist/traversal.d.ts.map +1 -0
- package/dist/traversal.js +183 -0
- package/dist/traversal.js.map +1 -0
- package/dist/trust-algebra.d.ts +34 -0
- package/dist/trust-algebra.d.ts.map +1 -0
- package/dist/trust-algebra.js +58 -0
- package/dist/trust-algebra.js.map +1 -0
- package/package.json +6 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branded-ids.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/branded-ids.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { describe, it, expect, expectTypeOf } from "vitest";
|
|
2
|
+
import { asMotebitId, asDeviceId, asNodeId, asGoalId, asEventId, asConversationId, asPlanId, asAllocationId, asSettlementId, asListingId, asProposalId, } from "../index.js";
|
|
3
|
+
describe("Branded ID types", () => {
|
|
4
|
+
it("string is assignable to branded type (backward compat)", () => {
|
|
5
|
+
expectTypeOf().toMatchTypeOf();
|
|
6
|
+
expectTypeOf().toMatchTypeOf();
|
|
7
|
+
expectTypeOf().toMatchTypeOf();
|
|
8
|
+
expectTypeOf().toMatchTypeOf();
|
|
9
|
+
});
|
|
10
|
+
it("branded type is assignable to string (for SQL, JSON)", () => {
|
|
11
|
+
expectTypeOf().toMatchTypeOf();
|
|
12
|
+
expectTypeOf().toMatchTypeOf();
|
|
13
|
+
});
|
|
14
|
+
it("branded types are NOT cross-assignable (catches the bug)", () => {
|
|
15
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
16
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
17
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
18
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
19
|
+
expectTypeOf().not.toMatchTypeOf();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe("Branded ID branding functions", () => {
|
|
23
|
+
it("asMotebitId brands a string as MotebitId", () => {
|
|
24
|
+
const id = asMotebitId("test-motebit-id");
|
|
25
|
+
expect(id).toBe("test-motebit-id");
|
|
26
|
+
// Runtime value is a plain string
|
|
27
|
+
expect(typeof id).toBe("string");
|
|
28
|
+
});
|
|
29
|
+
it("asDeviceId brands a string as DeviceId", () => {
|
|
30
|
+
const id = asDeviceId("dev-001");
|
|
31
|
+
expect(id).toBe("dev-001");
|
|
32
|
+
});
|
|
33
|
+
it("asNodeId brands a string as NodeId", () => {
|
|
34
|
+
const id = asNodeId("node-abc");
|
|
35
|
+
expect(id).toBe("node-abc");
|
|
36
|
+
});
|
|
37
|
+
it("asGoalId brands a string as GoalId", () => {
|
|
38
|
+
const id = asGoalId("goal-xyz");
|
|
39
|
+
expect(id).toBe("goal-xyz");
|
|
40
|
+
});
|
|
41
|
+
it("asEventId brands a string as EventId", () => {
|
|
42
|
+
const id = asEventId("evt-123");
|
|
43
|
+
expect(id).toBe("evt-123");
|
|
44
|
+
});
|
|
45
|
+
it("asConversationId brands a string as ConversationId", () => {
|
|
46
|
+
const id = asConversationId("conv-456");
|
|
47
|
+
expect(id).toBe("conv-456");
|
|
48
|
+
});
|
|
49
|
+
it("asPlanId brands a string as PlanId", () => {
|
|
50
|
+
const id = asPlanId("plan-789");
|
|
51
|
+
expect(id).toBe("plan-789");
|
|
52
|
+
});
|
|
53
|
+
it("asAllocationId brands a string as AllocationId", () => {
|
|
54
|
+
const id = asAllocationId("alloc-001");
|
|
55
|
+
expect(id).toBe("alloc-001");
|
|
56
|
+
});
|
|
57
|
+
it("asSettlementId brands a string as SettlementId", () => {
|
|
58
|
+
const id = asSettlementId("settle-002");
|
|
59
|
+
expect(id).toBe("settle-002");
|
|
60
|
+
});
|
|
61
|
+
it("asListingId brands a string as ListingId", () => {
|
|
62
|
+
const id = asListingId("list-003");
|
|
63
|
+
expect(id).toBe("list-003");
|
|
64
|
+
});
|
|
65
|
+
it("asProposalId brands a string as ProposalId", () => {
|
|
66
|
+
const id = asProposalId("prop-004");
|
|
67
|
+
expect(id).toBe("prop-004");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=branded-ids.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branded-ids.test.js","sourceRoot":"","sources":["../../src/__tests__/branded-ids.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Property-based tests for semiring laws using fast-check.
|
|
3
|
+
*
|
|
4
|
+
* These verify the algebraic invariants that every algorithm in the
|
|
5
|
+
* semiring package depends on — associativity, commutativity, identity,
|
|
6
|
+
* annihilation, distributivity — over thousands of random inputs rather
|
|
7
|
+
* than a handful of hand-picked examples.
|
|
8
|
+
*
|
|
9
|
+
* ### Determinism
|
|
10
|
+
*
|
|
11
|
+
* Fast-check defaults to a time-based seed, which means two CI runs
|
|
12
|
+
* can draw different inputs and expose different edge cases. That
|
|
13
|
+
* turns property tests into nondeterministic flakes under parallel
|
|
14
|
+
* monorepo execution — one of the 103 tests in this file fired
|
|
15
|
+
* intermittently during the pre-push hook. Fixed by pinning a seed:
|
|
16
|
+
* every run now draws the same input sequence, so a passing run is a
|
|
17
|
+
* reproducible guarantee, and a failing run is a bisectable
|
|
18
|
+
* counterexample instead of a ghost.
|
|
19
|
+
*
|
|
20
|
+
* If a new law fails locally but passes the fixed-seed CI run, bump
|
|
21
|
+
* `FC_NUM_RUNS` to explore more inputs, or switch the seed temporarily
|
|
22
|
+
* to confirm the counterexample isn't a cherry-pick.
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=semiring-laws.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semiring-laws.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/semiring-laws.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Property-based tests for semiring laws using fast-check.
|
|
3
|
+
*
|
|
4
|
+
* These verify the algebraic invariants that every algorithm in the
|
|
5
|
+
* semiring package depends on — associativity, commutativity, identity,
|
|
6
|
+
* annihilation, distributivity — over thousands of random inputs rather
|
|
7
|
+
* than a handful of hand-picked examples.
|
|
8
|
+
*
|
|
9
|
+
* ### Determinism
|
|
10
|
+
*
|
|
11
|
+
* Fast-check defaults to a time-based seed, which means two CI runs
|
|
12
|
+
* can draw different inputs and expose different edge cases. That
|
|
13
|
+
* turns property tests into nondeterministic flakes under parallel
|
|
14
|
+
* monorepo execution — one of the 103 tests in this file fired
|
|
15
|
+
* intermittently during the pre-push hook. Fixed by pinning a seed:
|
|
16
|
+
* every run now draws the same input sequence, so a passing run is a
|
|
17
|
+
* reproducible guarantee, and a failing run is a bisectable
|
|
18
|
+
* counterexample instead of a ghost.
|
|
19
|
+
*
|
|
20
|
+
* If a new law fails locally but passes the fixed-seed CI run, bump
|
|
21
|
+
* `FC_NUM_RUNS` to explore more inputs, or switch the seed temporarily
|
|
22
|
+
* to confirm the counterexample isn't a cherry-pick.
|
|
23
|
+
*/
|
|
24
|
+
import { describe, it, beforeAll } from "vitest";
|
|
25
|
+
import fc from "fast-check";
|
|
26
|
+
import { TrustSemiring, CostSemiring, LatencySemiring, BottleneckSemiring, ReliabilitySemiring, BooleanSemiring, RegulatoryRiskSemiring, productSemiring, recordSemiring, } from "../index.js";
|
|
27
|
+
// Pin fast-check's seed so the property tests run deterministically.
|
|
28
|
+
// This makes CI runs reproducible and removes the "works locally,
|
|
29
|
+
// fails in CI once every N runs" flake class entirely. The number of
|
|
30
|
+
// runs per property stays at the default (100) — raising it would
|
|
31
|
+
// make the suite slower without changing the deterministic guarantee.
|
|
32
|
+
const FC_SEED = 0x5eed; // arbitrary fixed value, no security meaning
|
|
33
|
+
beforeAll(() => {
|
|
34
|
+
fc.configureGlobal({ seed: FC_SEED, numRuns: 100 });
|
|
35
|
+
});
|
|
36
|
+
// ── Approximate equality for floating-point ────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* Relative epsilon scaled by magnitude. Absolute 1e-10 tolerance is too
|
|
39
|
+
* tight when values reach ~1e6 (one ULP of 1e6 is ~1.2e-10), so
|
|
40
|
+
* associativity/distributivity checks would occasionally "fail" on
|
|
41
|
+
* perfectly-algebraic IEEE 754 math. Relative epsilon (1e-9 × the
|
|
42
|
+
* larger magnitude) plus a small absolute floor fixes both the
|
|
43
|
+
* large-value and near-zero cases.
|
|
44
|
+
*/
|
|
45
|
+
function tolerance(a, b) {
|
|
46
|
+
const scale = Math.max(Math.abs(a), Math.abs(b), 1);
|
|
47
|
+
return 1e-9 * scale + 1e-12;
|
|
48
|
+
}
|
|
49
|
+
function approxEq(a, b) {
|
|
50
|
+
if (a === b)
|
|
51
|
+
return true; // handles Infinity === Infinity
|
|
52
|
+
if (!isFinite(a) || !isFinite(b))
|
|
53
|
+
return false;
|
|
54
|
+
return Math.abs(a - b) <= tolerance(a, b);
|
|
55
|
+
}
|
|
56
|
+
/** `x <= y` with the same scaled tolerance approxEq uses. */
|
|
57
|
+
function approxLeq(x, y) {
|
|
58
|
+
if (x === y)
|
|
59
|
+
return true;
|
|
60
|
+
if (x === -Infinity || y === Infinity)
|
|
61
|
+
return true;
|
|
62
|
+
if (x === Infinity || y === -Infinity)
|
|
63
|
+
return false;
|
|
64
|
+
return x <= y + tolerance(x, y);
|
|
65
|
+
}
|
|
66
|
+
// ── Generic law checker ────────────────────────────────────────────
|
|
67
|
+
function semiringLaws(name, sr, arb, eq, opts) {
|
|
68
|
+
describe(`${name} — property-based semiring laws`, () => {
|
|
69
|
+
it("associativity of add: a + (b + c) = (a + b) + c", () => {
|
|
70
|
+
fc.assert(fc.property(arb, arb, arb, (a, b, c) => {
|
|
71
|
+
return eq(sr.add(a, sr.add(b, c)), sr.add(sr.add(a, b), c));
|
|
72
|
+
}));
|
|
73
|
+
});
|
|
74
|
+
it("associativity of mul: a * (b * c) = (a * b) * c", () => {
|
|
75
|
+
fc.assert(fc.property(arb, arb, arb, (a, b, c) => {
|
|
76
|
+
return eq(sr.mul(a, sr.mul(b, c)), sr.mul(sr.mul(a, b), c));
|
|
77
|
+
}));
|
|
78
|
+
});
|
|
79
|
+
it("commutativity of add: a + b = b + a", () => {
|
|
80
|
+
fc.assert(fc.property(arb, arb, (a, b) => {
|
|
81
|
+
return eq(sr.add(a, b), sr.add(b, a));
|
|
82
|
+
}));
|
|
83
|
+
});
|
|
84
|
+
it("additive identity: a + 0 = a = 0 + a", () => {
|
|
85
|
+
fc.assert(fc.property(arb, (a) => {
|
|
86
|
+
return eq(sr.add(a, sr.zero), a) && eq(sr.add(sr.zero, a), a);
|
|
87
|
+
}));
|
|
88
|
+
});
|
|
89
|
+
it("multiplicative identity: a * 1 = a = 1 * a", () => {
|
|
90
|
+
fc.assert(fc.property(arb, (a) => {
|
|
91
|
+
return eq(sr.mul(a, sr.one), a) && eq(sr.mul(sr.one, a), a);
|
|
92
|
+
}));
|
|
93
|
+
});
|
|
94
|
+
it("annihilation: a * 0 = 0 = 0 * a", () => {
|
|
95
|
+
fc.assert(fc.property(arb, (a) => {
|
|
96
|
+
return eq(sr.mul(a, sr.zero), sr.zero) && eq(sr.mul(sr.zero, a), sr.zero);
|
|
97
|
+
}));
|
|
98
|
+
});
|
|
99
|
+
it("left distributivity: a * (b + c) = (a * b) + (a * c)", () => {
|
|
100
|
+
fc.assert(fc.property(arb, arb, arb, (a, b, c) => {
|
|
101
|
+
const lhs = sr.mul(a, sr.add(b, c));
|
|
102
|
+
const rhs = sr.add(sr.mul(a, b), sr.mul(a, c));
|
|
103
|
+
return eq(lhs, rhs);
|
|
104
|
+
}));
|
|
105
|
+
});
|
|
106
|
+
it("right distributivity: (a + b) * c = (a * c) + (b * c)", () => {
|
|
107
|
+
fc.assert(fc.property(arb, arb, arb, (a, b, c) => {
|
|
108
|
+
const lhs = sr.mul(sr.add(a, b), c);
|
|
109
|
+
const rhs = sr.add(sr.mul(a, c), sr.mul(b, c));
|
|
110
|
+
return eq(lhs, rhs);
|
|
111
|
+
}));
|
|
112
|
+
});
|
|
113
|
+
if (opts?.idempotentAdd) {
|
|
114
|
+
it("idempotency of add: a + a = a", () => {
|
|
115
|
+
fc.assert(fc.property(arb, (a) => {
|
|
116
|
+
return eq(sr.add(a, a), a);
|
|
117
|
+
}));
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
it("closure: add result is in valid domain", () => {
|
|
121
|
+
fc.assert(fc.property(arb, arb, (a, b) => {
|
|
122
|
+
const r = sr.add(a, b);
|
|
123
|
+
// Result should be the same type and not NaN
|
|
124
|
+
return typeof r === typeof a && !(typeof r === "number" && isNaN(r));
|
|
125
|
+
}));
|
|
126
|
+
});
|
|
127
|
+
it("closure: mul result is in valid domain", () => {
|
|
128
|
+
fc.assert(fc.property(arb, arb, (a, b) => {
|
|
129
|
+
const r = sr.mul(a, b);
|
|
130
|
+
return typeof r === typeof a && !(typeof r === "number" && isNaN(r));
|
|
131
|
+
}));
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// ── Arbitraries ────────────────────────────────────────────────────
|
|
136
|
+
// Trust/Reliability: values in [0, 1]
|
|
137
|
+
const unitArb = fc.double({ min: 0, max: 1, noNaN: true });
|
|
138
|
+
// Cost/Latency/RegulatoryRisk: non-negative including Infinity
|
|
139
|
+
// Use oneof to ensure Infinity appears in the test distribution
|
|
140
|
+
const nonNegArb = fc.oneof(fc.double({ min: 0, max: 1e6, noNaN: true }), fc.constant(Infinity), fc.constant(0));
|
|
141
|
+
// Bottleneck: non-negative including 0 and Infinity
|
|
142
|
+
const bottleneckArb = fc.oneof(fc.double({ min: 0, max: 1e6, noNaN: true }), fc.constant(Infinity), fc.constant(0));
|
|
143
|
+
const boolArb = fc.boolean();
|
|
144
|
+
// ── Run law checks on all concrete semirings ───────────────────────
|
|
145
|
+
// Trust: (max, *, 0, 1) — add is idempotent (max(a,a) = a)
|
|
146
|
+
semiringLaws("TrustSemiring", TrustSemiring, unitArb, approxEq, {
|
|
147
|
+
idempotentAdd: true,
|
|
148
|
+
});
|
|
149
|
+
// Cost: (min, +, Inf, 0) — tropical semiring, add is idempotent (min(a,a) = a)
|
|
150
|
+
semiringLaws("CostSemiring", CostSemiring, nonNegArb, approxEq, {
|
|
151
|
+
idempotentAdd: true,
|
|
152
|
+
});
|
|
153
|
+
// Latency: same algebra as Cost
|
|
154
|
+
semiringLaws("LatencySemiring", LatencySemiring, nonNegArb, approxEq, {
|
|
155
|
+
idempotentAdd: true,
|
|
156
|
+
});
|
|
157
|
+
// RegulatoryRisk: same algebra as Cost
|
|
158
|
+
semiringLaws("RegulatoryRiskSemiring", RegulatoryRiskSemiring, nonNegArb, approxEq, {
|
|
159
|
+
idempotentAdd: true,
|
|
160
|
+
});
|
|
161
|
+
// Bottleneck: (max, min, 0, Inf) — add is idempotent (max(a,a) = a)
|
|
162
|
+
semiringLaws("BottleneckSemiring", BottleneckSemiring, bottleneckArb, approxEq, {
|
|
163
|
+
idempotentAdd: true,
|
|
164
|
+
});
|
|
165
|
+
// Reliability: (max, *, 0, 1) — same algebra as Trust
|
|
166
|
+
semiringLaws("ReliabilitySemiring", ReliabilitySemiring, unitArb, approxEq, {
|
|
167
|
+
idempotentAdd: true,
|
|
168
|
+
});
|
|
169
|
+
// Boolean: (||, &&, false, true)
|
|
170
|
+
semiringLaws("BooleanSemiring", BooleanSemiring, boolArb, (a, b) => a === b, {
|
|
171
|
+
idempotentAdd: true,
|
|
172
|
+
});
|
|
173
|
+
// ── Product semiring ───────────────────────────────────────────────
|
|
174
|
+
describe("Product(Trust x Cost) — property-based", () => {
|
|
175
|
+
const ps = productSemiring(TrustSemiring, CostSemiring);
|
|
176
|
+
const productArb = fc.tuple(unitArb, nonNegArb);
|
|
177
|
+
const productEq = (a, b) => approxEq(a[0], b[0]) && approxEq(a[1], b[1]);
|
|
178
|
+
semiringLaws("Product(Trust x Cost)", ps, productArb, productEq, {
|
|
179
|
+
idempotentAdd: true,
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
// ── Record semiring ────────────────────────────────────────────────
|
|
183
|
+
describe("Record{trust, cost, latency} — property-based", () => {
|
|
184
|
+
const rs = recordSemiring({
|
|
185
|
+
trust: TrustSemiring,
|
|
186
|
+
cost: CostSemiring,
|
|
187
|
+
latency: LatencySemiring,
|
|
188
|
+
});
|
|
189
|
+
const recordArb = fc.record({
|
|
190
|
+
trust: unitArb,
|
|
191
|
+
cost: nonNegArb,
|
|
192
|
+
latency: nonNegArb,
|
|
193
|
+
});
|
|
194
|
+
const recordEq = (a, b) => approxEq(a.trust, b.trust) && approxEq(a.cost, b.cost) && approxEq(a.latency, b.latency);
|
|
195
|
+
semiringLaws("Record{trust, cost, latency}", rs, recordArb, recordEq, {
|
|
196
|
+
idempotentAdd: true,
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
// ── Monotonicity ───────────────────────────────────────────────────
|
|
200
|
+
// For semirings where add = max or add = min, verify monotonicity.
|
|
201
|
+
describe("monotonicity", () => {
|
|
202
|
+
it("TrustSemiring: if a <= b then a + c <= b + c", () => {
|
|
203
|
+
fc.assert(fc.property(unitArb, unitArb, unitArb, (a, b, c) => {
|
|
204
|
+
if (a > b)
|
|
205
|
+
return true; // only test when a <= b
|
|
206
|
+
return approxLeq(TrustSemiring.add(a, c), TrustSemiring.add(b, c));
|
|
207
|
+
}));
|
|
208
|
+
});
|
|
209
|
+
it("CostSemiring: if a <= b then a + c <= b + c (min is monotone)", () => {
|
|
210
|
+
fc.assert(fc.property(nonNegArb, nonNegArb, nonNegArb, (a, b, c) => {
|
|
211
|
+
if (a > b)
|
|
212
|
+
return true;
|
|
213
|
+
return approxLeq(CostSemiring.add(a, c), CostSemiring.add(b, c));
|
|
214
|
+
}));
|
|
215
|
+
});
|
|
216
|
+
it("ReliabilitySemiring: if a <= b then a + c <= b + c", () => {
|
|
217
|
+
fc.assert(fc.property(unitArb, unitArb, unitArb, (a, b, c) => {
|
|
218
|
+
if (a > b)
|
|
219
|
+
return true;
|
|
220
|
+
return approxLeq(ReliabilitySemiring.add(a, c), ReliabilitySemiring.add(b, c));
|
|
221
|
+
}));
|
|
222
|
+
});
|
|
223
|
+
it("BottleneckSemiring: if a <= b then a + c <= b + c", () => {
|
|
224
|
+
fc.assert(fc.property(bottleneckArb, bottleneckArb, bottleneckArb, (a, b, c) => {
|
|
225
|
+
if (a > b)
|
|
226
|
+
return true;
|
|
227
|
+
return approxLeq(BottleneckSemiring.add(a, c), BottleneckSemiring.add(b, c));
|
|
228
|
+
}));
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
//# sourceMappingURL=semiring-laws.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semiring-laws.test.js","sourceRoot":"","sources":["../../src/__tests__/semiring-laws.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semiring.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/semiring.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { TrustSemiring, CostSemiring, LatencySemiring, BottleneckSemiring, ReliabilitySemiring, BooleanSemiring, RegulatoryRiskSemiring, productSemiring, recordSemiring, mappedSemiring, } from "../index.js";
|
|
3
|
+
// Cover the barrel re-export (index.ts line 1+)
|
|
4
|
+
import * as barrel from "../index.js";
|
|
5
|
+
// ── Semiring Axiom Verification ─────────────────────────────────────
|
|
6
|
+
// If the axioms don't hold, every algorithm built on top is wrong.
|
|
7
|
+
function verifySemiringAxioms(name, sr, values, eq = (a, b) => a === b) {
|
|
8
|
+
describe(`${name} — semiring axioms`, () => {
|
|
9
|
+
it("⊕ is commutative: a ⊕ b = b ⊕ a", () => {
|
|
10
|
+
for (const a of values) {
|
|
11
|
+
for (const b of values) {
|
|
12
|
+
expect(eq(sr.add(a, b), sr.add(b, a))).toBe(true);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
it("⊕ is associative: (a ⊕ b) ⊕ c = a ⊕ (b ⊕ c)", () => {
|
|
17
|
+
for (const a of values) {
|
|
18
|
+
for (const b of values) {
|
|
19
|
+
for (const c of values) {
|
|
20
|
+
expect(eq(sr.add(sr.add(a, b), c), sr.add(a, sr.add(b, c)))).toBe(true);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
it("0 is additive identity: a ⊕ 0 = a", () => {
|
|
26
|
+
for (const a of values) {
|
|
27
|
+
expect(eq(sr.add(a, sr.zero), a)).toBe(true);
|
|
28
|
+
expect(eq(sr.add(sr.zero, a), a)).toBe(true);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
it("⊗ is associative: (a ⊗ b) ⊗ c = a ⊗ (b ⊗ c)", () => {
|
|
32
|
+
for (const a of values) {
|
|
33
|
+
for (const b of values) {
|
|
34
|
+
for (const c of values) {
|
|
35
|
+
const lhs = sr.mul(sr.mul(a, b), c);
|
|
36
|
+
const rhs = sr.mul(a, sr.mul(b, c));
|
|
37
|
+
expect(eq(lhs, rhs)).toBe(true);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
it("1 is multiplicative identity: a ⊗ 1 = 1 ⊗ a = a", () => {
|
|
43
|
+
for (const a of values) {
|
|
44
|
+
expect(eq(sr.mul(a, sr.one), a)).toBe(true);
|
|
45
|
+
expect(eq(sr.mul(sr.one, a), a)).toBe(true);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
it("0 annihilates: a ⊗ 0 = 0 ⊗ a = 0", () => {
|
|
49
|
+
for (const a of values) {
|
|
50
|
+
expect(eq(sr.mul(a, sr.zero), sr.zero)).toBe(true);
|
|
51
|
+
expect(eq(sr.mul(sr.zero, a), sr.zero)).toBe(true);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
it("⊗ distributes over ⊕: a ⊗ (b ⊕ c) = (a ⊗ b) ⊕ (a ⊗ c)", () => {
|
|
55
|
+
for (const a of values) {
|
|
56
|
+
for (const b of values) {
|
|
57
|
+
for (const c of values) {
|
|
58
|
+
const lhs = sr.mul(a, sr.add(b, c));
|
|
59
|
+
const rhs = sr.add(sr.mul(a, b), sr.mul(a, c));
|
|
60
|
+
expect(eq(lhs, rhs)).toBe(true);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
it("right distributivity: (b ⊕ c) ⊗ a = (b ⊗ a) ⊕ (c ⊗ a)", () => {
|
|
66
|
+
for (const a of values) {
|
|
67
|
+
for (const b of values) {
|
|
68
|
+
for (const c of values) {
|
|
69
|
+
const lhs = sr.mul(sr.add(b, c), a);
|
|
70
|
+
const rhs = sr.add(sr.mul(b, a), sr.mul(c, a));
|
|
71
|
+
expect(eq(lhs, rhs)).toBe(true);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// ── Number equality with floating point tolerance ───────────────────
|
|
79
|
+
const numEq = (a, b) => Math.abs(a - b) < 1e-10 || a === b;
|
|
80
|
+
// ── Run axiom checks on all concrete semirings ──────────────────────
|
|
81
|
+
const trustValues = [0, 0.1, 0.3, 0.6, 0.9, 1];
|
|
82
|
+
verifySemiringAxioms("TrustSemiring", TrustSemiring, trustValues, numEq);
|
|
83
|
+
const costValues = [0, 0.5, 1, 5, 10, Infinity];
|
|
84
|
+
verifySemiringAxioms("CostSemiring", CostSemiring, costValues, numEq);
|
|
85
|
+
const latencyValues = [0, 100, 500, 1000, Infinity];
|
|
86
|
+
verifySemiringAxioms("LatencySemiring", LatencySemiring, latencyValues, numEq);
|
|
87
|
+
// RegulatoryRisk: (min, +, ∞, 0) — same algebra as Cost/Latency (tropical)
|
|
88
|
+
const riskValues = [0, 0.5, 1, 5, 10, Infinity];
|
|
89
|
+
verifySemiringAxioms("RegulatoryRiskSemiring", RegulatoryRiskSemiring, riskValues, numEq);
|
|
90
|
+
// Bottleneck: (max, min, 0, ∞) — annihilation check needs special care
|
|
91
|
+
// a ⊗ 0 = min(a, 0) = 0 ✓ and a ⊕ 0 = max(a, 0) = a ✓ (for a >= 0)
|
|
92
|
+
const bottleneckValues = [0, 0.5, 1, 10, Infinity];
|
|
93
|
+
verifySemiringAxioms("BottleneckSemiring", BottleneckSemiring, bottleneckValues, numEq);
|
|
94
|
+
verifySemiringAxioms("ReliabilitySemiring", ReliabilitySemiring, trustValues, numEq);
|
|
95
|
+
verifySemiringAxioms("BooleanSemiring", BooleanSemiring, [true, false]);
|
|
96
|
+
// ── Product Semiring ────────────────────────────────────────────────
|
|
97
|
+
describe("productSemiring", () => {
|
|
98
|
+
const ps = productSemiring(TrustSemiring, CostSemiring);
|
|
99
|
+
it("zero and one are correct", () => {
|
|
100
|
+
expect(ps.zero).toEqual([0, Infinity]);
|
|
101
|
+
expect(ps.one).toEqual([1, 0]);
|
|
102
|
+
});
|
|
103
|
+
it("add applies component-wise", () => {
|
|
104
|
+
expect(ps.add([0.5, 10], [0.8, 5])).toEqual([0.8, 5]);
|
|
105
|
+
});
|
|
106
|
+
it("mul applies component-wise", () => {
|
|
107
|
+
const result = ps.mul([0.9, 2], [0.8, 3]);
|
|
108
|
+
expect(result[0]).toBeCloseTo(0.72); // 0.9 × 0.8
|
|
109
|
+
expect(result[1]).toBeCloseTo(5); // 2 + 3
|
|
110
|
+
});
|
|
111
|
+
// Verify axioms on the product
|
|
112
|
+
const productValues = [
|
|
113
|
+
[0, Infinity],
|
|
114
|
+
[1, 0],
|
|
115
|
+
[0.5, 3],
|
|
116
|
+
[0.9, 1],
|
|
117
|
+
[0.3, 10],
|
|
118
|
+
];
|
|
119
|
+
verifySemiringAxioms("Product(Trust × Cost)", ps, [...productValues], (a, b) => numEq(a[0], b[0]) && numEq(a[1], b[1]));
|
|
120
|
+
});
|
|
121
|
+
// ── Record Semiring ─────────────────────────────────────────────────
|
|
122
|
+
describe("recordSemiring", () => {
|
|
123
|
+
const rs = recordSemiring({
|
|
124
|
+
trust: TrustSemiring,
|
|
125
|
+
cost: CostSemiring,
|
|
126
|
+
latency: LatencySemiring,
|
|
127
|
+
});
|
|
128
|
+
it("computes zero and one correctly", () => {
|
|
129
|
+
expect(rs.zero).toEqual({ trust: 0, cost: Infinity, latency: Infinity });
|
|
130
|
+
expect(rs.one).toEqual({ trust: 1, cost: 0, latency: 0 });
|
|
131
|
+
});
|
|
132
|
+
it("add picks best per dimension", () => {
|
|
133
|
+
const a = { trust: 0.5, cost: 10, latency: 200 };
|
|
134
|
+
const b = { trust: 0.8, cost: 5, latency: 300 };
|
|
135
|
+
const result = rs.add(a, b);
|
|
136
|
+
expect(result.trust).toBe(0.8); // max
|
|
137
|
+
expect(result.cost).toBe(5); // min
|
|
138
|
+
expect(result.latency).toBe(200); // min
|
|
139
|
+
});
|
|
140
|
+
it("mul composes per dimension", () => {
|
|
141
|
+
const a = { trust: 0.9, cost: 2, latency: 100 };
|
|
142
|
+
const b = { trust: 0.8, cost: 3, latency: 200 };
|
|
143
|
+
const result = rs.mul(a, b);
|
|
144
|
+
expect(result.trust).toBeCloseTo(0.72); // ×
|
|
145
|
+
expect(result.cost).toBe(5); // +
|
|
146
|
+
expect(result.latency).toBe(300); // +
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
// ── Mapped Semiring ─────────────────────────────────────────────────
|
|
150
|
+
describe("barrel re-export (index.ts)", () => {
|
|
151
|
+
it("exports all MIT protocol symbols", () => {
|
|
152
|
+
expect(barrel.TrustSemiring).toBeDefined();
|
|
153
|
+
expect(barrel.CostSemiring).toBeDefined();
|
|
154
|
+
expect(barrel.WeightedDigraph).toBeDefined();
|
|
155
|
+
expect(barrel.optimalPaths).toBeDefined();
|
|
156
|
+
// ProvenanceSemiring, buildAgentGraph, addDelegationEdges, RouteWeightSemiring
|
|
157
|
+
// are BSL exports from @motebit/semiring — tested there, not here.
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe("mappedSemiring", () => {
|
|
161
|
+
// Map cost semiring through milliseconds ↔ seconds conversion
|
|
162
|
+
const SecondsCost = mappedSemiring(CostSemiring, (ms) => ms / 1000, (s) => s * 1000);
|
|
163
|
+
it("preserves semiring structure through isomorphism", () => {
|
|
164
|
+
expect(SecondsCost.zero).toBe(Infinity);
|
|
165
|
+
expect(SecondsCost.one).toBe(0);
|
|
166
|
+
expect(SecondsCost.add(5, 3)).toBe(3); // min
|
|
167
|
+
expect(SecondsCost.mul(2, 3)).toBe(5); // mapped: (2000+3000)/1000
|
|
168
|
+
});
|
|
169
|
+
it("eq delegates through the mapping", () => {
|
|
170
|
+
expect(SecondsCost.eq(3, 3)).toBe(true);
|
|
171
|
+
expect(SecondsCost.eq(3, 4)).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
// ── Semiring eq (value equality for convergence) ────────────────────
|
|
175
|
+
describe("Semiring eq — value equality for compound semirings", () => {
|
|
176
|
+
it("productSemiring eq compares both components", () => {
|
|
177
|
+
const TC = productSemiring(TrustSemiring, CostSemiring);
|
|
178
|
+
expect(TC.eq([0.8, 10], [0.8, 10])).toBe(true);
|
|
179
|
+
expect(TC.eq([0.8, 10], [0.9, 10])).toBe(false);
|
|
180
|
+
expect(TC.eq([0.8, 10], [0.8, 11])).toBe(false);
|
|
181
|
+
});
|
|
182
|
+
it("recordSemiring eq compares all fields", () => {
|
|
183
|
+
const Multi = recordSemiring({ trust: TrustSemiring, cost: CostSemiring });
|
|
184
|
+
expect(Multi.eq({ trust: 0.5, cost: 10 }, { trust: 0.5, cost: 10 })).toBe(true);
|
|
185
|
+
expect(Multi.eq({ trust: 0.5, cost: 10 }, { trust: 0.6, cost: 10 })).toBe(false);
|
|
186
|
+
expect(Multi.eq({ trust: 0.5, cost: 10 }, { trust: 0.5, cost: 11 })).toBe(false);
|
|
187
|
+
});
|
|
188
|
+
it("recordSemiring with nested eq propagates through fields", () => {
|
|
189
|
+
// Build a record where one field is itself a product (has non-trivial eq)
|
|
190
|
+
const Inner = productSemiring(TrustSemiring, CostSemiring);
|
|
191
|
+
const Outer = recordSemiring({ inner: Inner, lat: LatencySemiring });
|
|
192
|
+
expect(Outer.eq({ inner: [0.5, 3], lat: 10 }, { inner: [0.5, 3], lat: 10 })).toBe(true);
|
|
193
|
+
expect(Outer.eq({ inner: [0.5, 3], lat: 10 }, { inner: [0.5, 4], lat: 10 })).toBe(false);
|
|
194
|
+
});
|
|
195
|
+
it("primitive semirings do not define eq (defaults to ===)", () => {
|
|
196
|
+
expect(TrustSemiring.eq).toBeUndefined();
|
|
197
|
+
expect(CostSemiring.eq).toBeUndefined();
|
|
198
|
+
expect(BooleanSemiring.eq).toBeUndefined();
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
//# sourceMappingURL=semiring.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semiring.test.js","sourceRoot":"","sources":["../../src/__tests__/semiring.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traversal.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/traversal.test.ts"],"names":[],"mappings":""}
|