problemreductions/rules/
kcoloring_twodimensionalconsecutivesets.rs1use crate::models::graph::KColoring;
14use crate::models::set::TwoDimensionalConsecutiveSets;
15use crate::reduction;
16use crate::rules::traits::{ReduceTo, ReductionResult};
17use crate::topology::{Graph, SimpleGraph};
18use crate::variant::K3;
19
20#[derive(Debug, Clone)]
22pub struct ReductionKColoringToTDCS {
23 target: TwoDimensionalConsecutiveSets,
24 num_vertices: usize,
26}
27
28impl ReductionResult for ReductionKColoringToTDCS {
29 type Source = KColoring<K3, SimpleGraph>;
30 type Target = TwoDimensionalConsecutiveSets;
31
32 fn target_problem(&self) -> &Self::Target {
33 &self.target
34 }
35
36 fn extract_solution(&self, target_solution: &[usize]) -> Vec<usize> {
43 let vertex_groups = &target_solution[..self.num_vertices];
50
51 let mut used: Vec<usize> = vertex_groups.to_vec();
53 used.sort();
54 used.dedup();
55
56 let group_to_color: std::collections::HashMap<usize, usize> = used
57 .into_iter()
58 .enumerate()
59 .map(|(color, group)| (group, color % 3))
60 .collect();
61
62 vertex_groups.iter().map(|&g| group_to_color[&g]).collect()
63 }
64}
65
66#[reduction(
67 overhead = {
68 alphabet_size = "num_vertices + num_edges",
69 num_subsets = "num_edges",
70 }
71)]
72impl ReduceTo<TwoDimensionalConsecutiveSets> for KColoring<K3, SimpleGraph> {
73 type Result = ReductionKColoringToTDCS;
74
75 fn reduce_to(&self) -> Self::Result {
76 let n = self.graph().num_vertices();
77 let edges: Vec<(usize, usize)> = self.graph().edges();
78 let m = edges.len();
79 let alphabet_size = n + m;
80
81 let subsets: Vec<Vec<usize>> = edges
83 .iter()
84 .enumerate()
85 .map(|(i, &(u, v))| vec![u, v, n + i])
86 .collect();
87
88 let target = TwoDimensionalConsecutiveSets::new(alphabet_size, subsets);
89
90 ReductionKColoringToTDCS {
91 target,
92 num_vertices: n,
93 }
94 }
95}
96
97#[cfg(feature = "example-db")]
98pub(crate) fn canonical_rule_example_specs() -> Vec<crate::example_db::specs::RuleExampleSpec> {
99 use crate::export::SolutionPair;
100 use crate::traits::Problem;
101
102 vec![crate::example_db::specs::RuleExampleSpec {
103 id: "kcoloring_to_twodimensionalconsecutivesets",
104 build: || {
105 let source =
109 KColoring::<K3, _>::new(SimpleGraph::new(4, vec![(0, 1), (1, 2), (0, 2), (2, 3)]));
110 let reduction = <KColoring<K3, SimpleGraph> as ReduceTo<
111 TwoDimensionalConsecutiveSets,
112 >>::reduce_to(&source);
113 let target = reduction.target_problem();
114
115 let source_config = vec![0, 1, 2, 0];
123 let target_config = vec![0, 1, 2, 0, 2, 0, 1, 1];
124
125 assert!(
127 target.evaluate(&target_config).0,
128 "canonical example target config must be valid"
129 );
130
131 crate::example_db::specs::assemble_rule_example(
132 &source,
133 target,
134 vec![SolutionPair {
135 source_config,
136 target_config,
137 }],
138 )
139 },
140 }]
141}
142
143#[cfg(test)]
144#[path = "../unit_tests/rules/kcoloring_twodimensionalconsecutivesets.rs"]
145mod tests;