Models
evidencelib keeps the model explicit. This matters because DST and DSmT use the
same-looking propositions with different assumptions about intersections.
DST / Shafer model
frame = Frame.dst(["A", "B", "C"])
In this model, hypotheses are exhaustive and mutually exclusive. Therefore
A & B is the empty proposition, and frame.elements() generates the classical
power set.
Use this when the hypotheses are known to be exclusive alternatives, such as one true class among several labels.
Typical DST workflows use dempster(), yager(), pcr5(), or pignistic
probabilities over singleton hypotheses.
Free DSm model
frame = Frame.dsmt(["A", "B", "C"])
In the free DSm model, hypotheses are exhaustive but may overlap. Intersections
such as A & B can be non-empty. frame.elements() generates the hyper-power
set.
Use this when the hypotheses are vague, overlapping, or not safely separable.
In this model, A, B, and A & B can all carry distinct mass. The
conjunctive rule dsmc() keeps mass on intersections instead of treating them
as conflict.
Hybrid DSm model
frame = Frame.hybrid(["A", "B", "C"], exclusive=True, empty=["C"])
Hybrid models add explicit constraints. They are useful when some intersections are impossible or when new knowledge makes a hypothesis empty.
Examples:
Frame.hybrid(["A", "B"], exclusive=True)
Frame.hybrid(["A", "B", "C"], empty=["A & B"])
Frame.hybrid(["A", "B", "C"], exclusive=[("A", "B")])
The exclusive=True shortcut constrains every pairwise intersection to be
empty, matching Shafer-style exclusivity.
Use dsmh() when conflict should be redistributed according to these model
constraints instead of normalized away.