pub struct CycleWalk {
pub range: u64,
pub seed: u64,
pub stream: u64,
pub state: CycleWalkState,
/* private fields */
}Expand description
Bijective permutation of [0, range) via cycle-walking over PCG.
Signature: cycle_walk(position: u64, range: u64, seed: u64, stream: u64) -> u64
Maps every integer in [0, range) to a unique integer in [0, range)
(a permutation). Internally uses a 6-round Feistel network operating
on the bit-width of range, with PCG-derived round keys, then
cycle-walks: if the Feistel output is >= range, it is fed back as
input. Because the Feistel cipher is a bijection on the power-of-two
domain and the mask is at most 2x range, each cycle-walk iteration
has >= 50% chance of landing in range, giving fast expected
termination (~2 iterations).
Use this when you need a shuffle or bijective mapping: e.g., visiting every row in a table exactly once in a pseudo-random order, or generating unique IDs without a tracking structure.
The range, seed, and stream are init-time constants.
JIT level: P3 (named JitOp consuming [range, seed, inc] from
the jit_constants override); the compiled_u64 override
serves the closure tier. Both read the pre-computed
CycleWalkState.
Fields§
§range: u64The range argument, as given at construction.
seed: u64The seed argument, as given at construction.
stream: u64The stream argument, as given at construction.
state: CycleWalkStateThe state value, computed once at construction.
Implementations§
Trait Implementations§
Source§impl PolydatNode for CycleWalk
impl PolydatNode for CycleWalk
Source§fn compiled_u64(&self) -> Option<CompiledU64Op>
fn compiled_u64(&self) -> Option<CompiledU64Op>
Source§fn compiled_slot(&self, wire_types: &[PortType]) -> Option<CompiledSlotKit>
fn compiled_slot(&self, wire_types: &[PortType]) -> Option<CompiledSlotKit>
(ptr, len) slot
pairs; vector outputs write into kernel-owned scratch.
Checked by the compiled-kernel builders AFTER
Self::compiled_u64 — pure-scalar nodes never need it.
Default None: the node stays on typed eval.Source§fn jit_constants(&self) -> Vec<u64>
fn jit_constants(&self) -> Vec<u64>
Source§fn scratch_layout(&self) -> Vec<ScratchElem>
fn scratch_layout(&self) -> Vec<ScratchElem>
Self::eval_in. Empty for a node that evaluates over
Values alone, which is every node but a native cone.Source§fn eval_in(
&self,
scratch: &mut [ScratchBuf],
inputs: &[Value],
outputs: &mut [Value],
)
fn eval_in( &self, scratch: &mut [ScratchBuf], inputs: &[Value], outputs: &mut [Value], )
Self::eval with the node’s scratch, which the evaluating
state owns and hands in: storage belongs to the state, never to
the node, which is shared by every state of the program.Source§fn commutativity(&self) -> Commutativity
fn commutativity(&self) -> Commutativity
Source§fn accepts_none_inputs(&self) -> bool
fn accepts_none_inputs(&self) -> bool
Value::None inputs
directly rather than have the kernel propagate None through
it. Default: false — most nodes follow SRD-74 Rule 1
(None in → None out, no eval invocation). Read moreSource§fn purity(&self) -> Purity
fn purity(&self) -> Purity
runtime_model.md’s D2 axiom. Default:
Purity::Pure. Override to declare an observable
side channel (Purity::SideChannel) or
eval-call-spanning state (Purity::Nondeterministic). Read moreSource§fn simd_variant(&self) -> Option<SimdVariant>
fn simd_variant(&self) -> Option<SimdVariant>
Source§fn fusion_subgraph(&self) -> Option<FusionSubgraph<'_>>
fn fusion_subgraph(&self) -> Option<FusionSubgraph<'_>>
PolydatProgram::canonical_hash) walks THROUGH fusion
nodes into this subgraph, so identity is invariant to the
engine mix: jit=off and jit=auto compiles of the same
source hash identically, and resume-skip matching survives
mode changes. Default None: ordinary nodes hash as
themselves.