pub struct GkState {
pub core: EngineCore,
/* private fields */
}Expand description
GK evaluation engine using precomputed per-input dependent lists.
On set_input(), only nodes that depend on the changed input
are dirtied. O(affected_nodes) per input change.
This is the default engine for production use.
Fields§
§core: EngineCoreShared evaluation core (buffers, clean flags, inputs).
Implementations§
Source§impl GkState
impl GkState
Sourcepub fn set_inputs(&mut self, coords: &[u64])
pub fn set_inputs(&mut self, coords: &[u64])
Set all coordinate inputs at once (convenience for the common
single-cycle case). Wraps each u64 as Value::U64 and sets
them at indices 0..N with per-input change detection.
Sourcepub fn set_input(&mut self, idx: usize, value: Value)
pub fn set_input(&mut self, idx: usize, value: Value)
Set a single input by index, dirtying only dependent nodes.
Single-register semantics: a cell-bound slot’s only
register IS the cell — set_input writes through the
cell. A non-cell slot’s register is the local
inputs[idx] array. There’s no second snapshot kept in
lockstep with the cell; reads always go to whichever is
the slot’s register.
Dependents-marking is the dependent-list invalidation
strategy carried by GkState; it’s the write-side
half of the engine’s dirty-tracking. Other engines
(RawState, ProvScanState) implement different
strategies — see their own set_inputs impls.
Sourcepub fn get_input(&self, idx: usize) -> Value
pub fn get_input(&self, idx: usize) -> Value
Read the value of an input by index.
Single-register read: cell-bound slots return the cell’s current value; non-cell slots return the local register. One canonical value per slot, no stale snapshot.
Sourcepub fn read_input_value(&self, idx: usize) -> Value
pub fn read_input_value(&self, idx: usize) -> Value
Alias for Self::get_input; kept for legacy callers
that picked the more explicit name. Both read the cell
when one is attached.
Attach a SharedCell to an input slot.
After this call the cell becomes the slot’s sole
register: reads via read_input go through the cell,
set_input writes through the cell. The local
inputs[idx] array entry for this slot is unused for
cell-bound slots — there is no second register kept in
lockstep.
Dependents are dirtied because the slot’s effective value just changed from the local default to whatever the cell currently holds.
Returns the SharedCell attached to an input slot, if any.
Used by materialize_wiring_from_outer to share an existing cell with
inner kernels.
Sourcepub fn invalidate_cell_bound_dependents(&mut self)
pub fn invalidate_cell_bound_dependents(&mut self)
Mark every node that depends on a cell-bound input slot as
dirty. Called at cycle boundary on descendant kernels so
that values written into shared cells by ancestor kernels’
advance_broadcasts actually propagate through our memoized
eval cone on the next pull.
Without this, a passthrough output node like query —
whose wiring is WireSource::Input(idx_of_query_slot) and
whose query slot is attached to the phase kernel’s output
cell — caches its first-cycle value forever, because no
set_input call on this kernel ever touches that slot (the
cell is written by the ancestor, not via our set_input).
Sourcepub fn reset_inputs_from(&mut self, from_idx: usize)
pub fn reset_inputs_from(&mut self, from_idx: usize)
Reset a range of inputs to their defaults. Used at stanza
boundaries to prevent capture leakage across stanzas.
from_idx is typically coord_count (skip coordinates,
reset only capture inputs).
Cell-bound slots are skipped: the cell is cross-kernel shared state with its own lifecycle (managed by the owning ancestor scope), and a stanza-local reset must not clobber other kernels’ views.
Sourcepub fn invalidate_all(&mut self)
pub fn invalidate_all(&mut self)
Invalidate all state: reset all inputs to defaults and mark every node dirty. Provides “clean slate” semantics.
Sourcepub fn pull(&mut self, program: &GkProgram, output_name: &str) -> &Value
pub fn pull(&mut self, program: &GkProgram, output_name: &str) -> &Value
Pull a named output variate from the program.
Sourcepub fn seed_node_buffer(
&mut self,
node_idx: usize,
port_idx: usize,
value: Value,
)
pub fn seed_node_buffer( &mut self, node_idx: usize, port_idx: usize, value: Value, )
Pre-populate a node’s output buffer slot and mark it clean, suppressing on-demand evaluation. Used by the scope-init pass (SRD 11 §“Init Binding Contract” Plan B) to seed per-fiber states with init binding values that the activation kernel already evaluated, so each fiber doesn’t re-fire the eval at first pull.
Sourcepub fn node_buffer(&self, node_idx: usize, port_idx: usize) -> Option<&Value>
pub fn node_buffer(&self, node_idx: usize, port_idx: usize) -> Option<&Value>
Read a node’s output buffer slot. Used by the scope-init pass to extract a pre-pulled init binding value from one state and seed it into another.
Sourcepub fn pull_by_index(
&mut self,
program: &GkProgram,
output_idx: usize,
) -> &Value
pub fn pull_by_index( &mut self, program: &GkProgram, output_idx: usize, ) -> &Value
Pull an output by index (declaration order). Only evaluates the computation cone for this specific output.
Sourcepub fn pull_all<'a>(&'a mut self, program: &GkProgram) -> Vec<&'a Value>
pub fn pull_all<'a>(&'a mut self, program: &GkProgram) -> Vec<&'a Value>
Pull all outputs in declaration order.
Sourcepub fn accessor(program: &GkProgram, names: &[&str]) -> OutputAccessor
pub fn accessor(program: &GkProgram, names: &[&str]) -> OutputAccessor
Create a memoized accessor for a named subset of outputs. Resolves names to indices once; subsequent access uses indices only.
Auto Trait Implementations§
impl Freeze for GkState
impl !RefUnwindSafe for GkState
impl Send for GkState
impl Sync for GkState
impl Unpin for GkState
impl UnsafeUnpin for GkState
impl !UnwindSafe for GkState
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more