problemreductions/rules/
bicliquecover_bmf.rs1use crate::models::algebraic::BMF;
15use crate::models::graph::BicliqueCover;
16use crate::reduction;
17use crate::rules::bmf_bicliquecover::config_bmf_to_bc;
18use crate::rules::traits::{ReduceTo, ReductionResult};
19
20#[derive(Debug, Clone)]
22pub struct ReductionBicliqueCoverToBMF {
23 target: BMF,
24 m: usize,
25 n: usize,
26 k: usize,
27}
28
29impl ReductionResult for ReductionBicliqueCoverToBMF {
30 type Source = BicliqueCover;
31 type Target = BMF;
32
33 fn target_problem(&self) -> &BMF {
34 &self.target
35 }
36
37 fn extract_solution(&self, target_solution: &[usize]) -> Vec<usize> {
40 config_bmf_to_bc(target_solution, self.m, self.n, self.k)
41 }
42}
43
44#[reduction(
45 overhead = {
46 rows = "left_size",
47 cols = "right_size",
48 rank = "rank",
49 }
50)]
51impl ReduceTo<BMF> for BicliqueCover {
52 type Result = ReductionBicliqueCoverToBMF;
53
54 fn reduce_to(&self) -> Self::Result {
55 let m = self.left_size();
56 let n = self.right_size();
57 let k = self.k();
58 let mut matrix = vec![vec![false; n]; m];
59 for &(i, j) in self.graph().left_edges() {
60 matrix[i][j] = true;
61 }
62 let target = BMF::new(matrix, k);
63 ReductionBicliqueCoverToBMF { target, m, n, k }
64 }
65}
66
67#[cfg(feature = "example-db")]
68pub(crate) fn canonical_rule_example_specs() -> Vec<crate::example_db::specs::RuleExampleSpec> {
69 use crate::export::SolutionPair;
70 use crate::topology::BipartiteGraph;
71
72 vec![crate::example_db::specs::RuleExampleSpec {
73 id: "bicliquecover_to_bmf",
74 build: || {
75 let source = BicliqueCover::new(
77 BipartiteGraph::new(2, 2, vec![(0, 0), (0, 1), (1, 0), (1, 1)]),
78 1,
79 );
80 crate::example_db::specs::rule_example_with_witness::<_, BMF>(
81 source,
82 SolutionPair {
83 source_config: vec![1, 1, 1, 1],
85 target_config: vec![1, 1, 1, 1],
87 },
88 )
89 },
90 }]
91}
92
93#[cfg(test)]
94#[path = "../unit_tests/rules/bicliquecover_bmf.rs"]
95mod tests;