problemreductions/rules/
maximumindependentset_gridgraph.rs1use crate::models::graph::MaximumIndependentSet;
7use crate::reduction;
8use crate::rules::traits::{ReduceTo, ReductionResult};
9use crate::rules::unitdiskmapping::ksg;
10use crate::topology::{Graph, KingsSubgraph, SimpleGraph};
11use crate::types::One;
12
13#[derive(Debug, Clone)]
15pub struct ReductionISSimpleOneToGridOne {
16 target: MaximumIndependentSet<KingsSubgraph, One>,
17 mapping_result: ksg::MappingResult<ksg::KsgTapeEntry>,
18}
19
20impl ReductionResult for ReductionISSimpleOneToGridOne {
21 type Source = MaximumIndependentSet<SimpleGraph, One>;
22 type Target = MaximumIndependentSet<KingsSubgraph, One>;
23
24 fn target_problem(&self) -> &Self::Target {
25 &self.target
26 }
27
28 fn extract_solution(
29 &self,
30 target_solution: &<Self::Target as crate::traits::Problem>::Solution,
31 ) -> crate::rules::ExtractionResult<<Self::Source as crate::traits::Problem>::Solution> {
32 crate::rules::traits::validate_target_solution(self.target_problem(), target_solution)?;
33
34 let encoded = crate::config::bits_to_config(target_solution);
35 let mapped = self.mapping_result.map_config_back(&encoded)?;
36 Ok(crate::config::config_to_bits(&mapped))
37 }
38}
39
40#[reduction(
41 transform = upper_bound {
42 num_vertices = "16 * num_vertices^2 + 32 * num_vertices + 12",
43 num_edges = "64 * num_vertices^2 + 128 * num_vertices + 48",
44 }
45)]
46impl ReduceTo<MaximumIndependentSet<KingsSubgraph, One>>
47 for MaximumIndependentSet<SimpleGraph, One>
48{
49 type Result = ReductionISSimpleOneToGridOne;
50
51 fn reduce_to(&self) -> Result<Self::Result, crate::rules::ReductionError> {
52 let n = self.graph().num_vertices();
53 let edges = self.graph().edges();
54 let result = ksg::map_unweighted(n, &edges).map_err(|error| {
55 error.for_reduction::<Self, MaximumIndependentSet<KingsSubgraph, One>>()
56 })?;
57 let grid = result.to_kings_subgraph();
58 let weights = vec![One; grid.num_vertices()];
59 let target = MaximumIndependentSet::new(grid, weights);
60 Ok(ReductionISSimpleOneToGridOne {
61 target,
62 mapping_result: result,
63 })
64 }
65}
66
67#[cfg(test)]
68#[path = "../unit_tests/rules/maximumindependentset_gridgraph.rs"]
69mod tests;