@lucern/confidence 0.3.0-alpha.0 → 0.3.0-alpha.1
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/README.md +5 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +214 -87
- package/dist/index.js.map +1 -1
- package/dist/v1/codec.d.ts +42 -0
- package/dist/v1/codec.js +62 -0
- package/dist/v1/codec.js.map +1 -0
- package/dist/v1/index.d.ts +5 -3
- package/dist/v1/index.js +214 -87
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/operations/approximation.js +30 -21
- package/dist/v1/operations/approximation.js.map +1 -1
- package/dist/v1/operations/bridge/index.d.ts +3 -3
- package/dist/v1/operations/bridge/index.js +27 -13
- package/dist/v1/operations/bridge/index.js.map +1 -1
- package/dist/v1/operations/canonical.d.ts +2 -2
- package/dist/v1/operations/canonical.js +16 -19
- package/dist/v1/operations/canonical.js.map +1 -1
- package/dist/v1/operations/contradiction/detectTupleContradiction.js.map +1 -1
- package/dist/v1/operations/contradiction/index.js.map +1 -1
- package/dist/v1/operations/dynamics/cascade.js +19 -6
- package/dist/v1/operations/dynamics/cascade.js.map +1 -1
- package/dist/v1/operations/dynamics/decay.js +5 -4
- package/dist/v1/operations/dynamics/decay.js.map +1 -1
- package/dist/v1/operations/dynamics/defeat.js +22 -17
- package/dist/v1/operations/dynamics/defeat.js.map +1 -1
- package/dist/v1/operations/dynamics/propagation.js +66 -33
- package/dist/v1/operations/dynamics/propagation.js.map +1 -1
- package/dist/v1/operations/dynamics/revision.d.ts +6 -6
- package/dist/v1/operations/dynamics/revision.js +31 -19
- package/dist/v1/operations/dynamics/revision.js.map +1 -1
- package/dist/v1/operations/index.js +9 -5
- package/dist/v1/operations/index.js.map +1 -1
- package/dist/v1/operations/lucern.d.ts +4 -2
- package/dist/v1/operations/lucern.js +179 -76
- package/dist/v1/operations/lucern.js.map +1 -1
- package/dist/v1/operations/operatorTaxonomy.d.ts +23 -1
- package/dist/v1/operations/operatorTaxonomy.js +28 -0
- package/dist/v1/operations/operatorTaxonomy.js.map +1 -1
- package/dist/v1/operations/scoring.d.ts +30 -12
- package/dist/v1/operations/scoring.js +82 -40
- package/dist/v1/operations/scoring.js.map +1 -1
- package/dist/v1/operations/subjectiveLogic/index.d.ts +20 -19
- package/dist/v1/operations/subjectiveLogic/index.js +11 -10
- package/dist/v1/operations/subjectiveLogic/index.js.map +1 -1
- package/dist/v1/operations/temporalDecay.js +9 -5
- package/dist/v1/operations/temporalDecay.js.map +1 -1
- package/dist/v1/types.d.ts +5 -1
- package/package.json +5 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/v1/operations/subjectiveLogic/index.ts
|
|
2
|
-
function
|
|
3
|
-
const b =
|
|
4
|
-
const d =
|
|
5
|
-
const u =
|
|
2
|
+
function mkOpinion(belief, disbelief, uncertainty, baseRate) {
|
|
3
|
+
const b = Number.isFinite(belief) ? Math.max(0, belief) : 0;
|
|
4
|
+
const d = Number.isFinite(disbelief) ? Math.max(0, disbelief) : 0;
|
|
5
|
+
const u = Number.isFinite(uncertainty) ? Math.max(0, uncertainty) : 0;
|
|
6
6
|
const a = Math.max(0, Math.min(1, baseRate));
|
|
7
7
|
const sum = b + d + u;
|
|
8
8
|
if (sum === 0) {
|
|
@@ -15,8 +15,9 @@ function opinion(belief, disbelief, uncertainty, baseRate = 0.5) {
|
|
|
15
15
|
a
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
var opinion = mkOpinion;
|
|
19
|
+
function vacuous(baseRate) {
|
|
20
|
+
return mkOpinion(0, 0, 1, baseRate);
|
|
20
21
|
}
|
|
21
22
|
function project(o) {
|
|
22
23
|
return o.b + o.a * o.u;
|
|
@@ -159,7 +160,7 @@ function conditionalDeduction(opinionA, ifTrue, ifFalse, fallbackBaseRate) {
|
|
|
159
160
|
);
|
|
160
161
|
}
|
|
161
162
|
function negate(o) {
|
|
162
|
-
return
|
|
163
|
+
return mkOpinion(o.d, o.b, o.u, 1 - o.a);
|
|
163
164
|
}
|
|
164
165
|
function constraintFusion(left, right, mode = "pressure") {
|
|
165
166
|
if (mode === "redistribute") {
|
|
@@ -205,7 +206,14 @@ function constraintFusion(left, right, mode = "pressure") {
|
|
|
205
206
|
|
|
206
207
|
// src/v1/operations/dynamics/cascade.ts
|
|
207
208
|
function dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode = "continuous", threshold = 0.3) {
|
|
208
|
-
const dependencyProjection = project(
|
|
209
|
+
const dependencyProjection = project(
|
|
210
|
+
mkOpinion(
|
|
211
|
+
dependencyOpinion.b,
|
|
212
|
+
dependencyOpinion.d,
|
|
213
|
+
dependencyOpinion.u,
|
|
214
|
+
dependencyOpinion.a
|
|
215
|
+
)
|
|
216
|
+
);
|
|
209
217
|
if (mode === "threshold") {
|
|
210
218
|
if (dependencyProjection < threshold) {
|
|
211
219
|
return opinion(
|
|
@@ -230,40 +238,49 @@ function dampedDependencyCascade(dependencyOpinion, beliefOpinion, mode = "conti
|
|
|
230
238
|
opinion: dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode),
|
|
231
239
|
operator: "dependency_cascade",
|
|
232
240
|
rationale: `Damped dependency cascade (${mode}): prerequisite at ${project(
|
|
233
|
-
|
|
241
|
+
mkOpinion(
|
|
242
|
+
dependencyOpinion.b,
|
|
243
|
+
dependencyOpinion.d,
|
|
244
|
+
dependencyOpinion.u,
|
|
245
|
+
dependencyOpinion.a
|
|
246
|
+
)
|
|
234
247
|
).toFixed(2)}`
|
|
235
248
|
};
|
|
236
249
|
}
|
|
237
250
|
|
|
238
251
|
// src/v1/operations/dynamics/defeat.ts
|
|
239
252
|
function applyNegativeSupport(source, target, weight, metadata = {}) {
|
|
253
|
+
const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);
|
|
254
|
+
const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);
|
|
240
255
|
if (metadata.constraint === "xor") {
|
|
241
256
|
const result = constraintFusion(
|
|
242
|
-
|
|
243
|
-
|
|
257
|
+
sourceOpinion,
|
|
258
|
+
targetOpinion,
|
|
244
259
|
metadata.normalization ?? "pressure"
|
|
245
260
|
);
|
|
246
261
|
return {
|
|
247
262
|
opinion: result.o2,
|
|
248
263
|
operator: "constraint_fusion",
|
|
249
|
-
rationale: `XOR constraint: source belief at ${project(
|
|
250
|
-
|
|
251
|
-
)} pressures target`
|
|
264
|
+
rationale: `XOR constraint: source belief at ${project(
|
|
265
|
+
sourceOpinion
|
|
266
|
+
).toFixed(2)} pressures target`
|
|
252
267
|
};
|
|
253
268
|
}
|
|
254
|
-
const discounted = trustDiscount(negate(
|
|
269
|
+
const discounted = trustDiscount(negate(sourceOpinion), Math.abs(weight));
|
|
255
270
|
return {
|
|
256
|
-
opinion: cumulativeFusion(
|
|
271
|
+
opinion: cumulativeFusion(targetOpinion, discounted),
|
|
257
272
|
operator: "cumulative_fusion",
|
|
258
273
|
rationale: `Contradicting evidence (weight=${weight.toFixed(
|
|
259
274
|
2
|
|
260
|
-
)}) from source at ${project(
|
|
275
|
+
)}) from source at ${project(sourceOpinion).toFixed(2)}`
|
|
261
276
|
};
|
|
262
277
|
}
|
|
263
278
|
function applyNegativeEvidence(source, target, weight) {
|
|
264
|
-
const
|
|
279
|
+
const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);
|
|
280
|
+
const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);
|
|
281
|
+
const discounted = trustDiscount(negate(sourceOpinion), Math.abs(weight));
|
|
265
282
|
return {
|
|
266
|
-
opinion: cumulativeFusion(
|
|
283
|
+
opinion: cumulativeFusion(targetOpinion, discounted),
|
|
267
284
|
operator: "cumulative_fusion",
|
|
268
285
|
rationale: `Contradicting evidence (weight=${weight.toFixed(2)})`
|
|
269
286
|
};
|
|
@@ -274,28 +291,32 @@ var EDGE_PROPAGATION_RULES = {
|
|
|
274
291
|
supports: {
|
|
275
292
|
direction: "outgoing",
|
|
276
293
|
handler: (source, target, weight, metadata) => {
|
|
294
|
+
const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);
|
|
295
|
+
const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);
|
|
277
296
|
if (weight < 0) {
|
|
278
|
-
return applyNegativeSupport(
|
|
297
|
+
return applyNegativeSupport(sourceOpinion, targetOpinion, weight, metadata);
|
|
279
298
|
}
|
|
280
|
-
const discounted = trustDiscount(
|
|
299
|
+
const discounted = trustDiscount(sourceOpinion, weight);
|
|
281
300
|
return {
|
|
282
|
-
opinion: cumulativeFusion(
|
|
301
|
+
opinion: cumulativeFusion(targetOpinion, discounted),
|
|
283
302
|
operator: "cumulative_fusion",
|
|
284
303
|
rationale: `Supporting evidence (weight=${weight.toFixed(
|
|
285
304
|
2
|
|
286
|
-
)}) from source at ${project(
|
|
305
|
+
)}) from source at ${project(sourceOpinion).toFixed(2)}`
|
|
287
306
|
};
|
|
288
307
|
}
|
|
289
308
|
},
|
|
290
309
|
informs: {
|
|
291
310
|
direction: "outgoing",
|
|
292
311
|
handler: (source, target, weight) => {
|
|
312
|
+
const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);
|
|
313
|
+
const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);
|
|
293
314
|
if (weight < 0) {
|
|
294
|
-
return applyNegativeEvidence(
|
|
315
|
+
return applyNegativeEvidence(sourceOpinion, targetOpinion, weight);
|
|
295
316
|
}
|
|
296
|
-
const discounted = trustDiscount(
|
|
317
|
+
const discounted = trustDiscount(sourceOpinion, Math.abs(weight));
|
|
297
318
|
return {
|
|
298
|
-
opinion: cumulativeFusion(
|
|
319
|
+
opinion: cumulativeFusion(targetOpinion, discounted),
|
|
299
320
|
operator: "cumulative_fusion",
|
|
300
321
|
rationale: `Supporting evidence (weight=${weight.toFixed(2)})`
|
|
301
322
|
};
|
|
@@ -304,23 +325,35 @@ var EDGE_PROPAGATION_RULES = {
|
|
|
304
325
|
depends_on: {
|
|
305
326
|
direction: "incoming",
|
|
306
327
|
handler: (source, target, _weight, metadata) => {
|
|
328
|
+
const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);
|
|
329
|
+
const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);
|
|
307
330
|
if (metadata.conditionalA && metadata.conditionalNotA) {
|
|
308
331
|
return {
|
|
309
332
|
opinion: conditionalDeduction(
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
333
|
+
sourceOpinion,
|
|
334
|
+
mkOpinion(
|
|
335
|
+
metadata.conditionalA.b,
|
|
336
|
+
metadata.conditionalA.d,
|
|
337
|
+
metadata.conditionalA.u,
|
|
338
|
+
metadata.conditionalA.a
|
|
339
|
+
),
|
|
340
|
+
mkOpinion(
|
|
341
|
+
metadata.conditionalNotA.b,
|
|
342
|
+
metadata.conditionalNotA.d,
|
|
343
|
+
metadata.conditionalNotA.u,
|
|
344
|
+
metadata.conditionalNotA.a
|
|
345
|
+
),
|
|
346
|
+
targetOpinion.a
|
|
314
347
|
),
|
|
315
348
|
operator: "conditional_deduction",
|
|
316
349
|
rationale: `Conditional deduction: prerequisite at ${project(
|
|
317
|
-
|
|
350
|
+
sourceOpinion
|
|
318
351
|
).toFixed(2)}`
|
|
319
352
|
};
|
|
320
353
|
}
|
|
321
354
|
return dampedDependencyCascade(
|
|
322
|
-
|
|
323
|
-
|
|
355
|
+
sourceOpinion,
|
|
356
|
+
targetOpinion,
|
|
324
357
|
metadata.propagation ?? "continuous"
|
|
325
358
|
);
|
|
326
359
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/v1/operations/subjectiveLogic/index.ts","../../../../src/v1/operations/dynamics/cascade.ts","../../../../src/v1/operations/dynamics/defeat.ts","../../../../src/v1/operations/dynamics/propagation.ts"],"names":[],"mappings":"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","file":"propagation.js","sourcesContent":["import type { Opinion } from \"../../types\";\n\nexport function opinion(\n belief: number,\n disbelief: number,\n uncertainty: number,\n baseRate: number = 0.5\n): Opinion {\n const b = Math.max(0, Math.min(1, belief));\n const d = Math.max(0, Math.min(1, disbelief));\n const u = Math.max(0, Math.min(1, uncertainty));\n const a = Math.max(0, Math.min(1, baseRate));\n const sum = b + d + u;\n\n if (sum === 0) {\n return { b: 0, d: 0, u: 1, a };\n }\n\n return {\n b: b / sum,\n d: d / sum,\n u: u / sum,\n a,\n };\n}\n\nexport function vacuous(baseRate: number = 0.5): Opinion {\n return { b: 0, d: 0, u: 1, a: baseRate };\n}\n\nexport function dogmatic(probability: number, baseRate: number = 0.5): Opinion {\n const p = Math.max(0, Math.min(1, probability));\n return { b: p, d: 1 - p, u: 0, a: baseRate };\n}\n\nexport function project(o: Opinion): number {\n return o.b + o.a * o.u;\n}\n\nexport function confidenceLevel(o: Opinion): \"high\" | \"medium\" | \"low\" {\n const projected = project(o);\n if (o.u > 0.5) {\n return \"low\";\n }\n if (projected >= 0.8 && o.u < 0.2) {\n return \"high\";\n }\n if (projected >= 0.6) {\n return \"medium\";\n }\n return \"low\";\n}\n\nexport function cumulativeFusion(left: Opinion, right: Opinion): Opinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u - left.u * right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function averagingFusion(left: Opinion, right: Opinion): Opinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (2 * left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function trustDiscount(sourceOpinion: Opinion, trust: number): Opinion {\n const weight = Math.max(0, Math.min(1, Math.abs(trust)));\n return opinion(\n weight * sourceOpinion.b,\n weight * sourceOpinion.d,\n 1 - weight * (sourceOpinion.b + sourceOpinion.d),\n sourceOpinion.a\n );\n}\n\nconst EPSILON = 1e-9;\n\nfunction childBaseRateFallback(\n ifTrue: Opinion,\n ifFalse: Opinion,\n fallbackBaseRate: number | undefined\n): number {\n if (fallbackBaseRate !== undefined) {\n return Math.max(0, Math.min(1, fallbackBaseRate));\n }\n\n if (Math.abs(ifTrue.a - ifFalse.a) <= EPSILON) {\n return ifTrue.a;\n }\n\n return (ifTrue.a + ifFalse.a) / 2;\n}\n\nfunction computeConditionalDeductionBaseRate(\n opinionA: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\n fallbackBaseRate: number\n): number {\n const denominator =\n 1 - opinionA.a * ifTrue.u - (1 - opinionA.a) * ifFalse.u;\n\n if (ifTrue.u + ifFalse.u < 2 - EPSILON && Math.abs(denominator) > EPSILON) {\n const baseRate =\n (opinionA.a * ifTrue.b + (1 - opinionA.a) * ifFalse.b) / denominator;\n if (baseRate >= -EPSILON && baseRate <= 1 + EPSILON) {\n return Math.max(0, Math.min(1, baseRate));\n }\n }\n\n return fallbackBaseRate;\n}\n\nfunction safeCorrectionTerm(\n numerator: number,\n denominator: number\n): number | undefined {\n if (Math.abs(denominator) <= EPSILON) {\n return undefined;\n }\n\n const value = numerator / denominator;\n if (!Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, value);\n}\n\nexport function conditionalDeduction(\n opinionA: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\n fallbackBaseRate?: number\n): Opinion {\n const fallbackChildBaseRate = childBaseRateFallback(\n ifTrue,\n ifFalse,\n fallbackBaseRate\n );\n const childBaseRate = computeConditionalDeductionBaseRate(\n opinionA,\n ifTrue,\n ifFalse,\n fallbackChildBaseRate\n );\n const projectedAntecedent = project(opinionA);\n const projectedAntecedentComplement = 1 - projectedAntecedent;\n const intermediateBelief =\n opinionA.b * ifTrue.b +\n opinionA.d * ifFalse.b +\n opinionA.u * (ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a));\n const intermediateDisbelief =\n opinionA.b * ifTrue.d +\n opinionA.d * ifFalse.d +\n opinionA.u * (ifTrue.d * opinionA.a + ifFalse.d * (1 - opinionA.a));\n const intermediateUncertainty =\n opinionA.b * ifTrue.u +\n opinionA.d * ifFalse.u +\n opinionA.u * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedVacuousDeduction =\n ifTrue.b * opinionA.a +\n ifFalse.b * (1 - opinionA.a) +\n childBaseRate *\n (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedConditionalA =\n ifTrue.b + childBaseRate * (1 - ifTrue.b - ifTrue.d);\n let correction = 0;\n\n if (\n (ifTrue.b > ifFalse.b && ifTrue.d > ifFalse.d) ||\n (ifTrue.b <= ifFalse.b && ifTrue.d <= ifFalse.d)\n ) {\n correction = 0;\n } else if (ifTrue.b > ifFalse.b && ifTrue.d <= ifFalse.d) {\n const beliefGap = ifTrue.b - ifFalse.b;\n const disbeliefGap = ifFalse.d - ifTrue.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedent * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,\n projectedAntecedentComplement * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedent * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedentComplement * (1 - childBaseRate)\n ) ?? 0;\n }\n } else {\n const beliefGap = ifFalse.b - ifTrue.b;\n const disbeliefGap = ifTrue.d - ifFalse.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateDisbelief - ifTrue.d) *\n beliefGap,\n projectedAntecedent * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedentComplement * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedent * (1 - childBaseRate)\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n opinionA.a *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedentComplement * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n }\n }\n\n return opinion(\n intermediateBelief - childBaseRate * correction,\n intermediateDisbelief - (1 - childBaseRate) * correction,\n intermediateUncertainty + correction,\n childBaseRate\n );\n}\n\n/**\n * Abductive inference over a conditional.\n * Given an opinion on Y and conditionals P(Y|X), P(Y|~X), infer an opinion on X.\n */\nexport function conditionalAbduction(\n opinionY: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\n baseRateX: number\n): Opinion {\n const priorX = Math.max(0, Math.min(1, baseRateX));\n const probabilityY = project(opinionY);\n const probabilityGivenTrue = project(ifTrue);\n const probabilityGivenFalse = project(ifFalse);\n\n const posteriorIfYDenominator =\n probabilityGivenTrue * priorX +\n probabilityGivenFalse * (1 - priorX);\n const posteriorIfY =\n posteriorIfYDenominator === 0\n ? priorX\n : (probabilityGivenTrue * priorX) / posteriorIfYDenominator;\n\n const posteriorIfNotYDenominator =\n (1 - probabilityGivenTrue) * priorX +\n (1 - probabilityGivenFalse) * (1 - priorX);\n const posteriorIfNotY =\n posteriorIfNotYDenominator === 0\n ? priorX\n : ((1 - probabilityGivenTrue) * priorX) / posteriorIfNotYDenominator;\n\n const projectedX =\n probabilityY * posteriorIfY + (1 - probabilityY) * posteriorIfNotY;\n const uncertainty = Math.max(\n opinionY.u * 0.5,\n probabilityY * ifTrue.u + (1 - probabilityY) * ifFalse.u\n );\n\n return opinion(\n projectedX * (1 - uncertainty),\n (1 - projectedX) * (1 - uncertainty),\n uncertainty,\n priorX\n );\n}\n\nexport function negate(o: Opinion): Opinion {\n return { b: o.d, d: o.b, u: o.u, a: 1 - o.a };\n}\n\nexport function constraintFusion(\n left: Opinion,\n right: Opinion,\n mode: \"pressure\" | \"redistribute\" = \"pressure\"\n): { o1: Opinion; o2: Opinion } {\n if (mode === \"redistribute\") {\n const leftProjected = project(left);\n const rightProjected = project(right);\n const total = leftProjected + rightProjected;\n\n if (total <= 1) {\n return { o1: left, o2: right };\n }\n\n const scale = 1 / total;\n return {\n o1: opinion(\n left.b * scale,\n left.d + left.b * (1 - scale),\n left.u,\n left.a\n ),\n o2: opinion(\n right.b * scale,\n right.d + right.b * (1 - scale),\n right.u,\n right.a\n ),\n };\n }\n\n const pressureLeft = right.b * 0.5;\n const pressureRight = left.b * 0.5;\n\n return {\n o1: opinion(\n left.b - pressureLeft * 0.3,\n left.d + pressureLeft * 0.3,\n left.u,\n left.a\n ),\n o2: opinion(\n right.b - pressureRight * 0.3,\n right.d + pressureRight * 0.3,\n right.u,\n right.a\n ),\n };\n}\n\nexport function evidenceBalance(o: Opinion): number {\n const total = o.b + o.d;\n if (total === 0) {\n return 0;\n }\n return (o.b - o.d) / total;\n}\n\nexport function areTensioned(left: Opinion, right: Opinion): boolean {\n return (\n project(left) > 0.5 &&\n project(right) > 0.5 &&\n (left.d > 0.2 || right.d > 0.2)\n );\n}\n\nexport function informationGain(o: Opinion): number {\n if (o.u === 0) {\n return 0;\n }\n if (o.u === 1) {\n return 1;\n }\n return o.u * (1 - Math.abs(o.b - o.d));\n}\n","import type { Opinion, PropagationMode, PropagationResult } from \"../../types\";\nimport { opinion, project } from \"../subjectiveLogic\";\n\nexport function dampedDependencyOpinion(\n dependencyOpinion: Opinion,\n beliefOpinion: Opinion,\n mode: PropagationMode = \"continuous\",\n threshold: number = 0.3\n): Opinion {\n const dependencyProjection = project(dependencyOpinion);\n\n if (mode === \"threshold\") {\n if (dependencyProjection < threshold) {\n return opinion(\n 0,\n beliefOpinion.d + beliefOpinion.b * 0.5,\n 0.5,\n beliefOpinion.a\n );\n }\n return beliefOpinion;\n }\n\n const dampingFactor = Math.pow(dependencyProjection, 0.5);\n return opinion(\n beliefOpinion.b * dampingFactor,\n beliefOpinion.d + beliefOpinion.b * (1 - dampingFactor) * 0.3,\n beliefOpinion.u + beliefOpinion.b * (1 - dampingFactor) * 0.7,\n beliefOpinion.a\n );\n}\n\nexport function dampedDependencyCascade(\n dependencyOpinion: Opinion,\n beliefOpinion: Opinion,\n mode: PropagationMode = \"continuous\"\n): PropagationResult {\n return {\n opinion: dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode),\n operator: \"dependency_cascade\",\n rationale: `Damped dependency cascade (${mode}): prerequisite at ${project(\n dependencyOpinion\n ).toFixed(2)}`,\n };\n}\n","import type { EdgeMetadata, Opinion, PropagationResult } from \"../../types\";\nimport {\n constraintFusion,\n cumulativeFusion,\n negate,\n project,\n trustDiscount,\n} from \"../subjectiveLogic\";\n\nexport function applyNegativeSupport(\n source: Opinion,\n target: Opinion,\n weight: number,\n metadata: EdgeMetadata = {}\n): PropagationResult {\n if (metadata.constraint === \"xor\") {\n const result = constraintFusion(\n source,\n target,\n metadata.normalization ?? \"pressure\"\n );\n return {\n opinion: result.o2,\n operator: \"constraint_fusion\",\n rationale: `XOR constraint: source belief at ${project(source).toFixed(\n 2\n )} pressures target`,\n };\n }\n\n const discounted = trustDiscount(negate(source), Math.abs(weight));\n return {\n opinion: cumulativeFusion(target, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Contradicting evidence (weight=${weight.toFixed(\n 2\n )}) from source at ${project(source).toFixed(2)}`,\n };\n}\n\nexport function applyNegativeEvidence(\n source: Opinion,\n target: Opinion,\n weight: number\n): PropagationResult {\n const discounted = trustDiscount(negate(source), Math.abs(weight));\n return {\n opinion: cumulativeFusion(target, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Contradicting evidence (weight=${weight.toFixed(2)})`,\n };\n}\n","import type {\n EdgeMetadata,\n Opinion,\n PropagationResult,\n SLOperator,\n} from \"../../types\";\nimport { dampedDependencyCascade } from \"./cascade\";\nimport { applyNegativeEvidence, applyNegativeSupport } from \"./defeat\";\nimport {\n conditionalDeduction,\n cumulativeFusion,\n project,\n trustDiscount,\n} from \"../subjectiveLogic\";\n\ntype EdgeHandler = (\n source: Opinion,\n target: Opinion,\n weight: number,\n metadata: EdgeMetadata\n) => PropagationResult;\n\nexport type PropagationTraversalDirection = \"outgoing\" | \"incoming\";\n\ntype EdgePropagationRule = {\n direction: PropagationTraversalDirection;\n handler: EdgeHandler;\n};\n\nconst EDGE_PROPAGATION_RULES = {\n supports: {\n direction: \"outgoing\",\n handler: (source, target, weight, metadata) => {\n if (weight < 0) {\n return applyNegativeSupport(source, target, weight, metadata);\n }\n\n const discounted = trustDiscount(source, weight);\n return {\n opinion: cumulativeFusion(target, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${weight.toFixed(\n 2\n )}) from source at ${project(source).toFixed(2)}`,\n };\n },\n },\n informs: {\n direction: \"outgoing\",\n handler: (source, target, weight) => {\n if (weight < 0) {\n return applyNegativeEvidence(source, target, weight);\n }\n\n const discounted = trustDiscount(source, Math.abs(weight));\n return {\n opinion: cumulativeFusion(target, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${weight.toFixed(2)})`,\n };\n },\n },\n depends_on: {\n direction: \"incoming\",\n handler: (source, target, _weight, metadata) => {\n if (metadata.conditionalA && metadata.conditionalNotA) {\n return {\n opinion: conditionalDeduction(\n source,\n metadata.conditionalA,\n metadata.conditionalNotA,\n target.a\n ),\n operator: \"conditional_deduction\",\n rationale: `Conditional deduction: prerequisite at ${project(\n source\n ).toFixed(2)}`,\n };\n }\n\n return dampedDependencyCascade(\n source,\n target,\n metadata.propagation ?? \"continuous\"\n );\n },\n },\n derived_from: {\n direction: \"incoming\",\n handler: (_source, target) => ({\n opinion: target,\n operator: \"trust_discount\",\n rationale: \"Provenance edge — no confidence propagation\",\n }),\n },\n contains: {\n direction: \"outgoing\",\n handler: (_source, target) => ({\n opinion: target,\n operator: \"trust_discount\",\n rationale: \"Containment edge — no confidence propagation\",\n }),\n },\n tests: {\n direction: \"outgoing\",\n handler: (_source, target) => ({\n opinion: target,\n operator: \"trust_discount\",\n rationale: \"Testing edge — no confidence propagation\",\n }),\n },\n} satisfies Record<string, EdgePropagationRule>;\n\nexport type PropagationEdgeType = keyof typeof EDGE_PROPAGATION_RULES;\n\nexport type PropagationTraversalSpec = {\n edgeType: PropagationEdgeType;\n direction: PropagationTraversalDirection;\n};\n\nexport const PROPAGATION_TRAVERSAL_SPECS: readonly PropagationTraversalSpec[] =\n Object.entries(EDGE_PROPAGATION_RULES).map(([edgeType, rule]) => ({\n edgeType: edgeType as PropagationEdgeType,\n direction: rule.direction,\n }));\n\nexport function isPropagationEdgeType(\n edgeType: string\n): edgeType is PropagationEdgeType {\n return edgeType in EDGE_PROPAGATION_RULES;\n}\n\nexport function getPropagationTraversalSpecs(): readonly PropagationTraversalSpec[] {\n return PROPAGATION_TRAVERSAL_SPECS;\n}\n\nexport function propagateThroughEdge(\n sourceOpinion: Opinion,\n targetOpinion: Opinion,\n edgeType: string,\n weight: number = 1,\n metadata: EdgeMetadata = {}\n): PropagationResult {\n const handler = isPropagationEdgeType(edgeType)\n ? EDGE_PROPAGATION_RULES[edgeType].handler\n : undefined;\n if (!handler) {\n return {\n opinion: targetOpinion,\n operator: \"manual_assessment\",\n rationale: `Unknown edge type: ${edgeType} — no propagation`,\n };\n }\n return handler(sourceOpinion, targetOpinion, weight, metadata);\n}\n\nexport function propagateAllEdges(\n currentOpinion: Opinion,\n incomingEdges: Array<{\n sourceOpinion: Opinion;\n edgeType: string;\n weight: number;\n metadata: EdgeMetadata;\n }>\n): PropagationResult {\n let result = currentOpinion;\n const rationales: string[] = [];\n\n for (const edgeType of [\"depends_on\", \"informs\", \"supports\"]) {\n for (const incoming of incomingEdges.filter((edge) => edge.edgeType === edgeType)) {\n const propagated = propagateThroughEdge(\n incoming.sourceOpinion,\n result,\n incoming.edgeType,\n incoming.weight,\n incoming.metadata\n );\n result = propagated.opinion;\n rationales.push(propagated.rationale);\n }\n }\n\n return {\n opinion: result,\n operator: \"cumulative_fusion\" as SLOperator,\n rationale: rationales.join(\"; \"),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/v1/operations/subjectiveLogic/index.ts","../../../../src/v1/operations/dynamics/cascade.ts","../../../../src/v1/operations/dynamics/defeat.ts","../../../../src/v1/operations/dynamics/propagation.ts"],"names":[],"mappings":"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","file":"propagation.js","sourcesContent":["import type { SLOpinion } from \"../../types\";\n\nexport function mkOpinion(\n belief: number,\n disbelief: number,\n uncertainty: number,\n baseRate: number\n): SLOpinion {\n const b = Number.isFinite(belief) ? Math.max(0, belief) : 0;\n const d = Number.isFinite(disbelief) ? Math.max(0, disbelief) : 0;\n const u = Number.isFinite(uncertainty) ? Math.max(0, uncertainty) : 0;\n const a = Math.max(0, Math.min(1, baseRate));\n const sum = b + d + u;\n\n if (sum === 0) {\n return { b: 0, d: 0, u: 1, a } as SLOpinion;\n }\n\n return {\n b: b / sum,\n d: d / sum,\n u: u / sum,\n a,\n } as SLOpinion;\n}\n\nexport const opinion = mkOpinion;\n\nexport function vacuous(baseRate: number): SLOpinion {\n return mkOpinion(0, 0, 1, baseRate);\n}\n\nexport function dogmatic(probability: number, baseRate: number): SLOpinion {\n const p = Math.max(0, Math.min(1, probability));\n return mkOpinion(p, 1 - p, 0, baseRate);\n}\n\nexport function project(o: SLOpinion): number {\n return o.b + o.a * o.u;\n}\n\nexport function confidenceLevel(o: SLOpinion): \"high\" | \"medium\" | \"low\" {\n const projected = project(o);\n if (o.u > 0.5) {\n return \"low\";\n }\n if (projected >= 0.8 && o.u < 0.2) {\n return \"high\";\n }\n if (projected >= 0.6) {\n return \"medium\";\n }\n return \"low\";\n}\n\nexport function cumulativeFusion(left: SLOpinion, right: SLOpinion): SLOpinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u - left.u * right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function averagingFusion(left: SLOpinion, right: SLOpinion): SLOpinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (2 * left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function trustDiscount(sourceOpinion: SLOpinion, trust: number): SLOpinion {\n const weight = Math.max(0, Math.min(1, Math.abs(trust)));\n return opinion(\n weight * sourceOpinion.b,\n weight * sourceOpinion.d,\n 1 - weight * (sourceOpinion.b + sourceOpinion.d),\n sourceOpinion.a\n );\n}\n\nconst EPSILON = 1e-9;\n\nfunction childBaseRateFallback(\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate: number | undefined\n): number {\n if (fallbackBaseRate !== undefined) {\n return Math.max(0, Math.min(1, fallbackBaseRate));\n }\n\n if (Math.abs(ifTrue.a - ifFalse.a) <= EPSILON) {\n return ifTrue.a;\n }\n\n return (ifTrue.a + ifFalse.a) / 2;\n}\n\nfunction computeConditionalDeductionBaseRate(\n opinionA: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate: number\n): number {\n const denominator =\n 1 - opinionA.a * ifTrue.u - (1 - opinionA.a) * ifFalse.u;\n\n if (ifTrue.u + ifFalse.u < 2 - EPSILON && Math.abs(denominator) > EPSILON) {\n const baseRate =\n (opinionA.a * ifTrue.b + (1 - opinionA.a) * ifFalse.b) / denominator;\n if (baseRate >= -EPSILON && baseRate <= 1 + EPSILON) {\n return Math.max(0, Math.min(1, baseRate));\n }\n }\n\n return fallbackBaseRate;\n}\n\nfunction safeCorrectionTerm(\n numerator: number,\n denominator: number\n): number | undefined {\n if (Math.abs(denominator) <= EPSILON) {\n return undefined;\n }\n\n const value = numerator / denominator;\n if (!Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, value);\n}\n\nexport function conditionalDeduction(\n opinionA: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate?: number\n): SLOpinion {\n const fallbackChildBaseRate = childBaseRateFallback(\n ifTrue,\n ifFalse,\n fallbackBaseRate\n );\n const childBaseRate = computeConditionalDeductionBaseRate(\n opinionA,\n ifTrue,\n ifFalse,\n fallbackChildBaseRate\n );\n const projectedAntecedent = project(opinionA);\n const projectedAntecedentComplement = 1 - projectedAntecedent;\n const intermediateBelief =\n opinionA.b * ifTrue.b +\n opinionA.d * ifFalse.b +\n opinionA.u * (ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a));\n const intermediateDisbelief =\n opinionA.b * ifTrue.d +\n opinionA.d * ifFalse.d +\n opinionA.u * (ifTrue.d * opinionA.a + ifFalse.d * (1 - opinionA.a));\n const intermediateUncertainty =\n opinionA.b * ifTrue.u +\n opinionA.d * ifFalse.u +\n opinionA.u * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedVacuousDeduction =\n ifTrue.b * opinionA.a +\n ifFalse.b * (1 - opinionA.a) +\n childBaseRate *\n (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedConditionalA =\n ifTrue.b + childBaseRate * (1 - ifTrue.b - ifTrue.d);\n let correction = 0;\n\n if (\n (ifTrue.b > ifFalse.b && ifTrue.d > ifFalse.d) ||\n (ifTrue.b <= ifFalse.b && ifTrue.d <= ifFalse.d)\n ) {\n correction = 0;\n } else if (ifTrue.b > ifFalse.b && ifTrue.d <= ifFalse.d) {\n const beliefGap = ifTrue.b - ifFalse.b;\n const disbeliefGap = ifFalse.d - ifTrue.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedent * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,\n projectedAntecedentComplement * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedent * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedentComplement * (1 - childBaseRate)\n ) ?? 0;\n }\n } else {\n const beliefGap = ifFalse.b - ifTrue.b;\n const disbeliefGap = ifTrue.d - ifFalse.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateDisbelief - ifTrue.d) *\n beliefGap,\n projectedAntecedent * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedentComplement * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedent * (1 - childBaseRate)\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n opinionA.a *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedentComplement * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n }\n }\n\n return opinion(\n intermediateBelief - childBaseRate * correction,\n intermediateDisbelief - (1 - childBaseRate) * correction,\n intermediateUncertainty + correction,\n childBaseRate\n );\n}\n\n/**\n * Abductive inference over a conditional.\n * Given an opinion on Y and conditionals P(Y|X), P(Y|~X), infer an opinion on X.\n */\nexport function conditionalAbduction(\n opinionY: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n baseRateX: number\n): SLOpinion {\n const priorX = Math.max(0, Math.min(1, baseRateX));\n const probabilityY = project(opinionY);\n const probabilityGivenTrue = project(ifTrue);\n const probabilityGivenFalse = project(ifFalse);\n\n const posteriorIfYDenominator =\n probabilityGivenTrue * priorX +\n probabilityGivenFalse * (1 - priorX);\n const posteriorIfY =\n posteriorIfYDenominator === 0\n ? priorX\n : (probabilityGivenTrue * priorX) / posteriorIfYDenominator;\n\n const posteriorIfNotYDenominator =\n (1 - probabilityGivenTrue) * priorX +\n (1 - probabilityGivenFalse) * (1 - priorX);\n const posteriorIfNotY =\n posteriorIfNotYDenominator === 0\n ? priorX\n : ((1 - probabilityGivenTrue) * priorX) / posteriorIfNotYDenominator;\n\n const projectedX =\n probabilityY * posteriorIfY + (1 - probabilityY) * posteriorIfNotY;\n const uncertainty = Math.max(\n opinionY.u * 0.5,\n probabilityY * ifTrue.u + (1 - probabilityY) * ifFalse.u\n );\n\n return opinion(\n projectedX * (1 - uncertainty),\n (1 - projectedX) * (1 - uncertainty),\n uncertainty,\n priorX\n );\n}\n\nexport function negate(o: SLOpinion): SLOpinion {\n return mkOpinion(o.d, o.b, o.u, 1 - o.a);\n}\n\nexport function constraintFusion(\n left: SLOpinion,\n right: SLOpinion,\n mode: \"pressure\" | \"redistribute\" = \"pressure\"\n): { o1: SLOpinion; o2: SLOpinion } {\n if (mode === \"redistribute\") {\n const leftProjected = project(left);\n const rightProjected = project(right);\n const total = leftProjected + rightProjected;\n\n if (total <= 1) {\n return { o1: left, o2: right };\n }\n\n const scale = 1 / total;\n return {\n o1: opinion(\n left.b * scale,\n left.d + left.b * (1 - scale),\n left.u,\n left.a\n ),\n o2: opinion(\n right.b * scale,\n right.d + right.b * (1 - scale),\n right.u,\n right.a\n ),\n };\n }\n\n const pressureLeft = right.b * 0.5;\n const pressureRight = left.b * 0.5;\n\n return {\n o1: opinion(\n left.b - pressureLeft * 0.3,\n left.d + pressureLeft * 0.3,\n left.u,\n left.a\n ),\n o2: opinion(\n right.b - pressureRight * 0.3,\n right.d + pressureRight * 0.3,\n right.u,\n right.a\n ),\n };\n}\n\nexport function evidenceBalance(o: SLOpinion): number {\n const total = o.b + o.d;\n if (total === 0) {\n return 0;\n }\n return (o.b - o.d) / total;\n}\n\nexport function areTensioned(left: SLOpinion, right: SLOpinion): boolean {\n return (\n project(left) > 0.5 &&\n project(right) > 0.5 &&\n (left.d > 0.2 || right.d > 0.2)\n );\n}\n\nexport function informationGain(o: SLOpinion): number {\n if (o.u === 0) {\n return 0;\n }\n if (o.u === 1) {\n return 1;\n }\n return o.u * (1 - Math.abs(o.b - o.d));\n}\n","import type { Opinion, PropagationMode, PropagationResult } from \"../../types\";\nimport { mkOpinion, opinion, project } from \"../subjectiveLogic\";\n\nexport function dampedDependencyOpinion(\n dependencyOpinion: Opinion,\n beliefOpinion: Opinion,\n mode: PropagationMode = \"continuous\",\n threshold: number = 0.3\n): Opinion {\n const dependencyProjection = project(\n mkOpinion(\n dependencyOpinion.b,\n dependencyOpinion.d,\n dependencyOpinion.u,\n dependencyOpinion.a\n )\n );\n\n if (mode === \"threshold\") {\n if (dependencyProjection < threshold) {\n return opinion(\n 0,\n beliefOpinion.d + beliefOpinion.b * 0.5,\n 0.5,\n beliefOpinion.a\n );\n }\n return beliefOpinion;\n }\n\n const dampingFactor = Math.pow(dependencyProjection, 0.5);\n return opinion(\n beliefOpinion.b * dampingFactor,\n beliefOpinion.d + beliefOpinion.b * (1 - dampingFactor) * 0.3,\n beliefOpinion.u + beliefOpinion.b * (1 - dampingFactor) * 0.7,\n beliefOpinion.a\n );\n}\n\nexport function dampedDependencyCascade(\n dependencyOpinion: Opinion,\n beliefOpinion: Opinion,\n mode: PropagationMode = \"continuous\"\n): PropagationResult {\n return {\n opinion: dampedDependencyOpinion(dependencyOpinion, beliefOpinion, mode),\n operator: \"dependency_cascade\",\n rationale: `Damped dependency cascade (${mode}): prerequisite at ${project(\n mkOpinion(\n dependencyOpinion.b,\n dependencyOpinion.d,\n dependencyOpinion.u,\n dependencyOpinion.a\n )\n ).toFixed(2)}`,\n };\n}\n","import type { EdgeMetadata, Opinion, PropagationResult } from \"../../types\";\nimport {\n constraintFusion,\n cumulativeFusion,\n mkOpinion,\n negate,\n project,\n trustDiscount,\n} from \"../subjectiveLogic\";\n\nexport function applyNegativeSupport(\n source: Opinion,\n target: Opinion,\n weight: number,\n metadata: EdgeMetadata = {}\n): PropagationResult {\n const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);\n const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);\n if (metadata.constraint === \"xor\") {\n const result = constraintFusion(\n sourceOpinion,\n targetOpinion,\n metadata.normalization ?? \"pressure\"\n );\n return {\n opinion: result.o2,\n operator: \"constraint_fusion\",\n rationale: `XOR constraint: source belief at ${project(\n sourceOpinion\n ).toFixed(2)} pressures target`,\n };\n }\n\n const discounted = trustDiscount(negate(sourceOpinion), Math.abs(weight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Contradicting evidence (weight=${weight.toFixed(\n 2\n )}) from source at ${project(sourceOpinion).toFixed(2)}`,\n };\n}\n\nexport function applyNegativeEvidence(\n source: Opinion,\n target: Opinion,\n weight: number\n): PropagationResult {\n const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);\n const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);\n const discounted = trustDiscount(negate(sourceOpinion), Math.abs(weight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Contradicting evidence (weight=${weight.toFixed(2)})`,\n };\n}\n","import type {\n EdgeMetadata,\n Opinion,\n PropagationResult,\n SLOperator,\n} from \"../../types\";\nimport { dampedDependencyCascade } from \"./cascade\";\nimport { applyNegativeEvidence, applyNegativeSupport } from \"./defeat\";\nimport {\n conditionalDeduction,\n cumulativeFusion,\n mkOpinion,\n project,\n trustDiscount,\n} from \"../subjectiveLogic\";\n\ntype EdgeHandler = (\n source: Opinion,\n target: Opinion,\n weight: number,\n metadata: EdgeMetadata\n) => PropagationResult;\n\nexport type PropagationTraversalDirection = \"outgoing\" | \"incoming\";\n\ntype EdgePropagationRule = {\n direction: PropagationTraversalDirection;\n handler: EdgeHandler;\n};\n\nconst EDGE_PROPAGATION_RULES = {\n supports: {\n direction: \"outgoing\",\n handler: (source, target, weight, metadata) => {\n const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);\n const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);\n if (weight < 0) {\n return applyNegativeSupport(sourceOpinion, targetOpinion, weight, metadata);\n }\n\n const discounted = trustDiscount(sourceOpinion, weight);\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${weight.toFixed(\n 2\n )}) from source at ${project(sourceOpinion).toFixed(2)}`,\n };\n },\n },\n informs: {\n direction: \"outgoing\",\n handler: (source, target, weight) => {\n const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);\n const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);\n if (weight < 0) {\n return applyNegativeEvidence(sourceOpinion, targetOpinion, weight);\n }\n\n const discounted = trustDiscount(sourceOpinion, Math.abs(weight));\n return {\n opinion: cumulativeFusion(targetOpinion, discounted),\n operator: \"cumulative_fusion\",\n rationale: `Supporting evidence (weight=${weight.toFixed(2)})`,\n };\n },\n },\n depends_on: {\n direction: \"incoming\",\n handler: (source, target, _weight, metadata) => {\n const sourceOpinion = mkOpinion(source.b, source.d, source.u, source.a);\n const targetOpinion = mkOpinion(target.b, target.d, target.u, target.a);\n if (metadata.conditionalA && metadata.conditionalNotA) {\n return {\n opinion: conditionalDeduction(\n sourceOpinion,\n mkOpinion(\n metadata.conditionalA.b,\n metadata.conditionalA.d,\n metadata.conditionalA.u,\n metadata.conditionalA.a\n ),\n mkOpinion(\n metadata.conditionalNotA.b,\n metadata.conditionalNotA.d,\n metadata.conditionalNotA.u,\n metadata.conditionalNotA.a\n ),\n targetOpinion.a\n ),\n operator: \"conditional_deduction\",\n rationale: `Conditional deduction: prerequisite at ${project(\n sourceOpinion\n ).toFixed(2)}`,\n };\n }\n\n return dampedDependencyCascade(\n sourceOpinion,\n targetOpinion,\n metadata.propagation ?? \"continuous\"\n );\n },\n },\n derived_from: {\n direction: \"incoming\",\n handler: (_source, target) => ({\n opinion: target,\n operator: \"trust_discount\",\n rationale: \"Provenance edge — no confidence propagation\",\n }),\n },\n contains: {\n direction: \"outgoing\",\n handler: (_source, target) => ({\n opinion: target,\n operator: \"trust_discount\",\n rationale: \"Containment edge — no confidence propagation\",\n }),\n },\n tests: {\n direction: \"outgoing\",\n handler: (_source, target) => ({\n opinion: target,\n operator: \"trust_discount\",\n rationale: \"Testing edge — no confidence propagation\",\n }),\n },\n} satisfies Record<string, EdgePropagationRule>;\n\nexport type PropagationEdgeType = keyof typeof EDGE_PROPAGATION_RULES;\n\nexport type PropagationTraversalSpec = {\n edgeType: PropagationEdgeType;\n direction: PropagationTraversalDirection;\n};\n\nexport const PROPAGATION_TRAVERSAL_SPECS: readonly PropagationTraversalSpec[] =\n Object.entries(EDGE_PROPAGATION_RULES).map(([edgeType, rule]) => ({\n edgeType: edgeType as PropagationEdgeType,\n direction: rule.direction,\n }));\n\nexport function isPropagationEdgeType(\n edgeType: string\n): edgeType is PropagationEdgeType {\n return edgeType in EDGE_PROPAGATION_RULES;\n}\n\nexport function getPropagationTraversalSpecs(): readonly PropagationTraversalSpec[] {\n return PROPAGATION_TRAVERSAL_SPECS;\n}\n\nexport function propagateThroughEdge(\n sourceOpinion: Opinion,\n targetOpinion: Opinion,\n edgeType: string,\n weight: number = 1,\n metadata: EdgeMetadata = {}\n): PropagationResult {\n const handler = isPropagationEdgeType(edgeType)\n ? EDGE_PROPAGATION_RULES[edgeType].handler\n : undefined;\n if (!handler) {\n return {\n opinion: targetOpinion,\n operator: \"manual_assessment\",\n rationale: `Unknown edge type: ${edgeType} — no propagation`,\n };\n }\n return handler(sourceOpinion, targetOpinion, weight, metadata);\n}\n\nexport function propagateAllEdges(\n currentOpinion: Opinion,\n incomingEdges: Array<{\n sourceOpinion: Opinion;\n edgeType: string;\n weight: number;\n metadata: EdgeMetadata;\n }>\n): PropagationResult {\n let result = currentOpinion;\n const rationales: string[] = [];\n\n for (const edgeType of [\"depends_on\", \"informs\", \"supports\"]) {\n for (const incoming of incomingEdges.filter((edge) => edge.edgeType === edgeType)) {\n const propagated = propagateThroughEdge(\n incoming.sourceOpinion,\n result,\n incoming.edgeType,\n incoming.weight,\n incoming.metadata\n );\n result = propagated.opinion;\n rationales.push(propagated.rationale);\n }\n }\n\n return {\n opinion: result,\n operator: \"cumulative_fusion\" as SLOperator,\n rationale: rationales.join(\"; \"),\n };\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SLOpinion } from '../../types.js';
|
|
2
2
|
|
|
3
|
-
declare function bayesianUpdate(priorConfidence: number, priorWeight: number, newAssessment: number, newWeight: number, options
|
|
4
|
-
baseRate
|
|
3
|
+
declare function bayesianUpdate(priorConfidence: number, priorWeight: number, newAssessment: number, newWeight: number, options: {
|
|
4
|
+
baseRate: number;
|
|
5
5
|
nonInformativeWeight?: number;
|
|
6
6
|
}): number;
|
|
7
7
|
declare function reviseConfidence(args: {
|
|
@@ -9,7 +9,7 @@ declare function reviseConfidence(args: {
|
|
|
9
9
|
priorWeight: number;
|
|
10
10
|
newAssessment: number;
|
|
11
11
|
newWeight?: number;
|
|
12
|
-
baseRate
|
|
12
|
+
baseRate: number;
|
|
13
13
|
nonInformativeWeight?: number;
|
|
14
14
|
}): number;
|
|
15
15
|
declare function reviseConfidenceOpinion(args: {
|
|
@@ -17,8 +17,8 @@ declare function reviseConfidenceOpinion(args: {
|
|
|
17
17
|
priorWeight: number;
|
|
18
18
|
newAssessment: number;
|
|
19
19
|
newWeight?: number;
|
|
20
|
-
baseRate
|
|
20
|
+
baseRate: number;
|
|
21
21
|
nonInformativeWeight?: number;
|
|
22
|
-
}):
|
|
22
|
+
}): SLOpinion;
|
|
23
23
|
|
|
24
24
|
export { bayesianUpdate, reviseConfidence, reviseConfidenceOpinion };
|
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
// src/v1/operations/subjectiveLogic/index.ts
|
|
2
|
+
function mkOpinion(belief, disbelief, uncertainty, baseRate) {
|
|
3
|
+
const b = Number.isFinite(belief) ? Math.max(0, belief) : 0;
|
|
4
|
+
const d = Number.isFinite(disbelief) ? Math.max(0, disbelief) : 0;
|
|
5
|
+
const u = Number.isFinite(uncertainty) ? Math.max(0, uncertainty) : 0;
|
|
6
|
+
const a = Math.max(0, Math.min(1, baseRate));
|
|
7
|
+
const sum = b + d + u;
|
|
8
|
+
if (sum === 0) {
|
|
9
|
+
return { b: 0, d: 0, u: 1, a };
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
b: b / sum,
|
|
13
|
+
d: d / sum,
|
|
14
|
+
u: u / sum,
|
|
15
|
+
a
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function project(o) {
|
|
19
|
+
return o.b + o.a * o.u;
|
|
20
|
+
}
|
|
21
|
+
|
|
1
22
|
// src/v1/operations/bridge/index.ts
|
|
2
23
|
var DEFAULT_NON_INFORMATIVE_WEIGHT = 2;
|
|
3
24
|
function clamp01(value) {
|
|
@@ -16,10 +37,6 @@ function normalizeBaseRateVector(baseRate, size) {
|
|
|
16
37
|
if (size === 0) {
|
|
17
38
|
return [];
|
|
18
39
|
}
|
|
19
|
-
const fallback = Array.from({ length: size }, () => 1 / size);
|
|
20
|
-
if (!baseRate) {
|
|
21
|
-
return fallback;
|
|
22
|
-
}
|
|
23
40
|
if (baseRate.length !== size) {
|
|
24
41
|
throw new Error(
|
|
25
42
|
`Base-rate vector length ${baseRate.length} must match evidence vector length ${size}.`
|
|
@@ -28,11 +45,11 @@ function normalizeBaseRateVector(baseRate, size) {
|
|
|
28
45
|
const normalized = baseRate.map((value) => clampNonNegative(value));
|
|
29
46
|
const total = normalized.reduce((sum, value) => sum + value, 0);
|
|
30
47
|
if (total === 0) {
|
|
31
|
-
|
|
48
|
+
throw new Error("Base-rate vector must contain at least one positive value.");
|
|
32
49
|
}
|
|
33
50
|
return normalized.map((value) => value / total);
|
|
34
51
|
}
|
|
35
|
-
function opinionFromDirichlet(alpha, nonInformativeWeight
|
|
52
|
+
function opinionFromDirichlet(alpha, nonInformativeWeight, baseRate) {
|
|
36
53
|
const evidence = alpha.map((value) => clampNonNegative(value));
|
|
37
54
|
const safeWeight = normalizeNonInformativeWeight(nonInformativeWeight);
|
|
38
55
|
const normalizedBaseRate = normalizeBaseRateVector(baseRate, evidence.length);
|
|
@@ -51,23 +68,18 @@ function opinionFromDirichlet(alpha, nonInformativeWeight = DEFAULT_NON_INFORMAT
|
|
|
51
68
|
a: normalizedBaseRate
|
|
52
69
|
};
|
|
53
70
|
}
|
|
54
|
-
function opinionFromBeta(alpha, beta, nonInformativeWeight
|
|
71
|
+
function opinionFromBeta(alpha, beta, nonInformativeWeight, baseRate) {
|
|
55
72
|
const dirichlet = opinionFromDirichlet(
|
|
56
73
|
[alpha, beta],
|
|
57
74
|
nonInformativeWeight,
|
|
58
75
|
[clamp01(baseRate), 1 - clamp01(baseRate)]
|
|
59
76
|
);
|
|
60
|
-
return
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// src/v1/operations/subjectiveLogic/index.ts
|
|
69
|
-
function project(o) {
|
|
70
|
-
return o.b + o.a * o.u;
|
|
77
|
+
return mkOpinion(
|
|
78
|
+
dirichlet.b[0] ?? 0,
|
|
79
|
+
dirichlet.b[1] ?? 0,
|
|
80
|
+
dirichlet.u,
|
|
81
|
+
dirichlet.a[0] ?? clamp01(baseRate)
|
|
82
|
+
);
|
|
71
83
|
}
|
|
72
84
|
|
|
73
85
|
// src/v1/operations/dynamics/revision.ts
|
|
@@ -102,7 +114,7 @@ function reviseConfidenceOpinion(args) {
|
|
|
102
114
|
priorEvidence.alpha + newEvidence.alpha,
|
|
103
115
|
priorEvidence.beta + newEvidence.beta,
|
|
104
116
|
args.nonInformativeWeight ?? DEFAULT_NON_INFORMATIVE_WEIGHT,
|
|
105
|
-
args.baseRate
|
|
117
|
+
args.baseRate
|
|
106
118
|
);
|
|
107
119
|
}
|
|
108
120
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/v1/operations/bridge/index.ts","../../../../src/v1/operations/subjectiveLogic/index.ts","../../../../src/v1/operations/dynamics/revision.ts"],"names":["clamp01"],"mappings":"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","file":"revision.js","sourcesContent":["import type { DirichletOpinion, Opinion } from \"../../types\";\n\nexport const DEFAULT_NON_INFORMATIVE_WEIGHT = 2;\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction clampNonNegative(value: number): number {\n return Number.isFinite(value) ? Math.max(0, value) : 0;\n}\n\nfunction normalizeNonInformativeWeight(weight?: number): number {\n if (weight === undefined) {\n return DEFAULT_NON_INFORMATIVE_WEIGHT;\n }\n return Number.isFinite(weight)\n ? Math.max(0, weight)\n : DEFAULT_NON_INFORMATIVE_WEIGHT;\n}\n\nfunction normalizeBaseRateVector(\n baseRate: readonly number[] | undefined,\n size: number\n): number[] {\n if (size === 0) {\n return [];\n }\n\n const fallback = Array.from({ length: size }, () => 1 / size);\n if (!baseRate) {\n return fallback;\n }\n\n if (baseRate.length !== size) {\n throw new Error(\n `Base-rate vector length ${baseRate.length} must match evidence vector length ${size}.`\n );\n }\n\n const normalized = baseRate.map((value) => clampNonNegative(value));\n const total = normalized.reduce((sum, value) => sum + value, 0);\n\n if (total === 0) {\n return fallback;\n }\n\n return normalized.map((value) => value / total);\n}\n\nexport function opinionFromDirichlet(\n alpha: readonly number[],\n nonInformativeWeight: number = DEFAULT_NON_INFORMATIVE_WEIGHT,\n baseRate?: readonly number[]\n): DirichletOpinion {\n const evidence = alpha.map((value) => clampNonNegative(value));\n const safeWeight = normalizeNonInformativeWeight(nonInformativeWeight);\n const normalizedBaseRate = normalizeBaseRateVector(baseRate, evidence.length);\n const totalEvidence = evidence.reduce((sum, value) => sum + value, 0);\n const denominator = totalEvidence + safeWeight;\n\n if (denominator === 0) {\n return {\n b: evidence.map(() => 0),\n u: 1,\n a: normalizedBaseRate,\n };\n }\n\n return {\n b: evidence.map((value) => value / denominator),\n u: safeWeight / denominator,\n a: normalizedBaseRate,\n };\n}\n\nexport function projectDirichletOpinion(opinion: DirichletOpinion): number[] {\n return opinion.b.map(\n (belief, index) => belief + (opinion.a[index] ?? 0) * opinion.u\n );\n}\n\nexport function opinionFromBeta(\n alpha: number,\n beta: number,\n nonInformativeWeight: number = DEFAULT_NON_INFORMATIVE_WEIGHT,\n baseRate: number = 0.5\n): Opinion {\n const dirichlet = opinionFromDirichlet(\n [alpha, beta],\n nonInformativeWeight,\n [clamp01(baseRate), 1 - clamp01(baseRate)]\n );\n\n return {\n b: dirichlet.b[0] ?? 0,\n d: dirichlet.b[1] ?? 0,\n u: dirichlet.u,\n a: dirichlet.a[0] ?? clamp01(baseRate),\n };\n}\n\nexport function betaFromOpinion(\n opinion: Opinion,\n nonInformativeWeight: number = DEFAULT_NON_INFORMATIVE_WEIGHT\n): { alpha: number; beta: number } {\n if (opinion.u === 0) {\n return {\n alpha: Number.POSITIVE_INFINITY,\n beta: Number.POSITIVE_INFINITY,\n };\n }\n\n const safeWeight = normalizeNonInformativeWeight(nonInformativeWeight);\n const scale = safeWeight / opinion.u;\n\n return {\n alpha: opinion.b * scale,\n beta: opinion.d * scale,\n };\n}\n","import type { Opinion } from \"../../types\";\n\nexport function opinion(\n belief: number,\n disbelief: number,\n uncertainty: number,\n baseRate: number = 0.5\n): Opinion {\n const b = Math.max(0, Math.min(1, belief));\n const d = Math.max(0, Math.min(1, disbelief));\n const u = Math.max(0, Math.min(1, uncertainty));\n const a = Math.max(0, Math.min(1, baseRate));\n const sum = b + d + u;\n\n if (sum === 0) {\n return { b: 0, d: 0, u: 1, a };\n }\n\n return {\n b: b / sum,\n d: d / sum,\n u: u / sum,\n a,\n };\n}\n\nexport function vacuous(baseRate: number = 0.5): Opinion {\n return { b: 0, d: 0, u: 1, a: baseRate };\n}\n\nexport function dogmatic(probability: number, baseRate: number = 0.5): Opinion {\n const p = Math.max(0, Math.min(1, probability));\n return { b: p, d: 1 - p, u: 0, a: baseRate };\n}\n\nexport function project(o: Opinion): number {\n return o.b + o.a * o.u;\n}\n\nexport function confidenceLevel(o: Opinion): \"high\" | \"medium\" | \"low\" {\n const projected = project(o);\n if (o.u > 0.5) {\n return \"low\";\n }\n if (projected >= 0.8 && o.u < 0.2) {\n return \"high\";\n }\n if (projected >= 0.6) {\n return \"medium\";\n }\n return \"low\";\n}\n\nexport function cumulativeFusion(left: Opinion, right: Opinion): Opinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u - left.u * right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function averagingFusion(left: Opinion, right: Opinion): Opinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (2 * left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function trustDiscount(sourceOpinion: Opinion, trust: number): Opinion {\n const weight = Math.max(0, Math.min(1, Math.abs(trust)));\n return opinion(\n weight * sourceOpinion.b,\n weight * sourceOpinion.d,\n 1 - weight * (sourceOpinion.b + sourceOpinion.d),\n sourceOpinion.a\n );\n}\n\nconst EPSILON = 1e-9;\n\nfunction childBaseRateFallback(\n ifTrue: Opinion,\n ifFalse: Opinion,\n fallbackBaseRate: number | undefined\n): number {\n if (fallbackBaseRate !== undefined) {\n return Math.max(0, Math.min(1, fallbackBaseRate));\n }\n\n if (Math.abs(ifTrue.a - ifFalse.a) <= EPSILON) {\n return ifTrue.a;\n }\n\n return (ifTrue.a + ifFalse.a) / 2;\n}\n\nfunction computeConditionalDeductionBaseRate(\n opinionA: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\n fallbackBaseRate: number\n): number {\n const denominator =\n 1 - opinionA.a * ifTrue.u - (1 - opinionA.a) * ifFalse.u;\n\n if (ifTrue.u + ifFalse.u < 2 - EPSILON && Math.abs(denominator) > EPSILON) {\n const baseRate =\n (opinionA.a * ifTrue.b + (1 - opinionA.a) * ifFalse.b) / denominator;\n if (baseRate >= -EPSILON && baseRate <= 1 + EPSILON) {\n return Math.max(0, Math.min(1, baseRate));\n }\n }\n\n return fallbackBaseRate;\n}\n\nfunction safeCorrectionTerm(\n numerator: number,\n denominator: number\n): number | undefined {\n if (Math.abs(denominator) <= EPSILON) {\n return undefined;\n }\n\n const value = numerator / denominator;\n if (!Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, value);\n}\n\nexport function conditionalDeduction(\n opinionA: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\n fallbackBaseRate?: number\n): Opinion {\n const fallbackChildBaseRate = childBaseRateFallback(\n ifTrue,\n ifFalse,\n fallbackBaseRate\n );\n const childBaseRate = computeConditionalDeductionBaseRate(\n opinionA,\n ifTrue,\n ifFalse,\n fallbackChildBaseRate\n );\n const projectedAntecedent = project(opinionA);\n const projectedAntecedentComplement = 1 - projectedAntecedent;\n const intermediateBelief =\n opinionA.b * ifTrue.b +\n opinionA.d * ifFalse.b +\n opinionA.u * (ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a));\n const intermediateDisbelief =\n opinionA.b * ifTrue.d +\n opinionA.d * ifFalse.d +\n opinionA.u * (ifTrue.d * opinionA.a + ifFalse.d * (1 - opinionA.a));\n const intermediateUncertainty =\n opinionA.b * ifTrue.u +\n opinionA.d * ifFalse.u +\n opinionA.u * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedVacuousDeduction =\n ifTrue.b * opinionA.a +\n ifFalse.b * (1 - opinionA.a) +\n childBaseRate *\n (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedConditionalA =\n ifTrue.b + childBaseRate * (1 - ifTrue.b - ifTrue.d);\n let correction = 0;\n\n if (\n (ifTrue.b > ifFalse.b && ifTrue.d > ifFalse.d) ||\n (ifTrue.b <= ifFalse.b && ifTrue.d <= ifFalse.d)\n ) {\n correction = 0;\n } else if (ifTrue.b > ifFalse.b && ifTrue.d <= ifFalse.d) {\n const beliefGap = ifTrue.b - ifFalse.b;\n const disbeliefGap = ifFalse.d - ifTrue.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedent * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,\n projectedAntecedentComplement * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedent * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedentComplement * (1 - childBaseRate)\n ) ?? 0;\n }\n } else {\n const beliefGap = ifFalse.b - ifTrue.b;\n const disbeliefGap = ifTrue.d - ifFalse.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateDisbelief - ifTrue.d) *\n beliefGap,\n projectedAntecedent * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedentComplement * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedent * (1 - childBaseRate)\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n opinionA.a *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedentComplement * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n }\n }\n\n return opinion(\n intermediateBelief - childBaseRate * correction,\n intermediateDisbelief - (1 - childBaseRate) * correction,\n intermediateUncertainty + correction,\n childBaseRate\n );\n}\n\n/**\n * Abductive inference over a conditional.\n * Given an opinion on Y and conditionals P(Y|X), P(Y|~X), infer an opinion on X.\n */\nexport function conditionalAbduction(\n opinionY: Opinion,\n ifTrue: Opinion,\n ifFalse: Opinion,\n baseRateX: number\n): Opinion {\n const priorX = Math.max(0, Math.min(1, baseRateX));\n const probabilityY = project(opinionY);\n const probabilityGivenTrue = project(ifTrue);\n const probabilityGivenFalse = project(ifFalse);\n\n const posteriorIfYDenominator =\n probabilityGivenTrue * priorX +\n probabilityGivenFalse * (1 - priorX);\n const posteriorIfY =\n posteriorIfYDenominator === 0\n ? priorX\n : (probabilityGivenTrue * priorX) / posteriorIfYDenominator;\n\n const posteriorIfNotYDenominator =\n (1 - probabilityGivenTrue) * priorX +\n (1 - probabilityGivenFalse) * (1 - priorX);\n const posteriorIfNotY =\n posteriorIfNotYDenominator === 0\n ? priorX\n : ((1 - probabilityGivenTrue) * priorX) / posteriorIfNotYDenominator;\n\n const projectedX =\n probabilityY * posteriorIfY + (1 - probabilityY) * posteriorIfNotY;\n const uncertainty = Math.max(\n opinionY.u * 0.5,\n probabilityY * ifTrue.u + (1 - probabilityY) * ifFalse.u\n );\n\n return opinion(\n projectedX * (1 - uncertainty),\n (1 - projectedX) * (1 - uncertainty),\n uncertainty,\n priorX\n );\n}\n\nexport function negate(o: Opinion): Opinion {\n return { b: o.d, d: o.b, u: o.u, a: 1 - o.a };\n}\n\nexport function constraintFusion(\n left: Opinion,\n right: Opinion,\n mode: \"pressure\" | \"redistribute\" = \"pressure\"\n): { o1: Opinion; o2: Opinion } {\n if (mode === \"redistribute\") {\n const leftProjected = project(left);\n const rightProjected = project(right);\n const total = leftProjected + rightProjected;\n\n if (total <= 1) {\n return { o1: left, o2: right };\n }\n\n const scale = 1 / total;\n return {\n o1: opinion(\n left.b * scale,\n left.d + left.b * (1 - scale),\n left.u,\n left.a\n ),\n o2: opinion(\n right.b * scale,\n right.d + right.b * (1 - scale),\n right.u,\n right.a\n ),\n };\n }\n\n const pressureLeft = right.b * 0.5;\n const pressureRight = left.b * 0.5;\n\n return {\n o1: opinion(\n left.b - pressureLeft * 0.3,\n left.d + pressureLeft * 0.3,\n left.u,\n left.a\n ),\n o2: opinion(\n right.b - pressureRight * 0.3,\n right.d + pressureRight * 0.3,\n right.u,\n right.a\n ),\n };\n}\n\nexport function evidenceBalance(o: Opinion): number {\n const total = o.b + o.d;\n if (total === 0) {\n return 0;\n }\n return (o.b - o.d) / total;\n}\n\nexport function areTensioned(left: Opinion, right: Opinion): boolean {\n return (\n project(left) > 0.5 &&\n project(right) > 0.5 &&\n (left.d > 0.2 || right.d > 0.2)\n );\n}\n\nexport function informationGain(o: Opinion): number {\n if (o.u === 0) {\n return 0;\n }\n if (o.u === 1) {\n return 1;\n }\n return o.u * (1 - Math.abs(o.b - o.d));\n}\n","import type { Opinion } from \"../../types\";\nimport {\n DEFAULT_NON_INFORMATIVE_WEIGHT,\n opinionFromBeta,\n} from \"../bridge\";\nimport { project } from \"../subjectiveLogic\";\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction toEvidence(probability: number, weight: number): {\n alpha: number;\n beta: number;\n} {\n const safeProbability = clamp01(probability);\n const safeWeight = Number.isFinite(weight) ? Math.max(0, weight) : 0;\n\n return {\n alpha: safeProbability * safeWeight,\n beta: (1 - safeProbability) * safeWeight,\n };\n}\n\nexport function bayesianUpdate(\n priorConfidence: number,\n priorWeight: number,\n newAssessment: number,\n newWeight: number,\n options?: {\n baseRate?: number;\n nonInformativeWeight?: number;\n }\n): number {\n return reviseConfidence({\n priorConfidence,\n priorWeight,\n newAssessment,\n newWeight,\n baseRate: options?.baseRate,\n nonInformativeWeight: options?.nonInformativeWeight,\n });\n}\n\nexport function reviseConfidence(args: {\n priorConfidence: number;\n priorWeight: number;\n newAssessment: number;\n newWeight?: number;\n baseRate?: number;\n nonInformativeWeight?: number;\n}): number {\n return project(reviseConfidenceOpinion(args));\n}\n\nexport function reviseConfidenceOpinion(args: {\n priorConfidence: number;\n priorWeight: number;\n newAssessment: number;\n newWeight?: number;\n baseRate?: number;\n nonInformativeWeight?: number;\n}): Opinion {\n const priorEvidence = toEvidence(args.priorConfidence, args.priorWeight);\n const newEvidence = toEvidence(args.newAssessment, args.newWeight ?? 1);\n\n return opinionFromBeta(\n priorEvidence.alpha + newEvidence.alpha,\n priorEvidence.beta + newEvidence.beta,\n args.nonInformativeWeight ?? DEFAULT_NON_INFORMATIVE_WEIGHT,\n args.baseRate ?? 0.5\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/v1/operations/subjectiveLogic/index.ts","../../../../src/v1/operations/bridge/index.ts","../../../../src/v1/operations/dynamics/revision.ts"],"names":["clamp01"],"mappings":"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","file":"revision.js","sourcesContent":["import type { SLOpinion } from \"../../types\";\n\nexport function mkOpinion(\n belief: number,\n disbelief: number,\n uncertainty: number,\n baseRate: number\n): SLOpinion {\n const b = Number.isFinite(belief) ? Math.max(0, belief) : 0;\n const d = Number.isFinite(disbelief) ? Math.max(0, disbelief) : 0;\n const u = Number.isFinite(uncertainty) ? Math.max(0, uncertainty) : 0;\n const a = Math.max(0, Math.min(1, baseRate));\n const sum = b + d + u;\n\n if (sum === 0) {\n return { b: 0, d: 0, u: 1, a } as SLOpinion;\n }\n\n return {\n b: b / sum,\n d: d / sum,\n u: u / sum,\n a,\n } as SLOpinion;\n}\n\nexport const opinion = mkOpinion;\n\nexport function vacuous(baseRate: number): SLOpinion {\n return mkOpinion(0, 0, 1, baseRate);\n}\n\nexport function dogmatic(probability: number, baseRate: number): SLOpinion {\n const p = Math.max(0, Math.min(1, probability));\n return mkOpinion(p, 1 - p, 0, baseRate);\n}\n\nexport function project(o: SLOpinion): number {\n return o.b + o.a * o.u;\n}\n\nexport function confidenceLevel(o: SLOpinion): \"high\" | \"medium\" | \"low\" {\n const projected = project(o);\n if (o.u > 0.5) {\n return \"low\";\n }\n if (projected >= 0.8 && o.u < 0.2) {\n return \"high\";\n }\n if (projected >= 0.6) {\n return \"medium\";\n }\n return \"low\";\n}\n\nexport function cumulativeFusion(left: SLOpinion, right: SLOpinion): SLOpinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u - left.u * right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function averagingFusion(left: SLOpinion, right: SLOpinion): SLOpinion {\n if (left.u === 0 && right.u === 0) {\n return opinion(\n (left.b + right.b) / 2,\n (left.d + right.d) / 2,\n 0,\n (left.a + right.a) / 2\n );\n }\n\n const k = left.u + right.u;\n if (k === 0) {\n return vacuous((left.a + right.a) / 2);\n }\n\n return opinion(\n (left.b * right.u + right.b * left.u) / k,\n (left.d * right.u + right.d * left.u) / k,\n (2 * left.u * right.u) / k,\n (left.a + right.a) / 2\n );\n}\n\nexport function trustDiscount(sourceOpinion: SLOpinion, trust: number): SLOpinion {\n const weight = Math.max(0, Math.min(1, Math.abs(trust)));\n return opinion(\n weight * sourceOpinion.b,\n weight * sourceOpinion.d,\n 1 - weight * (sourceOpinion.b + sourceOpinion.d),\n sourceOpinion.a\n );\n}\n\nconst EPSILON = 1e-9;\n\nfunction childBaseRateFallback(\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate: number | undefined\n): number {\n if (fallbackBaseRate !== undefined) {\n return Math.max(0, Math.min(1, fallbackBaseRate));\n }\n\n if (Math.abs(ifTrue.a - ifFalse.a) <= EPSILON) {\n return ifTrue.a;\n }\n\n return (ifTrue.a + ifFalse.a) / 2;\n}\n\nfunction computeConditionalDeductionBaseRate(\n opinionA: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate: number\n): number {\n const denominator =\n 1 - opinionA.a * ifTrue.u - (1 - opinionA.a) * ifFalse.u;\n\n if (ifTrue.u + ifFalse.u < 2 - EPSILON && Math.abs(denominator) > EPSILON) {\n const baseRate =\n (opinionA.a * ifTrue.b + (1 - opinionA.a) * ifFalse.b) / denominator;\n if (baseRate >= -EPSILON && baseRate <= 1 + EPSILON) {\n return Math.max(0, Math.min(1, baseRate));\n }\n }\n\n return fallbackBaseRate;\n}\n\nfunction safeCorrectionTerm(\n numerator: number,\n denominator: number\n): number | undefined {\n if (Math.abs(denominator) <= EPSILON) {\n return undefined;\n }\n\n const value = numerator / denominator;\n if (!Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, value);\n}\n\nexport function conditionalDeduction(\n opinionA: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n fallbackBaseRate?: number\n): SLOpinion {\n const fallbackChildBaseRate = childBaseRateFallback(\n ifTrue,\n ifFalse,\n fallbackBaseRate\n );\n const childBaseRate = computeConditionalDeductionBaseRate(\n opinionA,\n ifTrue,\n ifFalse,\n fallbackChildBaseRate\n );\n const projectedAntecedent = project(opinionA);\n const projectedAntecedentComplement = 1 - projectedAntecedent;\n const intermediateBelief =\n opinionA.b * ifTrue.b +\n opinionA.d * ifFalse.b +\n opinionA.u * (ifTrue.b * opinionA.a + ifFalse.b * (1 - opinionA.a));\n const intermediateDisbelief =\n opinionA.b * ifTrue.d +\n opinionA.d * ifFalse.d +\n opinionA.u * (ifTrue.d * opinionA.a + ifFalse.d * (1 - opinionA.a));\n const intermediateUncertainty =\n opinionA.b * ifTrue.u +\n opinionA.d * ifFalse.u +\n opinionA.u * (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedVacuousDeduction =\n ifTrue.b * opinionA.a +\n ifFalse.b * (1 - opinionA.a) +\n childBaseRate *\n (ifTrue.u * opinionA.a + ifFalse.u * (1 - opinionA.a));\n const projectedConditionalA =\n ifTrue.b + childBaseRate * (1 - ifTrue.b - ifTrue.d);\n let correction = 0;\n\n if (\n (ifTrue.b > ifFalse.b && ifTrue.d > ifFalse.d) ||\n (ifTrue.b <= ifFalse.b && ifTrue.d <= ifFalse.d)\n ) {\n correction = 0;\n } else if (ifTrue.b > ifFalse.b && ifTrue.d <= ifFalse.d) {\n const beliefGap = ifTrue.b - ifFalse.b;\n const disbeliefGap = ifFalse.d - ifTrue.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedent * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d) * beliefGap,\n projectedAntecedentComplement * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedent * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedentComplement * (1 - childBaseRate)\n ) ?? 0;\n }\n } else {\n const beliefGap = ifFalse.b - ifTrue.b;\n const disbeliefGap = ifTrue.d - ifFalse.d;\n\n if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) *\n opinionA.u *\n (intermediateDisbelief - ifTrue.d) *\n beliefGap,\n projectedAntecedent * childBaseRate * disbeliefGap\n ) ?? 0;\n } else if (\n projectedVacuousDeduction <= projectedConditionalA &&\n projectedAntecedent > opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n (1 - opinionA.a) * opinionA.u * (intermediateBelief - ifTrue.b),\n projectedAntecedentComplement * childBaseRate\n ) ?? 0;\n } else if (\n projectedVacuousDeduction > projectedConditionalA &&\n projectedAntecedent <= opinionA.a\n ) {\n correction =\n safeCorrectionTerm(\n opinionA.a * opinionA.u * (intermediateDisbelief - ifTrue.d),\n projectedAntecedent * (1 - childBaseRate)\n ) ?? 0;\n } else {\n correction =\n safeCorrectionTerm(\n opinionA.a *\n opinionA.u *\n (intermediateBelief - ifTrue.b) *\n disbeliefGap,\n projectedAntecedentComplement * (1 - childBaseRate) * beliefGap\n ) ?? 0;\n }\n }\n\n return opinion(\n intermediateBelief - childBaseRate * correction,\n intermediateDisbelief - (1 - childBaseRate) * correction,\n intermediateUncertainty + correction,\n childBaseRate\n );\n}\n\n/**\n * Abductive inference over a conditional.\n * Given an opinion on Y and conditionals P(Y|X), P(Y|~X), infer an opinion on X.\n */\nexport function conditionalAbduction(\n opinionY: SLOpinion,\n ifTrue: SLOpinion,\n ifFalse: SLOpinion,\n baseRateX: number\n): SLOpinion {\n const priorX = Math.max(0, Math.min(1, baseRateX));\n const probabilityY = project(opinionY);\n const probabilityGivenTrue = project(ifTrue);\n const probabilityGivenFalse = project(ifFalse);\n\n const posteriorIfYDenominator =\n probabilityGivenTrue * priorX +\n probabilityGivenFalse * (1 - priorX);\n const posteriorIfY =\n posteriorIfYDenominator === 0\n ? priorX\n : (probabilityGivenTrue * priorX) / posteriorIfYDenominator;\n\n const posteriorIfNotYDenominator =\n (1 - probabilityGivenTrue) * priorX +\n (1 - probabilityGivenFalse) * (1 - priorX);\n const posteriorIfNotY =\n posteriorIfNotYDenominator === 0\n ? priorX\n : ((1 - probabilityGivenTrue) * priorX) / posteriorIfNotYDenominator;\n\n const projectedX =\n probabilityY * posteriorIfY + (1 - probabilityY) * posteriorIfNotY;\n const uncertainty = Math.max(\n opinionY.u * 0.5,\n probabilityY * ifTrue.u + (1 - probabilityY) * ifFalse.u\n );\n\n return opinion(\n projectedX * (1 - uncertainty),\n (1 - projectedX) * (1 - uncertainty),\n uncertainty,\n priorX\n );\n}\n\nexport function negate(o: SLOpinion): SLOpinion {\n return mkOpinion(o.d, o.b, o.u, 1 - o.a);\n}\n\nexport function constraintFusion(\n left: SLOpinion,\n right: SLOpinion,\n mode: \"pressure\" | \"redistribute\" = \"pressure\"\n): { o1: SLOpinion; o2: SLOpinion } {\n if (mode === \"redistribute\") {\n const leftProjected = project(left);\n const rightProjected = project(right);\n const total = leftProjected + rightProjected;\n\n if (total <= 1) {\n return { o1: left, o2: right };\n }\n\n const scale = 1 / total;\n return {\n o1: opinion(\n left.b * scale,\n left.d + left.b * (1 - scale),\n left.u,\n left.a\n ),\n o2: opinion(\n right.b * scale,\n right.d + right.b * (1 - scale),\n right.u,\n right.a\n ),\n };\n }\n\n const pressureLeft = right.b * 0.5;\n const pressureRight = left.b * 0.5;\n\n return {\n o1: opinion(\n left.b - pressureLeft * 0.3,\n left.d + pressureLeft * 0.3,\n left.u,\n left.a\n ),\n o2: opinion(\n right.b - pressureRight * 0.3,\n right.d + pressureRight * 0.3,\n right.u,\n right.a\n ),\n };\n}\n\nexport function evidenceBalance(o: SLOpinion): number {\n const total = o.b + o.d;\n if (total === 0) {\n return 0;\n }\n return (o.b - o.d) / total;\n}\n\nexport function areTensioned(left: SLOpinion, right: SLOpinion): boolean {\n return (\n project(left) > 0.5 &&\n project(right) > 0.5 &&\n (left.d > 0.2 || right.d > 0.2)\n );\n}\n\nexport function informationGain(o: SLOpinion): number {\n if (o.u === 0) {\n return 0;\n }\n if (o.u === 1) {\n return 1;\n }\n return o.u * (1 - Math.abs(o.b - o.d));\n}\n","import type { DirichletOpinion, Opinion, SLOpinion } from \"../../types\";\nimport { mkOpinion } from \"../subjectiveLogic\";\n\nexport const DEFAULT_NON_INFORMATIVE_WEIGHT = 2;\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction clampNonNegative(value: number): number {\n return Number.isFinite(value) ? Math.max(0, value) : 0;\n}\n\nfunction normalizeNonInformativeWeight(weight?: number): number {\n if (weight === undefined) {\n return DEFAULT_NON_INFORMATIVE_WEIGHT;\n }\n return Number.isFinite(weight)\n ? Math.max(0, weight)\n : DEFAULT_NON_INFORMATIVE_WEIGHT;\n}\n\nfunction normalizeBaseRateVector(\n baseRate: readonly number[],\n size: number\n): number[] {\n if (size === 0) {\n return [];\n }\n\n if (baseRate.length !== size) {\n throw new Error(\n `Base-rate vector length ${baseRate.length} must match evidence vector length ${size}.`\n );\n }\n\n const normalized = baseRate.map((value) => clampNonNegative(value));\n const total = normalized.reduce((sum, value) => sum + value, 0);\n\n if (total === 0) {\n throw new Error(\"Base-rate vector must contain at least one positive value.\");\n }\n\n return normalized.map((value) => value / total);\n}\n\nexport function opinionFromDirichlet(\n alpha: readonly number[],\n nonInformativeWeight: number,\n baseRate: readonly number[]\n): DirichletOpinion {\n const evidence = alpha.map((value) => clampNonNegative(value));\n const safeWeight = normalizeNonInformativeWeight(nonInformativeWeight);\n const normalizedBaseRate = normalizeBaseRateVector(baseRate, evidence.length);\n const totalEvidence = evidence.reduce((sum, value) => sum + value, 0);\n const denominator = totalEvidence + safeWeight;\n\n if (denominator === 0) {\n return {\n b: evidence.map(() => 0),\n u: 1,\n a: normalizedBaseRate,\n };\n }\n\n return {\n b: evidence.map((value) => value / denominator),\n u: safeWeight / denominator,\n a: normalizedBaseRate,\n };\n}\n\nexport function projectDirichletOpinion(opinion: DirichletOpinion): number[] {\n return opinion.b.map(\n (belief, index) => belief + (opinion.a[index] ?? 0) * opinion.u\n );\n}\n\nexport function opinionFromBeta(\n alpha: number,\n beta: number,\n nonInformativeWeight: number,\n baseRate: number\n): SLOpinion {\n const dirichlet = opinionFromDirichlet(\n [alpha, beta],\n nonInformativeWeight,\n [clamp01(baseRate), 1 - clamp01(baseRate)]\n );\n\n return mkOpinion(\n dirichlet.b[0] ?? 0,\n dirichlet.b[1] ?? 0,\n dirichlet.u,\n dirichlet.a[0] ?? clamp01(baseRate)\n );\n}\n\nexport function betaFromOpinion(\n opinion: Opinion,\n nonInformativeWeight: number = DEFAULT_NON_INFORMATIVE_WEIGHT\n): { alpha: number; beta: number } {\n if (opinion.u === 0) {\n return {\n alpha: Number.POSITIVE_INFINITY,\n beta: Number.POSITIVE_INFINITY,\n };\n }\n\n const safeWeight = normalizeNonInformativeWeight(nonInformativeWeight);\n const scale = safeWeight / opinion.u;\n\n return {\n alpha: opinion.b * scale,\n beta: opinion.d * scale,\n };\n}\n","import type { SLOpinion } from \"../../types\";\nimport {\n DEFAULT_NON_INFORMATIVE_WEIGHT,\n opinionFromBeta,\n} from \"../bridge\";\nimport { project } from \"../subjectiveLogic\";\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction toEvidence(probability: number, weight: number): {\n alpha: number;\n beta: number;\n} {\n const safeProbability = clamp01(probability);\n const safeWeight = Number.isFinite(weight) ? Math.max(0, weight) : 0;\n\n return {\n alpha: safeProbability * safeWeight,\n beta: (1 - safeProbability) * safeWeight,\n };\n}\n\nexport function bayesianUpdate(\n priorConfidence: number,\n priorWeight: number,\n newAssessment: number,\n newWeight: number,\n options: {\n baseRate: number;\n nonInformativeWeight?: number;\n }\n): number {\n return reviseConfidence({\n priorConfidence,\n priorWeight,\n newAssessment,\n newWeight,\n baseRate: options?.baseRate,\n nonInformativeWeight: options?.nonInformativeWeight,\n });\n}\n\nexport function reviseConfidence(args: {\n priorConfidence: number;\n priorWeight: number;\n newAssessment: number;\n newWeight?: number;\n baseRate: number;\n nonInformativeWeight?: number;\n}): number {\n return project(reviseConfidenceOpinion(args));\n}\n\nexport function reviseConfidenceOpinion(args: {\n priorConfidence: number;\n priorWeight: number;\n newAssessment: number;\n newWeight?: number;\n baseRate: number;\n nonInformativeWeight?: number;\n}): SLOpinion {\n const priorEvidence = toEvidence(args.priorConfidence, args.priorWeight);\n const newEvidence = toEvidence(args.newAssessment, args.newWeight ?? 1);\n\n return opinionFromBeta(\n priorEvidence.alpha + newEvidence.alpha,\n priorEvidence.beta + newEvidence.beta,\n args.nonInformativeWeight ?? DEFAULT_NON_INFORMATIVE_WEIGHT,\n args.baseRate\n );\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/v1/operations/subjectiveLogic/index.ts
|
|
2
|
-
function
|
|
3
|
-
const b =
|
|
4
|
-
const d =
|
|
5
|
-
const u =
|
|
2
|
+
function mkOpinion(belief, disbelief, uncertainty, baseRate) {
|
|
3
|
+
const b = Number.isFinite(belief) ? Math.max(0, belief) : 0;
|
|
4
|
+
const d = Number.isFinite(disbelief) ? Math.max(0, disbelief) : 0;
|
|
5
|
+
const u = Number.isFinite(uncertainty) ? Math.max(0, uncertainty) : 0;
|
|
6
6
|
const a = Math.max(0, Math.min(1, baseRate));
|
|
7
7
|
const sum = b + d + u;
|
|
8
8
|
if (sum === 0) {
|
|
@@ -15,6 +15,7 @@ function opinion(belief, disbelief, uncertainty, baseRate = 0.5) {
|
|
|
15
15
|
a
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
+
var opinion = mkOpinion;
|
|
18
19
|
function trustDiscount(sourceOpinion, trust) {
|
|
19
20
|
const weight = Math.max(0, Math.min(1, Math.abs(trust)));
|
|
20
21
|
return opinion(
|
|
@@ -58,7 +59,10 @@ function temporalDecay(sourceOpinion, now, decayParams) {
|
|
|
58
59
|
return { ...sourceOpinion };
|
|
59
60
|
}
|
|
60
61
|
const retainedEvidenceWeight = Math.pow(0.5, ageMs / halfLifeMs);
|
|
61
|
-
return trustDiscount(
|
|
62
|
+
return trustDiscount(
|
|
63
|
+
mkOpinion(sourceOpinion.b, sourceOpinion.d, sourceOpinion.u, sourceOpinion.a),
|
|
64
|
+
retainedEvidenceWeight
|
|
65
|
+
);
|
|
62
66
|
}
|
|
63
67
|
|
|
64
68
|
export { DEFAULT_TEMPORAL_DECAY_HALF_LIFE_MS, temporalDecay };
|