use super::*;
use crate::execution::disclosed::memory::{Definition, Memory, Value, VerifiedNode};
use nebu::Goldilocks as F;
use nox::{Order, Outcome, Reduction, data::Data};

mod adversarial;
mod differential;

const N: usize = 4096;
type Arena = Reduction<N>;

fn atom(ar: &mut Arena, value: u64) -> Order {
    ar.atom(F::new(value)).unwrap()
}
fn op(ar: &mut Arena, tag: u64, body: Order) -> Order {
    let head = atom(ar, tag);
    ar.pair(head, body).unwrap()
}
fn quote(ar: &mut Arena, value: u64) -> Order {
    let value = atom(ar, value);
    op(ar, 1, value)
}
fn binary(ar: &mut Arena, tag: u64, a: Order, b: Order) -> Order {
    let body = ar.pair(a, b).unwrap();
    op(ar, tag, body)
}
fn branch(ar: &mut Arena, test: Order, yes: Order, no: Order) -> Order {
    let arms = ar.pair(yes, no).unwrap();
    binary(ar, 4, test, arms)
}
fn pair(ar: &Arena, id: u32) -> (u32, u32) {
    (ar.head(id).unwrap(), ar.tail(id).unwrap())
}
fn particle(ar: &Arena, id: u32) -> Particle {
    ar.digest(id).unwrap().map(F::as_u64)
}
fn import(ar: &Arena) -> Memory {
    let mut memory =
        Memory::new(ar.count(), ar.count() as usize * size_of::<VerifiedNode>()).unwrap();
    for i in 0..ar.count() {
        let n = ar.get(i).unwrap();
        memory
            .append(Definition {
                value: match n.inner {
                    Data::Atom { value } => Value::Atom(value.as_u64()),
                    Data::Pair { left, right } => Value::Pair { left, right },
                },
                particle: n.hash.map(F::as_u64),
                cost: if n.bound.is_dynamic() {
                    Cost::Dynamic(n.bound.value())
                } else {
                    Cost::Exact(n.bound.value())
                },
            })
            .unwrap();
    }
    memory
}
fn limits() -> Limits {
    Limits {
        max_evaluations: 1024,
        max_buffer_bytes: 1024 * size_of::<VerifiedEvaluation>(),
        max_cost: u64::MAX,
        max_frames: 512,
        max_steps: u64::MAX,
    }
}
fn store(memory: &Memory) -> Evaluations<'_> {
    Evaluations::new(memory.view(memory.len()).unwrap(), limits()).unwrap()
}

#[derive(Clone, Copy)]
struct Native {
    candidate: Candidate,
    cost: u64,
    peak: u32,
}

/// Test-only producer obtains each result from the real native evaluator.
fn derive(ar: &mut Arena, object: u32, formula: u32, records: &mut Vec<Native>) -> u32 {
    let (tag, body) = pair(ar, formula);
    let tag = ar.atom_value(tag).unwrap().as_u64();
    let premises = match tag {
        0 | 1 => Premises::None,
        8 | 13 | 15 => Premises::One(derive(ar, object, body, records)),
        4 => {
            let (test, rest) = pair(ar, body);
            let (yes, no) = pair(ar, rest);
            let test = derive(ar, object, test, records);
            let v = ar
                .atom_value(records[test as usize].candidate.result)
                .unwrap();
            let chosen = if v == F::ZERO { yes } else { no };
            Premises::Two([test, derive(ar, object, chosen, records)])
        }
        _ => {
            let (a, b) = pair(ar, body);
            let a = derive(ar, object, a, records);
            let b = derive(ar, object, b, records);
            if tag == 2 {
                let c = derive(
                    ar,
                    records[a as usize].candidate.result,
                    records[b as usize].candidate.result,
                    records,
                );
                Premises::Three([a, b, c])
            } else {
                Premises::Two([a, b])
            }
        }
    };
    let run = nox::sequential::reduce_cached(
        ar,
        object,
        formula,
        u64::MAX,
        nox::sequential::Limits { max_frames: 512 },
    )
    .unwrap();
    let Outcome::Ok(result, remaining) = run.outcome else {
        panic!("{:?}", run.outcome)
    };
    let id = records.len() as u32;
    records.push(Native {
        candidate: Candidate {
            object,
            formula,
            result,
            premises,
        },
        cost: u64::MAX - remaining,
        peak: run.peak_frames,
    });
    id
}

fn verified<'a>(memory: &'a Memory, records: &[Native]) -> Evaluations<'a> {
    let mut evals = store(memory);
    for (i, record) in records.iter().enumerate() {
        assert_eq!(evals.append(record.candidate), Ok(i as u32));
        let result = evals.get(i as u32).unwrap();
        assert_eq!(result.cost(), record.cost);
        assert_eq!(result.peak_frames(), record.peak);
    }
    evals
}

