257 lines
8.7 KiB
Markdown
257 lines
8.7 KiB
Markdown
|
|
# 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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
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()`
|
|||
|
|
- `QMTOWAFusion` methods
|
|||
|
|
|
|||
|
|
### 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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 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.
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 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
|
|||
|
|
|
|||
|
|
1. **QualitativeScale Optimizations**:
|
|||
|
|
- `contains()`: O(1) average time using Set-based lookup
|
|||
|
|
- `indexOf()`: O(log n) time using binary search
|
|||
|
|
- These optimizations significantly improve performance for scale operations
|
|||
|
|
|
|||
|
|
2. **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
|
|||
|
|
|
|||
|
|
3. **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
|
|||
|
|
|
|||
|
|
4. **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:
|
|||
|
|
1. Working with QMTs directly (already implemented)
|
|||
|
|
2. Using sparse representations
|
|||
|
|
3. Implementing approximation algorithms
|
|||
|
|
|
|||
|
|
## Future Research Directions
|
|||
|
|
|
|||
|
|
1. **QMT-based OWA**: Develop more sophisticated OWA-like operators that work directly on QMTs
|
|||
|
|
2. **Complexity Optimization**: Implement efficient algorithms for large state spaces
|
|||
|
|
3. **Approximation Methods**: Develop approximation algorithms for intractable operations
|
|||
|
|
4. **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.
|