problemreductions/rules/
maximumsetpacking_casts.rs1use 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;