fn claim(ar: &Arena, native: Native) -> Claim {
    Claim {
        object: particle(ar, native.candidate.object),
        formula: particle(ar, native.candidate.formula),
        result: particle(ar, native.candidate.result),
        cost: native.cost,
        budget: native.cost,
        max_frames: native.peak,
    }
}

Homonyms

neural/trident/src/neural/tests.rs
cyb/honeycrisp/aruminium/src/tests.rs
soft3/radio/iroh-blobs/src/tests.rs
warriors/trisha/rs/lower/tests.rs
neural/trident/src/deploy/tests.rs
soft3/crate/src/wallet/tests.rs
soft3/lens/cli/src/tests.rs
soft3/crate/src/genesis/tests.rs
neural/trident/src/verify/solve/tests.rs
neural/trident/src/package/hash/tests.rs
cyb/wysm/crates/wasmi/src/tests.rs
soft3/zheng/rs/src/accumulate/tests.rs
soft3/zheng/rs/src/air/tests.rs
neural/trident/src/package/registry/tests.rs
neural/trident/src/verify/sym/tests.rs
cyb/honeycrisp/aruminium/src/render/tests.rs
neural/trident/src/syntax/format/tests.rs
neural/trident/src/verify/smt/tests.rs
neural/trident/src/syntax/grammar/tests.rs
neural/trident/src/config/scaffold/tests.rs
warriors/trisha/rs/cost/stack_verifier/tests.rs
soft3/radio/quinn/quinn-udp/tests/tests.rs
soft3/radio/cyber-bao/src/tree/tests.rs
cyb/honeycrisp/unimem/src/block/tests.rs
neural/trident/src/lsp/semantic/tests.rs
neural/trident/src/package/manifest/tests.rs
soft3/radio/cyber-bao/src/group/tests.rs
cyb/wysm/crates/cli/src/tests.rs
soft3/crate/src/chain/pool/tests.rs
soft3/cybernode/rs/src/genesis/tests.rs
soft3/zheng/rs/src/envelope/tests.rs
soft3/zheng/rs/src/machine/tests.rs
soft3/cybernode/rs/src/wallet/tests.rs
neural/trident/src/verify/synthesize/tests.rs
warriors/trisha/rs/lower/legalize/tests.rs
neural/trident/src/syntax/lexer/tests.rs
cyb/wysm/crates/collections/src/tests.rs
neural/trident/src/verify/equiv/tests.rs
neural/trident/src/lsp/util/tests.rs
neural/trident/src/verify/report/tests.rs
soft3/crate/src/chain/economy/tests.rs
soft3/radio/quinn/quinn/src/tests.rs
neural/trident/src/config/resolve/tests.rs
neural/trident/src/package/store/tests.rs
soft3/zheng/rs/src/execution/veil/tests.rs
soft3/zheng/rs/src/execution/zk/tests.rs
warriors/erga/rs/mine-bench/src/texture_ffi/tests.rs
neural/trident/src/ir/tir/stack/tests.rs
cyb/wysm/crates/core/src/memory/tests.rs
cyb/evy/forks/bevy_ecs/src/bundle/tests.rs
warriors/erga/rs/rtable-bench/src/probe/tests.rs
soft3/radio/quinn/quinn-proto/src/range_set/tests.rs
cyb/wysm/crates/core/src/table/tests.rs
warriors/erga/rs/blake-bench/src/batch/tests.rs
soft3/crate/src/chain/net/kernel/tests.rs
soft3/zheng/rs/src/recursion/circuit/tests.rs
soft3/zheng/rs/src/recursion/whir/tests.rs
soft3/zheng/rs/src/recursion/wrap/tests.rs
soft3/cybernode/rs/src/chain/economy/tests.rs
neural/trident/src/neural/data/tir_graph/tests.rs
neural/trident/src/ir/tir/optimize/tests.rs
soft3/zheng/rs/src/execution/tagged/tests.rs
warriors/erga/rs/rtable-bench/src/table/tests.rs
warriors/erga/rs/mine-bench/src/owner/tests.rs
soft3/cybernode/rs/src/chain/pool/tests.rs
soft3/zheng/rs/src/ccs/universal/tests.rs
cyb/wysm/crates/wasmi/src/instance/tests.rs
soft3/zheng/rs/src/execution/disclosed/stream/tests.rs
cyb/evy/forks/naga/src/front/wgsl/tests.rs
cyb/wysm/crates/wasmi/src/module/instantiate/tests.rs
soft3/bbg/rs/src/storage/application/transfer/tests.rs
warriors/erga/rs/mine-bench/src/cli/timed/tests.rs
cyb/wysm/crates/wasmi/src/engine/limits/tests.rs
soft3/cybernode/rs/src/chain/net/kernel/tests.rs
soft3/zheng/rs/src/execution/veil/hiding/tests.rs
soft3/zheng/rs/src/execution/disclosed/memory/tests.rs

Graph