fix: do not panic on higher than 16bits

This commit is contained in:
rudy
2022-11-28 16:18:02 +01:00
committed by rudy-6-4
parent 8134a01b50
commit c2610efc19
2 changed files with 13 additions and 7 deletions

View File

@@ -1,8 +1,8 @@
use crate::dag::operator::Precision;
// Default heuristic to split in several word
pub fn default_coprimes(precision: Precision) -> Vec<u64> {
match precision {
pub fn default_coprimes(precision: Precision) -> Result<Vec<u64>, 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<u64> {
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());
}
}

View File

@@ -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(