use crate::spec::{DiagramSpec, DiagramSpecBuilder, InputType};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Category {
Easy,
Medium,
Hard,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Fittable {
Normal,
SanityOnly,
Skip(&'static str),
}
pub struct CorpusEntry {
pub name: &'static str,
pub build: fn() -> DiagramSpec,
pub category: Category,
pub max_diag_error_circle: Option<f64>,
pub max_diag_error_ellipse: Option<f64>,
pub fittable_circle: Fittable,
pub fittable_ellipse: Fittable,
}
impl CorpusEntry {
pub fn ceiling_circle(&self) -> f64 {
self.max_diag_error_circle
.unwrap_or_else(|| default_ceiling(self.category))
}
pub fn ceiling_ellipse(&self) -> f64 {
self.max_diag_error_ellipse
.unwrap_or_else(|| default_ceiling(self.category))
}
}
pub const DEFAULT_MAX_DIAG_ERROR_EASY: f64 = 5e-3;
pub const DEFAULT_MAX_DIAG_ERROR_MEDIUM: f64 = 5e-3;
pub const DEFAULT_MAX_DIAG_ERROR_HARD: f64 = 5e-2;
#[cfg(target_os = "windows")]
pub const ISSUE71_ELLIPSE_CEILING: f64 = 2e-1;
#[cfg(not(target_os = "windows"))]
pub const ISSUE71_ELLIPSE_CEILING: f64 = 5e-2;
fn default_ceiling(c: Category) -> f64 {
match c {
Category::Easy => DEFAULT_MAX_DIAG_ERROR_EASY,
Category::Medium => DEFAULT_MAX_DIAG_ERROR_MEDIUM,
Category::Hard => DEFAULT_MAX_DIAG_ERROR_HARD,
}
}
pub const QUALITY_SEEDS: [u64; 16] = [1, 2, 3, 7, 13, 17, 23, 29, 31, 37, 41, 42, 47, 53, 59, 61];
pub const TEST_SEEDS: [u64; 3] = [1, 42, 7];
pub fn all() -> &'static [CorpusEntry] {
&CORPUS
}
pub fn get(name: &str) -> Option<&'static CorpusEntry> {
CORPUS.iter().find(|e| e.name == name)
}
#[allow(clippy::too_many_lines)]
static CORPUS: [CorpusEntry; 27] = [
CorpusEntry {
name: "uniform_3_set",
build: spec_uniform_3_set,
category: Category::Easy,
max_diag_error_circle: Some(3e-2),
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "three_disjoint",
build: spec_three_disjoint,
category: Category::Easy,
max_diag_error_circle: None,
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "one_contained",
build: spec_one_contained,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "two_inside_third",
build: spec_two_inside_third,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "one_contained_others_interacting",
build: spec_one_contained_others_interacting,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "russian_doll",
build: spec_russian_doll,
category: Category::Hard,
max_diag_error_circle: Some(1e-1),
max_diag_error_ellipse: Some(5e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "unequal_overlaps",
build: spec_unequal_overlaps,
category: Category::Medium,
max_diag_error_circle: None,
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "two_disjoint",
build: spec_two_disjoint,
category: Category::Easy,
max_diag_error_circle: None,
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "wilkinson_6_set",
build: spec_wilkinson_6_set,
category: Category::Hard,
max_diag_error_circle: Some(1e-1),
max_diag_error_ellipse: Some(5e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "gene_sets",
build: spec_gene_sets,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "three_inside_fourth",
build: spec_three_inside_fourth,
category: Category::Hard,
max_diag_error_circle: Some(1e-1),
max_diag_error_ellipse: Some(5e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "eulerape_3_set",
build: spec_eulerape_3_set,
category: Category::Easy,
max_diag_error_circle: Some(2e-2),
max_diag_error_ellipse: Some(2e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "one_disjoint_two_intersecting",
build: spec_one_disjoint_two_intersecting,
category: Category::Medium,
max_diag_error_circle: None,
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "four_uniform_interactions",
build: spec_four_uniform_interactions,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "two_overlapping_completely",
build: spec_two_overlapping_completely,
category: Category::Easy,
max_diag_error_circle: None,
max_diag_error_ellipse: None,
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "single_set",
build: spec_single_set,
category: Category::Hard,
max_diag_error_circle: None,
max_diag_error_ellipse: None,
fittable_circle: Fittable::SanityOnly,
fittable_ellipse: Fittable::SanityOnly,
},
CorpusEntry {
name: "random_4_set",
build: spec_random_4_set,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: Some(3e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue54_6_set_full",
build: spec_issue54_6_set_full,
category: Category::Hard,
max_diag_error_circle: Some(1.5e-1),
max_diag_error_ellipse: Some(7e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue114_4_set_dominant_quad",
build: spec_issue114_4_set_dominant_quad,
category: Category::Hard,
max_diag_error_circle: Some(1e-1),
max_diag_error_ellipse: Some(5e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue47_3_set_huge_triple",
build: spec_issue47_3_set_huge_triple,
category: Category::Hard,
max_diag_error_circle: Some(8e-2),
max_diag_error_ellipse: Some(3e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue92_3_set_dropped_pair",
build: spec_issue92_3_set_dropped_pair,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: Some(2e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue44_4_set_inclusive",
build: spec_issue44_4_set_inclusive,
category: Category::Hard,
max_diag_error_circle: Some(1e-1),
max_diag_error_ellipse: Some(1e-1),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue71_4_set_extreme_scale",
build: spec_issue71_4_set_extreme_scale,
category: Category::Hard,
max_diag_error_circle: Some(1e-1),
max_diag_error_ellipse: Some(ISSUE71_ELLIPSE_CEILING),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue103_4_set_missing_d",
build: spec_issue103_4_set_missing_d,
category: Category::Hard,
max_diag_error_circle: Some(1e-1),
max_diag_error_ellipse: Some(5e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue32_3_set_small_triple",
build: spec_issue32_3_set_small_triple,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: Some(2e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue91_6_set",
build: spec_issue91_6_set,
category: Category::Hard,
max_diag_error_circle: Some(2e-1),
max_diag_error_ellipse: Some(1e-1),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
CorpusEntry {
name: "issue111_3_set_asymmetric",
build: spec_issue111_3_set_asymmetric,
category: Category::Medium,
max_diag_error_circle: Some(5e-2),
max_diag_error_ellipse: Some(2e-2),
fittable_circle: Fittable::Normal,
fittable_ellipse: Fittable::Normal,
},
];
fn spec_uniform_3_set() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 10.0)
.set("B", 10.0)
.set("C", 10.0)
.intersection(&["A", "B"], 4.0)
.intersection(&["A", "C"], 4.0)
.intersection(&["B", "C"], 4.0)
.intersection(&["A", "B", "C"], 2.0)
.input_type(InputType::Exclusive)
.build()
.expect("uniform_3_set")
}
fn spec_three_disjoint() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 1.0)
.set("B", 1.0)
.set("C", 1.0)
.input_type(InputType::Exclusive)
.build()
.expect("three_disjoint")
}
fn spec_one_contained() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 10.0)
.set("B", 10.0)
.set("C", 0.0)
.intersection(&["A", "B"], 4.0)
.intersection(&["A", "C"], 0.0)
.intersection(&["B", "C"], 0.0)
.intersection(&["A", "B", "C"], 3.0)
.input_type(InputType::Exclusive)
.build()
.expect("one_contained")
}
fn spec_two_inside_third() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 15.0)
.set("B", 0.0)
.set("C", 0.0)
.intersection(&["A", "B"], 3.0)
.intersection(&["A", "C"], 3.0)
.intersection(&["B", "C"], 0.0)
.intersection(&["A", "B", "C"], 2.0)
.input_type(InputType::Exclusive)
.build()
.expect("two_inside_third")
}
fn spec_one_contained_others_interacting() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 15.0)
.set("B", 15.0)
.set("C", 0.0)
.intersection(&["A", "B"], 3.0)
.intersection(&["A", "C"], 0.0)
.intersection(&["B", "C"], 0.0)
.intersection(&["A", "B", "C"], 3.0)
.input_type(InputType::Exclusive)
.build()
.expect("one_contained_others_interacting")
}
fn spec_russian_doll() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 15.0)
.set("B", 0.0)
.set("C", 0.0)
.intersection(&["A", "B"], 10.0)
.intersection(&["A", "C"], 0.0)
.intersection(&["B", "C"], 0.0)
.intersection(&["A", "B", "C"], 5.0)
.input_type(InputType::Exclusive)
.build()
.expect("russian_doll")
}
fn spec_unequal_overlaps() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 7.0)
.set("B", 6.0)
.set("C", 0.0)
.intersection(&["A", "B"], 0.0)
.intersection(&["A", "C"], 1.0)
.intersection(&["B", "C"], 1.0)
.intersection(&["A", "B", "C"], 2.0)
.input_type(InputType::Exclusive)
.build()
.expect("unequal_overlaps")
}
fn spec_two_disjoint() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 10.0)
.set("B", 9.0)
.input_type(InputType::Exclusive)
.build()
.expect("two_disjoint")
}
fn spec_wilkinson_6_set() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 4.0)
.set("B", 6.0)
.set("C", 3.0)
.set("D", 2.0)
.set("E", 7.0)
.set("F", 3.0)
.intersection(&["A", "B"], 2.0)
.intersection(&["A", "F"], 2.0)
.intersection(&["B", "C"], 2.0)
.intersection(&["B", "D"], 1.0)
.intersection(&["B", "F"], 2.0)
.intersection(&["C", "D"], 1.0)
.intersection(&["D", "E"], 1.0)
.intersection(&["E", "F"], 1.0)
.intersection(&["A", "B", "F"], 1.0)
.intersection(&["B", "C", "D"], 1.0)
.input_type(InputType::Exclusive)
.build()
.expect("wilkinson_6_set")
}
fn spec_gene_sets() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("SE", 13.0)
.set("Treat", 28.0)
.set("Anti-CCP", 101.0)
.set("DAS28", 91.0)
.intersection(&["SE", "Treat"], 1.0)
.intersection(&["SE", "DAS28"], 14.0)
.intersection(&["Treat", "Anti-CCP"], 6.0)
.intersection(&["SE", "Anti-CCP", "DAS28"], 1.0)
.input_type(InputType::Exclusive)
.build()
.expect("gene_sets")
}
fn spec_three_inside_fourth() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 30.0)
.intersection(&["A", "B"], 3.0)
.intersection(&["A", "C"], 3.0)
.intersection(&["A", "D"], 3.0)
.intersection(&["A", "B", "C"], 2.0)
.intersection(&["A", "B", "D"], 2.0)
.intersection(&["A", "C", "D"], 2.0)
.intersection(&["A", "B", "C", "D"], 1.0)
.input_type(InputType::Exclusive)
.build()
.expect("three_inside_fourth")
}
fn spec_eulerape_3_set() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("a", 3491.0)
.set("b", 3409.0)
.set("c", 3503.0)
.intersection(&["a", "b"], 120.0)
.intersection(&["a", "c"], 114.0)
.intersection(&["b", "c"], 132.0)
.intersection(&["a", "b", "c"], 126.0)
.input_type(InputType::Exclusive)
.build()
.expect("eulerape_3_set")
}
fn spec_one_disjoint_two_intersecting() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 1.0)
.set("B", 0.4)
.set("C", 3.0)
.intersection(&["A", "B"], 0.2)
.intersection(&["A", "C"], 0.0)
.intersection(&["B", "C"], 0.0)
.intersection(&["A", "B", "C"], 0.0)
.input_type(InputType::Exclusive)
.build()
.expect("one_disjoint_two_intersecting")
}
fn spec_four_uniform_interactions() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 10.0)
.set("B", 10.0)
.set("C", 10.0)
.set("D", 10.0)
.intersection(&["A", "B"], 3.0)
.intersection(&["A", "C"], 3.0)
.intersection(&["A", "D"], 0.0)
.intersection(&["B", "C"], 0.0)
.intersection(&["B", "D"], 3.0)
.intersection(&["C", "D"], 3.0)
.intersection(&["A", "B", "C"], 1.0)
.intersection(&["A", "B", "D"], 1.0)
.intersection(&["A", "C", "D"], 1.0)
.intersection(&["B", "C", "D"], 1.0)
.intersection(&["A", "B", "C", "D"], 1.0)
.input_type(InputType::Exclusive)
.build()
.expect("four_uniform_interactions")
}
fn spec_two_overlapping_completely() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 0.0)
.set("B", 0.0)
.intersection(&["A", "B"], 10.0)
.input_type(InputType::Exclusive)
.build()
.expect("two_overlapping_completely")
}
fn spec_single_set() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 1.0)
.input_type(InputType::Exclusive)
.build()
.expect("single_set")
}
fn spec_random_4_set() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 0.265_508_663_142_1)
.set("B", 0.372_123_899_636_79)
.set("C", 0.572_853_363_351_896_4)
.set("E", 0.908_207_789_994_776_2)
.intersection(&["A", "B"], 0.201_681_931_037_455_8)
.intersection(&["A", "C"], 0.898_389_684_967_696_7)
.intersection(&["A", "E"], 0.944_675_268_605_351_4)
.intersection(&["B", "C"], 0.660_797_792_486_846_4)
.intersection(&["B", "E"], 0.629_114_043_898_880_5)
.intersection(&["C", "E"], 0.061_786_270_467_564_46)
.intersection(&["A", "B", "C"], 0.205_974_574_899_301)
.intersection(&["A", "B", "E"], 0.176_556_752_528_995_3)
.intersection(&["A", "C", "E"], 0.687_022_846_657_782_8)
.intersection(&["B", "C", "E"], 0.384_103_718_213_737)
.intersection(&["A", "B", "C", "E"], 0.769_841_419_998_556_4)
.input_type(InputType::Exclusive)
.build()
.expect("random_4_set")
}
fn spec_issue54_6_set_full() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 27.0)
.set("B", 7.0)
.set("C", 17.0)
.set("D", 12.0)
.set("E", 12.0)
.set("F", 11.0)
.intersection(&["A", "B"], 5.0)
.intersection(&["A", "C"], 0.0)
.intersection(&["A", "D"], 12.0)
.intersection(&["A", "E"], 0.0)
.intersection(&["A", "F"], 1.0)
.intersection(&["B", "C"], 1.0)
.intersection(&["B", "D"], 0.0)
.intersection(&["B", "E"], 4.0)
.intersection(&["B", "F"], 0.0)
.intersection(&["C", "D"], 1.0)
.intersection(&["C", "E"], 0.0)
.intersection(&["C", "F"], 4.0)
.intersection(&["D", "E"], 1.0)
.intersection(&["D", "F"], 1.0)
.intersection(&["E", "F"], 0.0)
.intersection(&["A", "B", "C"], 0.0)
.intersection(&["A", "B", "D"], 0.0)
.intersection(&["A", "B", "E"], 0.0)
.intersection(&["A", "B", "F"], 0.0)
.intersection(&["A", "C", "D"], 1.0)
.intersection(&["A", "C", "E"], 0.0)
.intersection(&["A", "C", "F"], 0.0)
.intersection(&["A", "D", "E"], 0.0)
.intersection(&["A", "D", "F"], 1.0)
.intersection(&["A", "E", "F"], 0.0)
.intersection(&["B", "C", "D"], 0.0)
.intersection(&["B", "C", "E"], 0.0)
.intersection(&["B", "C", "F"], 0.0)
.intersection(&["B", "D", "E"], 0.0)
.intersection(&["B", "D", "F"], 0.0)
.intersection(&["B", "E", "F"], 0.0)
.intersection(&["C", "D", "E"], 0.0)
.intersection(&["C", "D", "F"], 0.0)
.intersection(&["C", "E", "F"], 1.0)
.intersection(&["D", "E", "F"], 0.0)
.intersection(&["A", "B", "C", "D"], 0.0)
.intersection(&["A", "B", "C", "E"], 0.0)
.intersection(&["A", "B", "C", "F"], 0.0)
.intersection(&["A", "B", "D", "E"], 0.0)
.intersection(&["A", "B", "D", "F"], 1.0)
.intersection(&["A", "B", "E", "F"], 0.0)
.intersection(&["A", "C", "D", "E"], 0.0)
.intersection(&["A", "C", "D", "F"], 0.0)
.intersection(&["A", "C", "E", "F"], 0.0)
.intersection(&["A", "D", "E", "F"], 0.0)
.intersection(&["B", "C", "D", "E"], 0.0)
.intersection(&["B", "C", "D", "F"], 0.0)
.intersection(&["B", "C", "E", "F"], 0.0)
.intersection(&["B", "D", "E", "F"], 0.0)
.intersection(&["C", "D", "E", "F"], 0.0)
.intersection(&["A", "B", "C", "D", "E"], 0.0)
.intersection(&["A", "B", "C", "D", "F"], 0.0)
.intersection(&["A", "B", "C", "E", "F"], 0.0)
.intersection(&["A", "B", "D", "E", "F"], 0.0)
.intersection(&["A", "C", "D", "E", "F"], 0.0)
.intersection(&["B", "C", "D", "E", "F"], 0.0)
.intersection(&["A", "B", "C", "D", "E", "F"], 1.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue54_6_set_full")
}
fn spec_issue114_4_set_dominant_quad() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 7516.0)
.set("B", 7621.0)
.set("C", 3152.0)
.set("D", 26642.0)
.intersection(&["A", "B"], 781.0)
.intersection(&["A", "C"], 817.0)
.intersection(&["A", "D"], 6418.0)
.intersection(&["B", "C"], 369.0)
.intersection(&["B", "D"], 1465.0)
.intersection(&["C", "D"], 4118.0)
.intersection(&["A", "B", "C"], 324.0)
.intersection(&["A", "B", "D"], 2525.0)
.intersection(&["A", "C", "D"], 8847.0)
.intersection(&["B", "C", "D"], 1149.0)
.intersection(&["A", "B", "C", "D"], 10336.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue114_4_set_dominant_quad")
}
fn spec_issue47_3_set_huge_triple() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 500.0)
.set("B", 400.0)
.set("C", 400.0)
.intersection(&["A", "B"], 30.0)
.intersection(&["A", "C"], 40.0)
.intersection(&["B", "C"], 15.0)
.intersection(&["A", "B", "C"], 120.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue47_3_set_huge_triple")
}
fn spec_issue92_3_set_dropped_pair() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 164.0)
.set("B", 561.0)
.set("C", 166.0)
.intersection(&["A", "B"], 12.0)
.intersection(&["A", "C"], 459.0)
.intersection(&["B", "C"], 703.0)
.intersection(&["A", "B", "C"], 162.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue92_3_set_dropped_pair")
}
fn spec_issue44_4_set_inclusive() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 10487.0)
.set("B", 13190.0)
.set("C", 15675.0)
.set("D", 3519.0)
.intersection(&["A", "B"], 8302.0)
.intersection(&["A", "C"], 7501.0)
.intersection(&["A", "D"], 2986.0)
.intersection(&["B", "C"], 10276.0)
.intersection(&["B", "D"], 2914.0)
.intersection(&["C", "D"], 0.0)
.intersection(&["A", "B", "C"], 5791.0)
.intersection(&["A", "B", "D"], 2511.0)
.intersection(&["A", "C", "D"], 0.0)
.intersection(&["B", "C", "D"], 0.0)
.intersection(&["A", "B", "C", "D"], 0.0)
.input_type(InputType::Inclusive)
.build()
.expect("issue44_4_set_inclusive")
}
fn spec_issue71_4_set_extreme_scale() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 38066.0)
.set("B", 569.0)
.set("C", 23.0)
.set("D", 6.0)
.intersection(&["A", "B"], 7211.0)
.intersection(&["A", "C"], 88.0)
.intersection(&["A", "D"], 9.0)
.intersection(&["B", "C"], 15.0)
.intersection(&["B", "D"], 0.0)
.intersection(&["C", "D"], 1.0)
.intersection(&["A", "B", "C"], 819.0)
.intersection(&["A", "B", "D"], 65.0)
.intersection(&["A", "C", "D"], 0.0)
.intersection(&["B", "C", "D"], 0.0)
.intersection(&["A", "B", "C", "D"], 162.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue71_4_set_extreme_scale")
}
fn spec_issue103_4_set_missing_d() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 26.0)
.set("B", 455.0)
.set("C", 86.0)
.set("D", 26.0)
.intersection(&["A", "B"], 10.0)
.intersection(&["A", "C"], 6.0)
.intersection(&["A", "D"], 4.0)
.intersection(&["B", "C"], 34.0)
.intersection(&["B", "D"], 56.0)
.intersection(&["C", "D"], 21.0)
.intersection(&["A", "B", "C"], 2.0)
.intersection(&["A", "B", "D"], 8.0)
.intersection(&["A", "C", "D"], 13.0)
.intersection(&["B", "C", "D"], 79.0)
.intersection(&["A", "B", "C", "D"], 51.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue103_4_set_missing_d")
}
fn spec_issue32_3_set_small_triple() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 201.0)
.set("B", 72.0)
.set("C", 266.0)
.intersection(&["A", "B"], 0.0)
.intersection(&["A", "C"], 314.0)
.intersection(&["B", "C"], 0.0)
.intersection(&["A", "B", "C"], 3.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue32_3_set_small_triple")
}
#[allow(clippy::too_many_lines)]
fn spec_issue91_6_set() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 3290.0)
.set("B", 2717.0)
.set("C", 3569.0)
.set("D", 3316.0)
.set("E", 3598.0)
.set("F", 3471.0)
.intersection(&["A", "B"], 2717.0)
.intersection(&["A", "C"], 2640.0)
.intersection(&["A", "D"], 2466.0)
.intersection(&["A", "E"], 2485.0)
.intersection(&["A", "F"], 2415.0)
.intersection(&["B", "C"], 2228.0)
.intersection(&["B", "D"], 2132.0)
.intersection(&["B", "E"], 2098.0)
.intersection(&["B", "F"], 2059.0)
.intersection(&["C", "D"], 3316.0)
.intersection(&["C", "E"], 2667.0)
.intersection(&["C", "F"], 2596.0)
.intersection(&["D", "E"], 2495.0)
.intersection(&["D", "F"], 2444.0)
.intersection(&["E", "F"], 3471.0)
.intersection(&["A", "B", "C"], 2228.0)
.intersection(&["A", "B", "D"], 2132.0)
.intersection(&["A", "B", "E"], 2098.0)
.intersection(&["A", "B", "F"], 2059.0)
.intersection(&["A", "C", "D"], 2466.0)
.intersection(&["A", "C", "E"], 2294.0)
.intersection(&["A", "C", "F"], 2233.0)
.intersection(&["A", "D", "E"], 2156.0)
.intersection(&["A", "D", "F"], 2114.0)
.intersection(&["A", "E", "F"], 2415.0)
.intersection(&["B", "C", "D"], 2132.0)
.intersection(&["B", "C", "E"], 1956.0)
.intersection(&["B", "C", "F"], 1921.0)
.intersection(&["B", "D", "E"], 1881.0)
.intersection(&["B", "D", "F"], 1851.0)
.intersection(&["B", "E", "F"], 2059.0)
.intersection(&["C", "D", "E"], 2495.0)
.intersection(&["C", "D", "F"], 2444.0)
.intersection(&["C", "E", "F"], 2596.0)
.intersection(&["D", "E", "F"], 2444.0)
.intersection(&["A", "B", "C", "D"], 2132.0)
.intersection(&["A", "B", "C", "E"], 1956.0)
.intersection(&["A", "B", "C", "F"], 1921.0)
.intersection(&["A", "B", "D", "E"], 1881.0)
.intersection(&["A", "B", "D", "F"], 1851.0)
.intersection(&["A", "B", "E", "F"], 2059.0)
.intersection(&["A", "C", "D", "E"], 2156.0)
.intersection(&["A", "C", "D", "F"], 2114.0)
.intersection(&["A", "C", "E", "F"], 2233.0)
.intersection(&["A", "D", "E", "F"], 2114.0)
.intersection(&["B", "C", "D", "E"], 1881.0)
.intersection(&["B", "C", "D", "F"], 1851.0)
.intersection(&["B", "C", "E", "F"], 1921.0)
.intersection(&["B", "D", "E", "F"], 1851.0)
.intersection(&["C", "D", "E", "F"], 2444.0)
.intersection(&["A", "B", "C", "D", "E"], 1881.0)
.intersection(&["A", "B", "C", "D", "F"], 1851.0)
.intersection(&["A", "B", "C", "E", "F"], 1921.0)
.intersection(&["A", "B", "D", "E", "F"], 1851.0)
.intersection(&["A", "C", "D", "E", "F"], 2114.0)
.intersection(&["B", "C", "D", "E", "F"], 1851.0)
.intersection(&["A", "B", "C", "D", "E", "F"], 1851.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue91_6_set")
}
fn spec_issue111_3_set_asymmetric() -> DiagramSpec {
DiagramSpecBuilder::new()
.set("A", 10000.0)
.set("B", 1000.0)
.set("C", 100.0)
.intersection(&["A", "B"], 50.0)
.intersection(&["A", "C"], 30.0)
.intersection(&["B", "C"], 260.0)
.intersection(&["A", "B", "C"], 15.0)
.input_type(InputType::Exclusive)
.build()
.expect("issue111_3_set_asymmetric")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn corpus_has_27_unique_named_entries() {
let entries = all();
assert_eq!(entries.len(), 27);
let mut names: Vec<&str> = entries.iter().map(|e| e.name).collect();
names.sort();
let mut deduped = names.clone();
deduped.dedup();
assert_eq!(names, deduped, "corpus names must be unique");
}
#[test]
fn every_corpus_spec_builds() {
for entry in all() {
let _ = (entry.build)();
}
}
#[test]
fn lookup_by_name_works() {
assert!(get("eulerape_3_set").is_some());
assert!(get("nonexistent_spec").is_none());
}
}