Dead code with zero callers (deprecation notes promised removal): - RelationCSR index: always-off option (useRelationCsrIndex), never enabled in production, wired through RelationManager/RelationUpdates/ RelationLookup. Removed the module and all wiring. - getAggregatedBlurredValue (RelationManager) and aggregateBlurredValues (ValueManager): @deprecated shims, zero callers. - QualitativeRelationalComparatorRule._aggregateBlurredValues: @deprecated shim, zero callers. Kept compareRelationValues: non-deprecated public API, coherent and clock-threaded, just currently callerless. Stale scaffolding shipping in the published artifact (files: src/): - src/ast/tests/* and src/ast/examples/*: orphaned duplicates of tests/ast/, zero references anywhere, 11 files in the tarball. Removed; the live copies live in tests/ast/. Internal docs moved out of the shipped surface (1266 lines) to docs/internal/: VALUE_OPTIMIZATION_SUMMARY, rules API_SPECIFICATION, ast README, qualitative README — repo-kept, not packaged. Tarball .md count: 11 -> 1. Rigor 251/251, full suite 853/791/0.
8.7 KiB
Qualitative Capacity System
This module provides a complete implementation of qualitative capacities (q-capacities) as described in the research paper on qualitative capacities and their applications to evidential reasoning, decision making, and imprecise possibility.
Overview
A qualitative capacity γ: 2^W → L is a monotonic set-function where:
- γ(∅) = 0, γ(W) = 1
- If A ⊆ B, then γ(A) ≤ γ(B)
- L is a finite totally ordered scale with order-reversing negation
The core design principle is to use the Qualitative Möbius Transform (QMT) γ# as the canonical internal representation for any q-capacity γ.
Core Components
1. SetUtils
Utility functions for working with Sets as Map keys, providing canonical string representations for consistent and efficient Map operations.
import { getSetKey, setFromKey, setsEqual } from './src/qualitative/index.js';
const set = new Set(['a', 'b', 'c']);
const key = getSetKey(set); // "a,b,c"
const reconstructed = setFromKey(key); // Set(['a', 'b', 'c'])
const areEqual = setsEqual(set, reconstructed); // true
2. QualitativeScale
Finite totally ordered scales with order-reversing negation.
import { QualitativeScale } from './src/qualitative/index.js';
// Create a 5-point scale
const scale = QualitativeScale.fivePoint(); // [0, 0.25, 0.5, 0.75, 1]
// Test operations
console.log(scale.min(0.25, 0.75)); // 0.25
console.log(scale.max(0.25, 0.75)); // 0.75
console.log(scale.negate(0.25)); // 0.75 (order-reversing)
3. QualitativeCapacity
Q-capacities with QMT internal representation.
import { QualitativeCapacity } from './src/qualitative/index.js';
const stateSpace = ['s1', 's2', 's3'];
const scale = QualitativeScale.ternary();
// Create a simple support capacity
const ssc = QualitativeCapacity.createSimpleSupport(
stateSpace,
['s1'],
0.5,
scale
);
// Get capacity values
console.log(ssc.getCapacity(['s1'])); // 0.5
console.log(ssc.getCapacity(['s1', 's2'])); // 1
// Check if it's a necessity measure
console.log(ssc.isNecessityMeasure()); // true
4. QualitativeFusion
Theoretically sound fusion rules for capacity combination.
import { QualitativeFusion } from './src/qualitative/index.js';
// Create multiple capacities
const cap1 = QualitativeCapacity.createSimpleSupport(stateSpace, ['s1'], 0.5, scale);
const cap2 = QualitativeCapacity.createSimpleSupport(stateSpace, ['s2'], 0.5, scale);
// Normalized conjunctive fusion (theoretically sound)
const fused = QualitativeFusion.normalizedConjunctive([cap1, cap2]);
// Disjunctive fusion
const disjunctive = QualitativeFusion.disjunctive(cap1, cap2);
// Sugeno integral for decision making
const decisionFunction = { 's1': 0.5, 's2': 1, 's3': 0.5 };
const sugenoValue = QualitativeFusion.sugenoIntegral(fused, decisionFunction);
5. OWAQualitativeFusion
Bag algebras for sophisticated qualitative aggregation.
import { OWAQualitativeFusion } from './src/qualitative/index.js';
const values = [0.25, 0.5, 0.75];
const metas = [{ source: 'rule1' }, { source: 'rule2' }, { source: 'rule3' }];
// Different aggregation modes
const maxResult = OWAQualitativeFusion.max(values, metas, scale);
const majorityResult = OWAQualitativeFusion.majority(values, metas, scale);
const optimisticResult = OWAQualitativeFusion.optimistic(values, metas, scale);
// Configurable activation threshold
const selectiveResult = OWAQualitativeFusion.max(values, metas, scale, 0.8);
// Proper Sugeno integral
const sugenoResult = OWAQualitativeFusion.sugenoIntegral(capacity, decisionFunction);
6. QMTOWAFusion
Theoretically sound OWA-like operators that work directly on QMTs.
import { QMTOWAFusion } from './src/qualitative/index.js';
// These methods preserve monotonicity by working on QMTs directly
const optimistic = QMTOWAFusion.optimisticFusion([cap1, cap2]);
const pessimistic = QMTOWAFusion.pessimisticFusion([cap1, cap2]);
const majority = QMTOWAFusion.majorityFusion([cap1, cap2]);
const priority = QMTOWAFusion.priorityFusion([cap1, cap2], [10, 5]);
Theoretical Considerations
Pointwise OWA Fusion Warning
The pointwiseOWAFusion method (formerly fuseCapacities) performs pointwise OWA fusion on capacity values, which does NOT guarantee that the result is a valid qualitative capacity. The resulting set-function may violate the fundamental monotonicity property: A⊆B ⟹ γ(A)≤γ(B).
Use this method only for experimental purposes or when monotonicity is not required.
For theoretically sound capacity fusion, use:
QualitativeFusion.normalizedConjunctive()QualitativeFusion.disjunctive()QMTOWAFusionmethods
Qualitative OWA Operator
The qualitative OWA operator implements a novel weighted maximum where weights act as "gates" that must pass a threshold to allow their corresponding values to be considered. This is distinct from the standard Sugeno integral but provides a practical way to introduce weight influence in purely ordinal contexts.
The activation threshold is configurable (default 0.5) to allow for more or less "selective" aggregations.
Sugeno Integral
The Sugeno integral is the qualitative counterpart to the Choquet integral and provides a theoretically sound way to aggregate qualitative values with respect to a capacity:
S_γ(f) = max_{i=1}^n min(f_{(i)}, γ(A_{(i)}))
where f_{(i)} are the sorted values in descending order and A_{(i)} = {w_{(1)}, ..., w_{(i)}}.
Applications
1. Evidential Reasoning
Combine testimonies from different sources using Simple Support Capacities and normalized conjunctive fusion.
// Create testimonies as Simple Support Capacities
const testimony1 = QualitativeCapacity.createSimpleSupport(
stateSpace,
['s1'],
0.8,
scale
);
const testimony2 = QualitativeCapacity.createSimpleSupport(
stateSpace,
['s2'],
0.6,
scale
);
// Fuse testimonies
const combinedEvidence = QualitativeFusion.normalizedConjunctive([
testimony1,
testimony2
]);
2. Qualitative Decision Making
Use Sugeno integrals to evaluate decisions based on qualitative utility functions and uncertainty represented by q-capacities.
// Define decision function (utility for each state)
const utility = {
's1': 0.8, // High utility
's2': 0.4, // Medium utility
's3': 0.2 // Low utility
};
// Evaluate decision using Sugeno integral
const decisionValue = QualitativeFusion.sugenoIntegral(capacity, utility);
3. Imprecise Possibility
Represent ill-known possibility measures bounded by lower (q-capacity) and upper (possibility) measures.
// Get upper capacity (possibility measure)
const upperCapacity = capacity.getUpperCapacity();
// Get contour function
const contour = capacity.getContourFunction();
// Get conjugate capacity
const conjugate = capacity.getConjugate();
Performance Considerations
The current implementation has O(2^|W|) complexity for operations that generate all subsets. This is suitable for small state spaces (|W| < 20) but may not scale to larger ones.
Optimizations Implemented
-
QualitativeScale Optimizations:
contains(): O(1) average time using Set-based lookupindexOf(): O(log n) time using binary search- These optimizations significantly improve performance for scale operations
-
Canonical QMT Optimization:
_convertToCanonicalQMT(): Only checks immediate proper subsets instead of all smaller subsets- Uses the mathematical property: γ#(A) > 0 ⟺ γ(A) > max_{w∈A} γ(A∖{w})
- Provides substantial performance improvement for canonicalization
-
String Key Robustness:
- All Set objects are converted to canonical string keys for Map operations
- Eliminates JavaScript Set reference comparison issues
- Ensures consistent and efficient Map key operations
-
Canonicalization Consistency:
- All fusion methods return canonical QMTs by default
- Ensures minimal representation and consistent behavior
- Simplifies subsequent operations and saves memory
For large state spaces, consider:
- Working with QMTs directly (already implemented)
- Using sparse representations
- Implementing approximation algorithms
Future Research Directions
- QMT-based OWA: Develop more sophisticated OWA-like operators that work directly on QMTs
- Complexity Optimization: Implement efficient algorithms for large state spaces
- Approximation Methods: Develop approximation algorithms for intractable operations
- Integration with DSL: Extend the Evidence DSL to support qualitative capacities
References
This implementation is based on the research paper "Qualitative capacities: basic notions and potential applications" and related work on qualitative uncertainty theory, possibility theory, and evidential reasoning.