Fusion Rules
Fusion combines mass functions from the same frame.
combined = m1.dempster(m2)
All sources must belong to the same original Frame instance. Every rule
returns a new MassFunction; input sources are not modified. Fusion rules assume
that sources are independent in the sense required by the selected theory.
When constraints are learned after source elicitation, pass a separate target
frame with model=.... The result belongs to that target frame.
Choose a rule
Rule |
Best when |
Conflict behavior |
|---|---|---|
|
You want to inspect raw conflict. |
Keeps conflict on |
|
Classical DST normalization is acceptable. |
Removes |
|
Conflict should become uncertainty. |
Moves conflict to total ignorance. |
|
Free DSmT intersections are meaningful. |
Keeps mass on intersections. |
|
Static or dynamic hybrid constraints matter. |
Applies the complete |
|
Two-source, static conflict transfer is appropriate. |
Transfers static conflicts to unions. |
|
High conflict should stay local. |
Redistributes conflict to involved propositions. |
Conjunctive / DSmC / Smets
m1.conjunctive(m2)
m1.dsmc(m2)
m1.smets(m2)
The unnormalized conjunctive rule intersects propositions and multiplies their
masses. On a free DSmT frame this is the classic DSm rule, DSmC. On a DST frame,
conflicting intersections accumulate on empty.
smets() is an alias for the same unnormalized behavior.
Use when: you want to inspect conflict explicitly before deciding how to handle it.
Dempster
m1.dempster(m2)
Dempster’s rule removes empty-set conflict and normalizes the remaining masses.
If conflict is total, TotalConflictError is raised.
Use when: the frame is exclusive and normalized conflict handling matches your application.
Yager
m1.yager(m2)
Yager’s rule transfers total conflict to total ignorance. This keeps the result normalized while representing conflict as uncertainty instead of assigning it to specific hypotheses.
Use when: disagreement between sources should make the result less specific.
Hybrid DSm rule (DSmH)
m1.dsmh(m2) # static model
m1.dsmh(m2, model=target) # constraints learned later
dsmh() implements all three terms of the hybrid rule:
S1keeps products whose intersection remains non-empty;S2handles focal elements that all became empty, using their original atom-unionsu(X)and falling back to total ignorance only when required;S3transfers other relatively empty intersections to their canonical disjunction.
For a dynamic change, source assignments must be created on the original frame.
Do not recreate them on the constrained frame: doing so collapses distinct
relative-empty propositions onto empty before the rule can inspect them.
source = Frame.dst(["t1", "t2", "t3"])
t1, t2, t3 = source.symbols()
m1 = source.mass({t1: 0.1, t2: 0.4, t3: 0.2, t1 | t2: 0.3})
m2 = source.mass({t1: 0.5, t2: 0.1, t3: 0.3, t1 | t2: 0.1})
target = Frame.hybrid(["t1", "t2", "t3"], exclusive=True, empty=["t3"])
result = m1.dsmh(m2, model=target)
# {'t1': 0.34, 't1|t2': 0.41, 't2': 0.25}
The same explicit target-model mechanism is available on conjunctive(),
smets(), dempster(), and yager().
Dubois-Prade
m1.dubois_prade(m2)
Dubois-Prade is implemented as a static, exactly-two-source rule. In static
Shafer-style problems it coincides with the corresponding DSmH transfer. It is
not DSmH in a dynamic problem: the literature example where a hypothesis later
becomes empty loses mass under Dubois-Prade. Passing a distinct model=...
therefore raises ValueError instead of returning a mislabeled DSmH result.
Use when: you model constraints with
Frame.hybrid(...).
PCR5 and PCR6
m1.pcr5(m2)
m1.pcr6(m2, m3)
PCR rules redistribute partial conflict only to the propositions involved in that conflict, proportionally to the masses that created it.
pcr5() accepts two sources. pcr6() supports two or more sources.
Both require source assignments with m(empty) = 0; combine or normalize raw
TBM conflict before selecting a PCR rule.
Use when: assigning conflict to total ignorance would be too coarse.