1use crate::impl_variant_reduction;
6use crate::models::graph::MaximumIndependentSet;
7use crate::topology::{Graph, KingsSubgraph, SimpleGraph, TriangularSubgraph, UnitDiskGraph};
8use crate::types::One;
9
10impl_variant_reduction!(
11 MaximumIndependentSet,
12 <KingsSubgraph, i64> => <UnitDiskGraph, i64>,
13 fields: [num_vertices, num_edges],
14 |src| MaximumIndependentSet::new(
15 src.graph().try_to_unit_disk_graph().map_err(
16 crate::rules::ReductionError::construction::<
17 MaximumIndependentSet<KingsSubgraph, i64>,
18 MaximumIndependentSet<UnitDiskGraph, i64>,
19 >,
20 )?,
21 src.weights().to_vec())
22);
23
24impl_variant_reduction!(
25 MaximumIndependentSet,
26 <TriangularSubgraph, i64> => <UnitDiskGraph, i64>,
27 fields: [num_vertices, num_edges],
28 |src| MaximumIndependentSet::new(
29 src.graph().try_to_unit_disk_graph().map_err(
30 crate::rules::ReductionError::construction::<
31 MaximumIndependentSet<TriangularSubgraph, i64>,
32 MaximumIndependentSet<UnitDiskGraph, i64>,
33 >,
34 )?,
35 src.weights().to_vec())
36);
37
38impl_variant_reduction!(
39 MaximumIndependentSet,
40 <UnitDiskGraph, i64> => <SimpleGraph, i64>,
41 fields: [num_vertices, num_edges],
42 |src| MaximumIndependentSet::new(
43 SimpleGraph::new(src.num_vertices(), Graph::edges(src.graph())),
44 src.weights().to_vec())
45);
46
47impl_variant_reduction!(
49 MaximumIndependentSet,
50 <KingsSubgraph, One> => <UnitDiskGraph, One>,
51 fields: [num_vertices, num_edges],
52 |src| MaximumIndependentSet::new(
53 src.graph().try_to_unit_disk_graph().map_err(
54 crate::rules::ReductionError::construction::<
55 MaximumIndependentSet<KingsSubgraph, One>,
56 MaximumIndependentSet<UnitDiskGraph, One>,
57 >,
58 )?,
59 src.weights().to_vec())
60);
61
62impl_variant_reduction!(
63 MaximumIndependentSet,
64 <UnitDiskGraph, One> => <SimpleGraph, One>,
65 fields: [num_vertices, num_edges],
66 |src| MaximumIndependentSet::new(
67 SimpleGraph::new(src.num_vertices(), Graph::edges(src.graph())),
68 src.weights().to_vec())
69);
70
71impl_variant_reduction!(
73 MaximumIndependentSet,
74 <SimpleGraph, One> => <SimpleGraph, i64>,
75 fields: [num_vertices, num_edges],
76 |src| MaximumIndependentSet::new(
77 src.graph().clone(), vec![1_i64; src.num_vertices()])
78);
79
80#[cfg(test)]
81mod tests {
82 use super::*;
83 use crate::rules::{ReduceTo, ReductionError};
84 use crate::types::MAX_EXACT_F64_INTEGER;
85
86 #[test]
87 fn kings_to_unit_disk_exposes_coordinate_conversion_error() {
88 let source = MaximumIndependentSet::new(
89 KingsSubgraph::new(vec![(MAX_EXACT_F64_INTEGER + 1, 0)]),
90 vec![1_i64],
91 );
92
93 assert!(matches!(
94 ReduceTo::<MaximumIndependentSet<UnitDiskGraph, i64>>::reduce_to(&source),
95 Err(ReductionError::Construction { .. })
96 ));
97 }
98
99 #[test]
100 fn triangular_to_unit_disk_exposes_adjacency_conversion_error() {
101 let source = MaximumIndependentSet::new(
102 TriangularSubgraph::new(vec![(MAX_EXACT_F64_INTEGER, 0), (MAX_EXACT_F64_INTEGER, 1)]),
103 vec![1_i64, 1_i64],
104 );
105
106 assert!(matches!(
107 ReduceTo::<MaximumIndependentSet<UnitDiskGraph, i64>>::reduce_to(&source),
108 Err(ReductionError::Construction { .. })
109 ));
110 }
111}
112
113impl_variant_reduction!(
114 MaximumIndependentSet,
115 <KingsSubgraph, One> => <KingsSubgraph, i64>,
116 fields: [num_vertices, num_edges],
117 |src| MaximumIndependentSet::new(
118 src.graph().clone(), vec![1_i64; src.num_vertices()])
119);
120
121impl_variant_reduction!(
122 MaximumIndependentSet,
123 <UnitDiskGraph, One> => <UnitDiskGraph, i64>,
124 fields: [num_vertices, num_edges],
125 |src| MaximumIndependentSet::new(
126 src.graph().clone(), vec![1_i64; src.num_vertices()])
127);
128
129crate::register_aggregate_reduction!(
130 crate::rules::VariantReductionResult<
131 MaximumIndependentSet<KingsSubgraph, i64>,
132 MaximumIndependentSet<UnitDiskGraph, i64>,
133 >
134);
135crate::register_aggregate_reduction!(
136 crate::rules::VariantReductionResult<
137 MaximumIndependentSet<TriangularSubgraph, i64>,
138 MaximumIndependentSet<UnitDiskGraph, i64>,
139 >
140);
141crate::register_aggregate_reduction!(
142 crate::rules::VariantReductionResult<
143 MaximumIndependentSet<UnitDiskGraph, i64>,
144 MaximumIndependentSet<SimpleGraph, i64>,
145 >
146);
147crate::register_aggregate_reduction!(
148 crate::rules::VariantReductionResult<
149 MaximumIndependentSet<KingsSubgraph, One>,
150 MaximumIndependentSet<UnitDiskGraph, One>,
151 >
152);
153crate::register_aggregate_reduction!(
154 crate::rules::VariantReductionResult<
155 MaximumIndependentSet<UnitDiskGraph, One>,
156 MaximumIndependentSet<SimpleGraph, One>,
157 >
158);
159crate::register_aggregate_reduction!(
160 crate::rules::VariantReductionResult<
161 MaximumIndependentSet<SimpleGraph, One>,
162 MaximumIndependentSet<SimpleGraph, i64>,
163 >
164);
165crate::register_aggregate_reduction!(
166 crate::rules::VariantReductionResult<
167 MaximumIndependentSet<KingsSubgraph, One>,
168 MaximumIndependentSet<KingsSubgraph, i64>,
169 >
170);
171crate::register_aggregate_reduction!(
172 crate::rules::VariantReductionResult<
173 MaximumIndependentSet<UnitDiskGraph, One>,
174 MaximumIndependentSet<UnitDiskGraph, i64>,
175 >
176);