@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,417 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// ST Differential Privacy — Primitivas y composición
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Mecanismos básicos (ε,δ)-DP con composición:
|
|
7
|
+
//
|
|
8
|
+
// • Mecanismos de ruido: Laplace, Gaussian.
|
|
9
|
+
// • Mecanismo exponencial (selección bajo utility).
|
|
10
|
+
// • Randomized response (privacidad local).
|
|
11
|
+
// • Queries derivadas: count, mean, histogram.
|
|
12
|
+
// • Composición: básica, avanzada (Dwork-Rothblum-Vadhan),
|
|
13
|
+
// paralela (queries sobre dominios disjuntos).
|
|
14
|
+
// • Sensitivity calculators: global L1 y smooth (Nissim-Raskhodnikova-Smith).
|
|
15
|
+
// • PRNG inyectable y determinista por seed para tests.
|
|
16
|
+
//
|
|
17
|
+
// Convenciones de borde:
|
|
18
|
+
// • ε > 0 y δ ∈ [0, 1). Para δ > 0 usamos (ε,δ)-DP; el mecanismo
|
|
19
|
+
// Gaussian exige δ > 0 (ruido subgaussiano no da δ = 0).
|
|
20
|
+
// • La sensibilidad es L1 para Laplace, L2 para Gaussian.
|
|
21
|
+
// • randomized response: bit ∈ {0,1}, con probabilidad p de
|
|
22
|
+
// reportar la verdad y 1−p de flipear → ε = ln(p/(1−p)).
|
|
23
|
+
// • Composición básica es uniforme y conservadora; la avanzada
|
|
24
|
+
// usa la cota de Dwork-Rothblum-Vadhan (Theorem III.3, 2010)
|
|
25
|
+
// y sólo mejora cuando k es razonablemente grande.
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.makeDPRng = makeDPRng;
|
|
28
|
+
exports.laplaceNoise = laplaceNoise;
|
|
29
|
+
exports.gaussianNoise = gaussianNoise;
|
|
30
|
+
exports.exponentialMechanism = exponentialMechanism;
|
|
31
|
+
exports.randomizedResponse = randomizedResponse;
|
|
32
|
+
exports.randomizedResponseEpsilon = randomizedResponseEpsilon;
|
|
33
|
+
exports.dpCount = dpCount;
|
|
34
|
+
exports.dpMean = dpMean;
|
|
35
|
+
exports.dpHistogram = dpHistogram;
|
|
36
|
+
exports.basicComposition = basicComposition;
|
|
37
|
+
exports.advancedComposition = advancedComposition;
|
|
38
|
+
exports.parallelComposition = parallelComposition;
|
|
39
|
+
exports.globalSensitivityL1 = globalSensitivityL1;
|
|
40
|
+
exports.smoothSensitivity = smoothSensitivity;
|
|
41
|
+
// Mulberry32 — PRNG de 32 bits, sencillo y determinista, suficiente
|
|
42
|
+
// para tests reproducibles. NO criptográfico: nunca usar para
|
|
43
|
+
// despliegues reales de DP.
|
|
44
|
+
function mulberry32(seed) {
|
|
45
|
+
let a = seed | 0;
|
|
46
|
+
return () => {
|
|
47
|
+
a = (a + 0x6d2b79f5) | 0;
|
|
48
|
+
let t = a;
|
|
49
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
50
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
51
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Construye un DPRng a partir de un seed (default: Math.random como
|
|
55
|
+
// arranque, equivalente a no-determinista). Para reproducibilidad
|
|
56
|
+
// pasar siempre un seed entero.
|
|
57
|
+
function makeDPRng(seed) {
|
|
58
|
+
const u = seed === undefined ? Math.random : mulberry32(seed >>> 0);
|
|
59
|
+
return {
|
|
60
|
+
uniform: () => u(),
|
|
61
|
+
laplace: (b) => {
|
|
62
|
+
// Inverse-CDF: si U ~ Uniform(-1/2, 1/2), entonces
|
|
63
|
+
// X = -b · sign(U) · ln(1 − 2|U|) ~ Laplace(0, b).
|
|
64
|
+
const r = u() - 0.5;
|
|
65
|
+
const sign = r < 0 ? -1 : 1;
|
|
66
|
+
// Clamp para evitar log(0). El factor 1 − 2|U| ∈ (0, 1].
|
|
67
|
+
const x = 1 - 2 * Math.abs(r);
|
|
68
|
+
return -b * sign * Math.log(x === 0 ? Number.MIN_VALUE : x);
|
|
69
|
+
},
|
|
70
|
+
gaussian: (mu, sigma) => {
|
|
71
|
+
// Box-Muller con dos uniformes independientes.
|
|
72
|
+
let u1 = u();
|
|
73
|
+
// Evitar log(0).
|
|
74
|
+
if (u1 === 0)
|
|
75
|
+
u1 = Number.MIN_VALUE;
|
|
76
|
+
const u2 = u();
|
|
77
|
+
const r = Math.sqrt(-2 * Math.log(u1));
|
|
78
|
+
const theta = 2 * Math.PI * u2;
|
|
79
|
+
return mu + sigma * r * Math.cos(theta);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// RNG por defecto (no determinista) reutilizado por todas las funciones
|
|
84
|
+
// públicas que no reciben un rng explícito.
|
|
85
|
+
const DEFAULT_RNG = makeDPRng();
|
|
86
|
+
// ------------------------------------------------------------
|
|
87
|
+
// Validación de parámetros
|
|
88
|
+
// ------------------------------------------------------------
|
|
89
|
+
function assertEpsilon(epsilon) {
|
|
90
|
+
if (!Number.isFinite(epsilon) || epsilon <= 0) {
|
|
91
|
+
throw new Error(`differential-privacy: epsilon debe ser finito y > 0 (got ${epsilon})`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function assertDelta(delta) {
|
|
95
|
+
if (!Number.isFinite(delta) || delta < 0 || delta >= 1) {
|
|
96
|
+
throw new Error(`differential-privacy: delta debe estar en [0, 1) (got ${delta})`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function assertSensitivity(sensitivity) {
|
|
100
|
+
if (!Number.isFinite(sensitivity) || sensitivity < 0) {
|
|
101
|
+
throw new Error(`differential-privacy: sensitivity debe ser finita y ≥ 0 (got ${sensitivity})`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// ------------------------------------------------------------
|
|
105
|
+
// Mecanismos de ruido
|
|
106
|
+
// ------------------------------------------------------------
|
|
107
|
+
/**
|
|
108
|
+
* Mecanismo de Laplace: agrega ruido Laplace(0, Δ/ε) a `value`.
|
|
109
|
+
* Da ε-DP puro (δ = 0) cuando Δ es la sensibilidad L1 de la query.
|
|
110
|
+
*/
|
|
111
|
+
function laplaceNoise(value, sensitivity, epsilon, rng = DEFAULT_RNG) {
|
|
112
|
+
assertEpsilon(epsilon);
|
|
113
|
+
assertSensitivity(sensitivity);
|
|
114
|
+
if (sensitivity === 0)
|
|
115
|
+
return value;
|
|
116
|
+
const b = sensitivity / epsilon;
|
|
117
|
+
return value + rng.laplace(b);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Mecanismo Gaussian: agrega N(0, σ²) con σ = Δ·√(2 ln(1.25/δ))/ε,
|
|
121
|
+
* la calibración estándar de Dwork-Roth (Algorithmic Foundations,
|
|
122
|
+
* Theorem A.1). Garantiza (ε,δ)-DP para ε ∈ (0, 1] cuando Δ es la
|
|
123
|
+
* sensibilidad L2. Para ε > 1 la cota sigue siendo válida pero deja
|
|
124
|
+
* de ser tight; los frameworks modernos prefieren la "analytic
|
|
125
|
+
* Gaussian" (Balle-Wang 2018) — la dejamos para una iteración futura.
|
|
126
|
+
*/
|
|
127
|
+
function gaussianNoise(value, sensitivity, epsilon, delta, rng = DEFAULT_RNG) {
|
|
128
|
+
assertEpsilon(epsilon);
|
|
129
|
+
assertDelta(delta);
|
|
130
|
+
assertSensitivity(sensitivity);
|
|
131
|
+
if (delta === 0) {
|
|
132
|
+
throw new Error('gaussianNoise: requiere delta > 0 (ε,δ)-DP');
|
|
133
|
+
}
|
|
134
|
+
if (sensitivity === 0)
|
|
135
|
+
return value;
|
|
136
|
+
const sigma = (sensitivity * Math.sqrt(2 * Math.log(1.25 / delta))) / epsilon;
|
|
137
|
+
return value + rng.gaussian(0, sigma);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Mecanismo exponencial: elige un item con probabilidad proporcional
|
|
141
|
+
* a exp(ε · score(item) / (2 · sensitivity)). Implementa la
|
|
142
|
+
* formulación canónica (McSherry-Talwar 2007). Da ε-DP cuando
|
|
143
|
+
* `sensitivity` es la sensibilidad de la función de score.
|
|
144
|
+
*/
|
|
145
|
+
function exponentialMechanism(items, score, sensitivity, epsilon, rng = DEFAULT_RNG) {
|
|
146
|
+
assertEpsilon(epsilon);
|
|
147
|
+
assertSensitivity(sensitivity);
|
|
148
|
+
if (items.length === 0) {
|
|
149
|
+
throw new Error('exponentialMechanism: items vacío');
|
|
150
|
+
}
|
|
151
|
+
if (sensitivity === 0) {
|
|
152
|
+
// Determinista: máximo argmax estricto.
|
|
153
|
+
let best = items[0];
|
|
154
|
+
let bestScore = score(best);
|
|
155
|
+
for (let i = 1; i < items.length; i++) {
|
|
156
|
+
const cand = items[i];
|
|
157
|
+
const s = score(cand);
|
|
158
|
+
if (s > bestScore) {
|
|
159
|
+
bestScore = s;
|
|
160
|
+
best = cand;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return best;
|
|
164
|
+
}
|
|
165
|
+
const scores = items.map((it) => score(it));
|
|
166
|
+
// Estabilización numérica: restar el máximo antes de exponenciar.
|
|
167
|
+
let maxScore = -Infinity;
|
|
168
|
+
for (const s of scores) {
|
|
169
|
+
if (s > maxScore)
|
|
170
|
+
maxScore = s;
|
|
171
|
+
}
|
|
172
|
+
const weights = scores.map((s) => Math.exp((epsilon * (s - maxScore)) / (2 * sensitivity)));
|
|
173
|
+
let total = 0;
|
|
174
|
+
for (const w of weights)
|
|
175
|
+
total += w;
|
|
176
|
+
if (!Number.isFinite(total) || total <= 0) {
|
|
177
|
+
throw new Error('exponentialMechanism: pesos no normalizables');
|
|
178
|
+
}
|
|
179
|
+
const u = rng.uniform() * total;
|
|
180
|
+
let acc = 0;
|
|
181
|
+
for (let i = 0; i < items.length; i++) {
|
|
182
|
+
acc += weights[i];
|
|
183
|
+
if (u < acc)
|
|
184
|
+
return items[i];
|
|
185
|
+
}
|
|
186
|
+
return items[items.length - 1];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Randomized response binario: reporta `bit` con probabilidad `p`,
|
|
190
|
+
* y `¬bit` con probabilidad 1 − p. Garantiza ε-DP local con
|
|
191
|
+
* ε = |ln(p / (1 − p))|. La elección clásica p = 3/4 da ε = ln 3.
|
|
192
|
+
*/
|
|
193
|
+
function randomizedResponse(bit, p, rng = DEFAULT_RNG) {
|
|
194
|
+
if (!Number.isFinite(p) || p <= 0 || p >= 1) {
|
|
195
|
+
throw new Error(`randomizedResponse: p debe estar en (0, 1) (got ${p})`);
|
|
196
|
+
}
|
|
197
|
+
return rng.uniform() < p ? bit : !bit;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* ε equivalente a un mecanismo de randomized response con
|
|
201
|
+
* probabilidad de verdad `p`. Útil para test del trade-off.
|
|
202
|
+
*/
|
|
203
|
+
function randomizedResponseEpsilon(p) {
|
|
204
|
+
if (!Number.isFinite(p) || p <= 0 || p >= 1) {
|
|
205
|
+
throw new Error(`randomizedResponseEpsilon: p debe estar en (0, 1) (got ${p})`);
|
|
206
|
+
}
|
|
207
|
+
return Math.abs(Math.log(p / (1 - p)));
|
|
208
|
+
}
|
|
209
|
+
// ------------------------------------------------------------
|
|
210
|
+
// Queries derivadas
|
|
211
|
+
// ------------------------------------------------------------
|
|
212
|
+
/**
|
|
213
|
+
* Conteo DP: cuenta cuántos valores cumplen `predicate` y aplica
|
|
214
|
+
* ruido Laplace con sensibilidad 1 (cambiar un registro mueve el
|
|
215
|
+
* conteo en a lo más 1). El resultado se redondea al entero más
|
|
216
|
+
* cercano y se clamp-a a ≥ 0 (un conteo nunca es negativo).
|
|
217
|
+
*/
|
|
218
|
+
function dpCount(values, predicate, epsilon, rng = DEFAULT_RNG) {
|
|
219
|
+
assertEpsilon(epsilon);
|
|
220
|
+
let count = 0;
|
|
221
|
+
for (const v of values) {
|
|
222
|
+
if (predicate(v))
|
|
223
|
+
count++;
|
|
224
|
+
}
|
|
225
|
+
const noisy = laplaceNoise(count, 1, epsilon, rng);
|
|
226
|
+
return Math.max(0, Math.round(noisy));
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Media DP de valores acotados al rango [low, high]: clipea cada
|
|
230
|
+
* valor al rango, calcula la media empírica y aplica Laplace con
|
|
231
|
+
* sensibilidad (high − low) / n. Asumimos n público.
|
|
232
|
+
*/
|
|
233
|
+
function dpMean(values, range, epsilon, rng = DEFAULT_RNG) {
|
|
234
|
+
assertEpsilon(epsilon);
|
|
235
|
+
const [low, high] = range;
|
|
236
|
+
if (!Number.isFinite(low) || !Number.isFinite(high) || high <= low) {
|
|
237
|
+
throw new Error(`dpMean: rango inválido [${low}, ${high}]`);
|
|
238
|
+
}
|
|
239
|
+
if (values.length === 0) {
|
|
240
|
+
throw new Error('dpMean: values vacío');
|
|
241
|
+
}
|
|
242
|
+
const n = values.length;
|
|
243
|
+
let sum = 0;
|
|
244
|
+
for (const v of values) {
|
|
245
|
+
const clipped = v < low ? low : v > high ? high : v;
|
|
246
|
+
sum += clipped;
|
|
247
|
+
}
|
|
248
|
+
const mean = sum / n;
|
|
249
|
+
const sensitivity = (high - low) / n;
|
|
250
|
+
return laplaceNoise(mean, sensitivity, epsilon, rng);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Histograma DP sobre `categories`: cuenta ocurrencias por categoría
|
|
254
|
+
* y agrega ruido Laplace independiente a cada bin con sensibilidad 1.
|
|
255
|
+
* Asumimos que cada registro pertenece a a lo más una categoría
|
|
256
|
+
* (cambiar un registro mueve a lo más un bin en ±1). Si las
|
|
257
|
+
* categorías son disjuntas y cubrentes, este es un caso clásico de
|
|
258
|
+
* composición paralela: el ε total = ε.
|
|
259
|
+
*/
|
|
260
|
+
function dpHistogram(values, categories, epsilon, rng = DEFAULT_RNG) {
|
|
261
|
+
assertEpsilon(epsilon);
|
|
262
|
+
const counts = new Map();
|
|
263
|
+
for (const c of categories)
|
|
264
|
+
counts.set(c, 0);
|
|
265
|
+
for (const v of values) {
|
|
266
|
+
const cur = counts.get(v);
|
|
267
|
+
if (cur !== undefined)
|
|
268
|
+
counts.set(v, cur + 1);
|
|
269
|
+
}
|
|
270
|
+
const out = new Map();
|
|
271
|
+
for (const [cat, cnt] of counts) {
|
|
272
|
+
const noisy = laplaceNoise(cnt, 1, epsilon, rng);
|
|
273
|
+
out.set(cat, Math.max(0, Math.round(noisy)));
|
|
274
|
+
}
|
|
275
|
+
return out;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Composición básica (Dwork-McSherry-Nissim-Smith 2006, Theorem 3.16
|
|
279
|
+
* en Algorithmic Foundations): la composición secuencial de k
|
|
280
|
+
* mecanismos (ε_i, δ_i)-DP da (Σ ε_i, Σ δ_i)-DP. Cota uniforme y
|
|
281
|
+
* conservadora.
|
|
282
|
+
*/
|
|
283
|
+
function basicComposition(mechanisms) {
|
|
284
|
+
let epsilon = 0;
|
|
285
|
+
let delta = 0;
|
|
286
|
+
for (const m of mechanisms) {
|
|
287
|
+
assertEpsilon(m.epsilon);
|
|
288
|
+
assertDelta(m.delta);
|
|
289
|
+
epsilon += m.epsilon;
|
|
290
|
+
delta += m.delta;
|
|
291
|
+
}
|
|
292
|
+
return { epsilon, delta };
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Composición avanzada (Dwork-Rothblum-Vadhan 2010, Theorem III.3):
|
|
296
|
+
* para k mecanismos cada uno (ε, δ)-DP, el compuesto es
|
|
297
|
+
*
|
|
298
|
+
* (√(2 k ln(1/δ')) · ε + k · ε · (e^ε − 1), k δ + δ')-DP
|
|
299
|
+
*
|
|
300
|
+
* para cualquier δ' > 0. Cuando los ε_i son heterogéneos usamos el
|
|
301
|
+
* máximo como cota uniforme (válida pero no óptima; el tight bound
|
|
302
|
+
* heterogéneo requiere RDP/zCDP, fuera del alcance de este módulo).
|
|
303
|
+
*
|
|
304
|
+
* `deltaTotal` es el δ' adicional que el caller acepta pagar.
|
|
305
|
+
* Devuelve el (ε,δ) total cubriendo el slack δ'.
|
|
306
|
+
*/
|
|
307
|
+
function advancedComposition(mechanisms, deltaTotal) {
|
|
308
|
+
if (mechanisms.length === 0) {
|
|
309
|
+
return { epsilon: 0, delta: deltaTotal };
|
|
310
|
+
}
|
|
311
|
+
assertDelta(deltaTotal);
|
|
312
|
+
if (deltaTotal <= 0) {
|
|
313
|
+
throw new Error('advancedComposition: deltaTotal debe ser > 0');
|
|
314
|
+
}
|
|
315
|
+
let maxEps = 0;
|
|
316
|
+
let sumDelta = 0;
|
|
317
|
+
for (const m of mechanisms) {
|
|
318
|
+
assertEpsilon(m.epsilon);
|
|
319
|
+
assertDelta(m.delta);
|
|
320
|
+
if (m.epsilon > maxEps)
|
|
321
|
+
maxEps = m.epsilon;
|
|
322
|
+
sumDelta += m.delta;
|
|
323
|
+
}
|
|
324
|
+
const k = mechanisms.length;
|
|
325
|
+
const eps = maxEps;
|
|
326
|
+
const epsilonComposed = Math.sqrt(2 * k * Math.log(1 / deltaTotal)) * eps + k * eps * (Math.exp(eps) - 1);
|
|
327
|
+
return { epsilon: epsilonComposed, delta: sumDelta + deltaTotal };
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Composición paralela: cuando k mecanismos actúan sobre particiones
|
|
331
|
+
* disjuntas del dataset, el ε total es el máximo (no la suma), y el
|
|
332
|
+
* δ total es el máximo (no la suma). Caso clásico: histograma con
|
|
333
|
+
* categorías mutuamente excluyentes.
|
|
334
|
+
*/
|
|
335
|
+
function parallelComposition(mechanisms) {
|
|
336
|
+
let maxEps = 0;
|
|
337
|
+
let maxDelta = 0;
|
|
338
|
+
for (const m of mechanisms) {
|
|
339
|
+
assertEpsilon(m.epsilon);
|
|
340
|
+
assertDelta(m.delta);
|
|
341
|
+
if (m.epsilon > maxEps)
|
|
342
|
+
maxEps = m.epsilon;
|
|
343
|
+
if (m.delta > maxDelta)
|
|
344
|
+
maxDelta = m.delta;
|
|
345
|
+
}
|
|
346
|
+
return { epsilon: maxEps, delta: maxDelta };
|
|
347
|
+
}
|
|
348
|
+
// ------------------------------------------------------------
|
|
349
|
+
// Sensitivity calculators
|
|
350
|
+
// ------------------------------------------------------------
|
|
351
|
+
/**
|
|
352
|
+
* Sensibilidad global L1: el máximo de |f(D) − f(D')| sobre la
|
|
353
|
+
* lista de pares neighbours suministrada. Implementación empírica
|
|
354
|
+
* pensada para tests/diagnóstico — la sensibilidad real exige
|
|
355
|
+
* razonar sobre todas las parejas válidas, no sólo las muestreadas.
|
|
356
|
+
*/
|
|
357
|
+
function globalSensitivityL1(fn, neighbors) {
|
|
358
|
+
let max = 0;
|
|
359
|
+
for (const [a, b] of neighbors) {
|
|
360
|
+
const diff = Math.abs(fn(a) - fn(b));
|
|
361
|
+
if (diff > max)
|
|
362
|
+
max = diff;
|
|
363
|
+
}
|
|
364
|
+
return max;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Sensibilidad suave (Nissim-Raskhodnikova-Smith 2007):
|
|
368
|
+
*
|
|
369
|
+
* S*_β(f, D) = max_k e^{−β·k} · LS^{(k)}(f, D)
|
|
370
|
+
*
|
|
371
|
+
* donde LS^{(k)} es la sensibilidad local a distancia k. Aproximamos
|
|
372
|
+
* variando vecinos hasta `data.length` (cota superior de k). Para
|
|
373
|
+
* datasets grandes, restringir el k máximo via la longitud del
|
|
374
|
+
* propio dataset.
|
|
375
|
+
*
|
|
376
|
+
* Esta es una versión basada en mutaciones simples (cambiar un valor
|
|
377
|
+
* por el mín o máx empírico) — suficiente para median/mean acotados
|
|
378
|
+
* en tests, no un cálculo general.
|
|
379
|
+
*/
|
|
380
|
+
function smoothSensitivity(fn, data, beta) {
|
|
381
|
+
if (!Number.isFinite(beta) || beta <= 0) {
|
|
382
|
+
throw new Error(`smoothSensitivity: beta debe ser > 0 (got ${beta})`);
|
|
383
|
+
}
|
|
384
|
+
if (data.length === 0)
|
|
385
|
+
return 0;
|
|
386
|
+
// Determinar rango empírico para sintetizar vecinos extremos.
|
|
387
|
+
let lo = data[0];
|
|
388
|
+
let hi = data[0];
|
|
389
|
+
for (const v of data) {
|
|
390
|
+
if (v < lo)
|
|
391
|
+
lo = v;
|
|
392
|
+
if (v > hi)
|
|
393
|
+
hi = v;
|
|
394
|
+
}
|
|
395
|
+
const base = fn(data);
|
|
396
|
+
let max = 0;
|
|
397
|
+
// Para cada k = 0..n, calculamos LS^{(k)} aproximada cambiando los
|
|
398
|
+
// primeros k valores a `lo` o `hi` (el extremo que más mueve la query).
|
|
399
|
+
for (let k = 0; k <= data.length; k++) {
|
|
400
|
+
// Vecinos a distancia k: probar mutar k posiciones a lo o hi.
|
|
401
|
+
// Esto es heurístico — para mediana/media acotadas es exacto.
|
|
402
|
+
const mutLo = data.slice();
|
|
403
|
+
const mutHi = data.slice();
|
|
404
|
+
for (let i = 0; i < k; i++) {
|
|
405
|
+
mutLo[i] = lo;
|
|
406
|
+
mutHi[i] = hi;
|
|
407
|
+
}
|
|
408
|
+
const dLo = Math.abs(fn(mutLo) - base);
|
|
409
|
+
const dHi = Math.abs(fn(mutHi) - base);
|
|
410
|
+
const lsK = Math.max(dLo, dHi);
|
|
411
|
+
const smoothed = Math.exp(-beta * k) * lsK;
|
|
412
|
+
if (smoothed > max)
|
|
413
|
+
max = smoothed;
|
|
414
|
+
}
|
|
415
|
+
return max;
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reasoning/differential-privacy/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AuctionResult } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* First-price sealed-bid: el ganador paga su propio bid.
|
|
4
|
+
*
|
|
5
|
+
* No es strategy-proof — el bidder racional shadea su bid bajo su
|
|
6
|
+
* valuation. Pero la regla es lo más simple del mundo.
|
|
7
|
+
*/
|
|
8
|
+
export declare function firstPriceSealed(bids: Map<string, number>): AuctionResult;
|
|
9
|
+
/**
|
|
10
|
+
* Second-price sealed-bid (Vickrey): el ganador paga el segundo bid más
|
|
11
|
+
* alto. Es DSIC: bidding truthful es dominante.
|
|
12
|
+
*
|
|
13
|
+
* Si solo hay un bidder válido, paga 0 (no hay segundo precio). Esa es
|
|
14
|
+
* la convención estándar; en variantes con reserve, el reserve actúa
|
|
15
|
+
* como segundo precio si no hay otro bidder por encima.
|
|
16
|
+
*/
|
|
17
|
+
export declare function secondPriceSealed(bids: Map<string, number>): AuctionResult;
|
|
18
|
+
/**
|
|
19
|
+
* English ascending auction: simulamos un reloj que sube en pasos de
|
|
20
|
+
* `increment`. Cada bidder sigue activo mientras el precio no supere
|
|
21
|
+
* su valuation. Cuando solo queda 1 activo, termina y paga el precio
|
|
22
|
+
* actual.
|
|
23
|
+
*
|
|
24
|
+
* Bajo bidders racionales (cada uno dropea exactamente en su valuation),
|
|
25
|
+
* el resultado es equivalente a second-price (el ganador paga ~ segundo
|
|
26
|
+
* valor más alto, módulo `increment`).
|
|
27
|
+
*
|
|
28
|
+
* Implementación: en vez de simular reloj, calculamos directo:
|
|
29
|
+
* winner = bidder con max valuation
|
|
30
|
+
* payment = ceil(secondHighest / increment) * increment ≈ second + un step
|
|
31
|
+
*
|
|
32
|
+
* Para los tests usamos increment=1, lo que da payment ≈ second.
|
|
33
|
+
*/
|
|
34
|
+
export declare function englishAuction(bids: Map<string, number>, increment: number): AuctionResult;
|
|
35
|
+
/**
|
|
36
|
+
* Dutch descending auction: reloj baja desde `initialPrice` con pasos
|
|
37
|
+
* `decrement`. El primer bidder en aceptar (precio ≤ su valuation)
|
|
38
|
+
* gana y paga ese precio.
|
|
39
|
+
*
|
|
40
|
+
* Estratégicamente, Dutch ≡ first-price sealed: cada bidder elige a qué
|
|
41
|
+
* precio aceptar, equivalente a elegir su bid. Implementamos via
|
|
42
|
+
* simulación discreta.
|
|
43
|
+
*
|
|
44
|
+
* `bidders.get(id)` = valor máximo que el bidder está dispuesto a pagar
|
|
45
|
+
* (su bid efectivo en el equivalente sealed). El primero en alcanzar
|
|
46
|
+
* un precio ≤ a su bid gana.
|
|
47
|
+
*/
|
|
48
|
+
export declare function dutchAuction(initialPrice: number, bidders: Map<string, number>, decrement: number): AuctionResult;
|
|
49
|
+
//# sourceMappingURL=auctions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auctions.d.ts","sourceRoot":"","sources":["../../../src/reasoning/mechanism-design/auctions.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAmB7C;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAIzE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAsB1E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CAkC1F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,SAAS,EAAE,MAAM,GAChB,aAAa,CA6Bf"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Single-item auctions: first/second-price sealed, English, Dutch
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Convención: bids con valor <= 0 se ignoran (no participa). Si no hay
|
|
7
|
+
// bidders válidos, devolvemos { winner: '', payment: 0 }. Empates se
|
|
8
|
+
// rompen lexicográficamente por id (determinista, testeable).
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.firstPriceSealed = firstPriceSealed;
|
|
11
|
+
exports.secondPriceSealed = secondPriceSealed;
|
|
12
|
+
exports.englishAuction = englishAuction;
|
|
13
|
+
exports.dutchAuction = dutchAuction;
|
|
14
|
+
/** Tie-breaking determinista: max bid, ties por id ascendente. */
|
|
15
|
+
function pickWinner(bids) {
|
|
16
|
+
let winner = '';
|
|
17
|
+
let bestBid = -Infinity;
|
|
18
|
+
// Orden lexicográfico de ids para empates reproducibles.
|
|
19
|
+
const ids = [...bids.keys()].sort();
|
|
20
|
+
for (const id of ids) {
|
|
21
|
+
const b = bids.get(id) ?? 0;
|
|
22
|
+
if (b > bestBid) {
|
|
23
|
+
bestBid = b;
|
|
24
|
+
winner = id;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (bestBid <= 0 || winner === '')
|
|
28
|
+
return { winner: '', bid: 0 };
|
|
29
|
+
return { winner, bid: bestBid };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* First-price sealed-bid: el ganador paga su propio bid.
|
|
33
|
+
*
|
|
34
|
+
* No es strategy-proof — el bidder racional shadea su bid bajo su
|
|
35
|
+
* valuation. Pero la regla es lo más simple del mundo.
|
|
36
|
+
*/
|
|
37
|
+
function firstPriceSealed(bids) {
|
|
38
|
+
const { winner, bid } = pickWinner(bids);
|
|
39
|
+
if (winner === '')
|
|
40
|
+
return { winner: '', payment: 0 };
|
|
41
|
+
return { winner, payment: bid };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Second-price sealed-bid (Vickrey): el ganador paga el segundo bid más
|
|
45
|
+
* alto. Es DSIC: bidding truthful es dominante.
|
|
46
|
+
*
|
|
47
|
+
* Si solo hay un bidder válido, paga 0 (no hay segundo precio). Esa es
|
|
48
|
+
* la convención estándar; en variantes con reserve, el reserve actúa
|
|
49
|
+
* como segundo precio si no hay otro bidder por encima.
|
|
50
|
+
*/
|
|
51
|
+
function secondPriceSealed(bids) {
|
|
52
|
+
const ids = [...bids.keys()].sort();
|
|
53
|
+
if (ids.length === 0)
|
|
54
|
+
return { winner: '', payment: 0 };
|
|
55
|
+
// Localizamos el primero y segundo bid más alto.
|
|
56
|
+
let winner = '';
|
|
57
|
+
let first = -Infinity;
|
|
58
|
+
let second = 0;
|
|
59
|
+
for (const id of ids) {
|
|
60
|
+
const b = bids.get(id) ?? 0;
|
|
61
|
+
if (b > first) {
|
|
62
|
+
second = first === -Infinity ? 0 : first;
|
|
63
|
+
first = b;
|
|
64
|
+
winner = id;
|
|
65
|
+
}
|
|
66
|
+
else if (b > second) {
|
|
67
|
+
second = b;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (first <= 0 || winner === '')
|
|
71
|
+
return { winner: '', payment: 0 };
|
|
72
|
+
// Si no hubo "segundo" real (todos los otros 0 o ausentes), pagan 0.
|
|
73
|
+
if (second < 0)
|
|
74
|
+
second = 0;
|
|
75
|
+
return { winner, payment: second };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* English ascending auction: simulamos un reloj que sube en pasos de
|
|
79
|
+
* `increment`. Cada bidder sigue activo mientras el precio no supere
|
|
80
|
+
* su valuation. Cuando solo queda 1 activo, termina y paga el precio
|
|
81
|
+
* actual.
|
|
82
|
+
*
|
|
83
|
+
* Bajo bidders racionales (cada uno dropea exactamente en su valuation),
|
|
84
|
+
* el resultado es equivalente a second-price (el ganador paga ~ segundo
|
|
85
|
+
* valor más alto, módulo `increment`).
|
|
86
|
+
*
|
|
87
|
+
* Implementación: en vez de simular reloj, calculamos directo:
|
|
88
|
+
* winner = bidder con max valuation
|
|
89
|
+
* payment = ceil(secondHighest / increment) * increment ≈ second + un step
|
|
90
|
+
*
|
|
91
|
+
* Para los tests usamos increment=1, lo que da payment ≈ second.
|
|
92
|
+
*/
|
|
93
|
+
function englishAuction(bids, increment) {
|
|
94
|
+
if (increment <= 0)
|
|
95
|
+
throw new Error('English auction increment must be > 0');
|
|
96
|
+
const ids = [...bids.keys()].sort();
|
|
97
|
+
if (ids.length === 0)
|
|
98
|
+
return { winner: '', payment: 0 };
|
|
99
|
+
let winner = '';
|
|
100
|
+
let first = -Infinity;
|
|
101
|
+
let second = 0;
|
|
102
|
+
for (const id of ids) {
|
|
103
|
+
const b = bids.get(id) ?? 0;
|
|
104
|
+
if (b > first) {
|
|
105
|
+
second = first === -Infinity ? 0 : first;
|
|
106
|
+
first = b;
|
|
107
|
+
winner = id;
|
|
108
|
+
}
|
|
109
|
+
else if (b > second) {
|
|
110
|
+
second = b;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (first <= 0 || winner === '')
|
|
114
|
+
return { winner: '', payment: 0 };
|
|
115
|
+
if (second < 0)
|
|
116
|
+
second = 0;
|
|
117
|
+
// El reloj cruzó el step inmediatamente sobre `second`. Si second cae
|
|
118
|
+
// exactamente en un múltiplo de increment, el segundo bidder dropea
|
|
119
|
+
// justo y el ganador paga `second`. Si no, paga el siguiente step.
|
|
120
|
+
let payment;
|
|
121
|
+
const steps = Math.floor(second / increment);
|
|
122
|
+
const onGrid = Math.abs(second - steps * increment) < 1e-9;
|
|
123
|
+
if (onGrid) {
|
|
124
|
+
payment = second;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
payment = (steps + 1) * increment;
|
|
128
|
+
}
|
|
129
|
+
if (payment > first)
|
|
130
|
+
payment = first;
|
|
131
|
+
return { winner, payment };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Dutch descending auction: reloj baja desde `initialPrice` con pasos
|
|
135
|
+
* `decrement`. El primer bidder en aceptar (precio ≤ su valuation)
|
|
136
|
+
* gana y paga ese precio.
|
|
137
|
+
*
|
|
138
|
+
* Estratégicamente, Dutch ≡ first-price sealed: cada bidder elige a qué
|
|
139
|
+
* precio aceptar, equivalente a elegir su bid. Implementamos via
|
|
140
|
+
* simulación discreta.
|
|
141
|
+
*
|
|
142
|
+
* `bidders.get(id)` = valor máximo que el bidder está dispuesto a pagar
|
|
143
|
+
* (su bid efectivo en el equivalente sealed). El primero en alcanzar
|
|
144
|
+
* un precio ≤ a su bid gana.
|
|
145
|
+
*/
|
|
146
|
+
function dutchAuction(initialPrice, bidders, decrement) {
|
|
147
|
+
if (decrement <= 0)
|
|
148
|
+
throw new Error('Dutch auction decrement must be > 0');
|
|
149
|
+
if (initialPrice < 0)
|
|
150
|
+
throw new Error('Dutch auction initialPrice must be >= 0');
|
|
151
|
+
const ids = [...bidders.keys()].sort();
|
|
152
|
+
if (ids.length === 0)
|
|
153
|
+
return { winner: '', payment: 0 };
|
|
154
|
+
let price = initialPrice;
|
|
155
|
+
// Tolerancia para no caer en loops infinitos por floating-point.
|
|
156
|
+
const maxSteps = Math.ceil(initialPrice / decrement) + 1;
|
|
157
|
+
for (let step = 0; step <= maxSteps; step++) {
|
|
158
|
+
// Snapshot del precio actual; bidders elegibles = bid >= price.
|
|
159
|
+
let candidate = '';
|
|
160
|
+
let candidateBid = -Infinity;
|
|
161
|
+
for (const id of ids) {
|
|
162
|
+
const b = bidders.get(id) ?? 0;
|
|
163
|
+
if (b >= price - 1e-12 && b > candidateBid) {
|
|
164
|
+
candidateBid = b;
|
|
165
|
+
candidate = id;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (candidate !== '') {
|
|
169
|
+
// El primero en aceptar paga el precio actual (clamp a >= 0).
|
|
170
|
+
const payment = Math.max(0, price);
|
|
171
|
+
return { winner: candidate, payment };
|
|
172
|
+
}
|
|
173
|
+
price -= decrement;
|
|
174
|
+
if (price < 0)
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
return { winner: '', payment: 0 };
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=auctions.js.map
|