Skip to main content

provenance/
provenance.rs

1//! Exact fact-token provenance for auditable scientific evidence.
2
3use relmath::{UnaryRelation, provenance::ProvenanceRelation};
4
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}