Skip to main content

problemreductions/rules/
maximumsetpacking_casts.rs

1//! Variant reductions for MaximumSetPacking.
2
3use crate::impl_variant_reduction;
4use crate::models::set::MaximumSetPacking;
5use crate::rules::ReductionError;
6use crate::types::{i64_to_exact_f64, One};
7
8impl_variant_reduction!(
9    MaximumSetPacking,
10    <One> => <i64>,
11    fields: [num_sets, universe_size],
12    |src| MaximumSetPacking::with_weights(
13        src.sets().to_vec(),
14        vec![1_i64; src.num_sets()])
15        .map_err(ReductionError::construction::<
16            MaximumSetPacking<One>,
17            MaximumSetPacking<i64>,
18        >)?
19);
20
21impl_variant_reduction!(
22    MaximumSetPacking,
23    <i64> => <f64>,
24    fields: [num_sets, universe_size],
25    |src| {
26        let weights = src
27            .weights_ref()
28            .iter()
29            .copied()
30            .map(i64_to_exact_f64)
31            .collect::<Result<Vec<_>, _>>()
32            .map_err(|error| {
33                ReductionError::inexact_float_conversion::<
34                    MaximumSetPacking<i64>,
35                    MaximumSetPacking<f64>,
36                >(error)
37            })?;
38        MaximumSetPacking::with_weights(src.sets().to_vec(), weights).map_err(|cause| {
39            ReductionError::construction::<MaximumSetPacking<i64>, MaximumSetPacking<f64>>(
40                cause,
41            )
42        })?
43    }
44);
45
46#[cfg(test)]
47#[path = "../unit_tests/rules/maximumsetpacking_casts.rs"]
48mod tests;
49
50crate::register_aggregate_reduction!(
51    crate::rules::VariantReductionResult<MaximumSetPacking<One>, MaximumSetPacking<i64>>
52);