use racah::cache::{self, BASE_CACHE_MAX_BYTES};
use racah::{su2_f_symbol, wigner_3j, wigner_6j};
#[test]
fn base_cache_resource_contract() {
let per_tier_cap = BASE_CACHE_MAX_BYTES / 3;
cache::reset();
let _ = wigner_3j(2, 2, 2, 0, 0, 0); let _ = wigner_3j(2, 2, 2, 0, 0, 0); let s = cache::base_cache_stats();
assert_eq!(
(s.three_j.misses, s.three_j.hits),
(1, 1),
"one miss then one hit on the 3j tier"
);
let _ = wigner_6j(2, 2, 2, 2, 2, 2); let _ = wigner_6j(2, 2, 2, 2, 2, 2); let s = cache::base_cache_stats();
assert!(s.six_j.misses >= 1 && s.six_j.hits >= 1, "6j miss+hit");
let _ = su2_f_symbol(2, 2, 2, 2, 2, 2); let _ = su2_f_symbol(2, 2, 2, 2, 2, 2); let s = cache::base_cache_stats();
assert!(
s.derived_f.misses >= 1 && s.derived_f.hits >= 1,
"F miss+hit"
);
cache::reset();
for a in 0..12u32 {
for b in 0..12u32 {
for c in 0..12u32 {
let _ = wigner_3j(a, b, c, 0, 0, 0);
let _ = wigner_6j(a, b, c, a, b, c);
let _ = su2_f_symbol(a, b, c, a, b, c);
}
}
}
let s = cache::base_cache_stats();
assert!(
s.three_j.bytes <= per_tier_cap,
"3j over cap: {}",
s.three_j.bytes
);
assert!(
s.six_j.bytes <= per_tier_cap,
"6j over cap: {}",
s.six_j.bytes
);
assert!(
s.derived_f.bytes <= per_tier_cap,
"F over cap: {}",
s.derived_f.bytes
);
let total = s.total();
assert!(
total.bytes <= BASE_CACHE_MAX_BYTES,
"aggregate over BASE_CACHE_MAX_BYTES: {} > {}",
total.bytes,
BASE_CACHE_MAX_BYTES
);
assert_eq!(
total.entries,
s.three_j.entries + s.six_j.entries + s.derived_f.entries
);
assert_eq!(
total.bytes,
s.three_j.bytes + s.six_j.bytes + s.derived_f.bytes
);
assert!(total.entries > 0, "the fill retained entries");
let agg = cache::stats();
#[cfg(not(feature = "cgc-gen"))]
{
assert_eq!(total.entries, agg.entries, "base == aggregate (no cgc-gen)");
assert_eq!(total.bytes, agg.bytes);
}
#[cfg(feature = "cgc-gen")]
{
assert!(
total.entries <= agg.entries,
"base is a subset of aggregate"
);
assert!(total.bytes <= agg.bytes);
}
cache::reset();
let s = cache::base_cache_stats();
let zero = racah::cache::TierStats::default();
assert_eq!(s.three_j, zero, "3j not cleared");
assert_eq!(s.six_j, zero, "6j not cleared");
assert_eq!(s.derived_f, zero, "F not cleared");
assert_eq!(s.total(), zero, "total not cleared");
}