tiny.pluck.state
Defined in tiny.pluck.
API (25)
Actions
Public operations.
checkLimitsclearSampledFlipscompareCallstackscurrentAddresscurrentAddressForCallstackdeinitfindInsertPositioninitinitCheckedmaybeSampleBddpopCallstackpushCallstackrecordBddSamplerecordFinalBddSamplerecordManagerStatsstartTimeLimitstopTimeLimit
Types and contracts
Public types and contracts.
CallstackHashContextCallstackKeyFallbackModeInferenceModeLazyKCConfigLazyKCStateLazyKCStatsLimitReason
Source
Source: lib/pluck/src/state/callstack.zig:6
pub const CallstackKey = struct { callstack: []const i32, prob: f64,};Source: lib/pluck/src/state/machine.zig:198
pub fn checkLimits(state: *LazyKCState) bool { if (state.stats.limit_reason != null) return true; if (state.manager.iteLimitExceeded()) { state.stats.limit_reason = .ite_limit; return true; } if (state.cfg.max_depth) |max| { if (state.depth > max and !state.cfg.sample_after_max_depth) { state.stats.limit_reason = .max_depth; return true; } } if (state.manager.limits.checkTimeLimit()) { state.stats.limit_reason = .time_limit; return true; } if (state.manager.limits.checkIteLimit(state.manager.num_recursive_calls)) { state.stats.limit_reason = .ite_limit; return true; } return false;}Source: lib/pluck/src/state/machine.zig:173
pub fn clearSampledFlips(state: *LazyKCState) void { var sampled_iter = state.sampled_flips.iterator(); while (sampled_iter.next()) |entry| { state.allocator.free(entry.key_ptr.callstack); } state.sampled_flips.clearRetainingCapacity();}Source: lib/pluck/src/state/machine.zig:268
pub fn currentAddress(state: *LazyKCState, p: f64) !Bdd { return currentAddressForCallstack(state, state.callstack.items, p);}Source: lib/pluck/src/state/machine.zig:272
pub fn currentAddressForCallstack(state: *LazyKCState, callstack_items: []const i32, p: f64) !Bdd { const key = StateCallstackKey{ .callstack = callstack_items, .prob = p, }; if (state.var_of_callstack.get(key)) |existing| { return existing; } const addr = if (state.cfg.use_strict_order) blk: { const pos = findInsertPosition(state, key); const new_var = try state.manager.newVarAtPosition(@intCast(pos), true); if (state.manager.iteLimitExceeded()) break :blk Bdd.FALSE; const callstack_copy = try state.allocator.dupe(i32, callstack_items); const new_key = StateCallstackKey{ .callstack = callstack_copy, .prob = p }; try state.sorted_callstacks.insert(state.allocator, pos, new_key); break :blk new_var; } else blk: { break :blk try state.manager.newVar(true); }; if (state.manager.iteLimitExceeded()) return Bdd.FALSE; const callstack_copy = try state.allocator.dupe(i32, callstack_items); try state.var_of_callstack.put( state.allocator, StateCallstackKey{ .callstack = callstack_copy, .prob = p }, addr, ); try state.wmc_params.setWeight(state.manager.topVar(addr), 1.0 - p, p); return addr;}Source: lib/pluck/src/state/machine.zig:150
pub fn deinit(state: *LazyKCState) void { state.callstack.deinit(state.allocator); var iter = state.var_of_callstack.iterator(); while (iter.next()) |entry| { state.allocator.free(entry.key_ptr.callstack); } state.var_of_callstack.deinit(state.allocator); for (state.sorted_callstacks.items) |key| { state.allocator.free(key.callstack); } state.sorted_callstacks.deinit(state.allocator); clearSampledFlips(state); state.sampled_flips.deinit(state.allocator); state.stacktrace_buf.deinit(state.allocator); state.wmc_params.deinit(); for (state.deferred_weights.items) |deferred| { state.allocator.free(deferred.guards); } state.deferred_weights.deinit(state.allocator); state.weight_dd.deinit(); state.def_thunks.deinit(state.allocator);}Source: lib/pluck/src/state/machine.zig:310
pub fn findInsertPosition(state: *const LazyKCState, key: StateCallstackKey) usize { const items = state.sorted_callstacks.items; var left: usize = 0; var right: usize = items.len; while (left < right) { const mid = left + (right - left) / 2; const cmp = callstack.compareCallstacks(items[mid].callstack, key.callstack); if (state.cfg.use_reverse_order) { if (cmp == .gt) { left = mid + 1; } else { right = mid; } } else { if (cmp == .lt) { left = mid + 1; } else { right = mid; } } } return left;}Source: lib/pluck/src/state/machine.zig:92
pub fn init( allocator: Allocator, manager: *Manager, definitions: *const Definitions, cfg: LazyKCConfig,) LazyKCState { return initChecked(allocator, manager, definitions, cfg) catch @panic("LazyKCState.init: out of memory");}Source: lib/pluck/src/state/machine.zig:102
pub fn initChecked( allocator: Allocator, manager: *Manager, definitions: *const Definitions, cfg: LazyKCConfig,) !LazyKCState { const wmc_params = if (cfg.dual) WmcParams.initDual(allocator, cfg.vector_size) else WmcParams.init(allocator); var weight_dd_state = WeightDD.init(allocator, manager) catch |err| switch (err) { error.OutOfMemory => return error.OutOfMemory, error.NaNWeight, error.NonFiniteWeight => unreachable, }; const weight_one = weight_dd_state.leaf(1.0) catch |err| switch (err) { error.OutOfMemory => return error.OutOfMemory, error.NaNWeight, error.NonFiniteWeight => unreachable, }; const now = time.nanoTimestamp(); return LazyKCState{ .allocator = allocator, .manager = manager, .wmc_params = wmc_params, .weight_dd = weight_dd_state, .weight_dd_root = weight_one, .weight_dd_one = weight_one, .deferred_weights = .empty, .cfg = cfg, .stats = LazyKCStats{}, .callstack = .empty, .var_of_callstack = .empty, .sorted_callstacks = .empty, .depth = 0, .definitions = definitions, .current_def_name = null, .stacktrace_buf = .empty, .query = null, .next_thunk_id = 0, .start_time = now, .registry = null, .sampled_flips = .{}, .prng = std.Random.DefaultPrng.init(@intCast(@max(0, now))), .def_thunks = .{}, };}Source: lib/pluck/src/state/machine.zig:235
pub fn maybeSampleBdd(state: *LazyKCState) void { const calls = state.stats.num_forward_calls; if (calls == 0) return; if (!std.math.isPowerOfTwo(calls)) return; recordBddSample(state);}Source: lib/pluck/src/state/machine.zig:341
pub fn popCallstack(state: *LazyKCState) void { _ = state.callstack.pop();}Source: lib/pluck/src/state/machine.zig:337
pub fn pushCallstack(state: *LazyKCState, index: i32) !void { try state.callstack.append(state.allocator, index);}Source: lib/pluck/src/state/machine.zig:226
pub fn recordBddSample(state: *LazyKCState) void { if (@as(usize, state.stats.bdd_samples_len) >= LazyKCStats.MaxBddSamples) return; const idx: usize = @intCast(state.stats.bdd_samples_len); state.stats.bdd_samples_forward_calls[idx] = state.stats.num_forward_calls; state.stats.bdd_samples_vars[idx] = @intCast(state.manager.var_order.items.len); state.stats.bdd_samples_nodes[idx] = @intCast(state.manager.nodes.items.len); state.stats.bdd_samples_len += 1;}Source: lib/pluck/src/state/machine.zig:242
pub fn recordFinalBddSample(state: *LazyKCState) void { const calls = state.stats.num_forward_calls; if (calls == 0) return; if (state.stats.bdd_samples_len > 0) { const last_idx: usize = @intCast(state.stats.bdd_samples_len - 1); if (state.stats.bdd_samples_forward_calls[last_idx] == calls) return; } recordBddSample(state);}Source: lib/pluck/src/state/machine.zig:252
pub fn recordManagerStats(state: *LazyKCState) void { if (state.stats.limit_reason == null and state.manager.iteLimitExceeded()) { state.stats.limit_reason = .ite_limit; } if (state.stats.limit_reason == null and state.manager.timeLimitExceeded()) { state.stats.limit_reason = .time_limit; } state.stats.num_recursive_calls = state.manager.num_recursive_calls; state.stats.ite_cache_hits = state.manager.ite_cache_hits; state.stats.ite_cache_misses = state.manager.ite_cache_misses; state.stats.unique_table_grows = state.manager.unique_table_grows; state.stats.ite_cache_grows = state.manager.ite_cache_grows; state.stats.variable_count = state.manager.var_order.items.len; state.stats.node_count = state.manager.nodes.items.len;}Source: lib/pluck/src/state/machine.zig:181
pub fn startTimeLimit(state: *LazyKCState) void { state.start_time = time.nanoTimestamp(); if (state.cfg.time_limit) |limit| { state.manager.limits.startTimeLimit(limit); } if (state.cfg.ite_limit) |limit| { state.manager.startIteLimit(limit); }}Source: lib/pluck/src/state/machine.zig:191
pub fn stopTimeLimit(state: *LazyKCState) void { state.manager.limits.stopTimeLimit(); state.manager.stopIteLimit(); const elapsed = time.nanoTimestamp() - state.start_time; state.stats.time_ns = @intCast(@max(0, elapsed));}Source: lib/pluck/src/root.zig:23
pub const state = @import("state/root.zig");Source: lib/pluck/src/state/root.zig
const config = @import("config.zig");const stats = @import("stats.zig");const callstack = @import("callstack.zig");const machine = @import("machine.zig");pub const LazyKCConfig = config.LazyKCConfig;pub const FallbackMode = config.FallbackMode;pub const InferenceMode = config.InferenceMode;pub const LimitReason = stats.LimitReason;pub const LazyKCStats = stats.LazyKCStats;pub const CallstackKey = callstack.CallstackKey;pub const CallstackHashContext = callstack.CallstackHashContext;pub const compareCallstacks = callstack.compareCallstacks;pub const LazyKCState = machine.LazyKCState;pub const init = machine.init;pub const initChecked = machine.initChecked;pub const deinit = machine.deinit;pub const startTimeLimit = machine.startTimeLimit;pub const stopTimeLimit = machine.stopTimeLimit;pub const checkLimits = machine.checkLimits;pub const recordBddSample = machine.recordBddSample;pub const maybeSampleBdd = machine.maybeSampleBdd;pub const recordFinalBddSample = machine.recordFinalBddSample;pub const recordManagerStats = machine.recordManagerStats;pub const clearSampledFlips = machine.clearSampledFlips;pub const currentAddress = machine.currentAddress;pub const currentAddressForCallstack = machine.currentAddressForCallstack;pub const findInsertPosition = machine.findInsertPosition;pub const pushCallstack = machine.pushCallstack;pub const popCallstack = machine.popCallstack;Complete caller list for state.deinit
50 direct callers.
lib.accy.src.kernel.program.execution.Cpu.deinit[method] — private source atlib/accy/src/kernel/program/execution.zig:13in nearest public ownertiny.accy.kernel.program.executionlib.accy.src.kernel.program.execution.Cpu.ensureMachine[method] — private source atlib/accy/src/kernel/program/execution.zig:49in nearest public ownertiny.accy.kernel.program.executionlib.machine.src.checkpoint.roots.test.capture[function] — private source atlib/machine/src/checkpoint/roots/test.zig:1390in nearest public ownerlib.machine.src.checkpoint.roots.testlib.machine.src.checkpoint.roots.test.publishDeltaChain[function] — private source atlib/machine/src/checkpoint/roots/test.zig:1068in nearest public ownerlib.machine.src.checkpoint.roots.testlib.machine.src.checkpoint.test.captureAt[function] — private source atlib/machine/src/checkpoint/test.zig:1520in nearest public ownerlib.machine.src.checkpoint.testlib.machine.src.checkpoint.test.test_adjacent_checkpoints_preserve_the_prior_root_and_advance_logical_state[function] — test source atlib/machine/src/checkpoint/test.zig:730in nearest public ownerlib.machine.src.checkpoint.testlib.machine.src.checkpoint.test.test_checkpoint_capture_binds_every_immutable_load_and_preserves_writable_state[function] — test source atlib/machine/src/checkpoint/test.zig:669in nearest public ownerlib.machine.src.checkpoint.testlib.machine.src.checkpoint.test.test_checkpoint_capture_rejects_every_caller-owned_storage_alias[function] — test source atlib/machine/src/checkpoint/test.zig:1481in nearest public ownerlib.machine.src.checkpoint.testlib.machine.src.checkpoint.test.test_checkpoint_capture_rejects_every_changed_launch_mapping[function] — test source atlib/machine/src/checkpoint/test.zig:602in nearest public ownerlib.machine.src.checkpoint.testlib.machine.src.checkpoint.test.test_immutable_checkpoint_storage_cannot_be_overwritten[function] — test source atlib/machine/src/checkpoint/test.zig:580in nearest public ownerlib.machine.src.checkpoint.testlib.machine.src.fabric.test.test_direct_fault_choices_are_stable_replayable_and_enforced[function] — test source atlib/machine/src/fabric/test.zig:351in nearest public ownerlib.machine.src.fabric.testlib.machine.src.fabric.test.test_fabric_initialization_rejects_every_noncanonical_topology[function] — test source atlib/machine/src/fabric/test.zig:263in nearest public ownerlib.machine.src.fabric.testlib.machine.src.fabric.test.test_fabric_transitions_preserve_direct_input_and_admission_fault_variants[function] — test source atlib/machine/src/fabric/test.zig:123in nearest public ownerlib.machine.src.fabric.testlib.machine.src.fabric.test.test_virtual_time_entropy_and_terminal_choices_share_the_fabric_ledger[function] — test source atlib/machine/src/fabric/test.zig:171in nearest public ownerlib.machine.src.fabric.testlib.machine.src.instance.adversarial.test.startActivation[function] — private source atlib/machine/src/instance/adversarial/test.zig:167in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.startInput[function] — private source atlib/machine/src/instance/adversarial/test.zig:192in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.test_EventBatch_atomic_drain_rejects_a_missing_K0_activation_event[function] — test source atlib/machine/src/instance/adversarial/test.zig:80in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.test_EventBatch_atomic_drain_rejects_a_missing_K0_input_event[function] — test source atlib/machine/src/instance/adversarial/test.zig:108in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.test_EventBatch_atomic_drain_rejects_an_extra_K0_activation_event[function] — test source atlib/machine/src/instance/adversarial/test.zig:94in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.test_EventBatch_atomic_drain_rejects_an_extra_K0_input_event[function] — test source atlib/machine/src/instance/adversarial/test.zig:122in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.test_EventBatch_atomic_drain_rejects_corrupt_second_K0_input_event[function] — test source atlib/machine/src/instance/adversarial/test.zig:24in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.test_EventBatch_atomic_drain_rejects_corrupt_third_K0_input_event[function] — test source atlib/machine/src/instance/adversarial/test.zig:38in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.test_EventBatch_atomic_drain_rejects_shifted_K0_request_frontiers_at_quiescence[function] — test source atlib/machine/src/instance/adversarial/test.zig:66in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.adversarial.test.test_EventBatch_atomic_drain_rejects_stale_K0_quiescence_generation[function] — test source atlib/machine/src/instance/adversarial/test.zig:52in nearest public ownerlib.machine.src.instance.adversarial.testlib.machine.src.instance.reference.integration.test.test_portable_reference_backend_detects_executable_mutation_before_execution[function] — test source atlib/machine/src/instance/reference/integration/test.zig:39in nearest public ownerlib.machine.src.instance.reference.integration.testlib.machine.src.instance.reference.integration.test.test_portable_reference_backend_exposes_an_unreceipted_ready_doorbell[function] — test source atlib/machine/src/instance/reference/integration/test.zig:9in nearest public ownerlib.machine.src.instance.reference.integration.testlib.machine.src.instance.test.captureFakeAcceleratorBoundary[function] — private source atlib/machine/src/instance/test.zig:2067in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.capturePortableBoundary[function] — private source atlib/machine/src/instance/test.zig:2143in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.executeFakeAcceleratorReceipt[function] — private source atlib/machine/src/instance/test.zig:2260in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.executeInterpretedReceipt[function] — private source atlib/machine/src/instance/test.zig:2353in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.executePortableBoundaries[function] — private source atlib/machine/src/instance/test.zig:2215in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.executeRealInput[function] — private source atlib/machine/src/instance/test.zig:2460in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.replayAcceleratorBoundary[function] — private source atlib/machine/src/instance/test.zig:2106in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.replayPortableBoundaryWithFakeAccelerator[function] — private source atlib/machine/src/instance/test.zig:2170in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_KVM_launch_installs_the_exact_K0_CPU_before_memory_and_register_state[function] — test source atlib/machine/src/instance/test.zig:117in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_KVM_reactivation_replaces_the_VM_and_vCPU_execution_context[function] — test source atlib/machine/src/instance/test.zig:733in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_KVM_restore_installs_the_exact_K0_CPU_before_memory_and_register_state[function] — test source atlib/machine/src/instance/test.zig:603in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_accelerator_restore_closes_partial_KVM_state_and_retries[function] — test source atlib/machine/src/instance/test.zig:696in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_doorbell_rejects_every_wrong_shape_after_completing_pending_KVM_I/O[function] — test source atlib/machine/src/instance/test.zig:1430in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_fatal_backend_failures_close_execution[function] — test source atlib/machine/src/instance/test.zig:1535in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_fresh-fence_replay_survives_request-push_and_pre-acknowledgement_crash_cuts[function] — test source atlib/machine/src/instance/test.zig:986in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_host_KVM_availability_is_an_explicit_instance_result[function] — test source atlib/machine/src/instance/test.zig:1631in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_one_fixed-RAM_K0_instance_boots_and_completes_an_output_doorbell[function] — test source atlib/machine/src/instance/test.zig:76in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_partial_KVM_restart_failure_is_terminal[function] — test source atlib/machine/src/instance/test.zig:854in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_portable_reference_backend_executes_verified_Debug_K0_to_ready[function] — test source atlib/machine/src/instance/test.zig:203in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_shifted_empty_transport_frontiers_reject_basis_and_delivery_atomically[function] — test source atlib/machine/src/instance/test.zig:919in nearest public ownerlib.machine.src.instance.testlib.machine.src.instance.test.test_verified_K0_artifacts_cross_the_machine_admission_boundary[function] — test source atlib/machine/src/instance/test.zig:1158in nearest public ownerlib.machine.src.instance.testlib.machine.src.qualification.executeReceipt[function] — private source atlib/machine/src/qualification.zig:80in nearest public ownerlib.machine.src.qualificationlib.machine.src.world.fault.commit[function] — private source atlib/machine/src/world/fault.zig:112in nearest public ownerlib.machine.src.world.faulttiny.machine.world.Restored.deinit[method] atlib/machine/src/world/restore.zig:91
Audit
| Definitions | 18 |
|---|---|
| Public names | 18 |
| Members | 2 |
| Version | 26.7.0 |
| Revision | daab053ee433 |