pub struct FiniteCarrier<T: Ord> { /* private fields */ }Expand description
Deterministic explicit finite carrier distinct from inferred tuple support. A deterministic explicit finite carrier.
FiniteCarrier<T> is the first executable G7 carrier boundary. It records
admissible values explicitly, even when some values are disconnected from
the support of stored tuples. This keeps an explicit carrier semantically
distinct from exact support inferred from relations such as
crate::BinaryRelation::carrier.
Empty and singleton carriers are ordinary first-class values rather than
special cases hidden behind relation support.
The starter implementation stores carrier members in a BTreeSet, so
membership and iteration are deterministic.
§Examples
use relmath::{BinaryRelation, FiniteCarrier};
let states = FiniteCarrier::from_values(["Draft", "Review", "Archived"]);
let step = BinaryRelation::from_pairs([("Draft", "Review")]);
assert!(states.contains(&"Archived"));
assert_eq!(states.to_vec(), vec!["Archived", "Draft", "Review"]);
assert_eq!(step.carrier().to_vec(), vec!["Draft", "Review"]);Implementations§
Source§impl<T: Ord> FiniteCarrier<T>
impl<T: Ord> FiniteCarrier<T>
Sourcepub fn from_values<I>(values: I) -> Selfwhere
I: IntoIterator<Item = T>,
pub fn from_values<I>(values: I) -> Selfwhere
I: IntoIterator<Item = T>,
Creates an explicit finite carrier from the provided values.
Duplicate values are coalesced into one stored member.
Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([("Draft", "Review")]);
7 let states = FiniteCarrier::from_values(["Draft", "Review", "Archived"]);
8
9 let inferred = step.carrier();
10 let inferred_identity = BinaryRelation::identity(&inferred);
11 let explicit_identity = BinaryRelation::identity_on(&states);
12 let reachable = step.reflexive_transitive_closure_on(&states);
13
14 assert_eq!(inferred.to_vec(), vec!["Draft", "Review"]);
15 assert_eq!(
16 inferred_identity.to_vec(),
17 vec![("Draft", "Draft"), ("Review", "Review")]
18 );
19 assert_eq!(
20 explicit_identity.to_vec(),
21 vec![
22 ("Archived", "Archived"),
23 ("Draft", "Draft"),
24 ("Review", "Review"),
25 ]
26 );
27 assert_eq!(states.to_vec(), vec!["Archived", "Draft", "Review"]);
28 assert_eq!(
29 reachable.to_vec(),
30 step.reflexive_transitive_closure(&states.to_unary_relation())
31 .to_vec()
32 );
33 assert!(reachable.is_reflexive_on(&states));
34 assert!(step.is_irreflexive_on(&states));
35 assert!(reachable.contains(&"Archived", &"Archived"));
36 assert!(reachable.contains(&"Draft", &"Review"));
37
38 println!(
39 "explicit carrier: {:?}; inferred support: {:?}; inferred identity: {:?}; explicit identity: {:?}; reachable: {:?}",
40 states.to_vec(),
41 inferred.to_vec(),
42 inferred_identity.to_vec(),
43 explicit_identity.to_vec(),
44 reachable.to_vec()
45 );
46}Sourcepub fn singleton(value: T) -> Self
pub fn singleton(value: T) -> Self
Creates an explicit finite carrier containing exactly one value.
Sourcepub fn insert(&mut self, value: T) -> bool
pub fn insert(&mut self, value: T) -> bool
Inserts a value into the explicit carrier.
Returns true when the value was not already present.
Sourcepub fn contains(&self, value: &T) -> bool
pub fn contains(&self, value: &T) -> bool
Returns true when the explicit carrier contains the given value.
Sourcepub fn iter(&self) -> impl Iterator<Item = &T>
pub fn iter(&self) -> impl Iterator<Item = &T>
Returns an iterator over carrier values in deterministic order.
Sourcepub fn to_unary_relation(&self) -> UnaryRelation<T>where
T: Clone,
pub fn to_unary_relation(&self) -> UnaryRelation<T>where
T: Clone,
Materializes this explicit carrier as a unary relation.
This is an explicit bridge to the published exact APIs and generic code
paths that still take UnaryRelation<T> carrier arguments, such as
crate::BinaryRelation::identity and older call sites of
crate::BinaryRelation::reflexive_transitive_closure.
The conversion is intentionally explicit because it forgets the
semantic distinction between an explicitly declared carrier and ordinary
unary relation support. For direct carrier-aware exact operations, prefer
methods such as crate::BinaryRelation::identity_on and
crate::BinaryRelation::reflexive_transitive_closure_on.
§Examples
use relmath::{BinaryRelation, FiniteCarrier};
let step = BinaryRelation::from_pairs([("Draft", "Review")]);
let states = FiniteCarrier::from_values(["Draft", "Review", "Archived"]);
assert_eq!(
step.reflexive_transitive_closure(&states.to_unary_relation())
.to_vec(),
step.reflexive_transitive_closure_on(&states).to_vec()
);Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([("Draft", "Review")]);
7 let states = FiniteCarrier::from_values(["Draft", "Review", "Archived"]);
8
9 let inferred = step.carrier();
10 let inferred_identity = BinaryRelation::identity(&inferred);
11 let explicit_identity = BinaryRelation::identity_on(&states);
12 let reachable = step.reflexive_transitive_closure_on(&states);
13
14 assert_eq!(inferred.to_vec(), vec!["Draft", "Review"]);
15 assert_eq!(
16 inferred_identity.to_vec(),
17 vec![("Draft", "Draft"), ("Review", "Review")]
18 );
19 assert_eq!(
20 explicit_identity.to_vec(),
21 vec![
22 ("Archived", "Archived"),
23 ("Draft", "Draft"),
24 ("Review", "Review"),
25 ]
26 );
27 assert_eq!(states.to_vec(), vec!["Archived", "Draft", "Review"]);
28 assert_eq!(
29 reachable.to_vec(),
30 step.reflexive_transitive_closure(&states.to_unary_relation())
31 .to_vec()
32 );
33 assert!(reachable.is_reflexive_on(&states));
34 assert!(step.is_irreflexive_on(&states));
35 assert!(reachable.contains(&"Archived", &"Archived"));
36 assert!(reachable.contains(&"Draft", &"Review"));
37
38 println!(
39 "explicit carrier: {:?}; inferred support: {:?}; inferred identity: {:?}; explicit identity: {:?}; reachable: {:?}",
40 states.to_vec(),
41 inferred.to_vec(),
42 inferred_identity.to_vec(),
43 explicit_identity.to_vec(),
44 reachable.to_vec()
45 );
46}Sourcepub fn to_vec(&self) -> Vec<T>where
T: Clone,
pub fn to_vec(&self) -> Vec<T>where
T: Clone,
Converts the explicit carrier into a sorted vector of values.
Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([("Draft", "Review")]);
7 let states = FiniteCarrier::from_values(["Draft", "Review", "Archived"]);
8
9 let inferred = step.carrier();
10 let inferred_identity = BinaryRelation::identity(&inferred);
11 let explicit_identity = BinaryRelation::identity_on(&states);
12 let reachable = step.reflexive_transitive_closure_on(&states);
13
14 assert_eq!(inferred.to_vec(), vec!["Draft", "Review"]);
15 assert_eq!(
16 inferred_identity.to_vec(),
17 vec![("Draft", "Draft"), ("Review", "Review")]
18 );
19 assert_eq!(
20 explicit_identity.to_vec(),
21 vec![
22 ("Archived", "Archived"),
23 ("Draft", "Draft"),
24 ("Review", "Review"),
25 ]
26 );
27 assert_eq!(states.to_vec(), vec!["Archived", "Draft", "Review"]);
28 assert_eq!(
29 reachable.to_vec(),
30 step.reflexive_transitive_closure(&states.to_unary_relation())
31 .to_vec()
32 );
33 assert!(reachable.is_reflexive_on(&states));
34 assert!(step.is_irreflexive_on(&states));
35 assert!(reachable.contains(&"Archived", &"Archived"));
36 assert!(reachable.contains(&"Draft", &"Review"));
37
38 println!(
39 "explicit carrier: {:?}; inferred support: {:?}; inferred identity: {:?}; explicit identity: {:?}; reachable: {:?}",
40 states.to_vec(),
41 inferred.to_vec(),
42 inferred_identity.to_vec(),
43 explicit_identity.to_vec(),
44 reachable.to_vec()
45 );
46}Trait Implementations§
Source§impl<T: Clone + Ord> Clone for FiniteCarrier<T>
impl<T: Clone + Ord> Clone for FiniteCarrier<T>
Source§fn clone(&self) -> FiniteCarrier<T>
fn clone(&self) -> FiniteCarrier<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: Ord> Default for FiniteCarrier<T>
impl<T: Ord> Default for FiniteCarrier<T>
Source§impl<T: Ord> Extend<T> for FiniteCarrier<T>
impl<T: Ord> Extend<T> for FiniteCarrier<T>
Source§fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)