@stevenvo780/st-lang 4.7.0 → 4.9.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/logic/profiles/quantum/index.d.ts +153 -0
- package/dist/logic/profiles/quantum/index.d.ts.map +1 -0
- package/dist/logic/profiles/quantum/index.js +788 -0
- package/dist/logic/profiles/quantum/index.js.map +1 -0
- package/dist/namespaces/reasoning.d.ts +3 -1
- package/dist/namespaces/reasoning.d.ts.map +1 -1
- package/dist/namespaces/reasoning.js +5 -1
- package/dist/namespaces/reasoning.js.map +1 -1
- package/dist/proof-systems/certificate/canonical.d.ts +18 -0
- package/dist/proof-systems/certificate/canonical.d.ts.map +1 -0
- package/dist/proof-systems/certificate/canonical.js +79 -0
- package/dist/proof-systems/certificate/canonical.js.map +1 -0
- package/dist/proof-systems/certificate/generate.d.ts +39 -0
- package/dist/proof-systems/certificate/generate.d.ts.map +1 -0
- package/dist/proof-systems/certificate/generate.js +259 -0
- package/dist/proof-systems/certificate/generate.js.map +1 -0
- package/dist/proof-systems/certificate/index.d.ts +7 -0
- package/dist/proof-systems/certificate/index.d.ts.map +1 -0
- package/dist/proof-systems/certificate/index.js +23 -0
- package/dist/proof-systems/certificate/index.js.map +1 -0
- package/dist/proof-systems/certificate/lfsc.d.ts +15 -0
- package/dist/proof-systems/certificate/lfsc.d.ts.map +1 -0
- package/dist/proof-systems/certificate/lfsc.js +395 -0
- package/dist/proof-systems/certificate/lfsc.js.map +1 -0
- package/dist/proof-systems/certificate/rules.d.ts +8 -0
- package/dist/proof-systems/certificate/rules.d.ts.map +1 -0
- package/dist/proof-systems/certificate/rules.js +369 -0
- package/dist/proof-systems/certificate/rules.js.map +1 -0
- package/dist/proof-systems/certificate/types.d.ts +114 -0
- package/dist/proof-systems/certificate/types.d.ts.map +1 -0
- package/dist/proof-systems/certificate/types.js +18 -0
- package/dist/proof-systems/certificate/types.js.map +1 -0
- package/dist/proof-systems/certificate/verify.d.ts +20 -0
- package/dist/proof-systems/certificate/verify.d.ts.map +1 -0
- package/dist/proof-systems/certificate/verify.js +171 -0
- package/dist/proof-systems/certificate/verify.js.map +1 -0
- package/dist/reasoning/ban-logic/analyze.d.ts +31 -0
- package/dist/reasoning/ban-logic/analyze.d.ts.map +1 -0
- package/dist/reasoning/ban-logic/analyze.js +113 -0
- package/dist/reasoning/ban-logic/analyze.js.map +1 -0
- package/dist/reasoning/ban-logic/index.d.ts +7 -0
- package/dist/reasoning/ban-logic/index.d.ts.map +1 -0
- package/dist/reasoning/ban-logic/index.js +66 -0
- package/dist/reasoning/ban-logic/index.js.map +1 -0
- package/dist/reasoning/ban-logic/protocols.d.ts +54 -0
- package/dist/reasoning/ban-logic/protocols.d.ts.map +1 -0
- package/dist/reasoning/ban-logic/protocols.js +219 -0
- package/dist/reasoning/ban-logic/protocols.js.map +1 -0
- package/dist/reasoning/ban-logic/rules.d.ts +83 -0
- package/dist/reasoning/ban-logic/rules.d.ts.map +1 -0
- package/dist/reasoning/ban-logic/rules.js +409 -0
- package/dist/reasoning/ban-logic/rules.js.map +1 -0
- package/dist/reasoning/ban-logic/terms.d.ts +26 -0
- package/dist/reasoning/ban-logic/terms.d.ts.map +1 -0
- package/dist/reasoning/ban-logic/terms.js +262 -0
- package/dist/reasoning/ban-logic/terms.js.map +1 -0
- package/dist/reasoning/ban-logic/types.d.ts +107 -0
- package/dist/reasoning/ban-logic/types.d.ts.map +1 -0
- package/dist/reasoning/ban-logic/types.js +27 -0
- package/dist/reasoning/ban-logic/types.js.map +1 -0
- package/dist/reasoning/combinatorial-games/index.d.ts +105 -0
- package/dist/reasoning/combinatorial-games/index.d.ts.map +1 -0
- package/dist/reasoning/combinatorial-games/index.js +377 -0
- package/dist/reasoning/combinatorial-games/index.js.map +1 -0
- package/dist/reasoning/differential-privacy/index.d.ts +121 -0
- package/dist/reasoning/differential-privacy/index.d.ts.map +1 -0
- package/dist/reasoning/differential-privacy/index.js +417 -0
- package/dist/reasoning/differential-privacy/index.js.map +1 -0
- package/dist/reasoning/mechanism-design/auctions.d.ts +49 -0
- package/dist/reasoning/mechanism-design/auctions.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/auctions.js +179 -0
- package/dist/reasoning/mechanism-design/auctions.js.map +1 -0
- package/dist/reasoning/mechanism-design/index.d.ts +5 -0
- package/dist/reasoning/mechanism-design/index.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/index.js +39 -0
- package/dist/reasoning/mechanism-design/index.js.map +1 -0
- package/dist/reasoning/mechanism-design/myerson.d.ts +64 -0
- package/dist/reasoning/mechanism-design/myerson.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/myerson.js +253 -0
- package/dist/reasoning/mechanism-design/myerson.js.map +1 -0
- package/dist/reasoning/mechanism-design/types.d.ts +44 -0
- package/dist/reasoning/mechanism-design/types.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/types.js +22 -0
- package/dist/reasoning/mechanism-design/types.js.map +1 -0
- package/dist/reasoning/mechanism-design/vcg.d.ts +29 -0
- package/dist/reasoning/mechanism-design/vcg.d.ts.map +1 -0
- package/dist/reasoning/mechanism-design/vcg.js +305 -0
- package/dist/reasoning/mechanism-design/vcg.js.map +1 -0
- package/dist/reasoning/probabilistic/distributions.d.ts +44 -0
- package/dist/reasoning/probabilistic/distributions.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/distributions.js +207 -0
- package/dist/reasoning/probabilistic/distributions.js.map +1 -0
- package/dist/reasoning/probabilistic/examples.d.ts +31 -0
- package/dist/reasoning/probabilistic/examples.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/examples.js +85 -0
- package/dist/reasoning/probabilistic/examples.js.map +1 -0
- package/dist/reasoning/probabilistic/index.d.ts +6 -0
- package/dist/reasoning/probabilistic/index.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/index.js +42 -0
- package/dist/reasoning/probabilistic/index.js.map +1 -0
- package/dist/reasoning/probabilistic/inference.d.ts +45 -0
- package/dist/reasoning/probabilistic/inference.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/inference.js +579 -0
- package/dist/reasoning/probabilistic/inference.js.map +1 -0
- package/dist/reasoning/probabilistic/types.d.ts +153 -0
- package/dist/reasoning/probabilistic/types.d.ts.map +1 -0
- package/dist/reasoning/probabilistic/types.js +37 -0
- package/dist/reasoning/probabilistic/types.js.map +1 -0
- package/dist/solver/smt-z3/index.d.ts +3 -0
- package/dist/solver/smt-z3/index.d.ts.map +1 -0
- package/dist/solver/smt-z3/index.js +11 -0
- package/dist/solver/smt-z3/index.js.map +1 -0
- package/dist/solver/smt-z3/types.d.ts +52 -0
- package/dist/solver/smt-z3/types.d.ts.map +1 -0
- package/dist/solver/smt-z3/types.js +6 -0
- package/dist/solver/smt-z3/types.js.map +1 -0
- package/dist/solver/smt-z3/z3-wasm-backend.d.ts +88 -0
- package/dist/solver/smt-z3/z3-wasm-backend.d.ts.map +1 -0
- package/dist/solver/smt-z3/z3-wasm-backend.js +437 -0
- package/dist/solver/smt-z3/z3-wasm-backend.js.map +1 -0
- package/dist/tests/logic/profiles/quantum/quantum.test.d.ts +2 -0
- package/dist/tests/logic/profiles/quantum/quantum.test.d.ts.map +1 -0
- package/dist/tests/logic/profiles/quantum/quantum.test.js +209 -0
- package/dist/tests/logic/profiles/quantum/quantum.test.js.map +1 -0
- package/dist/tests/proof-systems/certificate/certificate.test.d.ts +2 -0
- package/dist/tests/proof-systems/certificate/certificate.test.d.ts.map +1 -0
- package/dist/tests/proof-systems/certificate/certificate.test.js +449 -0
- package/dist/tests/proof-systems/certificate/certificate.test.js.map +1 -0
- package/dist/tests/reasoning/ban-logic/ban-logic.test.d.ts +2 -0
- package/dist/tests/reasoning/ban-logic/ban-logic.test.d.ts.map +1 -0
- package/dist/tests/reasoning/ban-logic/ban-logic.test.js +270 -0
- package/dist/tests/reasoning/ban-logic/ban-logic.test.js.map +1 -0
- package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.d.ts +2 -0
- package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.d.ts.map +1 -0
- package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.js +203 -0
- package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.js.map +1 -0
- package/dist/tests/reasoning/differential-privacy/differential-privacy.test.d.ts +2 -0
- package/dist/tests/reasoning/differential-privacy/differential-privacy.test.d.ts.map +1 -0
- package/dist/tests/reasoning/differential-privacy/differential-privacy.test.js +388 -0
- package/dist/tests/reasoning/differential-privacy/differential-privacy.test.js.map +1 -0
- package/dist/tests/reasoning/mechanism-design/mechanism-design.test.d.ts +2 -0
- package/dist/tests/reasoning/mechanism-design/mechanism-design.test.d.ts.map +1 -0
- package/dist/tests/reasoning/mechanism-design/mechanism-design.test.js +290 -0
- package/dist/tests/reasoning/mechanism-design/mechanism-design.test.js.map +1 -0
- package/dist/tests/reasoning/probabilistic/probabilistic.test.d.ts +2 -0
- package/dist/tests/reasoning/probabilistic/probabilistic.test.d.ts.map +1 -0
- package/dist/tests/reasoning/probabilistic/probabilistic.test.js +370 -0
- package/dist/tests/reasoning/probabilistic/probabilistic.test.js.map +1 -0
- package/dist/tests/solver/smt-z3/z3-wasm-backend.test.d.ts +2 -0
- package/dist/tests/solver/smt-z3/z3-wasm-backend.test.d.ts.map +1 -0
- package/dist/tests/solver/smt-z3/z3-wasm-backend.test.js +394 -0
- package/dist/tests/solver/smt-z3/z3-wasm-backend.test.js.map +1 -0
- package/dist/tests/tooling/mathlib/mathlib.test.d.ts +2 -0
- package/dist/tests/tooling/mathlib/mathlib.test.d.ts.map +1 -0
- package/dist/tests/tooling/mathlib/mathlib.test.js +214 -0
- package/dist/tests/tooling/mathlib/mathlib.test.js.map +1 -0
- package/dist/tests/tooling/proof-guidance/features.test.d.ts +2 -0
- package/dist/tests/tooling/proof-guidance/features.test.d.ts.map +1 -0
- package/dist/tests/tooling/proof-guidance/features.test.js +72 -0
- package/dist/tests/tooling/proof-guidance/features.test.js.map +1 -0
- package/dist/tests/tooling/proof-guidance/model.test.d.ts +2 -0
- package/dist/tests/tooling/proof-guidance/model.test.d.ts.map +1 -0
- package/dist/tests/tooling/proof-guidance/model.test.js +165 -0
- package/dist/tests/tooling/proof-guidance/model.test.js.map +1 -0
- package/dist/tests/tooling/proof-guidance/search.test.d.ts +2 -0
- package/dist/tests/tooling/proof-guidance/search.test.d.ts.map +1 -0
- package/dist/tests/tooling/proof-guidance/search.test.js +238 -0
- package/dist/tests/tooling/proof-guidance/search.test.js.map +1 -0
- package/dist/tests/type-theory/cubical/cubical.test.d.ts +2 -0
- package/dist/tests/type-theory/cubical/cubical.test.d.ts.map +1 -0
- package/dist/tests/type-theory/cubical/cubical.test.js +207 -0
- package/dist/tests/type-theory/cubical/cubical.test.js.map +1 -0
- package/dist/tests/type-theory/effects/effects.test.d.ts +2 -0
- package/dist/tests/type-theory/effects/effects.test.d.ts.map +1 -0
- package/dist/tests/type-theory/effects/effects.test.js +242 -0
- package/dist/tests/type-theory/effects/effects.test.js.map +1 -0
- package/dist/tooling/mathlib/group.d.ts +27 -0
- package/dist/tooling/mathlib/group.d.ts.map +1 -0
- package/dist/tooling/mathlib/group.js +89 -0
- package/dist/tooling/mathlib/group.js.map +1 -0
- package/dist/tooling/mathlib/index.d.ts +8 -0
- package/dist/tooling/mathlib/index.d.ts.map +1 -0
- package/dist/tooling/mathlib/index.js +40 -0
- package/dist/tooling/mathlib/index.js.map +1 -0
- package/dist/tooling/mathlib/instances.d.ts +29 -0
- package/dist/tooling/mathlib/instances.d.ts.map +1 -0
- package/dist/tooling/mathlib/instances.js +139 -0
- package/dist/tooling/mathlib/instances.js.map +1 -0
- package/dist/tooling/mathlib/lemmas.d.ts +3 -0
- package/dist/tooling/mathlib/lemmas.d.ts.map +1 -0
- package/dist/tooling/mathlib/lemmas.js +72 -0
- package/dist/tooling/mathlib/lemmas.js.map +1 -0
- package/dist/tooling/mathlib/order.d.ts +29 -0
- package/dist/tooling/mathlib/order.d.ts.map +1 -0
- package/dist/tooling/mathlib/order.js +91 -0
- package/dist/tooling/mathlib/order.js.map +1 -0
- package/dist/tooling/mathlib/ring.d.ts +15 -0
- package/dist/tooling/mathlib/ring.d.ts.map +1 -0
- package/dist/tooling/mathlib/ring.js +91 -0
- package/dist/tooling/mathlib/ring.js.map +1 -0
- package/dist/tooling/mathlib/types.d.ts +62 -0
- package/dist/tooling/mathlib/types.d.ts.map +1 -0
- package/dist/tooling/mathlib/types.js +7 -0
- package/dist/tooling/mathlib/types.js.map +1 -0
- package/dist/tooling/proof-guidance/features.d.ts +10 -0
- package/dist/tooling/proof-guidance/features.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/features.js +97 -0
- package/dist/tooling/proof-guidance/features.js.map +1 -0
- package/dist/tooling/proof-guidance/index.d.ts +5 -0
- package/dist/tooling/proof-guidance/index.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/index.js +25 -0
- package/dist/tooling/proof-guidance/index.js.map +1 -0
- package/dist/tooling/proof-guidance/model.d.ts +42 -0
- package/dist/tooling/proof-guidance/model.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/model.js +149 -0
- package/dist/tooling/proof-guidance/model.js.map +1 -0
- package/dist/tooling/proof-guidance/search.d.ts +7 -0
- package/dist/tooling/proof-guidance/search.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/search.js +102 -0
- package/dist/tooling/proof-guidance/search.js.map +1 -0
- package/dist/tooling/proof-guidance/types.d.ts +77 -0
- package/dist/tooling/proof-guidance/types.d.ts.map +1 -0
- package/dist/tooling/proof-guidance/types.js +8 -0
- package/dist/tooling/proof-guidance/types.js.map +1 -0
- package/dist/type-theory/cubical/equality.d.ts +4 -0
- package/dist/type-theory/cubical/equality.d.ts.map +1 -0
- package/dist/type-theory/cubical/equality.js +78 -0
- package/dist/type-theory/cubical/equality.js.map +1 -0
- package/dist/type-theory/cubical/index.d.ts +14 -0
- package/dist/type-theory/cubical/index.d.ts.map +1 -0
- package/dist/type-theory/cubical/index.js +71 -0
- package/dist/type-theory/cubical/index.js.map +1 -0
- package/dist/type-theory/cubical/infer.d.ts +18 -0
- package/dist/type-theory/cubical/infer.d.ts.map +1 -0
- package/dist/type-theory/cubical/infer.js +241 -0
- package/dist/type-theory/cubical/infer.js.map +1 -0
- package/dist/type-theory/cubical/interval.d.ts +12 -0
- package/dist/type-theory/cubical/interval.d.ts.map +1 -0
- package/dist/type-theory/cubical/interval.js +118 -0
- package/dist/type-theory/cubical/interval.js.map +1 -0
- package/dist/type-theory/cubical/normalize.d.ts +5 -0
- package/dist/type-theory/cubical/normalize.d.ts.map +1 -0
- package/dist/type-theory/cubical/normalize.js +191 -0
- package/dist/type-theory/cubical/normalize.js.map +1 -0
- package/dist/type-theory/cubical/path-algebra.d.ts +12 -0
- package/dist/type-theory/cubical/path-algebra.d.ts.map +1 -0
- package/dist/type-theory/cubical/path-algebra.js +109 -0
- package/dist/type-theory/cubical/path-algebra.js.map +1 -0
- package/dist/type-theory/cubical/substitute.d.ts +3 -0
- package/dist/type-theory/cubical/substitute.d.ts.map +1 -0
- package/dist/type-theory/cubical/substitute.js +109 -0
- package/dist/type-theory/cubical/substitute.js.map +1 -0
- package/dist/type-theory/cubical/types.d.ts +77 -0
- package/dist/type-theory/cubical/types.d.ts.map +1 -0
- package/dist/type-theory/cubical/types.js +258 -0
- package/dist/type-theory/cubical/types.js.map +1 -0
- package/dist/type-theory/effects/core.d.ts +27 -0
- package/dist/type-theory/effects/core.d.ts.map +1 -0
- package/dist/type-theory/effects/core.js +79 -0
- package/dist/type-theory/effects/core.js.map +1 -0
- package/dist/type-theory/effects/exception.d.ts +18 -0
- package/dist/type-theory/effects/exception.d.ts.map +1 -0
- package/dist/type-theory/effects/exception.js +59 -0
- package/dist/type-theory/effects/exception.js.map +1 -0
- package/dist/type-theory/effects/index.d.ts +11 -0
- package/dist/type-theory/effects/index.d.ts.map +1 -0
- package/dist/type-theory/effects/index.js +50 -0
- package/dist/type-theory/effects/index.js.map +1 -0
- package/dist/type-theory/effects/reader.d.ts +20 -0
- package/dist/type-theory/effects/reader.d.ts.map +1 -0
- package/dist/type-theory/effects/reader.js +62 -0
- package/dist/type-theory/effects/reader.js.map +1 -0
- package/dist/type-theory/effects/state.d.ts +31 -0
- package/dist/type-theory/effects/state.d.ts.map +1 -0
- package/dist/type-theory/effects/state.js +91 -0
- package/dist/type-theory/effects/state.js.map +1 -0
- package/dist/type-theory/effects/types.d.ts +45 -0
- package/dist/type-theory/effects/types.d.ts.map +1 -0
- package/dist/type-theory/effects/types.js +21 -0
- package/dist/type-theory/effects/types.js.map +1 -0
- package/dist/type-theory/effects/writer.d.ts +30 -0
- package/dist/type-theory/effects/writer.d.ts.map +1 -0
- package/dist/type-theory/effects/writer.js +79 -0
- package/dist/type-theory/effects/writer.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Combinatorial Games — Sprague-Grundy + Surreal numbers
|
|
4
|
+
// ============================================================
|
|
5
|
+
// Dos puntas complementarias del análisis de juegos combinatorios:
|
|
6
|
+
//
|
|
7
|
+
// 1. Juegos imparciales (mismas movidas para ambos jugadores) →
|
|
8
|
+
// Sprague-Grundy theorem: cada estado tiene un único valor
|
|
9
|
+
// grundy ∈ ℕ. Una posición es perdedora para el jugador a mover
|
|
10
|
+
// sii grundy = 0. Para juegos compuestos (suma disjunta), el
|
|
11
|
+
// valor se obtiene como XOR (nim-sum) de los componentes.
|
|
12
|
+
//
|
|
13
|
+
// 2. Juegos partisanos (movidas asimétricas Left/Right) → números
|
|
14
|
+
// surreales de Conway. Cada juego es un par { L | R } donde L y R
|
|
15
|
+
// son conjuntos de juegos (sus opciones). De aquí emergen los
|
|
16
|
+
// enteros, fracciones diádicas, ω, ε, *, ↑, etc.
|
|
17
|
+
//
|
|
18
|
+
// Convenciones:
|
|
19
|
+
// • Los juegos imparciales se modelan como una interfaz genérica
|
|
20
|
+
// `ImpartialGame<S>` con función de movidas y predicado terminal.
|
|
21
|
+
// • Los estados deben ser serializables a string (clave del caché);
|
|
22
|
+
// se exige una función `key` opcional; default = JSON.stringify.
|
|
23
|
+
// • Los surreales son recursivos. Sólo soportamos comparación y
|
|
24
|
+
// aritmética básica (add, negate, compare). Suficiente para
|
|
25
|
+
// verificar identidades como 1 + 1 = 2, *‖0, etc.
|
|
26
|
+
// • La simplificación de surreales aquí elimina opciones dominadas
|
|
27
|
+
// (Left domina a otra Left si es ≥; Right domina si es ≤). No
|
|
28
|
+
// hacemos "número simplicity" completo — sí suficiente para que
|
|
29
|
+
// los tests de identidad pasen sin explosión de tamaño.
|
|
30
|
+
// ============================================================
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.STAR = exports.MINUS_ONE = exports.ONE = exports.ZERO = void 0;
|
|
33
|
+
exports.mex = mex;
|
|
34
|
+
exports.grundyValue = grundyValue;
|
|
35
|
+
exports.isWinning = isWinning;
|
|
36
|
+
exports.nimSum = nimSum;
|
|
37
|
+
exports.multiGameGrundy = multiGameGrundy;
|
|
38
|
+
exports.nim = nim;
|
|
39
|
+
exports.nim1d = nim1d;
|
|
40
|
+
exports.chompGame = chompGame;
|
|
41
|
+
exports.fromInt = fromInt;
|
|
42
|
+
exports.negate = negate;
|
|
43
|
+
exports.add = add;
|
|
44
|
+
exports.compare = compare;
|
|
45
|
+
exports.isFuzzy = isFuzzy;
|
|
46
|
+
exports.simplify = simplify;
|
|
47
|
+
function stateKey(game, state) {
|
|
48
|
+
return game.key ? game.key(state) : JSON.stringify(state);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Minimum Excludant: menor entero ≥ 0 que no está en el conjunto.
|
|
52
|
+
* mex(∅) = 0, mex({0,1,3}) = 2, mex({1,2}) = 0.
|
|
53
|
+
*/
|
|
54
|
+
function mex(set) {
|
|
55
|
+
let n = 0;
|
|
56
|
+
while (set.has(n))
|
|
57
|
+
n += 1;
|
|
58
|
+
return n;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Valor de Grundy del estado dado bajo el juego imparcial.
|
|
62
|
+
* Define: G(terminal) = 0; G(s) = mex { G(s') : s' ∈ moves(s) }.
|
|
63
|
+
* Usa caché (compartido entre llamadas) keyed por la clave canónica del estado.
|
|
64
|
+
*/
|
|
65
|
+
function grundyValue(game, state, cache = new Map()) {
|
|
66
|
+
const k = stateKey(game, state);
|
|
67
|
+
const cached = cache.get(k);
|
|
68
|
+
if (cached !== undefined)
|
|
69
|
+
return cached;
|
|
70
|
+
if (game.isTerminal(state)) {
|
|
71
|
+
cache.set(k, 0);
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
const successors = game.moves(state);
|
|
75
|
+
const values = new Set();
|
|
76
|
+
for (const next of successors) {
|
|
77
|
+
values.add(grundyValue(game, next, cache));
|
|
78
|
+
}
|
|
79
|
+
const g = mex(values);
|
|
80
|
+
cache.set(k, g);
|
|
81
|
+
return g;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* El jugador a mover gana sii grundy ≠ 0 (juego imparcial con convención
|
|
85
|
+
* normal: el que no puede mover, pierde).
|
|
86
|
+
*/
|
|
87
|
+
function isWinning(game, state) {
|
|
88
|
+
return grundyValue(game, state) !== 0;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Nim-sum: XOR bit a bit de los valores. Identidad del monoide de Grundy
|
|
92
|
+
* bajo suma disjunta de juegos imparciales.
|
|
93
|
+
*/
|
|
94
|
+
function nimSum(values) {
|
|
95
|
+
let acc = 0;
|
|
96
|
+
for (const v of values)
|
|
97
|
+
acc ^= v;
|
|
98
|
+
return acc;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Grundy de la suma disjunta de juegos imparciales independientes:
|
|
102
|
+
* G(G1 + G2 + ... + Gn)(s1,...,sn) = G1(s1) ⊕ G2(s2) ⊕ ... ⊕ Gn(sn).
|
|
103
|
+
* Requiere games.length === states.length.
|
|
104
|
+
*/
|
|
105
|
+
function multiGameGrundy(games, states) {
|
|
106
|
+
if (games.length !== states.length) {
|
|
107
|
+
throw new Error(`multiGameGrundy: games (${games.length}) y states (${states.length}) deben tener igual longitud`);
|
|
108
|
+
}
|
|
109
|
+
const xs = [];
|
|
110
|
+
for (let i = 0; i < games.length; i += 1) {
|
|
111
|
+
// Cada juego tiene su propio caché.
|
|
112
|
+
xs.push(grundyValue(games[i], states[i]));
|
|
113
|
+
}
|
|
114
|
+
return nimSum(xs);
|
|
115
|
+
}
|
|
116
|
+
// ── Juegos pre-construidos ──────────────────────────────────
|
|
117
|
+
/**
|
|
118
|
+
* Nim clásico: varios montones de piedras, un movimiento = sacar ≥1
|
|
119
|
+
* piedras de un único montón. Pierde quien no puede mover (todos los
|
|
120
|
+
* montones a 0). Estado: vector de tamaños (normalizado, sin ceros y
|
|
121
|
+
* ordenado descendente para que el caché sea efectivo entre simetrías).
|
|
122
|
+
*/
|
|
123
|
+
function nim(piles) {
|
|
124
|
+
if (piles.some((p) => p < 0 || !Number.isInteger(p))) {
|
|
125
|
+
throw new Error('nim: cada pila debe ser entero ≥ 0');
|
|
126
|
+
}
|
|
127
|
+
const canon = (s) => s.filter((x) => x > 0).sort((a, b) => b - a);
|
|
128
|
+
const initial = canon(piles);
|
|
129
|
+
return {
|
|
130
|
+
initial,
|
|
131
|
+
isTerminal: (s) => s.length === 0,
|
|
132
|
+
moves: (s) => {
|
|
133
|
+
const out = [];
|
|
134
|
+
for (let i = 0; i < s.length; i += 1) {
|
|
135
|
+
const v = s[i];
|
|
136
|
+
for (let take = 1; take <= v; take += 1) {
|
|
137
|
+
const next = s.slice();
|
|
138
|
+
next[i] = v - take;
|
|
139
|
+
out.push(canon(next));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
},
|
|
144
|
+
key: (s) => s.join(','),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Nim 1D: una sola pila de `stones` piedras; sacar 1..stones. Equivale
|
|
149
|
+
* a `nim([stones])` pero con estado más compacto (un número).
|
|
150
|
+
*/
|
|
151
|
+
function nim1d(stones) {
|
|
152
|
+
if (!Number.isInteger(stones) || stones < 0) {
|
|
153
|
+
throw new Error('nim1d: stones debe ser entero ≥ 0');
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
initial: stones,
|
|
157
|
+
isTerminal: (s) => s === 0,
|
|
158
|
+
moves: (s) => {
|
|
159
|
+
const out = [];
|
|
160
|
+
for (let take = 1; take <= s; take += 1)
|
|
161
|
+
out.push(s - take);
|
|
162
|
+
return out;
|
|
163
|
+
},
|
|
164
|
+
key: (s) => String(s),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Chomp: tablero rows×cols de "chocolate". Cada movida elige una casilla
|
|
169
|
+
* viva (true) y "muerde" todo el rectángulo abajo-derecha desde ella. La
|
|
170
|
+
* casilla (0,0) es veneno: quien la come pierde (convención misère
|
|
171
|
+
* implementada como: estado terminal cuando solo queda (0,0)).
|
|
172
|
+
*
|
|
173
|
+
* Estado: matriz booleana rows×cols con true = casilla viva.
|
|
174
|
+
*
|
|
175
|
+
* Nota: Chomp tiene posición ganadora conocida para el primer jugador
|
|
176
|
+
* en todo tablero ≥ 2×2 (argumento de robo de estrategia), pero la
|
|
177
|
+
* estrategia explícita es desconocida en general. Para 1×1 (sólo el
|
|
178
|
+
* veneno) el jugador a mover pierde, así que grundy = 0.
|
|
179
|
+
*/
|
|
180
|
+
function chompGame(rows, cols) {
|
|
181
|
+
if (!Number.isInteger(rows) || !Number.isInteger(cols) || rows < 1 || cols < 1) {
|
|
182
|
+
throw new Error('chompGame: rows y cols deben ser enteros ≥ 1');
|
|
183
|
+
}
|
|
184
|
+
const buildInitial = () => {
|
|
185
|
+
const m = [];
|
|
186
|
+
for (let r = 0; r < rows; r += 1) {
|
|
187
|
+
const row = [];
|
|
188
|
+
for (let c = 0; c < cols; c += 1)
|
|
189
|
+
row.push(true);
|
|
190
|
+
m.push(row);
|
|
191
|
+
}
|
|
192
|
+
return m;
|
|
193
|
+
};
|
|
194
|
+
const isTerminal = (s) => {
|
|
195
|
+
// Terminal: sólo queda la casilla (0,0) viva (el veneno). El jugador
|
|
196
|
+
// a mover está obligado a comerla y pierde.
|
|
197
|
+
if (!s[0][0])
|
|
198
|
+
return true; // ya consumida (degenerate)
|
|
199
|
+
for (let r = 0; r < s.length; r += 1) {
|
|
200
|
+
const row = s[r];
|
|
201
|
+
for (let c = 0; c < row.length; c += 1) {
|
|
202
|
+
if (row[c] && !(r === 0 && c === 0))
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
};
|
|
208
|
+
return {
|
|
209
|
+
initial: buildInitial(),
|
|
210
|
+
isTerminal,
|
|
211
|
+
moves: (s) => {
|
|
212
|
+
const out = [];
|
|
213
|
+
const R = s.length;
|
|
214
|
+
const C = s[0].length;
|
|
215
|
+
for (let r = 0; r < R; r += 1) {
|
|
216
|
+
for (let c = 0; c < C; c += 1) {
|
|
217
|
+
if (!s[r][c])
|
|
218
|
+
continue;
|
|
219
|
+
if (r === 0 && c === 0 && !isTerminal(s)) {
|
|
220
|
+
// Comer el veneno es legal sólo si es la única opción (terminal).
|
|
221
|
+
// No lo ofrecemos como movida si hay otras casillas.
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// Comer (r,c) elimina toda casilla (r', c') con r' ≥ r y c' ≥ c.
|
|
225
|
+
const next = s.map((row) => row.slice());
|
|
226
|
+
for (let r2 = r; r2 < R; r2 += 1) {
|
|
227
|
+
for (let c2 = c; c2 < C; c2 += 1) {
|
|
228
|
+
next[r2][c2] = false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
out.push(next);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return out;
|
|
235
|
+
},
|
|
236
|
+
key: (s) => s.map((row) => row.map((b) => (b ? '1' : '0')).join('')).join('/'),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function makeSurreal(left, right) {
|
|
240
|
+
return { left, right };
|
|
241
|
+
}
|
|
242
|
+
/** 0 = { | } — sin opciones para ninguno; "second player wins". */
|
|
243
|
+
exports.ZERO = makeSurreal([], []);
|
|
244
|
+
/** 1 = { 0 | }. */
|
|
245
|
+
exports.ONE = makeSurreal([exports.ZERO], []);
|
|
246
|
+
/** -1 = { | 0 }. */
|
|
247
|
+
exports.MINUS_ONE = makeSurreal([], [exports.ZERO]);
|
|
248
|
+
/** * (star) = { 0 | 0 } — primer jugador gana, no comparable a 0 (fuzzy). */
|
|
249
|
+
exports.STAR = makeSurreal([exports.ZERO], [exports.ZERO]);
|
|
250
|
+
/**
|
|
251
|
+
* Construye el surreal correspondiente al entero `n`.
|
|
252
|
+
* 0 = { | }
|
|
253
|
+
* n = { n-1 | } (n > 0)
|
|
254
|
+
* -n = { | -(n-1) } (n < 0)
|
|
255
|
+
*/
|
|
256
|
+
function fromInt(n) {
|
|
257
|
+
if (!Number.isInteger(n))
|
|
258
|
+
throw new Error('fromInt: requiere entero');
|
|
259
|
+
if (n === 0)
|
|
260
|
+
return exports.ZERO;
|
|
261
|
+
if (n > 0)
|
|
262
|
+
return makeSurreal([fromInt(n - 1)], []);
|
|
263
|
+
return makeSurreal([], [fromInt(n + 1)]);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Negación: -G = { -GR | -GL }.
|
|
267
|
+
*/
|
|
268
|
+
function negate(s) {
|
|
269
|
+
return makeSurreal(s.right.map((r) => negate(r)), s.left.map((l) => negate(l)));
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Suma de juegos: G + H = { GL+H, G+HL | GR+H, G+HR }.
|
|
273
|
+
*/
|
|
274
|
+
function add(a, b) {
|
|
275
|
+
const left = [];
|
|
276
|
+
for (const al of a.left)
|
|
277
|
+
left.push(add(al, b));
|
|
278
|
+
for (const bl of b.left)
|
|
279
|
+
left.push(add(a, bl));
|
|
280
|
+
const right = [];
|
|
281
|
+
for (const ar of a.right)
|
|
282
|
+
right.push(add(ar, b));
|
|
283
|
+
for (const br of b.right)
|
|
284
|
+
right.push(add(a, br));
|
|
285
|
+
return makeSurreal(left, right);
|
|
286
|
+
}
|
|
287
|
+
// ── Comparación de surreales ────────────────────────────────
|
|
288
|
+
//
|
|
289
|
+
// Definición Conway:
|
|
290
|
+
// G ≤ H ⇔ ∀ GL. ¬(H ≤ GL) ∧ ∀ HR. ¬(HR ≤ G)
|
|
291
|
+
// Equivalentemente:
|
|
292
|
+
// G ≥ H ⇔ H ≤ G
|
|
293
|
+
// G || H (fuzzy/incomparable) ⇔ ¬(G ≤ H) ∧ ¬(H ≤ G)
|
|
294
|
+
//
|
|
295
|
+
// `compare(a, b)` devuelve -1 si a<b, 1 si a>b, 0 si a==b. Si son
|
|
296
|
+
// incomparables (fuzzy) lanza error explicito — usá `isFuzzy` antes o
|
|
297
|
+
// `leq`/`geq` directamente.
|
|
298
|
+
function leq(a, b) {
|
|
299
|
+
for (const al of a.left) {
|
|
300
|
+
if (leq(b, al))
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
for (const br of b.right) {
|
|
304
|
+
if (leq(br, a))
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
function compare(a, b) {
|
|
310
|
+
const ab = leq(a, b);
|
|
311
|
+
const ba = leq(b, a);
|
|
312
|
+
if (ab && ba)
|
|
313
|
+
return 0;
|
|
314
|
+
if (ab && !ba)
|
|
315
|
+
return -1;
|
|
316
|
+
if (!ab && ba)
|
|
317
|
+
return 1;
|
|
318
|
+
throw new Error('compare: surreales incomparables (fuzzy). Usá isFuzzy / leq / geq.');
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* G es fuzzy con 0 sii no satisface G ≤ 0 ni 0 ≤ G — es decir, el
|
|
322
|
+
* primer jugador gana. * es el ejemplo canónico.
|
|
323
|
+
*/
|
|
324
|
+
function isFuzzy(s) {
|
|
325
|
+
return !leq(s, exports.ZERO) && !leq(exports.ZERO, s);
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Simplificación parcial: elimina opciones dominadas en cada lado.
|
|
329
|
+
*
|
|
330
|
+
* En la lista Left, una opción L1 domina a L2 si L1 ≥ L2 (entonces
|
|
331
|
+
* L2 puede borrarse: el jugador Left preferirá L1).
|
|
332
|
+
* En la lista Right, una opción R1 domina a R2 si R1 ≤ R2.
|
|
333
|
+
*
|
|
334
|
+
* No hace eliminación reversible ("bypass") — eso podría requerirse
|
|
335
|
+
* para canonicalización completa Conway. Para nuestros tests es
|
|
336
|
+
* suficiente.
|
|
337
|
+
*/
|
|
338
|
+
function simplify(s) {
|
|
339
|
+
const simplifiedLeft = s.left.map((l) => simplify(l));
|
|
340
|
+
const simplifiedRight = s.right.map((r) => simplify(r));
|
|
341
|
+
// Dominancia Left: descartar L2 si existe L1 con L1 ≥ L2 (L1 ≠ L2).
|
|
342
|
+
const keptLeft = [];
|
|
343
|
+
for (let i = 0; i < simplifiedLeft.length; i += 1) {
|
|
344
|
+
const li = simplifiedLeft[i];
|
|
345
|
+
let dominated = false;
|
|
346
|
+
for (let j = 0; j < simplifiedLeft.length; j += 1) {
|
|
347
|
+
if (i === j)
|
|
348
|
+
continue;
|
|
349
|
+
const lj = simplifiedLeft[j];
|
|
350
|
+
if (leq(li, lj) && !leq(lj, li)) {
|
|
351
|
+
dominated = true;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (!dominated)
|
|
356
|
+
keptLeft.push(li);
|
|
357
|
+
}
|
|
358
|
+
// Dominancia Right: descartar R2 si existe R1 con R1 ≤ R2 (R1 ≠ R2).
|
|
359
|
+
const keptRight = [];
|
|
360
|
+
for (let i = 0; i < simplifiedRight.length; i += 1) {
|
|
361
|
+
const ri = simplifiedRight[i];
|
|
362
|
+
let dominated = false;
|
|
363
|
+
for (let j = 0; j < simplifiedRight.length; j += 1) {
|
|
364
|
+
if (i === j)
|
|
365
|
+
continue;
|
|
366
|
+
const rj = simplifiedRight[j];
|
|
367
|
+
if (leq(rj, ri) && !leq(ri, rj)) {
|
|
368
|
+
dominated = true;
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (!dominated)
|
|
373
|
+
keptRight.push(ri);
|
|
374
|
+
}
|
|
375
|
+
return makeSurreal(keptLeft, keptRight);
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reasoning/combinatorial-games/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export interface DPMechanism<T> {
|
|
2
|
+
epsilon: number;
|
|
3
|
+
delta: number;
|
|
4
|
+
sensitivity: number;
|
|
5
|
+
apply(input: T): T | number;
|
|
6
|
+
}
|
|
7
|
+
export interface DPRng {
|
|
8
|
+
uniform(): number;
|
|
9
|
+
laplace(b: number): number;
|
|
10
|
+
gaussian(mu: number, sigma: number): number;
|
|
11
|
+
}
|
|
12
|
+
export declare function makeDPRng(seed?: number): DPRng;
|
|
13
|
+
/**
|
|
14
|
+
* Mecanismo de Laplace: agrega ruido Laplace(0, Δ/ε) a `value`.
|
|
15
|
+
* Da ε-DP puro (δ = 0) cuando Δ es la sensibilidad L1 de la query.
|
|
16
|
+
*/
|
|
17
|
+
export declare function laplaceNoise(value: number, sensitivity: number, epsilon: number, rng?: DPRng): number;
|
|
18
|
+
/**
|
|
19
|
+
* Mecanismo Gaussian: agrega N(0, σ²) con σ = Δ·√(2 ln(1.25/δ))/ε,
|
|
20
|
+
* la calibración estándar de Dwork-Roth (Algorithmic Foundations,
|
|
21
|
+
* Theorem A.1). Garantiza (ε,δ)-DP para ε ∈ (0, 1] cuando Δ es la
|
|
22
|
+
* sensibilidad L2. Para ε > 1 la cota sigue siendo válida pero deja
|
|
23
|
+
* de ser tight; los frameworks modernos prefieren la "analytic
|
|
24
|
+
* Gaussian" (Balle-Wang 2018) — la dejamos para una iteración futura.
|
|
25
|
+
*/
|
|
26
|
+
export declare function gaussianNoise(value: number, sensitivity: number, epsilon: number, delta: number, rng?: DPRng): number;
|
|
27
|
+
/**
|
|
28
|
+
* Mecanismo exponencial: elige un item con probabilidad proporcional
|
|
29
|
+
* a exp(ε · score(item) / (2 · sensitivity)). Implementa la
|
|
30
|
+
* formulación canónica (McSherry-Talwar 2007). Da ε-DP cuando
|
|
31
|
+
* `sensitivity` es la sensibilidad de la función de score.
|
|
32
|
+
*/
|
|
33
|
+
export declare function exponentialMechanism<T>(items: T[], score: (item: T) => number, sensitivity: number, epsilon: number, rng?: DPRng): T;
|
|
34
|
+
/**
|
|
35
|
+
* Randomized response binario: reporta `bit` con probabilidad `p`,
|
|
36
|
+
* y `¬bit` con probabilidad 1 − p. Garantiza ε-DP local con
|
|
37
|
+
* ε = |ln(p / (1 − p))|. La elección clásica p = 3/4 da ε = ln 3.
|
|
38
|
+
*/
|
|
39
|
+
export declare function randomizedResponse(bit: boolean, p: number, rng?: DPRng): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* ε equivalente a un mecanismo de randomized response con
|
|
42
|
+
* probabilidad de verdad `p`. Útil para test del trade-off.
|
|
43
|
+
*/
|
|
44
|
+
export declare function randomizedResponseEpsilon(p: number): number;
|
|
45
|
+
/**
|
|
46
|
+
* Conteo DP: cuenta cuántos valores cumplen `predicate` y aplica
|
|
47
|
+
* ruido Laplace con sensibilidad 1 (cambiar un registro mueve el
|
|
48
|
+
* conteo en a lo más 1). El resultado se redondea al entero más
|
|
49
|
+
* cercano y se clamp-a a ≥ 0 (un conteo nunca es negativo).
|
|
50
|
+
*/
|
|
51
|
+
export declare function dpCount<T>(values: T[], predicate: (v: T) => boolean, epsilon: number, rng?: DPRng): number;
|
|
52
|
+
/**
|
|
53
|
+
* Media DP de valores acotados al rango [low, high]: clipea cada
|
|
54
|
+
* valor al rango, calcula la media empírica y aplica Laplace con
|
|
55
|
+
* sensibilidad (high − low) / n. Asumimos n público.
|
|
56
|
+
*/
|
|
57
|
+
export declare function dpMean(values: number[], range: [number, number], epsilon: number, rng?: DPRng): number;
|
|
58
|
+
/**
|
|
59
|
+
* Histograma DP sobre `categories`: cuenta ocurrencias por categoría
|
|
60
|
+
* y agrega ruido Laplace independiente a cada bin con sensibilidad 1.
|
|
61
|
+
* Asumimos que cada registro pertenece a a lo más una categoría
|
|
62
|
+
* (cambiar un registro mueve a lo más un bin en ±1). Si las
|
|
63
|
+
* categorías son disjuntas y cubrentes, este es un caso clásico de
|
|
64
|
+
* composición paralela: el ε total = ε.
|
|
65
|
+
*/
|
|
66
|
+
export declare function dpHistogram<T>(values: T[], categories: T[], epsilon: number, rng?: DPRng): Map<T, number>;
|
|
67
|
+
export interface PrivacyBudget {
|
|
68
|
+
epsilon: number;
|
|
69
|
+
delta: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Composición básica (Dwork-McSherry-Nissim-Smith 2006, Theorem 3.16
|
|
73
|
+
* en Algorithmic Foundations): la composición secuencial de k
|
|
74
|
+
* mecanismos (ε_i, δ_i)-DP da (Σ ε_i, Σ δ_i)-DP. Cota uniforme y
|
|
75
|
+
* conservadora.
|
|
76
|
+
*/
|
|
77
|
+
export declare function basicComposition(mechanisms: PrivacyBudget[]): PrivacyBudget;
|
|
78
|
+
/**
|
|
79
|
+
* Composición avanzada (Dwork-Rothblum-Vadhan 2010, Theorem III.3):
|
|
80
|
+
* para k mecanismos cada uno (ε, δ)-DP, el compuesto es
|
|
81
|
+
*
|
|
82
|
+
* (√(2 k ln(1/δ')) · ε + k · ε · (e^ε − 1), k δ + δ')-DP
|
|
83
|
+
*
|
|
84
|
+
* para cualquier δ' > 0. Cuando los ε_i son heterogéneos usamos el
|
|
85
|
+
* máximo como cota uniforme (válida pero no óptima; el tight bound
|
|
86
|
+
* heterogéneo requiere RDP/zCDP, fuera del alcance de este módulo).
|
|
87
|
+
*
|
|
88
|
+
* `deltaTotal` es el δ' adicional que el caller acepta pagar.
|
|
89
|
+
* Devuelve el (ε,δ) total cubriendo el slack δ'.
|
|
90
|
+
*/
|
|
91
|
+
export declare function advancedComposition(mechanisms: PrivacyBudget[], deltaTotal: number): PrivacyBudget;
|
|
92
|
+
/**
|
|
93
|
+
* Composición paralela: cuando k mecanismos actúan sobre particiones
|
|
94
|
+
* disjuntas del dataset, el ε total es el máximo (no la suma), y el
|
|
95
|
+
* δ total es el máximo (no la suma). Caso clásico: histograma con
|
|
96
|
+
* categorías mutuamente excluyentes.
|
|
97
|
+
*/
|
|
98
|
+
export declare function parallelComposition(mechanisms: PrivacyBudget[]): PrivacyBudget;
|
|
99
|
+
/**
|
|
100
|
+
* Sensibilidad global L1: el máximo de |f(D) − f(D')| sobre la
|
|
101
|
+
* lista de pares neighbours suministrada. Implementación empírica
|
|
102
|
+
* pensada para tests/diagnóstico — la sensibilidad real exige
|
|
103
|
+
* razonar sobre todas las parejas válidas, no sólo las muestreadas.
|
|
104
|
+
*/
|
|
105
|
+
export declare function globalSensitivityL1(fn: (data: number[]) => number, neighbors: Array<[number[], number[]]>): number;
|
|
106
|
+
/**
|
|
107
|
+
* Sensibilidad suave (Nissim-Raskhodnikova-Smith 2007):
|
|
108
|
+
*
|
|
109
|
+
* S*_β(f, D) = max_k e^{−β·k} · LS^{(k)}(f, D)
|
|
110
|
+
*
|
|
111
|
+
* donde LS^{(k)} es la sensibilidad local a distancia k. Aproximamos
|
|
112
|
+
* variando vecinos hasta `data.length` (cota superior de k). Para
|
|
113
|
+
* datasets grandes, restringir el k máximo via la longitud del
|
|
114
|
+
* propio dataset.
|
|
115
|
+
*
|
|
116
|
+
* Esta es una versión basada en mutaciones simples (cambiar un valor
|
|
117
|
+
* por el mín o máx empírico) — suficiente para median/mean acotados
|
|
118
|
+
* en tests, no un cálculo general.
|
|
119
|
+
*/
|
|
120
|
+
export declare function smoothSensitivity(fn: (data: number[]) => number, data: number[], beta: number): number;
|
|
121
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reasoning/differential-privacy/index.ts"],"names":[],"mappings":"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"}
|