ltcode
Version:
Luby Transform Code implementation.
59 lines (58 loc) • 2.02 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BlockGraph = exports.CheckNode = void 0;
class CheckNode {
constructor(source_nodes, check_value) {
this.source_nodes = source_nodes;
this.check_value = check_value;
}
}
exports.CheckNode = CheckNode;
class BlockGraph {
constructor(num_blocks) {
this.num_blocks = num_blocks;
this.checks = new Map();
this.eliminated = new Map();
}
add_block(nodes, data) {
if (nodes.size === 1) {
const next = nodes.values().next().value;
let to_eliminate = Array.from(this.eliminate(next, data));
while (to_eliminate.length) {
const [other, check] = to_eliminate.pop();
to_eliminate.push(...this.eliminate(other, check));
}
}
for (const node of nodes) {
if (this.eliminated.has(node)) {
nodes.delete(node);
data = data ^ this.eliminated.get(node);
}
}
if (nodes.size === 1) {
return this.add_block(nodes, data);
}
return this._create_check_node(nodes, data);
}
*eliminate(node, data) {
this.eliminated.set(node, data);
const others = this.checks.get(node) || [];
this.checks.delete(node);
for (const check of others) {
check.check_value = check.check_value ^ data;
check.source_nodes.delete(node);
if (check.source_nodes.size === 1) {
const next = check.source_nodes.values().next().value;
yield [next, check.check_value];
}
}
}
_create_check_node(nodes, data) {
const check_node = new CheckNode(new Set(nodes), data);
for (const node of nodes) {
this.checks.set(node, [...(this.checks.get(node) || []), check_node]);
}
return this.eliminated.size >= this.num_blocks;
}
}
exports.BlockGraph = BlockGraph;