@stevenvo780/st-lang 4.2.0 → 4.3.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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/lambda-calc/church.d.ts +8 -0
- package/dist/lambda-calc/church.d.ts.map +1 -0
- package/dist/lambda-calc/church.js +67 -0
- package/dist/lambda-calc/church.js.map +1 -0
- package/dist/lambda-calc/combinators.d.ts +8 -0
- package/dist/lambda-calc/combinators.d.ts.map +1 -0
- package/dist/lambda-calc/combinators.js +24 -0
- package/dist/lambda-calc/combinators.js.map +1 -0
- package/dist/lambda-calc/index.d.ts +8 -0
- package/dist/lambda-calc/index.d.ts.map +1 -0
- package/dist/lambda-calc/index.js +48 -0
- package/dist/lambda-calc/index.js.map +1 -0
- package/dist/lambda-calc/reduce.d.ts +18 -0
- package/dist/lambda-calc/reduce.d.ts.map +1 -0
- package/dist/lambda-calc/reduce.js +174 -0
- package/dist/lambda-calc/reduce.js.map +1 -0
- package/dist/lambda-calc/substitution.d.ts +6 -0
- package/dist/lambda-calc/substitution.d.ts.map +1 -0
- package/dist/lambda-calc/substitution.js +120 -0
- package/dist/lambda-calc/substitution.js.map +1 -0
- package/dist/lambda-calc/types.d.ts +19 -0
- package/dist/lambda-calc/types.d.ts.map +1 -0
- package/dist/lambda-calc/types.js +72 -0
- package/dist/lambda-calc/types.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/formula.d.ts +19 -0
- package/dist/profiles/intuitionistic-nj/formula.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/formula.js +99 -0
- package/dist/profiles/intuitionistic-nj/formula.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/index.d.ts +5 -0
- package/dist/profiles/intuitionistic-nj/index.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/index.js +24 -0
- package/dist/profiles/intuitionistic-nj/index.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/kripke.d.ts +17 -0
- package/dist/profiles/intuitionistic-nj/kripke.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/kripke.js +206 -0
- package/dist/profiles/intuitionistic-nj/kripke.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/prover.d.ts +13 -0
- package/dist/profiles/intuitionistic-nj/prover.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/prover.js +418 -0
- package/dist/profiles/intuitionistic-nj/prover.js.map +1 -0
- package/dist/profiles/intuitionistic-nj/types.d.ts +55 -0
- package/dist/profiles/intuitionistic-nj/types.d.ts.map +1 -0
- package/dist/profiles/intuitionistic-nj/types.js +21 -0
- package/dist/profiles/intuitionistic-nj/types.js.map +1 -0
- package/dist/profiles/many-valued/index.d.ts +39 -0
- package/dist/profiles/many-valued/index.d.ts.map +1 -0
- package/dist/profiles/many-valued/index.js +250 -0
- package/dist/profiles/many-valued/index.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/formula.d.ts +23 -0
- package/dist/profiles/modal-frame-axioms/formula.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/formula.js +158 -0
- package/dist/profiles/modal-frame-axioms/formula.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/index.d.ts +6 -0
- package/dist/profiles/modal-frame-axioms/index.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/index.js +41 -0
- package/dist/profiles/modal-frame-axioms/index.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/systems.d.ts +29 -0
- package/dist/profiles/modal-frame-axioms/systems.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/systems.js +96 -0
- package/dist/profiles/modal-frame-axioms/systems.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/tableau.d.ts +12 -0
- package/dist/profiles/modal-frame-axioms/tableau.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/tableau.js +299 -0
- package/dist/profiles/modal-frame-axioms/tableau.js.map +1 -0
- package/dist/profiles/modal-frame-axioms/types.d.ts +61 -0
- package/dist/profiles/modal-frame-axioms/types.d.ts.map +1 -0
- package/dist/profiles/modal-frame-axioms/types.js +27 -0
- package/dist/profiles/modal-frame-axioms/types.js.map +1 -0
- package/dist/profiles/substructural/index.d.ts +4 -0
- package/dist/profiles/substructural/index.d.ts.map +1 -0
- package/dist/profiles/substructural/index.js +22 -0
- package/dist/profiles/substructural/index.js.map +1 -0
- package/dist/profiles/substructural/prover.d.ts +13 -0
- package/dist/profiles/substructural/prover.d.ts.map +1 -0
- package/dist/profiles/substructural/prover.js +481 -0
- package/dist/profiles/substructural/prover.js.map +1 -0
- package/dist/profiles/substructural/types.d.ts +72 -0
- package/dist/profiles/substructural/types.d.ts.map +1 -0
- package/dist/profiles/substructural/types.js +27 -0
- package/dist/profiles/substructural/types.js.map +1 -0
- package/dist/runtime/abduction/entails.d.ts +21 -0
- package/dist/runtime/abduction/entails.d.ts.map +1 -0
- package/dist/runtime/abduction/entails.js +308 -0
- package/dist/runtime/abduction/entails.js.map +1 -0
- package/dist/runtime/abduction/find.d.ts +18 -0
- package/dist/runtime/abduction/find.d.ts.map +1 -0
- package/dist/runtime/abduction/find.js +202 -0
- package/dist/runtime/abduction/find.js.map +1 -0
- package/dist/runtime/abduction/index.d.ts +4 -0
- package/dist/runtime/abduction/index.d.ts.map +1 -0
- package/dist/runtime/abduction/index.js +26 -0
- package/dist/runtime/abduction/index.js.map +1 -0
- package/dist/runtime/abduction/types.d.ts +78 -0
- package/dist/runtime/abduction/types.d.ts.map +1 -0
- package/dist/runtime/abduction/types.js +23 -0
- package/dist/runtime/abduction/types.js.map +1 -0
- package/dist/runtime/bayesian/factor.d.ts +22 -0
- package/dist/runtime/bayesian/factor.d.ts.map +1 -0
- package/dist/runtime/bayesian/factor.js +249 -0
- package/dist/runtime/bayesian/factor.js.map +1 -0
- package/dist/runtime/bayesian/index.d.ts +3 -0
- package/dist/runtime/bayesian/index.d.ts.map +1 -0
- package/dist/runtime/bayesian/index.js +25 -0
- package/dist/runtime/bayesian/index.js.map +1 -0
- package/dist/runtime/bayesian/inference.d.ts +6 -0
- package/dist/runtime/bayesian/inference.d.ts.map +1 -0
- package/dist/runtime/bayesian/inference.js +260 -0
- package/dist/runtime/bayesian/inference.js.map +1 -0
- package/dist/runtime/bayesian/types.d.ts +19 -0
- package/dist/runtime/bayesian/types.d.ts.map +1 -0
- package/dist/runtime/bayesian/types.js +9 -0
- package/dist/runtime/bayesian/types.js.map +1 -0
- package/dist/runtime/bisimulation/index.d.ts +4 -0
- package/dist/runtime/bisimulation/index.d.ts.map +1 -0
- package/dist/runtime/bisimulation/index.js +21 -0
- package/dist/runtime/bisimulation/index.js.map +1 -0
- package/dist/runtime/bisimulation/operations.d.ts +40 -0
- package/dist/runtime/bisimulation/operations.d.ts.map +1 -0
- package/dist/runtime/bisimulation/operations.js +219 -0
- package/dist/runtime/bisimulation/operations.js.map +1 -0
- package/dist/runtime/bisimulation/paige-tarjan.d.ts +8 -0
- package/dist/runtime/bisimulation/paige-tarjan.d.ts.map +1 -0
- package/dist/runtime/bisimulation/paige-tarjan.js +199 -0
- package/dist/runtime/bisimulation/paige-tarjan.js.map +1 -0
- package/dist/runtime/bisimulation/types.d.ts +26 -0
- package/dist/runtime/bisimulation/types.d.ts.map +1 -0
- package/dist/runtime/bisimulation/types.js +22 -0
- package/dist/runtime/bisimulation/types.js.map +1 -0
- package/dist/runtime/fca/context.d.ts +46 -0
- package/dist/runtime/fca/context.d.ts.map +1 -0
- package/dist/runtime/fca/context.js +155 -0
- package/dist/runtime/fca/context.js.map +1 -0
- package/dist/runtime/fca/implications.d.ts +10 -0
- package/dist/runtime/fca/implications.d.ts.map +1 -0
- package/dist/runtime/fca/implications.js +33 -0
- package/dist/runtime/fca/implications.js.map +1 -0
- package/dist/runtime/fca/index.d.ts +6 -0
- package/dist/runtime/fca/index.d.ts.map +1 -0
- package/dist/runtime/fca/index.js +39 -0
- package/dist/runtime/fca/index.js.map +1 -0
- package/dist/runtime/fca/lattice.d.ts +10 -0
- package/dist/runtime/fca/lattice.d.ts.map +1 -0
- package/dist/runtime/fca/lattice.js +86 -0
- package/dist/runtime/fca/lattice.js.map +1 -0
- package/dist/runtime/fca/next-closure.d.ts +12 -0
- package/dist/runtime/fca/next-closure.d.ts.map +1 -0
- package/dist/runtime/fca/next-closure.js +99 -0
- package/dist/runtime/fca/next-closure.js.map +1 -0
- package/dist/runtime/fca/types.d.ts +31 -0
- package/dist/runtime/fca/types.d.ts.map +1 -0
- package/dist/runtime/fca/types.js +30 -0
- package/dist/runtime/fca/types.js.map +1 -0
- package/dist/runtime/proof-minify/index.d.ts +3 -0
- package/dist/runtime/proof-minify/index.d.ts.map +1 -0
- package/dist/runtime/proof-minify/index.js +13 -0
- package/dist/runtime/proof-minify/index.js.map +1 -0
- package/dist/runtime/proof-minify/minify.d.ts +13 -0
- package/dist/runtime/proof-minify/minify.d.ts.map +1 -0
- package/dist/runtime/proof-minify/minify.js +540 -0
- package/dist/runtime/proof-minify/minify.js.map +1 -0
- package/dist/runtime/proof-minify/types.d.ts +89 -0
- package/dist/runtime/proof-minify/types.d.ts.map +1 -0
- package/dist/runtime/proof-minify/types.js +16 -0
- package/dist/runtime/proof-minify/types.js.map +1 -0
- package/dist/runtime/symbolic-diff/constructors.d.ts +16 -0
- package/dist/runtime/symbolic-diff/constructors.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/constructors.js +75 -0
- package/dist/runtime/symbolic-diff/constructors.js.map +1 -0
- package/dist/runtime/symbolic-diff/differentiate.d.ts +22 -0
- package/dist/runtime/symbolic-diff/differentiate.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/differentiate.js +107 -0
- package/dist/runtime/symbolic-diff/differentiate.js.map +1 -0
- package/dist/runtime/symbolic-diff/evaluate.d.ts +3 -0
- package/dist/runtime/symbolic-diff/evaluate.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/evaluate.js +47 -0
- package/dist/runtime/symbolic-diff/evaluate.js.map +1 -0
- package/dist/runtime/symbolic-diff/index.d.ts +9 -0
- package/dist/runtime/symbolic-diff/index.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/index.js +34 -0
- package/dist/runtime/symbolic-diff/index.js.map +1 -0
- package/dist/runtime/symbolic-diff/parse.d.ts +16 -0
- package/dist/runtime/symbolic-diff/parse.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/parse.js +206 -0
- package/dist/runtime/symbolic-diff/parse.js.map +1 -0
- package/dist/runtime/symbolic-diff/simplify.d.ts +11 -0
- package/dist/runtime/symbolic-diff/simplify.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/simplify.js +214 -0
- package/dist/runtime/symbolic-diff/simplify.js.map +1 -0
- package/dist/runtime/symbolic-diff/stringify.d.ts +3 -0
- package/dist/runtime/symbolic-diff/stringify.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/stringify.js +69 -0
- package/dist/runtime/symbolic-diff/stringify.js.map +1 -0
- package/dist/runtime/symbolic-diff/types.d.ts +35 -0
- package/dist/runtime/symbolic-diff/types.d.ts.map +1 -0
- package/dist/runtime/symbolic-diff/types.js +9 -0
- package/dist/runtime/symbolic-diff/types.js.map +1 -0
- package/dist/runtime/term-rewriting/critical-pairs.d.ts +38 -0
- package/dist/runtime/term-rewriting/critical-pairs.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/critical-pairs.js +109 -0
- package/dist/runtime/term-rewriting/critical-pairs.js.map +1 -0
- package/dist/runtime/term-rewriting/index.d.ts +9 -0
- package/dist/runtime/term-rewriting/index.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/index.js +38 -0
- package/dist/runtime/term-rewriting/index.js.map +1 -0
- package/dist/runtime/term-rewriting/knuth-bendix.d.ts +29 -0
- package/dist/runtime/term-rewriting/knuth-bendix.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/knuth-bendix.js +196 -0
- package/dist/runtime/term-rewriting/knuth-bendix.js.map +1 -0
- package/dist/runtime/term-rewriting/lpo.d.ts +17 -0
- package/dist/runtime/term-rewriting/lpo.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/lpo.js +158 -0
- package/dist/runtime/term-rewriting/lpo.js.map +1 -0
- package/dist/runtime/term-rewriting/rewrite.d.ts +44 -0
- package/dist/runtime/term-rewriting/rewrite.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/rewrite.js +189 -0
- package/dist/runtime/term-rewriting/rewrite.js.map +1 -0
- package/dist/runtime/term-rewriting/term-utils.d.ts +64 -0
- package/dist/runtime/term-rewriting/term-utils.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/term-utils.js +360 -0
- package/dist/runtime/term-rewriting/term-utils.js.map +1 -0
- package/dist/runtime/term-rewriting/types.d.ts +66 -0
- package/dist/runtime/term-rewriting/types.d.ts.map +1 -0
- package/dist/runtime/term-rewriting/types.js +21 -0
- package/dist/runtime/term-rewriting/types.js.map +1 -0
- package/dist/tests/abduction/abduction.test.d.ts +2 -0
- package/dist/tests/abduction/abduction.test.d.ts.map +1 -0
- package/dist/tests/abduction/abduction.test.js +380 -0
- package/dist/tests/abduction/abduction.test.js.map +1 -0
- package/dist/tests/bayesian/bayesian.test.d.ts +2 -0
- package/dist/tests/bayesian/bayesian.test.d.ts.map +1 -0
- package/dist/tests/bayesian/bayesian.test.js +328 -0
- package/dist/tests/bayesian/bayesian.test.js.map +1 -0
- package/dist/tests/bisimulation/paige-tarjan.test.d.ts +2 -0
- package/dist/tests/bisimulation/paige-tarjan.test.d.ts.map +1 -0
- package/dist/tests/bisimulation/paige-tarjan.test.js +254 -0
- package/dist/tests/bisimulation/paige-tarjan.test.js.map +1 -0
- package/dist/tests/fca/fca.test.d.ts +2 -0
- package/dist/tests/fca/fca.test.d.ts.map +1 -0
- package/dist/tests/fca/fca.test.js +317 -0
- package/dist/tests/fca/fca.test.js.map +1 -0
- package/dist/tests/intuitionistic-nj/nj.test.d.ts +2 -0
- package/dist/tests/intuitionistic-nj/nj.test.d.ts.map +1 -0
- package/dist/tests/intuitionistic-nj/nj.test.js +216 -0
- package/dist/tests/intuitionistic-nj/nj.test.js.map +1 -0
- package/dist/tests/lambda-calc/lambda-calc.test.d.ts +2 -0
- package/dist/tests/lambda-calc/lambda-calc.test.d.ts.map +1 -0
- package/dist/tests/lambda-calc/lambda-calc.test.js +164 -0
- package/dist/tests/lambda-calc/lambda-calc.test.js.map +1 -0
- package/dist/tests/many-valued/many-valued.test.d.ts +2 -0
- package/dist/tests/many-valued/many-valued.test.d.ts.map +1 -0
- package/dist/tests/many-valued/many-valued.test.js +150 -0
- package/dist/tests/many-valued/many-valued.test.js.map +1 -0
- package/dist/tests/modal-frame-axioms/frame-axioms.test.d.ts +2 -0
- package/dist/tests/modal-frame-axioms/frame-axioms.test.d.ts.map +1 -0
- package/dist/tests/modal-frame-axioms/frame-axioms.test.js +236 -0
- package/dist/tests/modal-frame-axioms/frame-axioms.test.js.map +1 -0
- package/dist/tests/proof-minify/minify.test.d.ts +2 -0
- package/dist/tests/proof-minify/minify.test.d.ts.map +1 -0
- package/dist/tests/proof-minify/minify.test.js +281 -0
- package/dist/tests/proof-minify/minify.test.js.map +1 -0
- package/dist/tests/substructural/prover.test.d.ts +2 -0
- package/dist/tests/substructural/prover.test.d.ts.map +1 -0
- package/dist/tests/substructural/prover.test.js +271 -0
- package/dist/tests/substructural/prover.test.js.map +1 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.d.ts +2 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.d.ts.map +1 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.js +278 -0
- package/dist/tests/symbolic-diff/symbolic-diff.test.js.map +1 -0
- package/dist/tests/term-rewriting/critical-pairs.test.d.ts +2 -0
- package/dist/tests/term-rewriting/critical-pairs.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/critical-pairs.test.js +34 -0
- package/dist/tests/term-rewriting/critical-pairs.test.js.map +1 -0
- package/dist/tests/term-rewriting/knuth-bendix.test.d.ts +2 -0
- package/dist/tests/term-rewriting/knuth-bendix.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/knuth-bendix.test.js +94 -0
- package/dist/tests/term-rewriting/knuth-bendix.test.js.map +1 -0
- package/dist/tests/term-rewriting/lpo.test.d.ts +2 -0
- package/dist/tests/term-rewriting/lpo.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/lpo.test.js +57 -0
- package/dist/tests/term-rewriting/lpo.test.js.map +1 -0
- package/dist/tests/term-rewriting/rewrite.test.d.ts +2 -0
- package/dist/tests/term-rewriting/rewrite.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/rewrite.test.js +56 -0
- package/dist/tests/term-rewriting/rewrite.test.js.map +1 -0
- package/dist/tests/term-rewriting/term-utils.test.d.ts +2 -0
- package/dist/tests/term-rewriting/term-utils.test.d.ts.map +1 -0
- package/dist/tests/term-rewriting/term-utils.test.js +58 -0
- package/dist/tests/term-rewriting/term-utils.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Bayesian Inference — Algorithms
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// - jointProbability: producto P(Xᵢ | parents(Xᵢ)) sobre asignación completa.
|
|
7
|
+
// - variableElimination: P(Q | E) marginalizando variables no-evidencia.
|
|
8
|
+
// - query: alias semántico de variableElimination.
|
|
9
|
+
// - mostProbableExplanation: MAP/MPE sobre variables no-evidencia.
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.jointProbability = jointProbability;
|
|
12
|
+
exports.variableElimination = variableElimination;
|
|
13
|
+
exports.query = query;
|
|
14
|
+
exports.mostProbableExplanation = mostProbableExplanation;
|
|
15
|
+
const factor_1 = require("./factor");
|
|
16
|
+
// ── Validación ───────────────────────────────────────────────
|
|
17
|
+
function indexCPTs(net) {
|
|
18
|
+
const m = new Map();
|
|
19
|
+
for (const c of net.cpts)
|
|
20
|
+
m.set(c.variable, c);
|
|
21
|
+
return m;
|
|
22
|
+
}
|
|
23
|
+
function assertVariableExists(net, name) {
|
|
24
|
+
if (!net.variables.some((v) => v.name === name)) {
|
|
25
|
+
throw new Error(`Variable "${name}" no existe en la red`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function assertEvidenceValid(net, evidence) {
|
|
29
|
+
for (const [k, v] of Object.entries(evidence)) {
|
|
30
|
+
const dvar = net.variables.find((x) => x.name === k);
|
|
31
|
+
if (!dvar)
|
|
32
|
+
throw new Error(`Evidencia "${k}" no existe en la red`);
|
|
33
|
+
if (!dvar.values.includes(v)) {
|
|
34
|
+
throw new Error(`Evidencia "${k}=${v}" fuera del dominio [${dvar.values.join(', ')}]`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// ── jointProbability ─────────────────────────────────────────
|
|
39
|
+
function jointProbability(net, assignment) {
|
|
40
|
+
// Toda variable de la red debe estar asignada y dentro del dominio.
|
|
41
|
+
for (const v of net.variables) {
|
|
42
|
+
const val = assignment[v.name];
|
|
43
|
+
if (val === undefined) {
|
|
44
|
+
throw new Error(`Asignación incompleta: falta "${v.name}"`);
|
|
45
|
+
}
|
|
46
|
+
if (!v.values.includes(val)) {
|
|
47
|
+
throw new Error(`Valor "${val}" fuera del dominio de "${v.name}" [${v.values.join(', ')}]`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const cptIndex = indexCPTs(net);
|
|
51
|
+
let p = 1;
|
|
52
|
+
for (const v of net.variables) {
|
|
53
|
+
const cpt = cptIndex.get(v.name);
|
|
54
|
+
if (!cpt)
|
|
55
|
+
throw new Error(`Sin CPT para "${v.name}"`);
|
|
56
|
+
const parentKey = (0, factor_1.buildParentKey)(cpt.parents, assignment);
|
|
57
|
+
const row = cpt.entries[parentKey];
|
|
58
|
+
if (!row) {
|
|
59
|
+
throw new Error(`CPT incompleta: falta fila "${parentKey}" para "${v.name}"`);
|
|
60
|
+
}
|
|
61
|
+
const prob = row[assignment[v.name]];
|
|
62
|
+
if (prob === undefined) {
|
|
63
|
+
throw new Error(`CPT incompleta: sin entrada para "${v.name}=${assignment[v.name]}"`);
|
|
64
|
+
}
|
|
65
|
+
p *= prob;
|
|
66
|
+
}
|
|
67
|
+
return p;
|
|
68
|
+
}
|
|
69
|
+
// ── Heurística de orden de eliminación ───────────────────────
|
|
70
|
+
//
|
|
71
|
+
// Min-fill simple: eliminar primero la variable cuya remoción
|
|
72
|
+
// agrega menos aristas al gráfico residual. Implementación O(n²)
|
|
73
|
+
// — suficiente para redes pequeñas. Para redes triviales con
|
|
74
|
+
// pocas variables el costo es despreciable.
|
|
75
|
+
function eliminationOrder(toEliminate, factors) {
|
|
76
|
+
const remaining = new Set(toEliminate);
|
|
77
|
+
const order = [];
|
|
78
|
+
const factorsAlive = factors.slice();
|
|
79
|
+
while (remaining.size > 0) {
|
|
80
|
+
let best = null;
|
|
81
|
+
let bestCost = Infinity;
|
|
82
|
+
for (const v of remaining) {
|
|
83
|
+
const involved = factorsAlive.filter((f) => f.variables.includes(v));
|
|
84
|
+
const merged = new Set();
|
|
85
|
+
for (const f of involved)
|
|
86
|
+
for (const x of f.variables)
|
|
87
|
+
merged.add(x);
|
|
88
|
+
merged.delete(v);
|
|
89
|
+
const cost = merged.size; // proxy del tamaño del cluster
|
|
90
|
+
if (cost < bestCost) {
|
|
91
|
+
bestCost = cost;
|
|
92
|
+
best = v;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (best === null)
|
|
96
|
+
break;
|
|
97
|
+
order.push(best);
|
|
98
|
+
remaining.delete(best);
|
|
99
|
+
// simular eliminación: reemplazar factores involucrados por uno fusionado
|
|
100
|
+
const involved = factorsAlive.filter((f) => f.variables.includes(best));
|
|
101
|
+
const others = factorsAlive.filter((f) => !f.variables.includes(best));
|
|
102
|
+
const mergedVars = new Set();
|
|
103
|
+
const mergedDomains = {};
|
|
104
|
+
for (const f of involved) {
|
|
105
|
+
for (const v of f.variables) {
|
|
106
|
+
if (v === best)
|
|
107
|
+
continue;
|
|
108
|
+
mergedVars.add(v);
|
|
109
|
+
mergedDomains[v] = f.domains[v];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const fakeFactor = {
|
|
113
|
+
variables: Array.from(mergedVars).sort(),
|
|
114
|
+
domains: mergedDomains,
|
|
115
|
+
values: new Map(),
|
|
116
|
+
};
|
|
117
|
+
factorsAlive.length = 0;
|
|
118
|
+
factorsAlive.push(...others, fakeFactor);
|
|
119
|
+
}
|
|
120
|
+
return order;
|
|
121
|
+
}
|
|
122
|
+
// ── variableElimination ──────────────────────────────────────
|
|
123
|
+
function variableElimination(net, queryVar, evidence = {}) {
|
|
124
|
+
assertVariableExists(net, queryVar);
|
|
125
|
+
assertEvidenceValid(net, evidence);
|
|
126
|
+
if (queryVar in evidence) {
|
|
127
|
+
// Si la query está observada, el posterior es degenerado.
|
|
128
|
+
const qDomain = net.variables.find((v) => v.name === queryVar).values;
|
|
129
|
+
const dist = {};
|
|
130
|
+
const out = {};
|
|
131
|
+
for (const val of qDomain)
|
|
132
|
+
out[val] = val === evidence[queryVar] ? 1 : 0;
|
|
133
|
+
void dist;
|
|
134
|
+
return { variable: queryVar, distribution: out };
|
|
135
|
+
}
|
|
136
|
+
const domains = (0, factor_1.variableDomainsOf)(net);
|
|
137
|
+
// 1. Construir factores desde CPTs, restringidos por evidencia.
|
|
138
|
+
let factors = net.cpts.map((cpt) => {
|
|
139
|
+
const f = (0, factor_1.factorFromCPT)(cpt, domains);
|
|
140
|
+
return (0, factor_1.restrictFactor)(f, evidence);
|
|
141
|
+
});
|
|
142
|
+
// 2. Determinar variables a eliminar (todas menos query y evidencia).
|
|
143
|
+
const toEliminate = net.variables
|
|
144
|
+
.map((v) => v.name)
|
|
145
|
+
.filter((n) => n !== queryVar && !(n in evidence));
|
|
146
|
+
const order = eliminationOrder(toEliminate, factors);
|
|
147
|
+
// 3. Eliminar cada variable: multiplicar todos los factores que la contengan
|
|
148
|
+
// y sumar-marginalizar.
|
|
149
|
+
for (const v of order) {
|
|
150
|
+
const involved = factors.filter((f) => f.variables.includes(v));
|
|
151
|
+
const others = factors.filter((f) => !f.variables.includes(v));
|
|
152
|
+
if (involved.length === 0)
|
|
153
|
+
continue;
|
|
154
|
+
let product = involved[0];
|
|
155
|
+
for (let i = 1; i < involved.length; i++) {
|
|
156
|
+
product = (0, factor_1.multiplyFactors)(product, involved[i]);
|
|
157
|
+
}
|
|
158
|
+
const reduced = (0, factor_1.sumOut)(product, v);
|
|
159
|
+
factors = [...others, reduced];
|
|
160
|
+
}
|
|
161
|
+
// 4. Multiplicar los factores restantes (todos sobre queryVar tras la elim).
|
|
162
|
+
let result = factors[0];
|
|
163
|
+
for (let i = 1; i < factors.length; i++) {
|
|
164
|
+
result = (0, factor_1.multiplyFactors)(result, factors[i]);
|
|
165
|
+
}
|
|
166
|
+
// 5. Normalizar.
|
|
167
|
+
const normalized = (0, factor_1.normalizeFactor)(result);
|
|
168
|
+
// 6. Extraer la distribución sobre la query.
|
|
169
|
+
const distribution = {};
|
|
170
|
+
const qDomain = net.variables.find((v) => v.name === queryVar).values;
|
|
171
|
+
for (const val of qDomain) {
|
|
172
|
+
const key = (0, factor_1.assignmentKey)([queryVar], { [queryVar]: val });
|
|
173
|
+
distribution[val] = normalized.values.get(key) ?? 0;
|
|
174
|
+
}
|
|
175
|
+
return { variable: queryVar, distribution };
|
|
176
|
+
}
|
|
177
|
+
// ── query (alias semántico) ──────────────────────────────────
|
|
178
|
+
function query(net, queryVar, evidence = {}) {
|
|
179
|
+
return variableElimination(net, queryVar, evidence);
|
|
180
|
+
}
|
|
181
|
+
// ── Most Probable Explanation (MPE / MAP completo) ───────────
|
|
182
|
+
//
|
|
183
|
+
// Devuelve la asignación de máxima probabilidad sobre todas las
|
|
184
|
+
// variables no observadas, dada la evidencia. Implementación:
|
|
185
|
+
// max-product variable elimination con tracking de backpointers.
|
|
186
|
+
function mostProbableExplanation(net, evidence = {}) {
|
|
187
|
+
assertEvidenceValid(net, evidence);
|
|
188
|
+
const domains = (0, factor_1.variableDomainsOf)(net);
|
|
189
|
+
let factors = net.cpts.map((cpt) => {
|
|
190
|
+
const f = (0, factor_1.factorFromCPT)(cpt, domains);
|
|
191
|
+
return (0, factor_1.restrictFactor)(f, evidence);
|
|
192
|
+
});
|
|
193
|
+
const toEliminate = net.variables.map((v) => v.name).filter((n) => !(n in evidence));
|
|
194
|
+
// Para reconstruir el argmax necesitamos eliminar en un orden
|
|
195
|
+
// determinístico y guardar, en cada paso, la mejor asignación
|
|
196
|
+
// de la variable eliminada como función de las restantes.
|
|
197
|
+
const order = eliminationOrder(toEliminate, factors);
|
|
198
|
+
const steps = [];
|
|
199
|
+
for (const v of order) {
|
|
200
|
+
const involved = factors.filter((f) => f.variables.includes(v));
|
|
201
|
+
const others = factors.filter((f) => !f.variables.includes(v));
|
|
202
|
+
if (involved.length === 0)
|
|
203
|
+
continue;
|
|
204
|
+
let product = involved[0];
|
|
205
|
+
for (let i = 1; i < involved.length; i++) {
|
|
206
|
+
product = (0, factor_1.multiplyFactors)(product, involved[i]);
|
|
207
|
+
}
|
|
208
|
+
const contextVars = product.variables.filter((x) => x !== v);
|
|
209
|
+
// Construir chooser: para cada asignación de contextVars,
|
|
210
|
+
// qué valor de v maximiza el producto.
|
|
211
|
+
const chooser = new Map();
|
|
212
|
+
const best = new Map();
|
|
213
|
+
for (const [key, val] of product.values) {
|
|
214
|
+
const assign = (0, factor_1.parseAssignmentKey)(key);
|
|
215
|
+
const ctx = {};
|
|
216
|
+
for (const c of contextVars)
|
|
217
|
+
ctx[c] = assign[c];
|
|
218
|
+
const ctxKey = (0, factor_1.assignmentKey)(contextVars, ctx);
|
|
219
|
+
const prev = best.get(ctxKey);
|
|
220
|
+
if (prev === undefined || val > prev) {
|
|
221
|
+
best.set(ctxKey, val);
|
|
222
|
+
chooser.set(ctxKey, assign[v]);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
steps.push({ variable: v, contextVars, chooser });
|
|
226
|
+
const { factor: reduced } = (0, factor_1.maxOut)(product, v);
|
|
227
|
+
factors = [...others, reduced];
|
|
228
|
+
}
|
|
229
|
+
// Tras eliminar todas las variables no-evidencia, queda un
|
|
230
|
+
// factor escalar (sin variables). La asignación óptima se
|
|
231
|
+
// reconstruye recorriendo `steps` en orden inverso.
|
|
232
|
+
const assignment = { ...evidence };
|
|
233
|
+
for (let i = steps.length - 1; i >= 0; i--) {
|
|
234
|
+
const step = steps[i];
|
|
235
|
+
const ctx = {};
|
|
236
|
+
for (const c of step.contextVars) {
|
|
237
|
+
const val = assignment[c];
|
|
238
|
+
if (val === undefined) {
|
|
239
|
+
// No debería ocurrir si el orden es válido — defensa.
|
|
240
|
+
ctx[c] = '';
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
ctx[c] = val;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const ctxKey = (0, factor_1.assignmentKey)(step.contextVars, ctx);
|
|
247
|
+
const chosen = step.chooser.get(ctxKey);
|
|
248
|
+
if (chosen !== undefined) {
|
|
249
|
+
assignment[step.variable] = chosen;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
// Fallback: primer valor del dominio. Solo posible con CPT degenerada.
|
|
253
|
+
const dom = domains[step.variable];
|
|
254
|
+
if (dom && dom.length > 0)
|
|
255
|
+
assignment[step.variable] = dom[0];
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return assignment;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../../src/runtime/bayesian/inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface DiscreteVariable {
|
|
2
|
+
name: string;
|
|
3
|
+
values: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface CPT {
|
|
6
|
+
variable: string;
|
|
7
|
+
parents: string[];
|
|
8
|
+
entries: Record<string, Record<string, number>>;
|
|
9
|
+
}
|
|
10
|
+
export interface BayesianNetwork {
|
|
11
|
+
variables: DiscreteVariable[];
|
|
12
|
+
cpts: CPT[];
|
|
13
|
+
}
|
|
14
|
+
export type Evidence = Record<string, string>;
|
|
15
|
+
export interface PosteriorDistribution {
|
|
16
|
+
variable: string;
|
|
17
|
+
distribution: Record<string, number>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/runtime/bayesian/types.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAGlB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,IAAI,EAAE,GAAG,EAAE,CAAC;CACb;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Bayesian Inference — Types
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Tipos para representar redes bayesianas discretas y consultas
|
|
7
|
+
// de inferencia probabilística.
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/runtime/bayesian/types.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAC/D,EAAE;AACF,gEAAgE;AAChE,gCAAgC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/bisimulation/index.ts"],"names":[],"mappings":"AAWA,YAAY,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Bisimulation — barrel público.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// API:
|
|
6
|
+
// paigeTarjan(lts) → BisimulationResult
|
|
7
|
+
// areBisimilar(lts, s, t) → boolean
|
|
8
|
+
// quotientLTS(lts) → LTS mínimo módulo ~
|
|
9
|
+
// strongBisimulation(L1, L2) → boolean
|
|
10
|
+
// weakBisimulation(lts, tau) → BisimulationResult (oculta τ)
|
|
11
|
+
// ============================================================
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.weakBisimulation = exports.strongBisimulation = exports.quotientLTS = exports.areBisimilar = exports.paigeTarjan = void 0;
|
|
14
|
+
var paige_tarjan_1 = require("./paige-tarjan");
|
|
15
|
+
Object.defineProperty(exports, "paigeTarjan", { enumerable: true, get: function () { return paige_tarjan_1.paigeTarjan; } });
|
|
16
|
+
var operations_1 = require("./operations");
|
|
17
|
+
Object.defineProperty(exports, "areBisimilar", { enumerable: true, get: function () { return operations_1.areBisimilar; } });
|
|
18
|
+
Object.defineProperty(exports, "quotientLTS", { enumerable: true, get: function () { return operations_1.quotientLTS; } });
|
|
19
|
+
Object.defineProperty(exports, "strongBisimulation", { enumerable: true, get: function () { return operations_1.strongBisimulation; } });
|
|
20
|
+
Object.defineProperty(exports, "weakBisimulation", { enumerable: true, get: function () { return operations_1.weakBisimulation; } });
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/bisimulation/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,oCAAoC;AACpC,+DAA+D;AAC/D,OAAO;AACP,uDAAuD;AACvD,4CAA4C;AAC5C,wDAAwD;AACxD,4CAA4C;AAC5C,kEAAkE;AAClE,+DAA+D;;;AAG/D,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2CAA+F;AAAtF,0GAAA,YAAY,OAAA;AAAE,yGAAA,WAAW,OAAA;AAAE,gHAAA,kBAAkB,OAAA;AAAE,8GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { LTS, BisimulationResult } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Devuelve `true` si los estados `s` y `t` caen en el mismo bloque de la
|
|
4
|
+
* partición de bisimulación fuerte. Lanza si alguno no existe en M.
|
|
5
|
+
*/
|
|
6
|
+
export declare function areBisimilar(lts: LTS, s: string, t: string): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Construye el LTS cociente M/~ donde cada bloque de la partición de
|
|
9
|
+
* bisimulación se convierte en un único estado. Las transiciones se
|
|
10
|
+
* deduplican: si s -a-> t, entonces [s] -a-> [t] aparece una sola vez.
|
|
11
|
+
*
|
|
12
|
+
* El labelling del bloque es el labelling común de sus miembros
|
|
13
|
+
* (todos los miembros tienen el mismo labelling por construcción).
|
|
14
|
+
*/
|
|
15
|
+
export declare function quotientLTS(lts: LTS): LTS;
|
|
16
|
+
/**
|
|
17
|
+
* Verifica si dos LTS son fuertemente bisimilares.
|
|
18
|
+
* Los espacios de estados deben ser disjuntos; si no lo son, los renombramos
|
|
19
|
+
* internamente con prefijos "L:" y "R:".
|
|
20
|
+
*
|
|
21
|
+
* El criterio: en el LTS combinado, los conjuntos iniciales (o, en ausencia
|
|
22
|
+
* de iniciales explícitos, todos los estados) deben quedar particionados de
|
|
23
|
+
* forma que cada estado de L tenga al menos un estado equivalente en R y
|
|
24
|
+
* viceversa. Como API simple, se compara la firma de la partición sobre
|
|
25
|
+
* el LTS combinado: dos LTS son bisimilares como sistemas sii existe una
|
|
26
|
+
* biyección entre sus bloques tal que cada bloque contiene estados de ambos
|
|
27
|
+
* lados (interpretación de "los autómatas son indistinguibles").
|
|
28
|
+
*/
|
|
29
|
+
export declare function strongBisimulation(lts1: LTS, lts2: LTS): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Bisimulación débil: oculta transiciones τ y satura ⇒ = τ* antes de aplicar
|
|
32
|
+
* Paige-Tarjan. Útil para CCS / process algebras donde τ representa una
|
|
33
|
+
* acción interna no observable.
|
|
34
|
+
*
|
|
35
|
+
* Cuesta O(n³) por la saturación (transitivos τ); para LTS grandes con muchas
|
|
36
|
+
* acciones reales esto es aceptable. La partición resultante es la mayor
|
|
37
|
+
* relación de bisimulación débil.
|
|
38
|
+
*/
|
|
39
|
+
export declare function weakBisimulation(lts: LTS, tau: string): BisimulationResult;
|
|
40
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../../src/runtime/bisimulation/operations.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAMpE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAsCzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CA8ChE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,CA6D1E"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Operaciones derivadas sobre bisimulación.
|
|
4
|
+
// ============================================================
|
|
5
|
+
// - areBisimilar(M, s, t) : ¿s y t están en el mismo bloque?
|
|
6
|
+
// - quotientLTS(M) : LTS mínimo módulo bisimulación.
|
|
7
|
+
// - strongBisimulation(M1, M2) : ¿dos LTS son fuertemente bisimilares?
|
|
8
|
+
// - weakBisimulation(M, τ) : partición que oculta transiciones τ.
|
|
9
|
+
//
|
|
10
|
+
// Para weakBisimulation usamos la construcción estándar:
|
|
11
|
+
// 1. saturar: ⇒ = τ* (con loops auto-incluidos)
|
|
12
|
+
// 2. para cada arista s -a-> t con a ≠ τ, agregar todas las composiciones
|
|
13
|
+
// τ* ; a ; τ*
|
|
14
|
+
// 3. para a = τ, agregar todos los pares (s, t) tales que s ⇒ t (incluido
|
|
15
|
+
// el reflexivo) bajo la acción τ.
|
|
16
|
+
// 4. Aplicar Paige-Tarjan sobre el LTS saturado.
|
|
17
|
+
//
|
|
18
|
+
// El resultado es la partición de bisimulación débil (~_w o "observational
|
|
19
|
+
// equivalence" de Milner).
|
|
20
|
+
// ============================================================
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.areBisimilar = areBisimilar;
|
|
23
|
+
exports.quotientLTS = quotientLTS;
|
|
24
|
+
exports.strongBisimulation = strongBisimulation;
|
|
25
|
+
exports.weakBisimulation = weakBisimulation;
|
|
26
|
+
const paige_tarjan_1 = require("./paige-tarjan");
|
|
27
|
+
/**
|
|
28
|
+
* Devuelve `true` si los estados `s` y `t` caen en el mismo bloque de la
|
|
29
|
+
* partición de bisimulación fuerte. Lanza si alguno no existe en M.
|
|
30
|
+
*/
|
|
31
|
+
function areBisimilar(lts, s, t) {
|
|
32
|
+
const known = new Set(lts.states);
|
|
33
|
+
if (!known.has(s))
|
|
34
|
+
throw new Error(`areBisimilar: estado desconocido "${s}"`);
|
|
35
|
+
if (!known.has(t))
|
|
36
|
+
throw new Error(`areBisimilar: estado desconocido "${t}"`);
|
|
37
|
+
const result = (0, paige_tarjan_1.paigeTarjan)(lts);
|
|
38
|
+
return result.partition.get(s) === result.partition.get(t);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Construye el LTS cociente M/~ donde cada bloque de la partición de
|
|
42
|
+
* bisimulación se convierte en un único estado. Las transiciones se
|
|
43
|
+
* deduplican: si s -a-> t, entonces [s] -a-> [t] aparece una sola vez.
|
|
44
|
+
*
|
|
45
|
+
* El labelling del bloque es el labelling común de sus miembros
|
|
46
|
+
* (todos los miembros tienen el mismo labelling por construcción).
|
|
47
|
+
*/
|
|
48
|
+
function quotientLTS(lts) {
|
|
49
|
+
const result = (0, paige_tarjan_1.paigeTarjan)(lts);
|
|
50
|
+
const blockName = (idx) => `q${idx}`;
|
|
51
|
+
const newStates = result.blocks.map((_, i) => blockName(i));
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
const newTransitions = [];
|
|
54
|
+
for (const [from, action, to] of lts.transitions) {
|
|
55
|
+
const bf = result.partition.get(from);
|
|
56
|
+
const bt = result.partition.get(to);
|
|
57
|
+
if (bf === undefined || bt === undefined)
|
|
58
|
+
continue;
|
|
59
|
+
const key = `${bf}|${action}|${bt}`;
|
|
60
|
+
if (seen.has(key))
|
|
61
|
+
continue;
|
|
62
|
+
seen.add(key);
|
|
63
|
+
newTransitions.push([blockName(bf), action, blockName(bt)]);
|
|
64
|
+
}
|
|
65
|
+
// Labelling: cada bloque hereda el labelling de cualquiera de sus miembros
|
|
66
|
+
// (los miembros de un mismo bloque coinciden en labelling por bisimulación).
|
|
67
|
+
const labelling = {};
|
|
68
|
+
if (lts.labelling) {
|
|
69
|
+
for (let i = 0; i < result.blocks.length; i++) {
|
|
70
|
+
const cell = result.blocks[i];
|
|
71
|
+
const rep = cell && cell.length > 0 ? cell[0] : undefined;
|
|
72
|
+
if (rep === undefined)
|
|
73
|
+
continue;
|
|
74
|
+
const labs = lts.labelling[rep];
|
|
75
|
+
if (labs && labs.size > 0) {
|
|
76
|
+
labelling[blockName(i)] = new Set(labs);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const out = {
|
|
81
|
+
states: newStates,
|
|
82
|
+
transitions: newTransitions,
|
|
83
|
+
};
|
|
84
|
+
if (Object.keys(labelling).length > 0)
|
|
85
|
+
out.labelling = labelling;
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Verifica si dos LTS son fuertemente bisimilares.
|
|
90
|
+
* Los espacios de estados deben ser disjuntos; si no lo son, los renombramos
|
|
91
|
+
* internamente con prefijos "L:" y "R:".
|
|
92
|
+
*
|
|
93
|
+
* El criterio: en el LTS combinado, los conjuntos iniciales (o, en ausencia
|
|
94
|
+
* de iniciales explícitos, todos los estados) deben quedar particionados de
|
|
95
|
+
* forma que cada estado de L tenga al menos un estado equivalente en R y
|
|
96
|
+
* viceversa. Como API simple, se compara la firma de la partición sobre
|
|
97
|
+
* el LTS combinado: dos LTS son bisimilares como sistemas sii existe una
|
|
98
|
+
* biyección entre sus bloques tal que cada bloque contiene estados de ambos
|
|
99
|
+
* lados (interpretación de "los autómatas son indistinguibles").
|
|
100
|
+
*/
|
|
101
|
+
function strongBisimulation(lts1, lts2) {
|
|
102
|
+
const prefix = (side, s) => `${side}:${s}`;
|
|
103
|
+
const states = [
|
|
104
|
+
...lts1.states.map((s) => prefix('L', s)),
|
|
105
|
+
...lts2.states.map((s) => prefix('R', s)),
|
|
106
|
+
];
|
|
107
|
+
const transitions = [
|
|
108
|
+
...lts1.transitions.map(([f, a, t]) => [prefix('L', f), a, prefix('L', t)]),
|
|
109
|
+
...lts2.transitions.map(([f, a, t]) => [prefix('R', f), a, prefix('R', t)]),
|
|
110
|
+
];
|
|
111
|
+
const labelling = {};
|
|
112
|
+
if (lts1.labelling) {
|
|
113
|
+
for (const [k, v] of Object.entries(lts1.labelling)) {
|
|
114
|
+
labelling[prefix('L', k)] = new Set(v);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (lts2.labelling) {
|
|
118
|
+
for (const [k, v] of Object.entries(lts2.labelling)) {
|
|
119
|
+
labelling[prefix('R', k)] = new Set(v);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const combined = { states, transitions };
|
|
123
|
+
if (Object.keys(labelling).length > 0)
|
|
124
|
+
combined.labelling = labelling;
|
|
125
|
+
const result = (0, paige_tarjan_1.paigeTarjan)(combined);
|
|
126
|
+
// Para que dos LTS sean "globalmente" bisimilares, cada estado de un lado
|
|
127
|
+
// debe quedar emparejado con al menos un estado del otro: los bloques deben
|
|
128
|
+
// contener miembros de ambos lados (o bloques que toquen sólo un lado son
|
|
129
|
+
// testigos de no-bisimilaridad).
|
|
130
|
+
for (const cell of result.blocks) {
|
|
131
|
+
let hasL = false;
|
|
132
|
+
let hasR = false;
|
|
133
|
+
for (const s of cell) {
|
|
134
|
+
if (s.startsWith('L:'))
|
|
135
|
+
hasL = true;
|
|
136
|
+
else if (s.startsWith('R:'))
|
|
137
|
+
hasR = true;
|
|
138
|
+
if (hasL && hasR)
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
if (!hasL || !hasR)
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Bisimulación débil: oculta transiciones τ y satura ⇒ = τ* antes de aplicar
|
|
148
|
+
* Paige-Tarjan. Útil para CCS / process algebras donde τ representa una
|
|
149
|
+
* acción interna no observable.
|
|
150
|
+
*
|
|
151
|
+
* Cuesta O(n³) por la saturación (transitivos τ); para LTS grandes con muchas
|
|
152
|
+
* acciones reales esto es aceptable. La partición resultante es la mayor
|
|
153
|
+
* relación de bisimulación débil.
|
|
154
|
+
*/
|
|
155
|
+
function weakBisimulation(lts, tau) {
|
|
156
|
+
const states = new Set(lts.states);
|
|
157
|
+
// Construir τ-reachability (incluyendo cero pasos: cada s alcanza a sí mismo).
|
|
158
|
+
const tauNext = new Map();
|
|
159
|
+
for (const s of states)
|
|
160
|
+
tauNext.set(s, new Set([s]));
|
|
161
|
+
for (const [f, a, t] of lts.transitions) {
|
|
162
|
+
if (a === tau)
|
|
163
|
+
tauNext.get(f)?.add(t);
|
|
164
|
+
}
|
|
165
|
+
// Cierre transitivo de τ (Floyd-Warshall ingenuo).
|
|
166
|
+
const tauStar = new Map();
|
|
167
|
+
for (const s of states) {
|
|
168
|
+
const reach = new Set([s]);
|
|
169
|
+
const queue = [s];
|
|
170
|
+
while (queue.length > 0) {
|
|
171
|
+
const cur = queue.shift();
|
|
172
|
+
if (cur === undefined)
|
|
173
|
+
continue;
|
|
174
|
+
for (const n of tauNext.get(cur) ?? []) {
|
|
175
|
+
if (!reach.has(n)) {
|
|
176
|
+
reach.add(n);
|
|
177
|
+
queue.push(n);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
tauStar.set(s, reach);
|
|
182
|
+
}
|
|
183
|
+
// Saturación: s ⇒ -a-> ⇐ t ≡ existen u, v con s ⇒ u -a-> v y v ⇒ t.
|
|
184
|
+
// Para τ: s ⇒ t (sólo cuando el LTS original tiene al menos un τ desde s o
|
|
185
|
+
// s ≠ t por algún camino) se traduce a aristas τ explícitas en el saturado.
|
|
186
|
+
const saturated = [];
|
|
187
|
+
const seen = new Set();
|
|
188
|
+
const addEdge = (f, a, t) => {
|
|
189
|
+
const k = `${f}|${a}|${t}`;
|
|
190
|
+
if (seen.has(k))
|
|
191
|
+
return;
|
|
192
|
+
seen.add(k);
|
|
193
|
+
saturated.push([f, a, t]);
|
|
194
|
+
};
|
|
195
|
+
// Saturación de transiciones observables (a ≠ τ):
|
|
196
|
+
// en el LTS saturado, s -a-> u sii existen f, t con s ⇒ f -a-> t ⇒ u.
|
|
197
|
+
// Los τ originales NO se emiten como aristas observables: se "absorben" en
|
|
198
|
+
// ⇒ y desaparecen de la firma local, que es la definición canónica de
|
|
199
|
+
// bisimulación débil de Milner.
|
|
200
|
+
for (const [f, a, t] of lts.transitions) {
|
|
201
|
+
if (a === tau)
|
|
202
|
+
continue;
|
|
203
|
+
for (const s of tauStar.keys()) {
|
|
204
|
+
if (!tauStar.get(s)?.has(f))
|
|
205
|
+
continue;
|
|
206
|
+
for (const u of tauStar.get(t) ?? []) {
|
|
207
|
+
addEdge(s, a, u);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const satLts = {
|
|
212
|
+
states: [...states],
|
|
213
|
+
transitions: saturated,
|
|
214
|
+
};
|
|
215
|
+
if (lts.labelling)
|
|
216
|
+
satLts.labelling = lts.labelling;
|
|
217
|
+
return (0, paige_tarjan_1.paigeTarjan)(satLts);
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../../src/runtime/bisimulation/operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LTS, BisimulationResult } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Particiona el LTS según bisimulación fuerte usando Paige-Tarjan.
|
|
4
|
+
* Devuelve la partición canónica donde dos estados están en el mismo bloque
|
|
5
|
+
* sii son fuertemente bisimilares.
|
|
6
|
+
*/
|
|
7
|
+
export declare function paigeTarjan(lts: LTS): BisimulationResult;
|
|
8
|
+
//# sourceMappingURL=paige-tarjan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paige-tarjan.d.ts","sourceRoot":"","sources":["../../../src/runtime/bisimulation/paige-tarjan.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAyEvD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,kBAAkB,CA+GxD"}
|