a11oy / packages /qec-integrity /src /qec_lineage.test.ts
betterwithage's picture
sync(space): complete build context — fix BUILD_ERROR (CTO)
518343a verified
Raw
History Blame
6.42 kB
/**
* qec_lineage.test.ts — runtime parity with Lutar/QEC/*.lean modules.
*
* Tests cover Hamming (1950), Shor (1995), CSS (1996), Kitaev (1997/2003).
*/
import assert from 'node:assert/strict';
import {
hammingDist,
hammingWeight,
hammingDistByte,
minDistance,
shorEncode,
shorMajorityPayload,
classicalToCSS,
cssConsistent,
vertexParity,
singleSiteError,
allErrors,
noErrors,
PhysicalReceipt,
Site,
VertexCheck,
} from './qec_lineage';
function run(name: string, fn: () => void) {
try {
fn();
console.log(` ok ${name}`);
} catch (e) {
console.error(` FAIL ${name}`);
console.error(e);
process.exitCode = 1;
}
}
console.log('QEC lineage — runtime parity with Lutar.QEC');
// ─── Hamming ───────────────────────────────────────────────────────────
run('Hamming: equal bit arrays have distance 0', () => {
assert.equal(hammingDist([true, false, true], [true, false, true]), 0);
});
run('Hamming: 000 vs 111 distance 3', () => {
assert.equal(hammingDist([false, false, false], [true, true, true]), 3);
});
run('Hamming: 1010 vs 0101 distance 4', () => {
assert.equal(hammingDist([true, false, true, false], [false, true, false, true]), 4);
});
run('Hamming: weight of all-zero is 0', () => {
assert.equal(hammingWeight([false, false, false]), 0);
});
run('Hamming: weight of all-one len 4 is 4', () => {
assert.equal(hammingWeight([true, true, true, true]), 4);
});
run('Hamming: weight of 1010 is 2', () => {
assert.equal(hammingWeight([true, false, true, false]), 2);
});
run('Hamming: length mismatch throws', () => {
assert.throws(() => hammingDist([true], [true, false]));
});
run('Hamming byte: 0x00 vs 0xFF distance 8', () => {
assert.equal(hammingDistByte(0x00, 0xff), 8);
});
run('Hamming byte: 0xAA vs 0x55 distance 8', () => {
assert.equal(hammingDistByte(0xaa, 0x55), 8);
});
run('Hamming byte: 0x42 vs 0x42 distance 0', () => {
assert.equal(hammingDistByte(0x42, 0x42), 0);
});
run('Hamming code minimum distance', () => {
// Hamming [7,4,3] partial code: include 4 codewords spanning the space.
const cw = [
[false, false, false, false, false, false, false],
[true, true, false, true, false, false, false],
[false, true, true, false, true, false, false],
[true, false, true, true, true, false, false],
];
const d = minDistance(cw);
assert.ok(d >= 1);
});
// ─── Shor ──────────────────────────────────────────────────────────────
run('Shor: encode yields 9 receipts', () => {
const logical: PhysicalReceipt = { payload: 0x42, lineage: 0xa5 };
const bundle = shorEncode(logical);
assert.equal(bundle.length, 9);
});
run('Shor: clean bundle decodes to original payload', () => {
const logical: PhysicalReceipt = { payload: 0x42, lineage: 0xa5 };
const bundle = shorEncode(logical);
assert.equal(shorMajorityPayload(bundle), 0x42);
});
run('Shor: single-fault bundle still decodes correctly (majority)', () => {
const logical: PhysicalReceipt = { payload: 0x42, lineage: 0xa5 };
const bundle = shorEncode(logical);
bundle[5] = { payload: 0xff, lineage: 0xff };
assert.equal(shorMajorityPayload(bundle), 0x42);
});
run('Shor: 4-fault bundle still decodes correctly (5 majority)', () => {
const logical: PhysicalReceipt = { payload: 0x42, lineage: 0xa5 };
const bundle = shorEncode(logical);
for (let i = 0; i < 4; i += 1) bundle[i] = { payload: 0xff, lineage: 0xff };
assert.equal(shorMajorityPayload(bundle), 0x42);
});
run('Shor: 5-fault bundle flips majority', () => {
const logical: PhysicalReceipt = { payload: 0x42, lineage: 0xa5 };
const bundle = shorEncode(logical);
for (let i = 0; i < 5; i += 1) bundle[i] = { payload: 0xff, lineage: 0xff };
assert.equal(shorMajorityPayload(bundle), 0xff);
});
// ─── CSS ───────────────────────────────────────────────────────────────
run('CSS: 0x00 -> (0x00, 0xFF)', () => {
const p = classicalToCSS(0x00);
assert.equal(p.xParity, 0x00);
assert.equal(p.zParity, 0xff);
});
run('CSS: 0xFF -> (0xFF, 0x00)', () => {
const p = classicalToCSS(0xff);
assert.equal(p.xParity, 0xff);
assert.equal(p.zParity, 0x00);
});
run('CSS: 0x55 -> (0x55, 0xAA), consistent', () => {
const p = classicalToCSS(0x55);
assert.equal(p.xParity, 0x55);
assert.equal(p.zParity, 0xaa);
assert.ok(cssConsistent(p));
});
run('CSS: inconsistent pair detected', () => {
assert.ok(!cssConsistent({ xParity: 0x00, zParity: 0x00 }));
});
run('CSS: injective on classical codewords', () => {
const all = new Set<string>();
for (let i = 0; i < 256; i += 1) {
const p = classicalToCSS(i);
all.add(`${p.xParity},${p.zParity}`);
}
assert.equal(all.size, 256);
});
// ─── Kitaev ────────────────────────────────────────────────────────────
const v0: VertexCheck = {
n: { agent: 0, slice: 0 },
s: { agent: 0, slice: 1 },
e: { agent: 1, slice: 0 },
w: { agent: 0, slice: 2 },
};
run('Kitaev: no errors -> parity 0', () => {
assert.equal(vertexParity(noErrors(), v0), false);
});
run('Kitaev: single-site error at n -> parity 1', () => {
assert.equal(vertexParity(singleSiteError(v0.n), v0), true);
});
run('Kitaev: single-site error at s -> parity 1', () => {
assert.equal(vertexParity(singleSiteError(v0.s), v0), true);
});
run('Kitaev: single-site error at e -> parity 1', () => {
assert.equal(vertexParity(singleSiteError(v0.e), v0), true);
});
run('Kitaev: single-site error at w -> parity 1', () => {
assert.equal(vertexParity(singleSiteError(v0.w), v0), true);
});
run('Kitaev: all errors -> parity 0 (4 errors cancel)', () => {
assert.equal(vertexParity(allErrors(), v0), false);
});
run('Kitaev: error at off-lattice site -> parity 0', () => {
const offSite: Site = { agent: 99, slice: 99 };
assert.equal(vertexParity(singleSiteError(offSite), v0), false);
});
console.log(process.exitCode === 1 ? '\nFAIL' : '\nall green (24 tests)');