use std::time::Instant;
use regex_automata::Input;
use regex_automata::dfa::{Automaton, dense};
use regex_automata::nfa::thompson;
use regex_automata::util::syntax;
use sheng::MAX_CONJUNCTS;
use sheng::prior::{CLASSES, Class};
mod common;
const WANT_BYTES: usize = 64 << 20;
const ROUNDS: usize = 7;
fn main() {
let docs = common::corpus_bytes(WANT_BYTES);
let total: usize = docs.iter().map(Vec::len).sum();
println!(
"// minted on {} · {} · {} files · {:.1} MiB from {}\n",
common::host(),
common::today(),
docs.len(),
total as f64 / (1 << 20) as f64,
common::root().display()
);
persistence(&docs);
let freq = histogram(&docs);
byte_table(&freq);
price(&docs, &freq);
}
fn histogram(docs: &[Vec<u8>]) -> [f64; 256] {
let mut n = [0u64; 256];
for doc in docs {
for &b in doc {
n[usize::from(b)] += 1;
}
}
let total: u64 = n.iter().sum();
n.map(|count| ratio(count, total))
}
fn byte_table(freq: &[f64; 256]) {
println!("pub const SOURCE_BYTES: [f64; 256] = [");
for row in freq.chunks(8) {
let cells: Vec<String> = row.iter().map(|f| format!("{f:.8}")).collect();
println!(" {},", cells.join(", "));
}
println!("];\n");
}
fn persistence(docs: &[Vec<u8>]) {
let mut counts = [[0u64; CLASSES]; CLASSES];
let mut marginal = [0u64; CLASSES];
for doc in docs {
for pair in doc.windows(2) {
counts[Class::of(pair[0]) as usize][Class::of(pair[1]) as usize] += 1;
}
for &b in doc {
marginal[Class::of(b) as usize] += 1;
}
}
let grand: u64 = marginal.iter().sum();
println!("pub const SOURCE: Chain = Chain {{");
println!(" next: [");
for (row, class) in counts.iter().zip(Class::ALL) {
let n: u64 = row.iter().sum();
let cells: Vec<String> = row.iter().map(|&c| format!("{:.6}", ratio(c, n))).collect();
println!(" [{}], // {class:?}", cells.join(", "));
}
println!(" ],");
let start: Vec<String> = marginal
.iter()
.map(|&c| format!("{:.6}", ratio(c, grand)))
.collect();
println!(" start: [{}],", start.join(", "));
println!("}};\n");
println!("// class marginal persistent ratio");
for ((i, row), &seen) in counts.iter().enumerate().zip(&marginal) {
let m = ratio(seen, grand);
let p = ratio(row[i], row.iter().sum());
println!(
"// {:<10} {m:8.4} {p:10.4} {:5.1}x",
format!("{:?}", Class::ALL[i]),
if m > 0.0 { p / m } else { 0.0 }
);
}
println!();
}
fn price(docs: &[Vec<u8>], freq: &[f64; 256]) {
let skip = timed(docs, SKIP_REF);
let walk = timed(docs, WALK_REF);
let excursion = excursion(docs, freq);
let skip_e = skip_excursion(docs, freq).map(|e| if e.is_nan() { excursion } else { e });
let sieve: Vec<String> = (1..=MAX_CONJUNCTS)
.map(|n| match sieve_ns(docs, n) {
Some(ns) => format!("{ns:.6}"),
None => "0.0".into(),
})
.collect();
println!("\npub const {}: Calibration = Calibration {{", row_name());
println!(" arch: {:?},", std::env::consts::ARCH);
println!(" kernel: Kernel::{:?},", sheng::shuffle::kernel());
println!(" host: {:?},", common::host());
println!(" minted: {:?},", common::today());
println!(" dfa_skip: {skip:.6},");
println!(" dfa_walk: {walk:.6},");
println!(" dfa_excursion: {excursion:.6},");
println!(" skip_excursion: [{:.6}, {:.6}],", skip_e[0], skip_e[1]);
println!(" sieve: [{}],", sieve.join(", "));
println!("}};");
println!(
"// then add {} to price::MINTED — a row nobody lists is a row nobody uses.",
row_name()
);
}
fn row_name() -> String {
format!(
"{}_{}",
std::env::consts::OS.to_uppercase(),
std::env::consts::ARCH.to_uppercase()
)
}
fn excursion(docs: &[Vec<u8>], freq: &[f64; 256]) -> f64 {
let mut solved = Vec::new();
println!("// lead p ns/B E");
for lead in ['e', 't', 'a', 'o', 's', 'f', 'p', 'E', '3', '=', '.'] {
let p = freq[lead as usize];
let [ns, skip, walk] = paired(
docs,
&mut [
&mut searcher(&format!(r"(?-u){}\x00\x01zz", regex_escape(lead))),
&mut searcher(SKIP_REF),
&mut searcher(WALK_REF),
],
)[..] else {
unreachable!("three loops in, three timings out")
};
let e = (ns - skip * (1.0 - p)) / (walk * p);
if e.is_finite() && e > 0.0 {
solved.push(e);
}
println!("// {lead:<6} {p:.8} {ns:7.4} {e:6.2}");
}
let mean = solved.iter().sum::<f64>() / solved.len() as f64;
let lo = solved.iter().copied().fold(f64::MAX, f64::min);
let hi = solved.iter().copied().fold(0.0f64, f64::max);
println!(
"// excursion over {} lead bytes: mean {mean:.3}, range {lo:.2}..{hi:.2}",
solved.len()
);
mean
}
fn skip_excursion(docs: &[Vec<u8>], freq: &[f64; 256]) -> [f64; 2] {
const FEW: &[&str] = &[
r"(?-u)e\x00\x01zz",
r"(?-u)a\x00\x01zz",
r"(?-u)p\x00\x01zz",
r"(?-u)E\x00\x01zz",
r"(?-u)(alpha|beta|gamma)\x00\x01zz",
];
const WIDE: &[&str] = &[
r"(?-u)[0-9]\x00\x01zz",
r"(?-u)[A-Z]\x00\x01zz",
r"(?-u)[aeiou]\x00\x01zz",
r"(?-u)[0-9a-fA-F]\x00\x01zz",
r"(?-u)[.,;:(){}]\x00\x01zz",
];
let mut solved = [0.0f64; 2];
for (slot, slate) in [FEW, WIDE].iter().enumerate() {
println!("// skip instrument={slot} p ns/B E");
let mut each = Vec::new();
for pattern in *slate {
let Some((quotient, probe)) = harvest_skip(pattern) else {
println!("// {pattern:<28} no skip");
continue;
};
if probe.instrument() as usize != slot {
continue;
}
let p: f64 = probe
.leaves()
.iter()
.map(|&b| freq[usize::from(b)])
.sum::<f64>()
.clamp(0.0, 1.0);
let [ns, skip, walk] = paired(
docs,
&mut [
&mut |hay: &[u8]| {
std::hint::black_box(sheng::shuffle::refutes_skipping(
"ient, &probe, hay,
));
},
&mut searcher(SKIP_REF),
&mut searcher(WALK_REF),
],
)[..] else {
unreachable!("three loops in, three timings out")
};
let e = (ns - skip * (1.0 - p)) / (walk * p);
if e.is_finite() && e > 0.0 {
each.push(e);
}
println!("// {pattern:<28} {p:.8} {ns:7.4} {e:6.2}");
}
solved[slot] = if each.is_empty() {
println!("// instrument={slot}: nothing measured — falling back to dfa_excursion");
f64::NAN
} else {
let mean = each.iter().sum::<f64>() / each.len() as f64;
let lo = each.iter().copied().fold(f64::MAX, f64::min);
let hi = each.iter().copied().fold(0.0f64, f64::max);
println!(
"// skip excursion instrument={slot} over {} sets: worst {hi:.3} (mean {mean:.3}, range {lo:.2}..{hi:.2})",
each.len()
);
hi
};
}
solved
}
fn harvest_skip(pattern: &str) -> Option<(sheng::Quotient, sheng::Skip)> {
let dfa = matcher(pattern);
let core = sheng::Projection::of(&dfa).ok()?;
let quotient = sheng::harvest(&core).into_iter().next()?;
let probe = sheng::Skip::of("ient.rows, quotient.start)?;
(quotient.start < quotient.threshold).then_some((quotient, probe))
}
fn regex_escape(c: char) -> String {
if c.is_ascii_alphanumeric() {
c.to_string()
} else {
format!("\\{c}")
}
}
fn matcher(pattern: &str) -> dense::DFA<Vec<u32>> {
dense::Builder::new()
.syntax(syntax::Config::new().utf8(false))
.thompson(thompson::Config::new().utf8(false))
.build(pattern)
.expect("pattern builds")
}
fn quiet(docs: &[Vec<u8>], pattern: &str) -> f64 {
let dfa = matcher(pattern);
per_byte(docs, |hay| {
assert!(
dfa.try_search_fwd(&Input::new(hay))
.expect("no quit")
.is_none(),
"calibration pattern must not match real source"
);
})
}
fn timed(docs: &[Vec<u8>], pattern: &str) -> f64 {
let dfa = matcher(pattern);
let start = dfa
.start_state_forward(&Input::new(b""))
.expect("start state");
let accel = !dfa.accelerator(start).is_empty();
let ns = quiet(docs, pattern);
println!("// {pattern:?} accel={accel} → {ns:.4} ns/B");
ns
}
fn sieve_ns(docs: &[Vec<u8>], n: usize) -> Option<f64> {
const SLATE: &[&str] = &[
r"(?-u)WalletService",
r"(?-u)a[^\n]*b",
r"(?-u)(alpha|beta|gamma)",
r"(?-u)[A-Z][a-z]+Service",
r"(?-u)[0-9]{3}-[0-9]{4}",
r"(?-u)<[^>]*>",
r"(?-u)ab+c",
];
let composing = sheng::Policy {
gate: sheng::Gate::Ungated,
skip: false,
..sheng::Policy::default()
};
let build = |p: &&str| sheng::Sieve::with(p, &composing).ok();
let harvested: Vec<(&str, usize)> = SLATE
.iter()
.filter_map(|p| build(p).map(|s| (*p, s.conjuncts())))
.collect();
if n == 1 {
println!("// slate conjunct census: {harvested:?}");
}
let sieve = SLATE
.iter()
.filter_map(build)
.find(|s| s.conjuncts() == n)?;
let ns = per_byte(docs, |hay| {
std::hint::black_box(sieve.refutes(hay));
});
println!("// sieve conjuncts={n} → {ns:.4} ns/B");
Some(ns)
}
const SKIP_REF: &str = r"(?-u)\x00\x01zz";
const WALK_REF: &str = r"(?-u)[A-Za-z]\x00\x01zz";
fn searcher(pattern: &str) -> impl FnMut(&[u8]) {
let dfa = matcher(pattern);
move |hay: &[u8]| {
assert!(
dfa.try_search_fwd(&Input::new(hay))
.expect("no quit")
.is_none(),
"calibration pattern must not match real source"
);
}
}
type Leg<'a> = &'a mut dyn FnMut(&[u8]);
fn paired(docs: &[Vec<u8>], runs: &mut [Leg<'_>]) -> Vec<f64> {
let bytes: usize = docs.iter().map(Vec::len).sum();
let mut best = vec![f64::MAX; runs.len()];
for _ in 0..ROUNDS {
for (slot, run) in runs.iter_mut().enumerate() {
let t = Instant::now();
for doc in docs {
run(doc);
}
best[slot] = best[slot].min(t.elapsed().as_secs_f64());
}
}
best.iter().map(|secs| secs * 1e9 / bytes as f64).collect()
}
fn per_byte(docs: &[Vec<u8>], mut run: impl FnMut(&[u8])) -> f64 {
let bytes: usize = docs.iter().map(Vec::len).sum();
let mut best = f64::MAX;
for _ in 0..ROUNDS {
let t = Instant::now();
for doc in docs {
run(doc);
}
best = best.min(t.elapsed().as_secs_f64());
}
best * 1e9 / bytes as f64
}
fn ratio(num: u64, den: u64) -> f64 {
if den == 0 {
0.0
} else {
num as f64 / den as f64
}
}