MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / find_best_params

Function find_best_params

nodedb-codec/src/alp.rs:337–400  ·  view source on GitHub ↗

Find the best ALP parameters by trying all exponents and both decode modes.

(values: &[f64])

Source from the content-addressed store, hash-verified

335
336/// Find the best ALP parameters by trying all exponents and both decode modes.
337fn 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 }

Callers 2

encodeFunction · 0.85
alp_encodabilityFunction · 0.85

Calls 4

try_alp_encodeFunction · 0.85
lenMethod · 0.45
countMethod · 0.45
iterMethod · 0.45

Tested by

no test coverage detected