pub struct UnaryRelation<T: Ord> { /* private fields */ }Expand description
Finite unary relation type. A finite unary relation.
UnaryRelation<T> remains the exact unary relation surface. Current
carrier-sensitive exact APIs still accept UnaryRelation<T> arguments for
compatibility, but G7 introduces crate::FiniteCarrier as the explicit
carrier boundary when a declared domain should stay distinct from support
inferred from stored tuples.
The starter implementation uses BTreeSet so iteration order is
deterministic.
§Examples
use relmath::{FiniteRelation, UnaryRelation};
let mut xs = UnaryRelation::new();
assert!(xs.is_empty());
xs.insert(3);
xs.insert(1);
xs.insert(2);
xs.insert(2);
let ys = UnaryRelation::singleton(3);
let zs = UnaryRelation::from_values([2, 3, 4]);
assert!(xs.contains(&1));
assert_eq!(xs.iter().copied().collect::<Vec<_>>(), vec![1, 2, 3]);
assert_eq!(xs.union(&ys).to_vec(), vec![1, 2, 3]);
assert_eq!(xs.intersection(&zs).to_vec(), vec![2, 3]);
assert_eq!(xs.difference(&zs).to_vec(), vec![1]);
assert!(ys.is_subset(&xs));Implementations§
Source§impl<T: Ord> UnaryRelation<T>
impl<T: Ord> UnaryRelation<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 a unary relation from the provided values.
Duplicate values are coalesced into a single stored element.
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}9fn main() -> Result<(), relmath::NaryRelationError> {
10 let people = UnaryRelation::from_values(["Ada", "Bob"]);
11 let parent = BinaryRelation::from_pairs([("Ada", "Bob"), ("Bob", "Cara")]);
12 let enrollments =
13 NaryRelation::from_rows(["student", "course"], [["Ada", "Math"], ["Bob", "Physics"]])?;
14
15 assert_eq!(tuple_count(&people), 2);
16 assert_eq!(tuple_count(&parent), 2);
17 assert_eq!(tuple_count(&enrollments), 2);
18
19 assert_eq!(
20 people.tuples().copied().collect::<Vec<_>>(),
21 vec!["Ada", "Bob"]
22 );
23 assert_eq!(
24 parent.tuples().copied().collect::<Vec<_>>(),
25 vec![("Ada", "Bob"), ("Bob", "Cara")]
26 );
27 assert_eq!(
28 enrollments
29 .tuples()
30 .map(|row| row.to_vec())
31 .collect::<Vec<_>>(),
32 vec![vec!["Ada", "Math"], vec!["Bob", "Physics"]]
33 );
34
35 println!("people: {:?}", people.tuples().copied().collect::<Vec<_>>());
36 println!("parent: {:?}", parent.tuples().copied().collect::<Vec<_>>());
37 println!(
38 "enrollments: {:?}",
39 enrollments
40 .tuples()
41 .map(|row| row.to_vec())
42 .collect::<Vec<_>>()
43 );
44
45 Ok(())
46}Sourcepub fn singleton(value: T) -> Self
pub fn singleton(value: T) -> Self
Creates a unary relation containing exactly one value.
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}8fn main() {
9 let assignments = ValidTimeRelation::from_facts([
10 (
11 ("alice", "review"),
12 Interval::new(1, 3).expect("expected valid interval"),
13 ),
14 (
15 ("alice", "review"),
16 Interval::new(3, 5).expect("expected valid interval"),
17 ),
18 (
19 ("bob", "approve"),
20 Interval::new(2, 4).expect("expected valid interval"),
21 ),
22 ]);
23
24 let alice = UnaryRelation::singleton("alice");
25 let fact_support = assignments.support();
26 let exact_support = assignments.to_binary_relation();
27 let audit_window = Interval::new(2, 4).expect("expected valid interval");
28 let active_at_three = assignments.snapshot_at(&3);
29 let audit_assignments = assignments.restrict_to(&audit_window);
30
31 assert_eq!(
32 assignments
33 .valid_time_of(&("alice", "review"))
34 .expect("expected support")
35 .to_vec(),
36 vec![Interval::new(1, 5).expect("expected valid interval")]
37 );
38 assert!(assignments.is_active_at(&("alice", "review"), &4));
39 assert!(!assignments.is_active_at(&("alice", "review"), &5));
40 assert_eq!(
41 active_at_three.to_vec(),
42 vec![("alice", "review"), ("bob", "approve")]
43 );
44 assert_eq!(
45 fact_support.to_vec(),
46 vec![("alice", "review"), ("bob", "approve")]
47 );
48 assert_eq!(
49 audit_assignments
50 .valid_time_of(&("alice", "review"))
51 .expect("expected support")
52 .to_vec(),
53 vec![Interval::new(2, 4).expect("expected valid interval")]
54 );
55 assert_eq!(
56 audit_assignments.to_binary_relation().to_vec(),
57 vec![("alice", "review"), ("bob", "approve")]
58 );
59 assert_eq!(exact_support.image(&alice).to_vec(), vec!["review"]);
60
61 println!(
62 "fact support: {:?}; active at t=3: {:?}; audit restriction: {:?}",
63 fact_support.to_vec(),
64 active_at_three.to_vec(),
65 audit_assignments
66 .valid_time_of(&("alice", "review"))
67 .expect("expected support")
68 .to_vec()
69 );
70}Sourcepub fn insert(&mut self, value: T) -> bool
pub fn insert(&mut self, value: T) -> bool
Inserts a value into the unary relation.
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 unary relation contains the given value.
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}Sourcepub fn iter(&self) -> impl Iterator<Item = &T>
pub fn iter(&self) -> impl Iterator<Item = &T>
Returns an iterator over the values in deterministic order.
Iteration order follows T: Ord.
Sourcepub fn intersection(&self, other: &Self) -> Selfwhere
T: Clone,
pub fn intersection(&self, other: &Self) -> Selfwhere
T: Clone,
Returns the intersection of self and other.
Sourcepub fn difference(&self, other: &Self) -> Selfwhere
T: Clone,
pub fn difference(&self, other: &Self) -> Selfwhere
T: Clone,
Returns the set difference self \ other.
Sourcepub fn is_subset(&self, other: &Self) -> bool
pub fn is_subset(&self, other: &Self) -> bool
Returns true when every element of self also appears in other.
Sourcepub fn to_vec(&self) -> Vec<T>where
T: Clone,
pub fn to_vec(&self) -> Vec<T>where
T: Clone,
Converts the unary relation into a sorted vector.
Examples found in repository?
More examples
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}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}Trait Implementations§
Source§impl<T: Clone + Ord> Clone for UnaryRelation<T>
impl<T: Clone + Ord> Clone for UnaryRelation<T>
Source§fn clone(&self) -> UnaryRelation<T>
fn clone(&self) -> UnaryRelation<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 UnaryRelation<T>
impl<T: Ord> Default for UnaryRelation<T>
Source§impl<T: Ord> Extend<T> for UnaryRelation<T>
impl<T: Ord> Extend<T> for UnaryRelation<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)