@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.
Files changed (285) hide show
  1. package/dist/logic/profiles/quantum/index.d.ts +153 -0
  2. package/dist/logic/profiles/quantum/index.d.ts.map +1 -0
  3. package/dist/logic/profiles/quantum/index.js +788 -0
  4. package/dist/logic/profiles/quantum/index.js.map +1 -0
  5. package/dist/namespaces/reasoning.d.ts +3 -1
  6. package/dist/namespaces/reasoning.d.ts.map +1 -1
  7. package/dist/namespaces/reasoning.js +5 -1
  8. package/dist/namespaces/reasoning.js.map +1 -1
  9. package/dist/proof-systems/certificate/canonical.d.ts +18 -0
  10. package/dist/proof-systems/certificate/canonical.d.ts.map +1 -0
  11. package/dist/proof-systems/certificate/canonical.js +79 -0
  12. package/dist/proof-systems/certificate/canonical.js.map +1 -0
  13. package/dist/proof-systems/certificate/generate.d.ts +39 -0
  14. package/dist/proof-systems/certificate/generate.d.ts.map +1 -0
  15. package/dist/proof-systems/certificate/generate.js +259 -0
  16. package/dist/proof-systems/certificate/generate.js.map +1 -0
  17. package/dist/proof-systems/certificate/index.d.ts +7 -0
  18. package/dist/proof-systems/certificate/index.d.ts.map +1 -0
  19. package/dist/proof-systems/certificate/index.js +23 -0
  20. package/dist/proof-systems/certificate/index.js.map +1 -0
  21. package/dist/proof-systems/certificate/lfsc.d.ts +15 -0
  22. package/dist/proof-systems/certificate/lfsc.d.ts.map +1 -0
  23. package/dist/proof-systems/certificate/lfsc.js +395 -0
  24. package/dist/proof-systems/certificate/lfsc.js.map +1 -0
  25. package/dist/proof-systems/certificate/rules.d.ts +8 -0
  26. package/dist/proof-systems/certificate/rules.d.ts.map +1 -0
  27. package/dist/proof-systems/certificate/rules.js +369 -0
  28. package/dist/proof-systems/certificate/rules.js.map +1 -0
  29. package/dist/proof-systems/certificate/types.d.ts +114 -0
  30. package/dist/proof-systems/certificate/types.d.ts.map +1 -0
  31. package/dist/proof-systems/certificate/types.js +18 -0
  32. package/dist/proof-systems/certificate/types.js.map +1 -0
  33. package/dist/proof-systems/certificate/verify.d.ts +20 -0
  34. package/dist/proof-systems/certificate/verify.d.ts.map +1 -0
  35. package/dist/proof-systems/certificate/verify.js +171 -0
  36. package/dist/proof-systems/certificate/verify.js.map +1 -0
  37. package/dist/reasoning/ban-logic/analyze.d.ts +31 -0
  38. package/dist/reasoning/ban-logic/analyze.d.ts.map +1 -0
  39. package/dist/reasoning/ban-logic/analyze.js +113 -0
  40. package/dist/reasoning/ban-logic/analyze.js.map +1 -0
  41. package/dist/reasoning/ban-logic/index.d.ts +7 -0
  42. package/dist/reasoning/ban-logic/index.d.ts.map +1 -0
  43. package/dist/reasoning/ban-logic/index.js +66 -0
  44. package/dist/reasoning/ban-logic/index.js.map +1 -0
  45. package/dist/reasoning/ban-logic/protocols.d.ts +54 -0
  46. package/dist/reasoning/ban-logic/protocols.d.ts.map +1 -0
  47. package/dist/reasoning/ban-logic/protocols.js +219 -0
  48. package/dist/reasoning/ban-logic/protocols.js.map +1 -0
  49. package/dist/reasoning/ban-logic/rules.d.ts +83 -0
  50. package/dist/reasoning/ban-logic/rules.d.ts.map +1 -0
  51. package/dist/reasoning/ban-logic/rules.js +409 -0
  52. package/dist/reasoning/ban-logic/rules.js.map +1 -0
  53. package/dist/reasoning/ban-logic/terms.d.ts +26 -0
  54. package/dist/reasoning/ban-logic/terms.d.ts.map +1 -0
  55. package/dist/reasoning/ban-logic/terms.js +262 -0
  56. package/dist/reasoning/ban-logic/terms.js.map +1 -0
  57. package/dist/reasoning/ban-logic/types.d.ts +107 -0
  58. package/dist/reasoning/ban-logic/types.d.ts.map +1 -0
  59. package/dist/reasoning/ban-logic/types.js +27 -0
  60. package/dist/reasoning/ban-logic/types.js.map +1 -0
  61. package/dist/reasoning/combinatorial-games/index.d.ts +105 -0
  62. package/dist/reasoning/combinatorial-games/index.d.ts.map +1 -0
  63. package/dist/reasoning/combinatorial-games/index.js +377 -0
  64. package/dist/reasoning/combinatorial-games/index.js.map +1 -0
  65. package/dist/reasoning/differential-privacy/index.d.ts +121 -0
  66. package/dist/reasoning/differential-privacy/index.d.ts.map +1 -0
  67. package/dist/reasoning/differential-privacy/index.js +417 -0
  68. package/dist/reasoning/differential-privacy/index.js.map +1 -0
  69. package/dist/reasoning/mechanism-design/auctions.d.ts +49 -0
  70. package/dist/reasoning/mechanism-design/auctions.d.ts.map +1 -0
  71. package/dist/reasoning/mechanism-design/auctions.js +179 -0
  72. package/dist/reasoning/mechanism-design/auctions.js.map +1 -0
  73. package/dist/reasoning/mechanism-design/index.d.ts +5 -0
  74. package/dist/reasoning/mechanism-design/index.d.ts.map +1 -0
  75. package/dist/reasoning/mechanism-design/index.js +39 -0
  76. package/dist/reasoning/mechanism-design/index.js.map +1 -0
  77. package/dist/reasoning/mechanism-design/myerson.d.ts +64 -0
  78. package/dist/reasoning/mechanism-design/myerson.d.ts.map +1 -0
  79. package/dist/reasoning/mechanism-design/myerson.js +253 -0
  80. package/dist/reasoning/mechanism-design/myerson.js.map +1 -0
  81. package/dist/reasoning/mechanism-design/types.d.ts +44 -0
  82. package/dist/reasoning/mechanism-design/types.d.ts.map +1 -0
  83. package/dist/reasoning/mechanism-design/types.js +22 -0
  84. package/dist/reasoning/mechanism-design/types.js.map +1 -0
  85. package/dist/reasoning/mechanism-design/vcg.d.ts +29 -0
  86. package/dist/reasoning/mechanism-design/vcg.d.ts.map +1 -0
  87. package/dist/reasoning/mechanism-design/vcg.js +305 -0
  88. package/dist/reasoning/mechanism-design/vcg.js.map +1 -0
  89. package/dist/reasoning/probabilistic/distributions.d.ts +44 -0
  90. package/dist/reasoning/probabilistic/distributions.d.ts.map +1 -0
  91. package/dist/reasoning/probabilistic/distributions.js +207 -0
  92. package/dist/reasoning/probabilistic/distributions.js.map +1 -0
  93. package/dist/reasoning/probabilistic/examples.d.ts +31 -0
  94. package/dist/reasoning/probabilistic/examples.d.ts.map +1 -0
  95. package/dist/reasoning/probabilistic/examples.js +85 -0
  96. package/dist/reasoning/probabilistic/examples.js.map +1 -0
  97. package/dist/reasoning/probabilistic/index.d.ts +6 -0
  98. package/dist/reasoning/probabilistic/index.d.ts.map +1 -0
  99. package/dist/reasoning/probabilistic/index.js +42 -0
  100. package/dist/reasoning/probabilistic/index.js.map +1 -0
  101. package/dist/reasoning/probabilistic/inference.d.ts +45 -0
  102. package/dist/reasoning/probabilistic/inference.d.ts.map +1 -0
  103. package/dist/reasoning/probabilistic/inference.js +579 -0
  104. package/dist/reasoning/probabilistic/inference.js.map +1 -0
  105. package/dist/reasoning/probabilistic/types.d.ts +153 -0
  106. package/dist/reasoning/probabilistic/types.d.ts.map +1 -0
  107. package/dist/reasoning/probabilistic/types.js +37 -0
  108. package/dist/reasoning/probabilistic/types.js.map +1 -0
  109. package/dist/solver/smt-z3/index.d.ts +3 -0
  110. package/dist/solver/smt-z3/index.d.ts.map +1 -0
  111. package/dist/solver/smt-z3/index.js +11 -0
  112. package/dist/solver/smt-z3/index.js.map +1 -0
  113. package/dist/solver/smt-z3/types.d.ts +52 -0
  114. package/dist/solver/smt-z3/types.d.ts.map +1 -0
  115. package/dist/solver/smt-z3/types.js +6 -0
  116. package/dist/solver/smt-z3/types.js.map +1 -0
  117. package/dist/solver/smt-z3/z3-wasm-backend.d.ts +88 -0
  118. package/dist/solver/smt-z3/z3-wasm-backend.d.ts.map +1 -0
  119. package/dist/solver/smt-z3/z3-wasm-backend.js +437 -0
  120. package/dist/solver/smt-z3/z3-wasm-backend.js.map +1 -0
  121. package/dist/tests/logic/profiles/quantum/quantum.test.d.ts +2 -0
  122. package/dist/tests/logic/profiles/quantum/quantum.test.d.ts.map +1 -0
  123. package/dist/tests/logic/profiles/quantum/quantum.test.js +209 -0
  124. package/dist/tests/logic/profiles/quantum/quantum.test.js.map +1 -0
  125. package/dist/tests/proof-systems/certificate/certificate.test.d.ts +2 -0
  126. package/dist/tests/proof-systems/certificate/certificate.test.d.ts.map +1 -0
  127. package/dist/tests/proof-systems/certificate/certificate.test.js +449 -0
  128. package/dist/tests/proof-systems/certificate/certificate.test.js.map +1 -0
  129. package/dist/tests/reasoning/ban-logic/ban-logic.test.d.ts +2 -0
  130. package/dist/tests/reasoning/ban-logic/ban-logic.test.d.ts.map +1 -0
  131. package/dist/tests/reasoning/ban-logic/ban-logic.test.js +270 -0
  132. package/dist/tests/reasoning/ban-logic/ban-logic.test.js.map +1 -0
  133. package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.d.ts +2 -0
  134. package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.d.ts.map +1 -0
  135. package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.js +203 -0
  136. package/dist/tests/reasoning/combinatorial-games/combinatorial-games.test.js.map +1 -0
  137. package/dist/tests/reasoning/differential-privacy/differential-privacy.test.d.ts +2 -0
  138. package/dist/tests/reasoning/differential-privacy/differential-privacy.test.d.ts.map +1 -0
  139. package/dist/tests/reasoning/differential-privacy/differential-privacy.test.js +388 -0
  140. package/dist/tests/reasoning/differential-privacy/differential-privacy.test.js.map +1 -0
  141. package/dist/tests/reasoning/mechanism-design/mechanism-design.test.d.ts +2 -0
  142. package/dist/tests/reasoning/mechanism-design/mechanism-design.test.d.ts.map +1 -0
  143. package/dist/tests/reasoning/mechanism-design/mechanism-design.test.js +290 -0
  144. package/dist/tests/reasoning/mechanism-design/mechanism-design.test.js.map +1 -0
  145. package/dist/tests/reasoning/probabilistic/probabilistic.test.d.ts +2 -0
  146. package/dist/tests/reasoning/probabilistic/probabilistic.test.d.ts.map +1 -0
  147. package/dist/tests/reasoning/probabilistic/probabilistic.test.js +370 -0
  148. package/dist/tests/reasoning/probabilistic/probabilistic.test.js.map +1 -0
  149. package/dist/tests/solver/smt-z3/z3-wasm-backend.test.d.ts +2 -0
  150. package/dist/tests/solver/smt-z3/z3-wasm-backend.test.d.ts.map +1 -0
  151. package/dist/tests/solver/smt-z3/z3-wasm-backend.test.js +394 -0
  152. package/dist/tests/solver/smt-z3/z3-wasm-backend.test.js.map +1 -0
  153. package/dist/tests/tooling/mathlib/mathlib.test.d.ts +2 -0
  154. package/dist/tests/tooling/mathlib/mathlib.test.d.ts.map +1 -0
  155. package/dist/tests/tooling/mathlib/mathlib.test.js +214 -0
  156. package/dist/tests/tooling/mathlib/mathlib.test.js.map +1 -0
  157. package/dist/tests/tooling/proof-guidance/features.test.d.ts +2 -0
  158. package/dist/tests/tooling/proof-guidance/features.test.d.ts.map +1 -0
  159. package/dist/tests/tooling/proof-guidance/features.test.js +72 -0
  160. package/dist/tests/tooling/proof-guidance/features.test.js.map +1 -0
  161. package/dist/tests/tooling/proof-guidance/model.test.d.ts +2 -0
  162. package/dist/tests/tooling/proof-guidance/model.test.d.ts.map +1 -0
  163. package/dist/tests/tooling/proof-guidance/model.test.js +165 -0
  164. package/dist/tests/tooling/proof-guidance/model.test.js.map +1 -0
  165. package/dist/tests/tooling/proof-guidance/search.test.d.ts +2 -0
  166. package/dist/tests/tooling/proof-guidance/search.test.d.ts.map +1 -0
  167. package/dist/tests/tooling/proof-guidance/search.test.js +238 -0
  168. package/dist/tests/tooling/proof-guidance/search.test.js.map +1 -0
  169. package/dist/tests/type-theory/cubical/cubical.test.d.ts +2 -0
  170. package/dist/tests/type-theory/cubical/cubical.test.d.ts.map +1 -0
  171. package/dist/tests/type-theory/cubical/cubical.test.js +207 -0
  172. package/dist/tests/type-theory/cubical/cubical.test.js.map +1 -0
  173. package/dist/tests/type-theory/effects/effects.test.d.ts +2 -0
  174. package/dist/tests/type-theory/effects/effects.test.d.ts.map +1 -0
  175. package/dist/tests/type-theory/effects/effects.test.js +242 -0
  176. package/dist/tests/type-theory/effects/effects.test.js.map +1 -0
  177. package/dist/tooling/mathlib/group.d.ts +27 -0
  178. package/dist/tooling/mathlib/group.d.ts.map +1 -0
  179. package/dist/tooling/mathlib/group.js +89 -0
  180. package/dist/tooling/mathlib/group.js.map +1 -0
  181. package/dist/tooling/mathlib/index.d.ts +8 -0
  182. package/dist/tooling/mathlib/index.d.ts.map +1 -0
  183. package/dist/tooling/mathlib/index.js +40 -0
  184. package/dist/tooling/mathlib/index.js.map +1 -0
  185. package/dist/tooling/mathlib/instances.d.ts +29 -0
  186. package/dist/tooling/mathlib/instances.d.ts.map +1 -0
  187. package/dist/tooling/mathlib/instances.js +139 -0
  188. package/dist/tooling/mathlib/instances.js.map +1 -0
  189. package/dist/tooling/mathlib/lemmas.d.ts +3 -0
  190. package/dist/tooling/mathlib/lemmas.d.ts.map +1 -0
  191. package/dist/tooling/mathlib/lemmas.js +72 -0
  192. package/dist/tooling/mathlib/lemmas.js.map +1 -0
  193. package/dist/tooling/mathlib/order.d.ts +29 -0
  194. package/dist/tooling/mathlib/order.d.ts.map +1 -0
  195. package/dist/tooling/mathlib/order.js +91 -0
  196. package/dist/tooling/mathlib/order.js.map +1 -0
  197. package/dist/tooling/mathlib/ring.d.ts +15 -0
  198. package/dist/tooling/mathlib/ring.d.ts.map +1 -0
  199. package/dist/tooling/mathlib/ring.js +91 -0
  200. package/dist/tooling/mathlib/ring.js.map +1 -0
  201. package/dist/tooling/mathlib/types.d.ts +62 -0
  202. package/dist/tooling/mathlib/types.d.ts.map +1 -0
  203. package/dist/tooling/mathlib/types.js +7 -0
  204. package/dist/tooling/mathlib/types.js.map +1 -0
  205. package/dist/tooling/proof-guidance/features.d.ts +10 -0
  206. package/dist/tooling/proof-guidance/features.d.ts.map +1 -0
  207. package/dist/tooling/proof-guidance/features.js +97 -0
  208. package/dist/tooling/proof-guidance/features.js.map +1 -0
  209. package/dist/tooling/proof-guidance/index.d.ts +5 -0
  210. package/dist/tooling/proof-guidance/index.d.ts.map +1 -0
  211. package/dist/tooling/proof-guidance/index.js +25 -0
  212. package/dist/tooling/proof-guidance/index.js.map +1 -0
  213. package/dist/tooling/proof-guidance/model.d.ts +42 -0
  214. package/dist/tooling/proof-guidance/model.d.ts.map +1 -0
  215. package/dist/tooling/proof-guidance/model.js +149 -0
  216. package/dist/tooling/proof-guidance/model.js.map +1 -0
  217. package/dist/tooling/proof-guidance/search.d.ts +7 -0
  218. package/dist/tooling/proof-guidance/search.d.ts.map +1 -0
  219. package/dist/tooling/proof-guidance/search.js +102 -0
  220. package/dist/tooling/proof-guidance/search.js.map +1 -0
  221. package/dist/tooling/proof-guidance/types.d.ts +77 -0
  222. package/dist/tooling/proof-guidance/types.d.ts.map +1 -0
  223. package/dist/tooling/proof-guidance/types.js +8 -0
  224. package/dist/tooling/proof-guidance/types.js.map +1 -0
  225. package/dist/type-theory/cubical/equality.d.ts +4 -0
  226. package/dist/type-theory/cubical/equality.d.ts.map +1 -0
  227. package/dist/type-theory/cubical/equality.js +78 -0
  228. package/dist/type-theory/cubical/equality.js.map +1 -0
  229. package/dist/type-theory/cubical/index.d.ts +14 -0
  230. package/dist/type-theory/cubical/index.d.ts.map +1 -0
  231. package/dist/type-theory/cubical/index.js +71 -0
  232. package/dist/type-theory/cubical/index.js.map +1 -0
  233. package/dist/type-theory/cubical/infer.d.ts +18 -0
  234. package/dist/type-theory/cubical/infer.d.ts.map +1 -0
  235. package/dist/type-theory/cubical/infer.js +241 -0
  236. package/dist/type-theory/cubical/infer.js.map +1 -0
  237. package/dist/type-theory/cubical/interval.d.ts +12 -0
  238. package/dist/type-theory/cubical/interval.d.ts.map +1 -0
  239. package/dist/type-theory/cubical/interval.js +118 -0
  240. package/dist/type-theory/cubical/interval.js.map +1 -0
  241. package/dist/type-theory/cubical/normalize.d.ts +5 -0
  242. package/dist/type-theory/cubical/normalize.d.ts.map +1 -0
  243. package/dist/type-theory/cubical/normalize.js +191 -0
  244. package/dist/type-theory/cubical/normalize.js.map +1 -0
  245. package/dist/type-theory/cubical/path-algebra.d.ts +12 -0
  246. package/dist/type-theory/cubical/path-algebra.d.ts.map +1 -0
  247. package/dist/type-theory/cubical/path-algebra.js +109 -0
  248. package/dist/type-theory/cubical/path-algebra.js.map +1 -0
  249. package/dist/type-theory/cubical/substitute.d.ts +3 -0
  250. package/dist/type-theory/cubical/substitute.d.ts.map +1 -0
  251. package/dist/type-theory/cubical/substitute.js +109 -0
  252. package/dist/type-theory/cubical/substitute.js.map +1 -0
  253. package/dist/type-theory/cubical/types.d.ts +77 -0
  254. package/dist/type-theory/cubical/types.d.ts.map +1 -0
  255. package/dist/type-theory/cubical/types.js +258 -0
  256. package/dist/type-theory/cubical/types.js.map +1 -0
  257. package/dist/type-theory/effects/core.d.ts +27 -0
  258. package/dist/type-theory/effects/core.d.ts.map +1 -0
  259. package/dist/type-theory/effects/core.js +79 -0
  260. package/dist/type-theory/effects/core.js.map +1 -0
  261. package/dist/type-theory/effects/exception.d.ts +18 -0
  262. package/dist/type-theory/effects/exception.d.ts.map +1 -0
  263. package/dist/type-theory/effects/exception.js +59 -0
  264. package/dist/type-theory/effects/exception.js.map +1 -0
  265. package/dist/type-theory/effects/index.d.ts +11 -0
  266. package/dist/type-theory/effects/index.d.ts.map +1 -0
  267. package/dist/type-theory/effects/index.js +50 -0
  268. package/dist/type-theory/effects/index.js.map +1 -0
  269. package/dist/type-theory/effects/reader.d.ts +20 -0
  270. package/dist/type-theory/effects/reader.d.ts.map +1 -0
  271. package/dist/type-theory/effects/reader.js +62 -0
  272. package/dist/type-theory/effects/reader.js.map +1 -0
  273. package/dist/type-theory/effects/state.d.ts +31 -0
  274. package/dist/type-theory/effects/state.d.ts.map +1 -0
  275. package/dist/type-theory/effects/state.js +91 -0
  276. package/dist/type-theory/effects/state.js.map +1 -0
  277. package/dist/type-theory/effects/types.d.ts +45 -0
  278. package/dist/type-theory/effects/types.d.ts.map +1 -0
  279. package/dist/type-theory/effects/types.js +21 -0
  280. package/dist/type-theory/effects/types.js.map +1 -0
  281. package/dist/type-theory/effects/writer.d.ts +30 -0
  282. package/dist/type-theory/effects/writer.d.ts.map +1 -0
  283. package/dist/type-theory/effects/writer.js +79 -0
  284. package/dist/type-theory/effects/writer.js.map +1 -0
  285. 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