problemreductions/rules/
maximumindependentset_casts.rs

1//! Variant cast reductions for MaximumIndependentSet.
2//!
3//! These explicit casts convert MIS between graph subtypes using
4//! the variant hierarchy's `CastToParent` trait.
5
6use crate::impl_variant_reduction;
7use crate::models::graph::MaximumIndependentSet;
8use crate::topology::{KingsSubgraph, SimpleGraph, TriangularSubgraph, UnitDiskGraph};
9use crate::types::One;
10use crate::variant::CastToParent;
11
12impl_variant_reduction!(
13    MaximumIndependentSet,
14    <KingsSubgraph, i32> => <UnitDiskGraph, i32>,
15    fields: [num_vertices, num_edges],
16    |src| MaximumIndependentSet::new(
17        src.graph().cast_to_parent(), src.weights().to_vec())
18);
19
20impl_variant_reduction!(
21    MaximumIndependentSet,
22    <TriangularSubgraph, i32> => <UnitDiskGraph, i32>,
23    fields: [num_vertices, num_edges],
24    |src| MaximumIndependentSet::new(
25        src.graph().cast_to_parent(), src.weights().to_vec())
26);
27
28impl_variant_reduction!(
29    MaximumIndependentSet,
30    <UnitDiskGraph, i32> => <SimpleGraph, i32>,
31    fields: [num_vertices, num_edges],
32    |src| MaximumIndependentSet::new(
33        src.graph().cast_to_parent(), src.weights().to_vec())
34);
35
36// Graph-hierarchy casts (same weight One)
37impl_variant_reduction!(
38    MaximumIndependentSet,
39    <KingsSubgraph, One> => <UnitDiskGraph, One>,
40    fields: [num_vertices, num_edges],
41    |src| MaximumIndependentSet::new(
42        src.graph().cast_to_parent(), src.weights().to_vec())
43);
44
45impl_variant_reduction!(
46    MaximumIndependentSet,
47    <UnitDiskGraph, One> => <SimpleGraph, One>,
48    fields: [num_vertices, num_edges],
49    |src| MaximumIndependentSet::new(
50        src.graph().cast_to_parent(), src.weights().to_vec())
51);
52
53// Weight-hierarchy casts (One → i32)
54impl_variant_reduction!(
55    MaximumIndependentSet,
56    <SimpleGraph, One> => <SimpleGraph, i32>,
57    fields: [num_vertices, num_edges],
58    |src| MaximumIndependentSet::new(
59        src.graph().clone(), src.weights().iter().map(|w| w.cast_to_parent()).collect())
60);
61
62impl_variant_reduction!(
63    MaximumIndependentSet,
64    <KingsSubgraph, One> => <KingsSubgraph, i32>,
65    fields: [num_vertices, num_edges],
66    |src| MaximumIndependentSet::new(
67        src.graph().clone(), src.weights().iter().map(|w| w.cast_to_parent()).collect())
68);
69
70impl_variant_reduction!(
71    MaximumIndependentSet,
72    <UnitDiskGraph, One> => <UnitDiskGraph, i32>,
73    fields: [num_vertices, num_edges],
74    |src| MaximumIndependentSet::new(
75        src.graph().clone(), src.weights().iter().map(|w| w.cast_to_parent()).collect())
76);