@stevenvo780/st-lang 4.7.0 → 4.8.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/namespaces/reasoning.d.ts +2 -1
- package/dist/namespaces/reasoning.d.ts.map +1 -1
- package/dist/namespaces/reasoning.js +3 -1
- package/dist/namespaces/reasoning.js.map +1 -1
- 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/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/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/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/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/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/package.json +1 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Agent, MechanismOutcome } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* VCG mechanism: allocation maximiza welfare; pago de cada agente =
|
|
4
|
+
* externalidad = (welfare óptimo de los demás cuando él NO participa)
|
|
5
|
+
* - (welfare de los demás en la allocation elegida).
|
|
6
|
+
*
|
|
7
|
+
* Devuelve allocation y payments. Payments son ≥ 0 si valuations son
|
|
8
|
+
* monotónicas (las nuestras lo son).
|
|
9
|
+
*/
|
|
10
|
+
export declare function vcgMechanism(agents: Agent[], items: string[]): MechanismOutcome;
|
|
11
|
+
/**
|
|
12
|
+
* Welfare social bajo una allocation: suma de valuations de los agentes
|
|
13
|
+
* por lo que recibieron.
|
|
14
|
+
*/
|
|
15
|
+
export declare function socialWelfare(outcome: MechanismOutcome, agents: Agent[]): number;
|
|
16
|
+
/**
|
|
17
|
+
* Strategy-proofness empírica: tomamos `samples` reportes aleatorios de
|
|
18
|
+
* un agente (manteniendo a los demás truthful), corremos el mechanism,
|
|
19
|
+
* y verificamos que la utilidad del agente que miente no supere la
|
|
20
|
+
* utilidad reportando truthfully. Si para alguna sample el misreport
|
|
21
|
+
* mejora estrictamente, retornamos false.
|
|
22
|
+
*
|
|
23
|
+
* Utilidad cuasi-lineal: v(allocation_i) - payment_i.
|
|
24
|
+
*
|
|
25
|
+
* Esto es probabilístico: con `samples=0` no chequeamos nada y devolvemos
|
|
26
|
+
* true. Útil sobretodo para testing.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isStrategyProof(mechanism: (agents: Agent[]) => MechanismOutcome, samples?: number): boolean;
|
|
29
|
+
//# sourceMappingURL=vcg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vcg.d.ts","sourceRoot":"","sources":["../../../src/reasoning/mechanism-design/vcg.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA4KvD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA2B/E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAOhF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,gBAAgB,EAChD,OAAO,GAAE,MAAW,GACnB,OAAO,CAyDT"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// VCG mechanism (Vickrey-Clarke-Groves)
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// El VCG mechanism elige la allocation que maximiza social welfare
|
|
7
|
+
// (suma de valuations reportadas). Cobra a cada agente la
|
|
8
|
+
// "externalidad" que impone sobre el resto: la diferencia entre el
|
|
9
|
+
// welfare máximo de los OTROS agentes cuando él NO participa y el
|
|
10
|
+
// welfare de los OTROS en la allocation elegida.
|
|
11
|
+
//
|
|
12
|
+
// Esta implementación cubre dos regímenes:
|
|
13
|
+
//
|
|
14
|
+
// 1. Single-item per agent (caso default): cada agente puede recibir
|
|
15
|
+
// a lo sumo 1 item, cada item se asigna a lo sumo 1 agente.
|
|
16
|
+
// Resolvemos el problema de asignación máxima por enumeración
|
|
17
|
+
// (Hungarian sería más eficiente pero alcanza para los tamaños
|
|
18
|
+
// de test, n ≤ ~8).
|
|
19
|
+
//
|
|
20
|
+
// 2. Combinatorial (bundles): si las valuations incluyen claves que
|
|
21
|
+
// representan combinaciones — convención: outcomes "*" significa
|
|
22
|
+
// "todos los items" — el algoritmo enumera particiones de items
|
|
23
|
+
// en agentes y elige la de mayor welfare. Por simplicidad y para
|
|
24
|
+
// los tests, asumimos que las claves del Map son subconjuntos de
|
|
25
|
+
// items separados por "+" o son items individuales.
|
|
26
|
+
//
|
|
27
|
+
// Para el caso combinatorial usamos enumeración exhaustiva de
|
|
28
|
+
// asignaciones agente→bundle (cada item al primer agente que lo
|
|
29
|
+
// quiera con mayor valor o sin asignar). Esto es exponencial en items
|
|
30
|
+
// pero claro y suficiente para tests pequeños.
|
|
31
|
+
//
|
|
32
|
+
// Strategy-proof: VCG es DSIC (dominant-strategy incentive-compatible).
|
|
33
|
+
// Verificamos esta propiedad empíricamente vía `isStrategyProof`.
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.vcgMechanism = vcgMechanism;
|
|
36
|
+
exports.socialWelfare = socialWelfare;
|
|
37
|
+
exports.isStrategyProof = isStrategyProof;
|
|
38
|
+
const EMPTY_BUNDLE = '';
|
|
39
|
+
/** Junta items en una clave canónica ordenada. */
|
|
40
|
+
function makeBundle(items) {
|
|
41
|
+
if (items.length === 0)
|
|
42
|
+
return EMPTY_BUNDLE;
|
|
43
|
+
return [...items].sort().join('+');
|
|
44
|
+
}
|
|
45
|
+
/** Lectura segura: 0 si el outcome no aparece en la valuation. */
|
|
46
|
+
function vOf(a, outcome) {
|
|
47
|
+
return a.valuation.get(outcome) ?? 0;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Enumera todas las asignaciones agente→item para single-item case.
|
|
51
|
+
* Devuelve la asignación que maximiza la suma de valuations.
|
|
52
|
+
*
|
|
53
|
+
* - agentSubset = lista de agentes participantes.
|
|
54
|
+
* - items = lista de items disponibles.
|
|
55
|
+
*
|
|
56
|
+
* Cada agente puede quedarse sin item (item = EMPTY_BUNDLE). Cada item
|
|
57
|
+
* se asigna a 0 o 1 agente.
|
|
58
|
+
*
|
|
59
|
+
* Complejidad: O((|items|+1)^|agents|) en worst case; OK para tests.
|
|
60
|
+
*/
|
|
61
|
+
function bestSingleItemAssignment(agentSubset, items) {
|
|
62
|
+
let bestWelfare = -Infinity;
|
|
63
|
+
let bestAllocation = new Map();
|
|
64
|
+
// Asignamos recursivamente. choices[i] ∈ items ∪ {EMPTY_BUNDLE},
|
|
65
|
+
// con restricción de unicidad de item.
|
|
66
|
+
const n = agentSubset.length;
|
|
67
|
+
const taken = new Set();
|
|
68
|
+
const current = new Array(n).fill(EMPTY_BUNDLE);
|
|
69
|
+
function recurse(idx, welfareSoFar) {
|
|
70
|
+
if (idx === n) {
|
|
71
|
+
if (welfareSoFar > bestWelfare) {
|
|
72
|
+
bestWelfare = welfareSoFar;
|
|
73
|
+
const alloc = new Map();
|
|
74
|
+
for (let i = 0; i < n; i++) {
|
|
75
|
+
if (current[i] !== EMPTY_BUNDLE) {
|
|
76
|
+
alloc.set(agentSubset[i].id, current[i]);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
bestAllocation = alloc;
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const agent = agentSubset[idx];
|
|
84
|
+
// Opción A: agente no recibe nada.
|
|
85
|
+
current[idx] = EMPTY_BUNDLE;
|
|
86
|
+
recurse(idx + 1, welfareSoFar);
|
|
87
|
+
// Opción B: agente recibe alguno de los items libres.
|
|
88
|
+
for (const item of items) {
|
|
89
|
+
if (taken.has(item))
|
|
90
|
+
continue;
|
|
91
|
+
taken.add(item);
|
|
92
|
+
current[idx] = item;
|
|
93
|
+
recurse(idx + 1, welfareSoFar + vOf(agent, item));
|
|
94
|
+
taken.delete(item);
|
|
95
|
+
}
|
|
96
|
+
current[idx] = EMPTY_BUNDLE;
|
|
97
|
+
}
|
|
98
|
+
if (n === 0) {
|
|
99
|
+
return { allocation: new Map(), welfare: 0 };
|
|
100
|
+
}
|
|
101
|
+
recurse(0, 0);
|
|
102
|
+
if (bestWelfare === -Infinity)
|
|
103
|
+
bestWelfare = 0;
|
|
104
|
+
return { allocation: bestAllocation, welfare: bestWelfare };
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Enumera particiones de items en bundles asignados a agentes (con
|
|
108
|
+
* agente "vacío" como opción) — usado cuando las valuations incluyen
|
|
109
|
+
* bundles compuestos ("A+B").
|
|
110
|
+
*
|
|
111
|
+
* Decisión por item: a qué agente va (o a ninguno). Luego cada agente
|
|
112
|
+
* obtiene el bundle canónico de los items que recibió y se consulta
|
|
113
|
+
* la valuation con esa clave (default 0).
|
|
114
|
+
*/
|
|
115
|
+
function bestCombinatorialAssignment(agentSubset, items) {
|
|
116
|
+
let bestWelfare = -Infinity;
|
|
117
|
+
let bestAssignment = new Array(items.length).fill(-1);
|
|
118
|
+
const assignment = new Array(items.length).fill(-1);
|
|
119
|
+
function evalWelfare() {
|
|
120
|
+
const bundlesPerAgent = agentSubset.map(() => []);
|
|
121
|
+
for (let i = 0; i < items.length; i++) {
|
|
122
|
+
const ai = assignment[i];
|
|
123
|
+
if (ai >= 0)
|
|
124
|
+
bundlesPerAgent[ai].push(items[i]);
|
|
125
|
+
}
|
|
126
|
+
let w = 0;
|
|
127
|
+
for (let a = 0; a < agentSubset.length; a++) {
|
|
128
|
+
const bundle = makeBundle(bundlesPerAgent[a]);
|
|
129
|
+
if (bundle === EMPTY_BUNDLE)
|
|
130
|
+
continue;
|
|
131
|
+
w += vOf(agentSubset[a], bundle);
|
|
132
|
+
}
|
|
133
|
+
return w;
|
|
134
|
+
}
|
|
135
|
+
function recurse(idx) {
|
|
136
|
+
if (idx === items.length) {
|
|
137
|
+
const w = evalWelfare();
|
|
138
|
+
if (w > bestWelfare) {
|
|
139
|
+
bestWelfare = w;
|
|
140
|
+
bestAssignment = assignment.slice();
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Item no asignado.
|
|
145
|
+
assignment[idx] = -1;
|
|
146
|
+
recurse(idx + 1);
|
|
147
|
+
// Item a cada agente.
|
|
148
|
+
for (let a = 0; a < agentSubset.length; a++) {
|
|
149
|
+
assignment[idx] = a;
|
|
150
|
+
recurse(idx + 1);
|
|
151
|
+
}
|
|
152
|
+
assignment[idx] = -1;
|
|
153
|
+
}
|
|
154
|
+
if (agentSubset.length === 0 || items.length === 0) {
|
|
155
|
+
return { allocation: new Map(), welfare: 0 };
|
|
156
|
+
}
|
|
157
|
+
recurse(0);
|
|
158
|
+
if (bestWelfare === -Infinity)
|
|
159
|
+
bestWelfare = 0;
|
|
160
|
+
// Reconstruir allocation: mapAgentId → bundle.
|
|
161
|
+
const alloc = new Map();
|
|
162
|
+
const bundlesPerAgent = agentSubset.map(() => []);
|
|
163
|
+
for (let i = 0; i < items.length; i++) {
|
|
164
|
+
const ai = bestAssignment[i];
|
|
165
|
+
if (ai >= 0)
|
|
166
|
+
bundlesPerAgent[ai].push(items[i]);
|
|
167
|
+
}
|
|
168
|
+
for (let a = 0; a < agentSubset.length; a++) {
|
|
169
|
+
const bundle = makeBundle(bundlesPerAgent[a]);
|
|
170
|
+
if (bundle !== EMPTY_BUNDLE)
|
|
171
|
+
alloc.set(agentSubset[a].id, bundle);
|
|
172
|
+
}
|
|
173
|
+
return { allocation: alloc, welfare: bestWelfare };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Detecta si la valuation usa bundles compuestos (claves con "+").
|
|
177
|
+
*/
|
|
178
|
+
function hasCombinatorialValuations(agents) {
|
|
179
|
+
for (const a of agents) {
|
|
180
|
+
for (const key of a.valuation.keys()) {
|
|
181
|
+
if (key.includes('+'))
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
function bestAssignment(agentSubset, items) {
|
|
188
|
+
if (hasCombinatorialValuations(agentSubset)) {
|
|
189
|
+
return bestCombinatorialAssignment(agentSubset, items);
|
|
190
|
+
}
|
|
191
|
+
return bestSingleItemAssignment(agentSubset, items);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* VCG mechanism: allocation maximiza welfare; pago de cada agente =
|
|
195
|
+
* externalidad = (welfare óptimo de los demás cuando él NO participa)
|
|
196
|
+
* - (welfare de los demás en la allocation elegida).
|
|
197
|
+
*
|
|
198
|
+
* Devuelve allocation y payments. Payments son ≥ 0 si valuations son
|
|
199
|
+
* monotónicas (las nuestras lo son).
|
|
200
|
+
*/
|
|
201
|
+
function vcgMechanism(agents, items) {
|
|
202
|
+
if (agents.length === 0) {
|
|
203
|
+
return { allocation: new Map(), payments: new Map() };
|
|
204
|
+
}
|
|
205
|
+
const { allocation } = bestAssignment(agents, items);
|
|
206
|
+
// Welfare de los OTROS bajo la allocation elegida.
|
|
207
|
+
const payments = new Map();
|
|
208
|
+
for (const a of agents) {
|
|
209
|
+
const without = agents.filter((x) => x.id !== a.id);
|
|
210
|
+
// Welfare de los demás en la allocation actual.
|
|
211
|
+
let welfareOthersIn = 0;
|
|
212
|
+
for (const other of without) {
|
|
213
|
+
const got = allocation.get(other.id);
|
|
214
|
+
if (got !== undefined)
|
|
215
|
+
welfareOthersIn += vOf(other, got);
|
|
216
|
+
}
|
|
217
|
+
// Welfare óptimo si `a` no existiera (libera los items que tenía).
|
|
218
|
+
const { welfare: welfareOthersOut } = bestAssignment(without, items);
|
|
219
|
+
const payment = welfareOthersOut - welfareOthersIn;
|
|
220
|
+
payments.set(a.id, payment);
|
|
221
|
+
}
|
|
222
|
+
return { allocation, payments };
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Welfare social bajo una allocation: suma de valuations de los agentes
|
|
226
|
+
* por lo que recibieron.
|
|
227
|
+
*/
|
|
228
|
+
function socialWelfare(outcome, agents) {
|
|
229
|
+
let w = 0;
|
|
230
|
+
for (const a of agents) {
|
|
231
|
+
const got = outcome.allocation.get(a.id);
|
|
232
|
+
if (got !== undefined)
|
|
233
|
+
w += vOf(a, got);
|
|
234
|
+
}
|
|
235
|
+
return w;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Strategy-proofness empírica: tomamos `samples` reportes aleatorios de
|
|
239
|
+
* un agente (manteniendo a los demás truthful), corremos el mechanism,
|
|
240
|
+
* y verificamos que la utilidad del agente que miente no supere la
|
|
241
|
+
* utilidad reportando truthfully. Si para alguna sample el misreport
|
|
242
|
+
* mejora estrictamente, retornamos false.
|
|
243
|
+
*
|
|
244
|
+
* Utilidad cuasi-lineal: v(allocation_i) - payment_i.
|
|
245
|
+
*
|
|
246
|
+
* Esto es probabilístico: con `samples=0` no chequeamos nada y devolvemos
|
|
247
|
+
* true. Útil sobretodo para testing.
|
|
248
|
+
*/
|
|
249
|
+
function isStrategyProof(mechanism, samples = 50) {
|
|
250
|
+
if (samples <= 0)
|
|
251
|
+
return true;
|
|
252
|
+
// Construimos un escenario base de 3 agentes y 2 items, con
|
|
253
|
+
// valuations enteras en [0, 10]. Para cada sample mutamos la
|
|
254
|
+
// valuation del primer agente y comparamos su utilidad con la
|
|
255
|
+
// reportada truthfully. El mechanism recibe solo agents (los items
|
|
256
|
+
// están implícitos en las valuations + closure del caller).
|
|
257
|
+
const baseAgents = [
|
|
258
|
+
{
|
|
259
|
+
id: 'a',
|
|
260
|
+
valuation: new Map([
|
|
261
|
+
['x', 8],
|
|
262
|
+
['y', 3],
|
|
263
|
+
]),
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
id: 'b',
|
|
267
|
+
valuation: new Map([
|
|
268
|
+
['x', 5],
|
|
269
|
+
['y', 6],
|
|
270
|
+
]),
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
id: 'c',
|
|
274
|
+
valuation: new Map([
|
|
275
|
+
['x', 2],
|
|
276
|
+
['y', 4],
|
|
277
|
+
]),
|
|
278
|
+
},
|
|
279
|
+
];
|
|
280
|
+
// Utilidad real del agente "a" si reporta `report` y los demás truthful.
|
|
281
|
+
function utilityOfA(report) {
|
|
282
|
+
const truthA = baseAgents[0].valuation;
|
|
283
|
+
const reported = [{ id: 'a', valuation: report }, baseAgents[1], baseAgents[2]];
|
|
284
|
+
const out = mechanism(reported);
|
|
285
|
+
const got = out.allocation.get('a');
|
|
286
|
+
const value = got !== undefined ? (truthA.get(got) ?? 0) : 0;
|
|
287
|
+
const pay = out.payments.get('a') ?? 0;
|
|
288
|
+
return value - pay;
|
|
289
|
+
}
|
|
290
|
+
const truthful = utilityOfA(baseAgents[0].valuation);
|
|
291
|
+
for (let s = 0; s < samples; s++) {
|
|
292
|
+
const fakeX = Math.floor(Math.random() * 11);
|
|
293
|
+
const fakeY = Math.floor(Math.random() * 11);
|
|
294
|
+
const fake = new Map([
|
|
295
|
+
['x', fakeX],
|
|
296
|
+
['y', fakeY],
|
|
297
|
+
]);
|
|
298
|
+
const u = utilityOfA(fake);
|
|
299
|
+
// Permitimos empates (igualdad): DSIC requiere truthful ∈ argmax.
|
|
300
|
+
if (u > truthful + 1e-9)
|
|
301
|
+
return false;
|
|
302
|
+
}
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=vcg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vcg.js","sourceRoot":"","sources":["../../../src/reasoning/mechanism-design/vcg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { BernoulliDist, CategoricalDist, DiscreteDist, Distribution, NormalDist, PoissonDist, UniformDist } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Saca un valor de `dist` usando `rng` (uniforme [0,1)).
|
|
4
|
+
*
|
|
5
|
+
* Para `categorical` y `discrete`, normaliza las probs internamente
|
|
6
|
+
* para tolerar entradas no exactamente sumadas a 1.
|
|
7
|
+
*
|
|
8
|
+
* Las firmas overloaded dan inferencia precisa por familia.
|
|
9
|
+
*/
|
|
10
|
+
export declare function sampleFrom(dist: BernoulliDist, rng: () => number): boolean;
|
|
11
|
+
export declare function sampleFrom(dist: UniformDist, rng: () => number): number;
|
|
12
|
+
export declare function sampleFrom(dist: NormalDist, rng: () => number): number;
|
|
13
|
+
export declare function sampleFrom(dist: PoissonDist, rng: () => number): number;
|
|
14
|
+
export declare function sampleFrom<T>(dist: CategoricalDist<T>, rng: () => number): T;
|
|
15
|
+
export declare function sampleFrom<T>(dist: DiscreteDist<T>, rng: () => number): T;
|
|
16
|
+
export declare function sampleFrom<T>(dist: Distribution<T>, rng: () => number): T;
|
|
17
|
+
/**
|
|
18
|
+
* Log-densidad / log-masa de `value` bajo `dist`.
|
|
19
|
+
*
|
|
20
|
+
* Para distribuciones continuas (`uniform`, `normal`) es log-pdf;
|
|
21
|
+
* para discretas (`bernoulli`, `poisson`, `categorical`, `discrete`)
|
|
22
|
+
* es log-pmf. Valores fuera del soporte devuelven `-Infinity`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function logPdf(dist: BernoulliDist, value: boolean): number;
|
|
25
|
+
export declare function logPdf(dist: UniformDist, value: number): number;
|
|
26
|
+
export declare function logPdf(dist: NormalDist, value: number): number;
|
|
27
|
+
export declare function logPdf(dist: PoissonDist, value: number): number;
|
|
28
|
+
export declare function logPdf<T>(dist: CategoricalDist<T>, value: T): number;
|
|
29
|
+
export declare function logPdf<T>(dist: DiscreteDist<T>, value: T): number;
|
|
30
|
+
export declare function logPdf<T>(dist: Distribution<T>, value: T): number;
|
|
31
|
+
/**
|
|
32
|
+
* Enumera el soporte de una distribución discreta como pares
|
|
33
|
+
* `[valor, probabilidad]`. Para distribuciones continuas o de
|
|
34
|
+
* soporte infinito (poisson), lanza error: no se puede enumerar.
|
|
35
|
+
*
|
|
36
|
+
* Para `poisson` se podría truncar pero la enumeración exacta no
|
|
37
|
+
* lo soporta — el usuario debe usar `categorical` con un soporte
|
|
38
|
+
* acotado si quiere enumeración.
|
|
39
|
+
*/
|
|
40
|
+
export declare function enumerateSupport(dist: BernoulliDist): Array<[boolean, number]>;
|
|
41
|
+
export declare function enumerateSupport<T>(dist: CategoricalDist<T>): Array<[T, number]>;
|
|
42
|
+
export declare function enumerateSupport<T>(dist: DiscreteDist<T>): Array<[T, number]>;
|
|
43
|
+
export declare function enumerateSupport<T>(dist: Distribution<T>): Array<[T, number]>;
|
|
44
|
+
//# sourceMappingURL=distributions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distributions.d.ts","sourceRoot":"","sources":["../../../src/reasoning/probabilistic/distributions.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,WAAW,EACZ,MAAM,SAAS,CAAC;AAKjB;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC;AAC5E,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,CAAC;AACzE,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,CAAC;AACxE,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,MAAM,CAAC;AACzE,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,CAAC,CAAC;AAC9E,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,CAAC,CAAC;AAC3E,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,MAAM,GAAG,CAAC,CAAC;AA6C3E;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;AACpE,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;AACjE,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;AAChE,wBAAgB,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;AACjE,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;AACtE,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;AACnE,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;AA8CnE;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAChF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAClF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Probabilistic Programming — Distributions
|
|
4
|
+
// ============================================================
|
|
5
|
+
//
|
|
6
|
+
// Muestreo y log-density para las seis familias soportadas.
|
|
7
|
+
// Todo función pura y RNG inyectable.
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.sampleFrom = sampleFrom;
|
|
10
|
+
exports.logPdf = logPdf;
|
|
11
|
+
exports.enumerateSupport = enumerateSupport;
|
|
12
|
+
const TWO_PI = 2 * Math.PI;
|
|
13
|
+
const LOG_2PI = Math.log(TWO_PI);
|
|
14
|
+
function sampleFrom(dist, rng) {
|
|
15
|
+
switch (dist.kind) {
|
|
16
|
+
case 'bernoulli':
|
|
17
|
+
return (rng() < dist.p);
|
|
18
|
+
case 'uniform':
|
|
19
|
+
return (dist.low + rng() * (dist.high - dist.low));
|
|
20
|
+
case 'normal':
|
|
21
|
+
return sampleNormal(dist.mean, dist.std, rng);
|
|
22
|
+
case 'poisson':
|
|
23
|
+
return samplePoisson(dist.lambda, rng);
|
|
24
|
+
case 'categorical': {
|
|
25
|
+
const u = rng();
|
|
26
|
+
const total = dist.probs.reduce((s, x) => s + x, 0);
|
|
27
|
+
if (total <= 0) {
|
|
28
|
+
throw new Error('categorical: suma de probs <= 0');
|
|
29
|
+
}
|
|
30
|
+
let acc = 0;
|
|
31
|
+
for (let i = 0; i < dist.values.length; i++) {
|
|
32
|
+
acc += (dist.probs[i] ?? 0) / total;
|
|
33
|
+
if (u < acc)
|
|
34
|
+
return dist.values[i];
|
|
35
|
+
}
|
|
36
|
+
// Borde por float: devolver el último.
|
|
37
|
+
return dist.values[dist.values.length - 1];
|
|
38
|
+
}
|
|
39
|
+
case 'discrete': {
|
|
40
|
+
const u = rng();
|
|
41
|
+
let total = 0;
|
|
42
|
+
for (const p of dist.pmf.values())
|
|
43
|
+
total += p;
|
|
44
|
+
if (total <= 0) {
|
|
45
|
+
throw new Error('discrete: suma de pmf <= 0');
|
|
46
|
+
}
|
|
47
|
+
let acc = 0;
|
|
48
|
+
let last;
|
|
49
|
+
for (const [v, p] of dist.pmf) {
|
|
50
|
+
last = v;
|
|
51
|
+
acc += p / total;
|
|
52
|
+
if (u < acc)
|
|
53
|
+
return v;
|
|
54
|
+
}
|
|
55
|
+
if (last === undefined)
|
|
56
|
+
throw new Error('discrete: pmf vacío');
|
|
57
|
+
return last;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function logPdf(dist, value) {
|
|
62
|
+
switch (dist.kind) {
|
|
63
|
+
case 'bernoulli': {
|
|
64
|
+
const v = value;
|
|
65
|
+
if (typeof v !== 'boolean')
|
|
66
|
+
return -Infinity;
|
|
67
|
+
const p = clampProb(dist.p);
|
|
68
|
+
return v ? Math.log(p) : Math.log(1 - p);
|
|
69
|
+
}
|
|
70
|
+
case 'uniform': {
|
|
71
|
+
const x = value;
|
|
72
|
+
if (typeof x !== 'number' || !Number.isFinite(x))
|
|
73
|
+
return -Infinity;
|
|
74
|
+
if (x < dist.low || x >= dist.high)
|
|
75
|
+
return -Infinity;
|
|
76
|
+
if (dist.high <= dist.low)
|
|
77
|
+
return -Infinity;
|
|
78
|
+
return -Math.log(dist.high - dist.low);
|
|
79
|
+
}
|
|
80
|
+
case 'normal': {
|
|
81
|
+
const x = value;
|
|
82
|
+
if (typeof x !== 'number' || !Number.isFinite(x))
|
|
83
|
+
return -Infinity;
|
|
84
|
+
if (dist.std <= 0)
|
|
85
|
+
return -Infinity;
|
|
86
|
+
const z = (x - dist.mean) / dist.std;
|
|
87
|
+
return -0.5 * (z * z + LOG_2PI) - Math.log(dist.std);
|
|
88
|
+
}
|
|
89
|
+
case 'poisson': {
|
|
90
|
+
const k = value;
|
|
91
|
+
if (!Number.isInteger(k) || k < 0)
|
|
92
|
+
return -Infinity;
|
|
93
|
+
if (dist.lambda <= 0)
|
|
94
|
+
return k === 0 ? 0 : -Infinity;
|
|
95
|
+
return k * Math.log(dist.lambda) - dist.lambda - logFactorial(k);
|
|
96
|
+
}
|
|
97
|
+
case 'categorical': {
|
|
98
|
+
const idx = dist.values.indexOf(value);
|
|
99
|
+
if (idx < 0)
|
|
100
|
+
return -Infinity;
|
|
101
|
+
const total = dist.probs.reduce((s, x) => s + x, 0);
|
|
102
|
+
const p = (dist.probs[idx] ?? 0) / total;
|
|
103
|
+
return p > 0 ? Math.log(p) : -Infinity;
|
|
104
|
+
}
|
|
105
|
+
case 'discrete': {
|
|
106
|
+
const p = dist.pmf.get(value);
|
|
107
|
+
if (p === undefined || p <= 0)
|
|
108
|
+
return -Infinity;
|
|
109
|
+
let total = 0;
|
|
110
|
+
for (const x of dist.pmf.values())
|
|
111
|
+
total += x;
|
|
112
|
+
return Math.log(p / total);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function enumerateSupport(dist) {
|
|
117
|
+
switch (dist.kind) {
|
|
118
|
+
case 'bernoulli': {
|
|
119
|
+
const p = clampProb(dist.p);
|
|
120
|
+
return [
|
|
121
|
+
[true, p],
|
|
122
|
+
[false, 1 - p],
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
case 'categorical': {
|
|
126
|
+
const total = dist.probs.reduce((s, x) => s + x, 0);
|
|
127
|
+
const out = [];
|
|
128
|
+
for (let i = 0; i < dist.values.length; i++) {
|
|
129
|
+
const p = (dist.probs[i] ?? 0) / total;
|
|
130
|
+
if (p > 0)
|
|
131
|
+
out.push([dist.values[i], p]);
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
case 'discrete': {
|
|
136
|
+
let total = 0;
|
|
137
|
+
for (const x of dist.pmf.values())
|
|
138
|
+
total += x;
|
|
139
|
+
const out = [];
|
|
140
|
+
for (const [v, p] of dist.pmf) {
|
|
141
|
+
if (p > 0)
|
|
142
|
+
out.push([v, p / total]);
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
case 'uniform':
|
|
147
|
+
case 'normal':
|
|
148
|
+
case 'poisson':
|
|
149
|
+
throw new Error(`enumerate: la distribución "${dist.kind}" tiene soporte continuo o infinito; ` +
|
|
150
|
+
'usá categorical/discrete o cambiá a rejection/importance/MH.');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ── Helpers privados ─────────────────────────────────────────
|
|
154
|
+
/**
|
|
155
|
+
* Box-Muller transform. Cachea el segundo gaussiano por llamada
|
|
156
|
+
* para no desperdiciar entropía — aunque la API permite dos
|
|
157
|
+
* llamadas separadas, en la práctica solo necesitamos una muestra
|
|
158
|
+
* por invocación, así que descartamos la segunda.
|
|
159
|
+
*/
|
|
160
|
+
function sampleNormal(mean, std, rng) {
|
|
161
|
+
if (std <= 0) {
|
|
162
|
+
throw new Error('normal: std debe ser > 0');
|
|
163
|
+
}
|
|
164
|
+
let u1 = rng();
|
|
165
|
+
// Evitar log(0) en el caso degenerado u1 == 0.
|
|
166
|
+
while (u1 <= 0)
|
|
167
|
+
u1 = rng();
|
|
168
|
+
const u2 = rng();
|
|
169
|
+
const z = Math.sqrt(-2 * Math.log(u1)) * Math.cos(TWO_PI * u2);
|
|
170
|
+
return mean + std * z;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Algoritmo de Knuth para Poisson — eficiente para lambda chicos
|
|
174
|
+
* (que es el caso típico en programas de tests). Para lambda > 30
|
|
175
|
+
* podría usarse aproximación normal, pero no lo necesitamos aquí.
|
|
176
|
+
*/
|
|
177
|
+
function samplePoisson(lambda, rng) {
|
|
178
|
+
if (lambda <= 0)
|
|
179
|
+
return 0;
|
|
180
|
+
const L = Math.exp(-lambda);
|
|
181
|
+
let k = 0;
|
|
182
|
+
let p = 1;
|
|
183
|
+
for (;;) {
|
|
184
|
+
k += 1;
|
|
185
|
+
p *= rng();
|
|
186
|
+
if (p <= L)
|
|
187
|
+
return k - 1;
|
|
188
|
+
// Salvaguarda anti-loop (lambda muy grande): truncar a 10 sigmas.
|
|
189
|
+
if (k > lambda + 50 * Math.sqrt(lambda) + 100)
|
|
190
|
+
return k - 1;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function logFactorial(n) {
|
|
194
|
+
// Tabulamos los primeros valores para precisión exacta.
|
|
195
|
+
let r = 0;
|
|
196
|
+
for (let i = 2; i <= n; i++)
|
|
197
|
+
r += Math.log(i);
|
|
198
|
+
return r;
|
|
199
|
+
}
|
|
200
|
+
function clampProb(p) {
|
|
201
|
+
if (p < 0)
|
|
202
|
+
return 0;
|
|
203
|
+
if (p > 1)
|
|
204
|
+
return 1;
|
|
205
|
+
return p;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=distributions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distributions.js","sourceRoot":"","sources":["../../../src/reasoning/probabilistic/distributions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type PProgram } from './types';
|
|
2
|
+
/** Bernoulli simétrica: prior trivial sobre {true, false}. */
|
|
3
|
+
export declare function coinExample(): PProgram<boolean>;
|
|
4
|
+
/** Bernoulli con bias arbitrario p ∈ [0,1]. */
|
|
5
|
+
export declare function biasedCoinExample(p: number): PProgram<boolean>;
|
|
6
|
+
/** AND de dos monedas Bernoulli(0.5): P(true) = 0.25 esperado. */
|
|
7
|
+
export declare function twoCoinsExample(): PProgram<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* Bayesian linear regression univariado:
|
|
10
|
+
* slope ~ Normal(0, 5)
|
|
11
|
+
* intercept ~ Normal(0, 5)
|
|
12
|
+
* yᵢ | slope, intercept ~ Normal(slope·xᵢ + intercept, 1)
|
|
13
|
+
*
|
|
14
|
+
* Devuelve la pareja (slope, intercept). Las observaciones se
|
|
15
|
+
* codifican como factor(logPdf(...)) sobre el residuo — equivale
|
|
16
|
+
* a una likelihood gaussiana, suitable para importance/MH.
|
|
17
|
+
*/
|
|
18
|
+
export declare function bayesianLinearRegression(xs: number[], ys: number[]): PProgram<{
|
|
19
|
+
slope: number;
|
|
20
|
+
intercept: number;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* Posterior sobre la media de una gaussiana con σ conocido.
|
|
24
|
+
* mu ~ Normal(0, 10)
|
|
25
|
+
* xᵢ | mu ~ Normal(mu, 1)
|
|
26
|
+
*
|
|
27
|
+
* Útil como caso de test analítico: el posterior verdadero es
|
|
28
|
+
* Normal((Σxᵢ) / (n + 1/100), 1/√(n + 1/100)).
|
|
29
|
+
*/
|
|
30
|
+
export declare function gaussianMeanModel(data: number[]): PProgram<number>;
|
|
31
|
+
//# sourceMappingURL=examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../../src/reasoning/probabilistic/examples.ts"],"names":[],"mappings":"AAeA,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE3D,8DAA8D;AAC9D,wBAAgB,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,CAE/C;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAE9D;AAED,kEAAkE;AAClE,wBAAgB,eAAe,IAAI,QAAQ,CAAC,OAAO,CAAC,CAMnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,MAAM,EAAE,EACZ,EAAE,EAAE,MAAM,EAAE,GACX,QAAQ,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBhD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAQlE"}
|