#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Ap001Verdict { Pass, Fail }
#[must_use]
pub fn verdict_from_shape_preservation(
token_embed_shape: &[u64],
pos_embed_shape: &[u64],
output_shape: &[u64],
) -> Ap001Verdict {
if token_embed_shape.is_empty() || pos_embed_shape.is_empty() || output_shape.is_empty() {
return Ap001Verdict::Fail;
}
if token_embed_shape != pos_embed_shape { return Ap001Verdict::Fail; }
if token_embed_shape != output_shape { return Ap001Verdict::Fail; }
Ap001Verdict::Pass
}
pub const AC_AP_002_TOLERANCE: f32 = 1.0e-6;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Ap002Verdict { Pass, Fail }
#[must_use]
pub fn verdict_from_additive_identity(
token_embed: &[f32],
pos_embed: &[f32],
output: &[f32],
) -> Ap002Verdict {
if token_embed.is_empty() || pos_embed.is_empty() || output.is_empty() {
return Ap002Verdict::Fail;
}
if token_embed.len() != pos_embed.len() || token_embed.len() != output.len() {
return Ap002Verdict::Fail;
}
for &p in pos_embed {
if !p.is_finite() { return Ap002Verdict::Fail; }
if p.abs() > AC_AP_002_TOLERANCE { return Ap002Verdict::Fail; }
}
for (&t, &o) in token_embed.iter().zip(output.iter()) {
if !t.is_finite() || !o.is_finite() { return Ap002Verdict::Fail; }
if (t - o).abs() > AC_AP_002_TOLERANCE { return Ap002Verdict::Fail; }
}
Ap002Verdict::Pass
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Ap003Verdict { Pass, Fail }
#[must_use]
pub fn verdict_from_position_bound(positions: &[u64], max_position: u64) -> Ap003Verdict {
if positions.is_empty() || max_position == 0 { return Ap003Verdict::Fail; }
for &t in positions {
if t >= max_position { return Ap003Verdict::Fail; }
}
Ap003Verdict::Pass
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Ap004Verdict { Pass, Fail }
#[must_use]
pub fn verdict_from_finite_output(
token_embed: &[f32],
pos_embed: &[f32],
output: &[f32],
) -> Ap004Verdict {
if token_embed.is_empty() || pos_embed.is_empty() || output.is_empty() {
return Ap004Verdict::Fail;
}
if token_embed.len() != pos_embed.len() || token_embed.len() != output.len() {
return Ap004Verdict::Fail;
}
if !token_embed.iter().all(|v| v.is_finite()) { return Ap004Verdict::Fail; }
if !pos_embed.iter().all(|v| v.is_finite()) { return Ap004Verdict::Fail; }
if !output.iter().all(|v| v.is_finite()) { return Ap004Verdict::Fail; }
Ap004Verdict::Pass
}
#[cfg(test)]
mod tests {
use super::*;
#[test] fn ap001_pass_canonical() {
let s = vec![16_u64, 4096];
assert_eq!(verdict_from_shape_preservation(&s, &s, &s), Ap001Verdict::Pass);
}
#[test] fn ap001_fail_token_pos_mismatch() {
let token = vec![16_u64, 4096];
let pos = vec![16_u64, 4097];
let out = vec![16_u64, 4096];
assert_eq!(verdict_from_shape_preservation(&token, &pos, &out), Ap001Verdict::Fail);
}
#[test] fn ap001_fail_output_drift() {
let s = vec![16_u64, 4096];
let out = vec![16_u64, 4097];
assert_eq!(verdict_from_shape_preservation(&s, &s, &out), Ap001Verdict::Fail);
}
#[test] fn ap001_fail_empty() {
assert_eq!(verdict_from_shape_preservation(&[], &[], &[]), Ap001Verdict::Fail);
}
#[test] fn ap002_pass_canonical() {
let token = vec![1.0_f32, 2.0, 3.0];
let pos = vec![0.0_f32, 0.0, 0.0];
let output = vec![1.0_f32, 2.0, 3.0];
assert_eq!(verdict_from_additive_identity(&token, &pos, &output), Ap002Verdict::Pass);
}
#[test] fn ap002_fail_nonzero_pos_embed() {
let token = vec![1.0_f32];
let pos = vec![0.5_f32];
let output = vec![1.5_f32];
assert_eq!(verdict_from_additive_identity(&token, &pos, &output), Ap002Verdict::Fail);
}
#[test] fn ap002_fail_output_drift() {
let token = vec![1.0_f32, 2.0, 3.0];
let pos = vec![0.0_f32, 0.0, 0.0];
let output = vec![0.0_f32, 0.0, 0.0]; assert_eq!(verdict_from_additive_identity(&token, &pos, &output), Ap002Verdict::Fail);
}
#[test] fn ap002_fail_length_mismatch() {
let token = vec![1.0_f32];
let pos = vec![0.0_f32, 0.0];
let output = vec![1.0_f32];
assert_eq!(verdict_from_additive_identity(&token, &pos, &output), Ap002Verdict::Fail);
}
#[test] fn ap002_fail_nan() {
let token = vec![f32::NAN];
let pos = vec![0.0_f32];
let output = vec![f32::NAN];
assert_eq!(verdict_from_additive_identity(&token, &pos, &output), Ap002Verdict::Fail);
}
#[test] fn ap003_pass_canonical() {
let positions: Vec<u64> = (0..512).collect();
assert_eq!(verdict_from_position_bound(&positions, 512), Ap003Verdict::Pass);
}
#[test] fn ap003_fail_at_max() {
let positions = vec![511_u64, 512];
assert_eq!(verdict_from_position_bound(&positions, 512), Ap003Verdict::Fail);
}
#[test] fn ap003_fail_above_max() {
let positions = vec![1024_u64];
assert_eq!(verdict_from_position_bound(&positions, 512), Ap003Verdict::Fail);
}
#[test] fn ap003_fail_zero_max() {
assert_eq!(verdict_from_position_bound(&[0_u64], 0), Ap003Verdict::Fail);
}
#[test] fn ap003_fail_empty() {
assert_eq!(verdict_from_position_bound(&[], 512), Ap003Verdict::Fail);
}
#[test] fn ap004_pass_canonical() {
let token = vec![1.0_f32, 2.0, 3.0];
let pos = vec![0.5_f32, 1.0, 1.5];
let output = vec![1.5_f32, 3.0, 4.5];
assert_eq!(verdict_from_finite_output(&token, &pos, &output), Ap004Verdict::Pass);
}
#[test] fn ap004_fail_nan_token() {
let token = vec![f32::NAN];
let pos = vec![1.0_f32];
let output = vec![f32::NAN];
assert_eq!(verdict_from_finite_output(&token, &pos, &output), Ap004Verdict::Fail);
}
#[test] fn ap004_fail_inf_output() {
let token = vec![1.0_f32];
let pos = vec![1.0_f32];
let output = vec![f32::INFINITY];
assert_eq!(verdict_from_finite_output(&token, &pos, &output), Ap004Verdict::Fail);
}
#[test] fn ap004_fail_length_mismatch() {
let token = vec![1.0_f32];
let pos = vec![1.0_f32, 2.0];
let output = vec![1.0_f32];
assert_eq!(verdict_from_finite_output(&token, &pos, &output), Ap004Verdict::Fail);
}
#[test] fn ap004_fail_empty() {
assert_eq!(verdict_from_finite_output(&[], &[], &[]), Ap004Verdict::Fail);
}
#[test] fn provenance_constants() {
assert!((AC_AP_002_TOLERANCE - 1e-6).abs() < 1e-12);
}
}