pub struct BinaryRelation<A: Ord, B: Ord> { /* private fields */ }Expand description
Finite binary relation type. A finite binary relation.
The starter implementation stores pairs in a BTreeSet so iteration order
is deterministic.
Composition direction is:
r.compose(&s) = { (a, c) | exists b. (a, b) in r and (b, c) in s }
§Examples
use relmath::{BinaryRelation, UnaryRelation};
let user_role = BinaryRelation::from_pairs([
("ann", "admin"),
("bob", "reviewer"),
]);
let extra_role = BinaryRelation::from_pairs([
("bob", "reviewer"),
("cara", "guest"),
]);
let role_permission = BinaryRelation::from_pairs([
("admin", "read"),
("reviewer", "approve"),
("guest", "view"),
]);
assert_eq!(
user_role.union(&extra_role).to_vec(),
vec![("ann", "admin"), ("bob", "reviewer"), ("cara", "guest")]
);
assert_eq!(
user_role.intersection(&extra_role).to_vec(),
vec![("bob", "reviewer")]
);
assert_eq!(user_role.difference(&extra_role).to_vec(), vec![("ann", "admin")]);
assert_eq!(
user_role.converse().to_vec(),
vec![("admin", "ann"), ("reviewer", "bob")]
);
let effective_permission = user_role.union(&extra_role).compose(&role_permission);
assert!(effective_permission.contains(&"ann", &"read"));
assert_eq!(
effective_permission.iter().copied().collect::<Vec<_>>(),
vec![("ann", "read"), ("bob", "approve"), ("cara", "view")]
);
assert_eq!(
effective_permission.domain().to_vec(),
vec!["ann", "bob", "cara"]
);
assert_eq!(
effective_permission.range().to_vec(),
vec!["approve", "read", "view"]
);
assert_eq!(
effective_permission
.restrict_domain(&UnaryRelation::from_values(["ann", "cara"]))
.to_vec(),
vec![("ann", "read"), ("cara", "view")]
);
assert_eq!(
effective_permission
.restrict_range(&UnaryRelation::from_values(["read", "view"]))
.to_vec(),
vec![("ann", "read"), ("cara", "view")]
);
assert_eq!(
effective_permission.image(&UnaryRelation::singleton("bob")).to_vec(),
vec!["approve"]
);
assert_eq!(
effective_permission
.preimage(&UnaryRelation::from_values(["read", "view"]))
.to_vec(),
vec!["ann", "cara"]
);Implementations§
Source§impl<A: Ord, B: Ord> BinaryRelation<A, B>
impl<A: Ord, B: Ord> BinaryRelation<A, B>
Sourcepub fn from_pairs<I>(pairs: I) -> Selfwhere
I: IntoIterator<Item = (A, B)>,
pub fn from_pairs<I>(pairs: I) -> Selfwhere
I: IntoIterator<Item = (A, B)>,
Creates a binary relation from the provided pairs.
Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([
7 ("Draft", "Review"),
8 ("Review", "Approved"),
9 ("Review", "Rejected"),
10 ]);
11
12 let states =
13 UnaryRelation::from_values(["Draft", "Review", "Approved", "Rejected", "Archived"]);
14 let reachable = step.reflexive_transitive_closure(&states);
15 let draft = UnaryRelation::singleton("Draft");
16
17 assert!(reachable.contains(&"Archived", &"Archived"));
18 assert!(reachable.contains(&"Draft", &"Approved"));
19
20 println!(
21 "reachable from Draft: {:?}",
22 reachable.image(&draft).to_vec()
23 );
24}More examples
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}5fn main() {
6 let user_role = BinaryRelation::from_pairs([
7 ("ann", "admin"),
8 ("bob", "analyst"),
9 ("bob", "reviewer"),
10 ("cara", "guest"),
11 ]);
12
13 let role_permission = BinaryRelation::from_pairs([
14 ("admin", "read"),
15 ("admin", "write"),
16 ("admin", "deploy"),
17 ("analyst", "read"),
18 ("reviewer", "approve"),
19 ("guest", "read"),
20 ]);
21
22 let effective_permission = user_role.compose(&role_permission);
23 let bob = UnaryRelation::singleton("bob");
24 let bob_permissions = effective_permission.image(&bob);
25
26 assert!(effective_permission.contains(&"ann", &"deploy"));
27 assert!(bob_permissions.contains(&"approve"));
28 assert!(bob_permissions.contains(&"read"));
29
30 println!(
31 "effective permissions for bob: {:?}",
32 bob_permissions.to_vec()
33 );
34}5fn main() {
6 let gene_disease = ProvenanceRelation::from_facts([
7 (("BRCA1", "BreastCancer"), "curated_panel"),
8 (("BRCA1", "BreastCancer"), "paper_12"),
9 (("TP53", "BreastCancer"), "paper_77"),
10 ]);
11
12 let disease_drug = relmath::BinaryRelation::from_pairs([
13 ("BreastCancer", "Olaparib"),
14 ("BreastCancer", "Tamoxifen"),
15 ]);
16
17 let supported_gene_disease = gene_disease.to_binary_relation();
18 let gene_drug = supported_gene_disease.compose(&disease_drug);
19 let brca1 = UnaryRelation::singleton("BRCA1");
20 let brca1_witness = gene_disease
21 .why(&("BRCA1", "BreastCancer"))
22 .expect("expected explanation");
23
24 assert_eq!(
25 gene_drug.image(&brca1).to_vec(),
26 vec!["Olaparib", "Tamoxifen"]
27 );
28 assert_eq!(brca1_witness.to_vec(), vec!["curated_panel", "paper_12"]);
29 assert!(brca1_witness.contains_token(&"paper_12"));
30 assert_eq!(
31 gene_disease
32 .provenance_of(&("BRCA1", "BreastCancer"))
33 .expect("expected explanation")
34 .to_vec(),
35 brca1_witness.to_vec()
36 );
37 assert_eq!(
38 gene_disease.support().to_vec(),
39 vec![("BRCA1", "BreastCancer"), ("TP53", "BreastCancer")]
40 );
41 assert!(gene_disease.why(&("BRCA1", "Olaparib")).is_none());
42
43 println!(
44 "why BRCA1 links to BreastCancer in the base evidence: {:?}",
45 brca1_witness.to_vec()
46 );
47}Sourcepub fn insert(&mut self, left: A, right: B) -> bool
pub fn insert(&mut self, left: A, right: B) -> bool
Inserts a pair into the relation.
Returns true when the pair was not already present.
Sourcepub fn contains(&self, left: &A, right: &B) -> bool
pub fn contains(&self, left: &A, right: &B) -> bool
Returns true when the relation contains the given pair.
Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([
7 ("Draft", "Review"),
8 ("Review", "Approved"),
9 ("Review", "Rejected"),
10 ]);
11
12 let states =
13 UnaryRelation::from_values(["Draft", "Review", "Approved", "Rejected", "Archived"]);
14 let reachable = step.reflexive_transitive_closure(&states);
15 let draft = UnaryRelation::singleton("Draft");
16
17 assert!(reachable.contains(&"Archived", &"Archived"));
18 assert!(reachable.contains(&"Draft", &"Approved"));
19
20 println!(
21 "reachable from Draft: {:?}",
22 reachable.image(&draft).to_vec()
23 );
24}More examples
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}5fn main() {
6 let user_role = BinaryRelation::from_pairs([
7 ("ann", "admin"),
8 ("bob", "analyst"),
9 ("bob", "reviewer"),
10 ("cara", "guest"),
11 ]);
12
13 let role_permission = BinaryRelation::from_pairs([
14 ("admin", "read"),
15 ("admin", "write"),
16 ("admin", "deploy"),
17 ("analyst", "read"),
18 ("reviewer", "approve"),
19 ("guest", "read"),
20 ]);
21
22 let effective_permission = user_role.compose(&role_permission);
23 let bob = UnaryRelation::singleton("bob");
24 let bob_permissions = effective_permission.image(&bob);
25
26 assert!(effective_permission.contains(&"ann", &"deploy"));
27 assert!(bob_permissions.contains(&"approve"));
28 assert!(bob_permissions.contains(&"read"));
29
30 println!(
31 "effective permissions for bob: {:?}",
32 bob_permissions.to_vec()
33 );
34}Sourcepub fn iter(&self) -> impl Iterator<Item = &(A, B)>
pub fn iter(&self) -> impl Iterator<Item = &(A, B)>
Returns an iterator over the stored pairs in deterministic order.
Sourcepub fn domain(&self) -> UnaryRelation<A>where
A: Clone,
pub fn domain(&self) -> UnaryRelation<A>where
A: Clone,
Returns the domain of the relation.
Sourcepub fn range(&self) -> UnaryRelation<B>where
B: Clone,
pub fn range(&self) -> UnaryRelation<B>where
B: Clone,
Returns the range of the relation.
Sourcepub fn converse(&self) -> BinaryRelation<B, A>
pub fn converse(&self) -> BinaryRelation<B, A>
Returns the converse relation.
Sourcepub fn intersection(&self, other: &Self) -> Self
pub fn intersection(&self, other: &Self) -> Self
Returns the intersection of self and other.
Sourcepub fn difference(&self, other: &Self) -> Self
pub fn difference(&self, other: &Self) -> Self
Returns the set difference self \ other.
Sourcepub fn restrict_domain(&self, allowed: &UnaryRelation<A>) -> Self
pub fn restrict_domain(&self, allowed: &UnaryRelation<A>) -> Self
Restricts the domain of the relation to allowed.
Sourcepub fn restrict_range(&self, allowed: &UnaryRelation<B>) -> Self
pub fn restrict_range(&self, allowed: &UnaryRelation<B>) -> Self
Restricts the range of the relation to allowed.
Sourcepub fn image(&self, sources: &UnaryRelation<A>) -> UnaryRelation<B>where
B: Clone,
pub fn image(&self, sources: &UnaryRelation<A>) -> UnaryRelation<B>where
B: Clone,
Computes the image of sources through the relation.
Returns { b | exists a in sources. (a, b) in self }.
Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([
7 ("Draft", "Review"),
8 ("Review", "Approved"),
9 ("Review", "Rejected"),
10 ]);
11
12 let states =
13 UnaryRelation::from_values(["Draft", "Review", "Approved", "Rejected", "Archived"]);
14 let reachable = step.reflexive_transitive_closure(&states);
15 let draft = UnaryRelation::singleton("Draft");
16
17 assert!(reachable.contains(&"Archived", &"Archived"));
18 assert!(reachable.contains(&"Draft", &"Approved"));
19
20 println!(
21 "reachable from Draft: {:?}",
22 reachable.image(&draft).to_vec()
23 );
24}More examples
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}5fn main() {
6 let user_role = BinaryRelation::from_pairs([
7 ("ann", "admin"),
8 ("bob", "analyst"),
9 ("bob", "reviewer"),
10 ("cara", "guest"),
11 ]);
12
13 let role_permission = BinaryRelation::from_pairs([
14 ("admin", "read"),
15 ("admin", "write"),
16 ("admin", "deploy"),
17 ("analyst", "read"),
18 ("reviewer", "approve"),
19 ("guest", "read"),
20 ]);
21
22 let effective_permission = user_role.compose(&role_permission);
23 let bob = UnaryRelation::singleton("bob");
24 let bob_permissions = effective_permission.image(&bob);
25
26 assert!(effective_permission.contains(&"ann", &"deploy"));
27 assert!(bob_permissions.contains(&"approve"));
28 assert!(bob_permissions.contains(&"read"));
29
30 println!(
31 "effective permissions for bob: {:?}",
32 bob_permissions.to_vec()
33 );
34}29fn main() {
30 let confirmations = AnnotatedRelation::from_facts([
31 (("Alice", "Math"), SupportCount(1)),
32 (("Alice", "Math"), SupportCount(1)),
33 (("Bob", "Physics"), SupportCount(1)),
34 (("Cara", "Logic"), SupportCount::zero()),
35 ]);
36
37 let exact_completed = confirmations.to_binary_relation();
38 let alice = UnaryRelation::singleton("Alice");
39
40 assert_eq!(
41 confirmations.annotation_of(&("Alice", "Math")),
42 Some(&SupportCount(2))
43 );
44 assert_eq!(exact_completed.image(&alice).to_vec(), vec!["Math"]);
45 assert!(!confirmations.contains_fact(&("Cara", "Logic")));
46 assert_eq!(
47 confirmations
48 .iter()
49 .map(|(fact, count)| (*fact, count.0))
50 .collect::<Vec<_>>(),
51 vec![(("Alice", "Math"), 2), (("Bob", "Physics"), 1)]
52 );
53
54 println!(
55 "stored support counts: {:?}",
56 confirmations
57 .iter()
58 .map(|(fact, count)| (*fact, count.0))
59 .collect::<Vec<_>>()
60 );
61}5fn main() {
6 let gene_disease = ProvenanceRelation::from_facts([
7 (("BRCA1", "BreastCancer"), "curated_panel"),
8 (("BRCA1", "BreastCancer"), "paper_12"),
9 (("TP53", "BreastCancer"), "paper_77"),
10 ]);
11
12 let disease_drug = relmath::BinaryRelation::from_pairs([
13 ("BreastCancer", "Olaparib"),
14 ("BreastCancer", "Tamoxifen"),
15 ]);
16
17 let supported_gene_disease = gene_disease.to_binary_relation();
18 let gene_drug = supported_gene_disease.compose(&disease_drug);
19 let brca1 = UnaryRelation::singleton("BRCA1");
20 let brca1_witness = gene_disease
21 .why(&("BRCA1", "BreastCancer"))
22 .expect("expected explanation");
23
24 assert_eq!(
25 gene_drug.image(&brca1).to_vec(),
26 vec!["Olaparib", "Tamoxifen"]
27 );
28 assert_eq!(brca1_witness.to_vec(), vec!["curated_panel", "paper_12"]);
29 assert!(brca1_witness.contains_token(&"paper_12"));
30 assert_eq!(
31 gene_disease
32 .provenance_of(&("BRCA1", "BreastCancer"))
33 .expect("expected explanation")
34 .to_vec(),
35 brca1_witness.to_vec()
36 );
37 assert_eq!(
38 gene_disease.support().to_vec(),
39 vec![("BRCA1", "BreastCancer"), ("TP53", "BreastCancer")]
40 );
41 assert!(gene_disease.why(&("BRCA1", "Olaparib")).is_none());
42
43 println!(
44 "why BRCA1 links to BreastCancer in the base evidence: {:?}",
45 brca1_witness.to_vec()
46 );
47}Sourcepub fn preimage(&self, targets: &UnaryRelation<B>) -> UnaryRelation<A>where
A: Clone,
pub fn preimage(&self, targets: &UnaryRelation<B>) -> UnaryRelation<A>where
A: Clone,
Computes the preimage of targets through the relation.
Returns { a | exists b in targets. (a, b) in self }.
Sourcepub fn compose<C>(&self, rhs: &BinaryRelation<B, C>) -> BinaryRelation<A, C>
pub fn compose<C>(&self, rhs: &BinaryRelation<B, C>) -> BinaryRelation<A, C>
Composes self with rhs.
The result contains (a, c) whenever there exists b such that
(a, b) is in self and (b, c) is in rhs.
§Examples
use relmath::BinaryRelation;
let user_role = BinaryRelation::from_pairs([
("ann", "admin"),
("bob", "reviewer"),
]);
let role_permission = BinaryRelation::from_pairs([
("admin", "read"),
("reviewer", "approve"),
]);
let effective_permission = user_role.compose(&role_permission);
assert_eq!(
effective_permission.to_vec(),
vec![("ann", "read"), ("bob", "approve")]
);Examples found in repository?
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}More examples
5fn main() {
6 let user_role = BinaryRelation::from_pairs([
7 ("ann", "admin"),
8 ("bob", "analyst"),
9 ("bob", "reviewer"),
10 ("cara", "guest"),
11 ]);
12
13 let role_permission = BinaryRelation::from_pairs([
14 ("admin", "read"),
15 ("admin", "write"),
16 ("admin", "deploy"),
17 ("analyst", "read"),
18 ("reviewer", "approve"),
19 ("guest", "read"),
20 ]);
21
22 let effective_permission = user_role.compose(&role_permission);
23 let bob = UnaryRelation::singleton("bob");
24 let bob_permissions = effective_permission.image(&bob);
25
26 assert!(effective_permission.contains(&"ann", &"deploy"));
27 assert!(bob_permissions.contains(&"approve"));
28 assert!(bob_permissions.contains(&"read"));
29
30 println!(
31 "effective permissions for bob: {:?}",
32 bob_permissions.to_vec()
33 );
34}5fn main() {
6 let gene_disease = ProvenanceRelation::from_facts([
7 (("BRCA1", "BreastCancer"), "curated_panel"),
8 (("BRCA1", "BreastCancer"), "paper_12"),
9 (("TP53", "BreastCancer"), "paper_77"),
10 ]);
11
12 let disease_drug = relmath::BinaryRelation::from_pairs([
13 ("BreastCancer", "Olaparib"),
14 ("BreastCancer", "Tamoxifen"),
15 ]);
16
17 let supported_gene_disease = gene_disease.to_binary_relation();
18 let gene_drug = supported_gene_disease.compose(&disease_drug);
19 let brca1 = UnaryRelation::singleton("BRCA1");
20 let brca1_witness = gene_disease
21 .why(&("BRCA1", "BreastCancer"))
22 .expect("expected explanation");
23
24 assert_eq!(
25 gene_drug.image(&brca1).to_vec(),
26 vec!["Olaparib", "Tamoxifen"]
27 );
28 assert_eq!(brca1_witness.to_vec(), vec!["curated_panel", "paper_12"]);
29 assert!(brca1_witness.contains_token(&"paper_12"));
30 assert_eq!(
31 gene_disease
32 .provenance_of(&("BRCA1", "BreastCancer"))
33 .expect("expected explanation")
34 .to_vec(),
35 brca1_witness.to_vec()
36 );
37 assert_eq!(
38 gene_disease.support().to_vec(),
39 vec![("BRCA1", "BreastCancer"), ("TP53", "BreastCancer")]
40 );
41 assert!(gene_disease.why(&("BRCA1", "Olaparib")).is_none());
42
43 println!(
44 "why BRCA1 links to BreastCancer in the base evidence: {:?}",
45 brca1_witness.to_vec()
46 );
47}Sourcepub fn to_vec(&self) -> Vec<(A, B)>
pub fn to_vec(&self) -> Vec<(A, B)>
Converts the relation into a sorted vector of pairs.
Examples found in repository?
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}Source§impl<T: Ord> BinaryRelation<T, T>
impl<T: Ord> BinaryRelation<T, T>
Sourcepub fn carrier(&self) -> UnaryRelation<T>where
T: Clone,
pub fn carrier(&self) -> UnaryRelation<T>where
T: Clone,
Returns the carrier induced by the relation: domain union range.
Sourcepub fn identity(carrier: &UnaryRelation<T>) -> Selfwhere
T: Clone,
pub fn identity(carrier: &UnaryRelation<T>) -> Selfwhere
T: Clone,
Returns the identity relation on carrier.
§Examples
use relmath::{BinaryRelation, UnaryRelation};
let carrier = UnaryRelation::from_values(["Draft", "Review"]);
assert_eq!(
BinaryRelation::identity(&carrier).to_vec(),
vec![("Draft", "Draft"), ("Review", "Review")]
);Sourcepub fn transitive_closure(&self) -> Selfwhere
T: Clone,
pub fn transitive_closure(&self) -> Selfwhere
T: Clone,
Computes the transitive closure of the relation.
§Examples
use relmath::BinaryRelation;
let step = BinaryRelation::from_pairs([
("Draft", "Review"),
("Review", "Approved"),
]);
assert_eq!(
step.transitive_closure().to_vec(),
vec![
("Draft", "Approved"),
("Draft", "Review"),
("Review", "Approved"),
]
);Sourcepub fn reflexive_transitive_closure(&self, carrier: &UnaryRelation<T>) -> Selfwhere
T: Clone,
pub fn reflexive_transitive_closure(&self, carrier: &UnaryRelation<T>) -> Selfwhere
T: Clone,
Computes the reflexive-transitive closure on the given carrier.
Values that appear in carrier but not in any pair still gain their
identity edge in the result.
§Examples
use relmath::{BinaryRelation, UnaryRelation};
let step = BinaryRelation::from_pairs([("Draft", "Review")]);
let states = UnaryRelation::from_values(["Draft", "Review", "Archived"]);
let reachable = step.reflexive_transitive_closure(&states);
assert!(reachable.contains(&"Archived", &"Archived"));
assert!(reachable.contains(&"Draft", &"Review"));Examples found in repository?
5fn main() {
6 let step = BinaryRelation::from_pairs([
7 ("Draft", "Review"),
8 ("Review", "Approved"),
9 ("Review", "Rejected"),
10 ]);
11
12 let states =
13 UnaryRelation::from_values(["Draft", "Review", "Approved", "Rejected", "Archived"]);
14 let reachable = step.reflexive_transitive_closure(&states);
15 let draft = UnaryRelation::singleton("Draft");
16
17 assert!(reachable.contains(&"Archived", &"Archived"));
18 assert!(reachable.contains(&"Draft", &"Approved"));
19
20 println!(
21 "reachable from Draft: {:?}",
22 reachable.image(&draft).to_vec()
23 );
24}More examples
5fn main() {
6 let parent = BinaryRelation::from_pairs([
7 ("Ada", "Bob"),
8 ("Ada", "Cara"),
9 ("Bob", "Dana"),
10 ("Cara", "Eli"),
11 ("Dana", "Finn"),
12 ]);
13
14 let people = UnaryRelation::from_values(["Ada", "Bob", "Cara", "Dana", "Eli", "Finn"]);
15 let grandparent = parent.compose(&parent);
16 let ancestor = parent.reflexive_transitive_closure(&people);
17
18 let ada = UnaryRelation::singleton("Ada");
19 let reachable_from_ada = ancestor.image(&ada);
20
21 assert!(grandparent.contains(&"Ada", &"Dana"));
22 assert!(grandparent.contains(&"Ada", &"Eli"));
23 assert!(reachable_from_ada.contains(&"Finn"));
24
25 println!("grandparent pairs: {:?}", grandparent.to_vec());
26 println!(
27 "people reachable from Ada: {:?}",
28 reachable_from_ada.to_vec()
29 );
30}Sourcepub fn is_reflexive(&self, carrier: &UnaryRelation<T>) -> bool
pub fn is_reflexive(&self, carrier: &UnaryRelation<T>) -> bool
Returns true when the relation is reflexive on carrier.
Sourcepub fn is_irreflexive(&self, carrier: &UnaryRelation<T>) -> bool
pub fn is_irreflexive(&self, carrier: &UnaryRelation<T>) -> bool
Returns true when the relation is irreflexive on carrier.
Sourcepub fn is_symmetric(&self) -> bool
pub fn is_symmetric(&self) -> bool
Returns true when the relation is symmetric.
Sourcepub fn is_antisymmetric(&self) -> bool
pub fn is_antisymmetric(&self) -> bool
Returns true when the relation is antisymmetric.
Sourcepub fn is_transitive(&self) -> boolwhere
T: Clone,
pub fn is_transitive(&self) -> boolwhere
T: Clone,
Returns true when the relation is transitive.
Sourcepub fn is_equivalence(&self, carrier: &UnaryRelation<T>) -> boolwhere
T: Clone,
pub fn is_equivalence(&self, carrier: &UnaryRelation<T>) -> boolwhere
T: Clone,
Returns true when the relation is an equivalence relation on carrier.
§Examples
use relmath::{BinaryRelation, UnaryRelation};
let aliases = BinaryRelation::from_pairs([
("A. Smith", "A. Smith"),
("A. Smith", "Alice Smith"),
("Alice Smith", "A. Smith"),
("Alice Smith", "Alice Smith"),
]);
let carrier = UnaryRelation::from_values(["A. Smith", "Alice Smith"]);
assert!(aliases.is_equivalence(&carrier));Sourcepub fn is_partial_order(&self, carrier: &UnaryRelation<T>) -> boolwhere
T: Clone,
pub fn is_partial_order(&self, carrier: &UnaryRelation<T>) -> boolwhere
T: Clone,
Returns true when the relation is a partial order on carrier.
§Examples
use relmath::{BinaryRelation, UnaryRelation};
let divides = BinaryRelation::from_pairs([
(1_u8, 1_u8),
(1, 2),
(1, 4),
(2, 2),
(2, 4),
(4, 4),
]);
let carrier = UnaryRelation::from_values([1_u8, 2_u8, 4_u8]);
assert!(divides.is_partial_order(&carrier));Trait Implementations§
Source§impl<A: Clone + Ord, B: Clone + Ord> Clone for BinaryRelation<A, B>
impl<A: Clone + Ord, B: Clone + Ord> Clone for BinaryRelation<A, B>
Source§fn clone(&self) -> BinaryRelation<A, B>
fn clone(&self) -> BinaryRelation<A, B>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<A: Ord, B: Ord> Extend<(A, B)> for BinaryRelation<A, B>
impl<A: Ord, B: Ord> Extend<(A, B)> for BinaryRelation<A, B>
Source§fn extend<I: IntoIterator<Item = (A, B)>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = (A, B)>>(&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)