From c2610efc19011619048034b137421140b8d19aa6 Mon Sep 17 00:00:00 2001 From: rudy Date: Mon, 28 Nov 2022 16:18:02 +0100 Subject: [PATCH] fix: do not panic on higher than 16bits --- .../wop_atomic_pattern/crt_decomposition.rs | 14 ++++++++------ .../optimization/wop_atomic_pattern/optimize.rs | 6 +++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/concrete-optimizer/src/optimization/wop_atomic_pattern/crt_decomposition.rs b/concrete-optimizer/src/optimization/wop_atomic_pattern/crt_decomposition.rs index 6a740737e..245b75848 100644 --- a/concrete-optimizer/src/optimization/wop_atomic_pattern/crt_decomposition.rs +++ b/concrete-optimizer/src/optimization/wop_atomic_pattern/crt_decomposition.rs @@ -1,8 +1,8 @@ use crate::dag::operator::Precision; // Default heuristic to split in several word -pub fn default_coprimes(precision: Precision) -> Vec { - match precision { +pub fn default_coprimes(precision: Precision) -> Result, String> { + Ok(match precision { 1 => vec![2], // 1 bit 2 => vec![4], // 2 bit 3 => vec![8], // 3 bit @@ -16,9 +16,9 @@ pub fn default_coprimes(precision: Precision) -> Vec { 12 => vec![7, 13, 15, 16], // 3,4,4,4 bits 13 | 14 | 15 => vec![11, 13, 15, 16], // 4,4,4,4 bits 16 => vec![7, 8, 9, 11, 13], // 4,4,4,4,4 bits - 0 => panic!("Precision cannot be zero"), - _ => panic!("Precision is limited to 16-bits"), - } + 0 => return Err("Precision cannot be zero".into()), + _ => return Err("Precision is limited to 16-bits".into()), + }) } #[allow(clippy::cast_sign_loss)] @@ -42,9 +42,11 @@ mod tests { fn test_coprimes() { for precision in 1..=16 { let coprimes = default_coprimes(precision); - let prod: u64 = coprimes.iter().product(); + assert!(coprimes.is_ok()); + let prod: u64 = coprimes.unwrap().iter().product(); println!("{precision} {prod}"); assert!((1 << precision) <= prod); } + assert!(default_coprimes(17).is_err()); } } diff --git a/concrete-optimizer/src/optimization/wop_atomic_pattern/optimize.rs b/concrete-optimizer/src/optimization/wop_atomic_pattern/optimize.rs index 08fa306ef..e5b38657f 100644 --- a/concrete-optimizer/src/optimization/wop_atomic_pattern/optimize.rs +++ b/concrete-optimizer/src/optimization/wop_atomic_pattern/optimize.rs @@ -510,7 +510,11 @@ pub fn optimize_one( search_space: &SearchSpace, caches: &PersistDecompCaches, ) -> OptimizationState { - let coprimes = crt_decomposition::default_coprimes(precision as Precision); + let Ok(coprimes) = crt_decomposition::default_coprimes(precision as Precision) else { + return OptimizationState { + best_solution: None, + } + }; let partitionning = crt_decomposition::precisions_from_coprimes(&coprimes); let n_functions = 1; let mut state = optimize_raw(