Find the best ALP parameters by trying all exponents and both decode modes.
(values: &[f64])
| 335 | |
| 336 | /// Find the best ALP parameters by trying all exponents and both decode modes. |
| 337 | fn find_best_params(values: &[f64]) -> AlpParams { |
| 338 | let sample_end = values.len().min(CODEC_SAMPLE_SIZE); |
| 339 | let sample = &values[..sample_end]; |
| 340 | |
| 341 | let mut best = AlpParams { |
| 342 | encode_exp: 0, |
| 343 | decode_exp: 0, |
| 344 | mode: DecodeMode::MultiplyInverse, |
| 345 | }; |
| 346 | let mut best_count: usize = 0; |
| 347 | |
| 348 | for e in 0..=MAX_EXPONENT { |
| 349 | let factor = POW10[e as usize]; |
| 350 | |
| 351 | for mode in [DecodeMode::MultiplyInverse, DecodeMode::DivideByFactor] { |
| 352 | // Try same decode exponent. |
| 353 | let count = sample |
| 354 | .iter() |
| 355 | .filter(|&&v| try_alp_encode(v, factor, e, mode).is_some()) |
| 356 | .count(); |
| 357 | |
| 358 | if count > best_count { |
| 359 | best_count = count; |
| 360 | best = AlpParams { |
| 361 | encode_exp: e, |
| 362 | decode_exp: e, |
| 363 | mode, |
| 364 | }; |
| 365 | } |
| 366 | |
| 367 | // Try neighboring decode exponents. |
| 368 | if e > 0 { |
| 369 | let count_alt = sample |
| 370 | .iter() |
| 371 | .filter(|&&v| try_alp_encode(v, factor, e - 1, mode).is_some()) |
| 372 | .count(); |
| 373 | if count_alt > best_count { |
| 374 | best_count = count_alt; |
| 375 | best = AlpParams { |
| 376 | encode_exp: e, |
| 377 | decode_exp: e - 1, |
| 378 | mode, |
| 379 | }; |
| 380 | } |
| 381 | } |
| 382 | if e < MAX_EXPONENT { |
| 383 | let count_alt = sample |
| 384 | .iter() |
| 385 | .filter(|&&v| try_alp_encode(v, factor, e + 1, mode).is_some()) |
| 386 | .count(); |
| 387 | if count_alt > best_count { |
| 388 | best_count = count_alt; |
| 389 | best = AlpParams { |
| 390 | encode_exp: e, |
| 391 | decode_exp: e + 1, |
| 392 | mode, |
| 393 | }; |
| 394 | } |
no test coverage detected