problemreductions/rules/
threepartition_resourceconstrainedscheduling.rs1use crate::models::misc::{ResourceConstrainedScheduling, ThreePartition};
22use crate::reduction;
23use crate::rules::traits::{ReduceTo, ReductionResult};
24
25#[derive(Debug, Clone)]
27pub struct ReductionThreePartitionToRCS {
28 target: ResourceConstrainedScheduling,
29}
30
31impl ReductionResult for ReductionThreePartitionToRCS {
32 type Source = ThreePartition;
33 type Target = ResourceConstrainedScheduling;
34
35 fn target_problem(&self) -> &Self::Target {
36 &self.target
37 }
38
39 fn extract_solution(&self, target_solution: &[usize]) -> Vec<usize> {
42 target_solution.to_vec()
43 }
44}
45
46#[reduction(overhead = {
47 num_tasks = "num_elements",
48})]
49impl ReduceTo<ResourceConstrainedScheduling> for ThreePartition {
50 type Result = ReductionThreePartitionToRCS;
51
52 fn reduce_to(&self) -> Self::Result {
53 let m = self.num_groups();
54 let bound = self.bound();
55
56 let resource_requirements: Vec<Vec<u64>> = self.sizes().iter().map(|&s| vec![s]).collect();
58
59 ReductionThreePartitionToRCS {
60 target: ResourceConstrainedScheduling::new(
61 3, vec![bound], resource_requirements,
64 m as u64, ),
66 }
67 }
68}
69
70#[cfg(feature = "example-db")]
71pub(crate) fn canonical_rule_example_specs() -> Vec<crate::example_db::specs::RuleExampleSpec> {
72 use crate::export::SolutionPair;
73
74 vec![crate::example_db::specs::RuleExampleSpec {
75 id: "threepartition_to_resourceconstrainedscheduling",
76 build: || {
77 crate::example_db::specs::rule_example_with_witness::<_, ResourceConstrainedScheduling>(
81 ThreePartition::new(vec![4, 5, 6, 4, 6, 5], 15),
82 SolutionPair {
83 source_config: vec![0, 0, 0, 1, 1, 1],
84 target_config: vec![0, 0, 0, 1, 1, 1],
85 },
86 )
87 },
88 }]
89}
90
91#[cfg(test)]
92#[path = "../unit_tests/rules/threepartition_resourceconstrainedscheduling.rs"]
93mod tests;