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 |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);