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    aggregate: identity,
13    |src| MaximumSetPacking::with_weights(
14        src.sets().to_vec(),
15        vec![1_i64; src.num_sets()])
16        .map_err(ReductionError::construction::<
17            MaximumSetPacking<One>,
18            MaximumSetPacking<i64>,
19        >)?
20);
21
22impl_variant_reduction!(
23    MaximumSetPacking,
24    <i64> => <f64>,
25    fields: [num_sets, universe_size],
26    |src| {
27        let weights = src
28            .weights_ref()
29            .iter()
30            .copied()
31            .map(i64_to_exact_f64)
32            .collect::<Result<Vec<_>, _>>()
33            .map_err(|error| {
34                ReductionError::inexact_float_conversion::<
35                    MaximumSetPacking<i64>,
36                    MaximumSetPacking<f64>,
37                >(error)
38            })?;
39        MaximumSetPacking::with_weights(src.sets().to_vec(), weights).map_err(|cause| {
40            ReductionError::construction::<MaximumSetPacking<i64>, MaximumSetPacking<f64>>(
41                cause,
42            )
43        })?
44    }
45);
46
47#[cfg(test)]
48#[path = "../unit_tests/rules/maximumsetpacking_casts.rs"]
49mod tests;