tiny.pluck.bdd.WmcContext
Defined in bdd.
API (18)
Actions
Public operations.
cacheSizecleardeinitgetStatsinitinvalidateAllinvalidateForVarsinvalidateWeightstrimToSizewmcCached
Fields and members
Public fields and members.
Source
Source: lib/pluck/src/bdd.zig:2559
zig
pub const WmcContext = struct { cache: std.ArrayListUnmanaged(WmcCacheEntry), entry_count: usize, params_version: u64, structure_version: u64, cache_generation: u64, stats: WmcCacheStats, allocator: Allocator, manager: ?*const Manager, pub fn init(allocator: Allocator) WmcContext { return WmcContext{ .cache = .empty, .entry_count = 0, .params_version = 0, .structure_version = 0, .cache_generation = 1, .stats = .{}, .allocator = allocator, .manager = null, }; } pub fn deinit(self: *WmcContext) void { self.cache.deinit(self.allocator); } pub fn wmcCached( self: *WmcContext, manager: *const Manager, bdd: Bdd, params: *const WmcParams, ) f64 { if (bdd.isTrue()) return 1.0; if (bdd.isFalse()) return 0.0; self.bindManager(manager); if (!self.ensureCapacity(manager.nodes.items.len)) { self.stats.misses += 1; return wmcWithAllocator(manager, bdd, params, self.allocator); } if (self.getCached(bdd)) |cached| { self.stats.hits += 1; return cached; } self.stats.misses += 1; return self.wmcHelperCached(manager, bdd, params); } fn wmcHelperCached( self: *WmcContext, manager: *const Manager, bdd: Bdd, params: *const WmcParams, ) f64 { if (bdd.isTrue()) return 1.0; if (bdd.isFalse()) return 0.0; if (self.getCached(bdd)) |cached| { return cached; } const node = manager.getNode(bdd); const weight = params.getWeight(node.var_label); const low_child = if (bdd.complement) node.low.neg() else node.low; const high_child = if (bdd.complement) node.high.neg() else node.high; const low_result = self.wmcHelperCached(manager, low_child, params); const high_result = self.wmcHelperCached(manager, high_child, params); const result = weight.low * low_result + weight.high * high_result; self.putCached(bdd, result); return result; } fn ensureCapacity(self: *WmcContext, node_count: usize) bool { const required = node_count * 2; if (self.cache.items.len >= required) return true; const old_len = self.cache.items.len; self.cache.ensureTotalCapacity(self.allocator, required) catch return false; self.cache.items.len = required; @memset(self.cache.items[old_len..], .{}); return true; } fn bindManager(self: *WmcContext, manager: *const Manager) void { if (self.manager) |bound| { if (bound == manager) return; self.clearEntries(); } self.manager = manager; } fn clearEntries(self: *WmcContext) void { @memset(self.cache.items, .{}); self.entry_count = 0; } fn getCached(self: *const WmcContext, bdd: Bdd) ?f64 { const index = cacheIndex(bdd); if (index >= self.cache.items.len) return null; const entry = self.cache.items[index]; if (entry.generation != self.cache_generation) return null; return entry.value; } fn putCached(self: *WmcContext, bdd: Bdd, value: f64) void { const index = cacheIndex(bdd); if (index >= self.cache.items.len) return; const was_occupied = self.cache.items[index].generation != 0; self.cache.items[index] = .{ .value = value, .generation = self.cache_generation, }; if (!was_occupied) { self.entry_count += 1; } } pub fn invalidateAll(self: *WmcContext) void { self.structure_version += 1; self.advanceGeneration(); self.stats.invalidations += 1; } pub fn invalidateWeights(self: *WmcContext) void { self.params_version += 1; self.advanceGeneration(); self.stats.invalidations += 1; } fn advanceGeneration(self: *WmcContext) void { self.cache_generation +%= 1; if (self.cache_generation == 0) { self.clearEntries(); self.cache_generation = 1; } } pub fn invalidateForVars( self: *WmcContext, manager: *const Manager, vars: []const VarLabel, ) void { self.stats.invalidations += 1; var removed: usize = 0; for (self.cache.items, 0..) |*entry, index| { if (entry.generation == 0) continue; const bdd = bddFromCacheIndex(index); for (vars) |var_label| { if (manager.hasVariable(bdd, var_label)) { entry.* = .{}; removed += 1; self.entry_count -= 1; break; } } } self.stats.evictions += removed; } pub fn trimToSize(self: *WmcContext, max_entries: usize) usize { const current = self.entry_count; if (current <= max_entries) return 0; const to_evict = current - max_entries; var evicted: usize = 0; for (self.cache.items) |*entry| { if (evicted >= to_evict) break; if (entry.generation != 0) { entry.* = .{}; evicted += 1; } } self.entry_count -= evicted; self.stats.evictions += evicted; return evicted; } pub fn clear(self: *WmcContext) void { self.clearEntries(); self.stats = .{}; self.params_version = 0; self.structure_version = 0; self.cache_generation = 1; self.manager = null; } pub fn cacheSize(self: *const WmcContext) usize { return self.entry_count; } pub fn getStats(self: *const WmcContext) WmcCacheStats { return self.stats; } fn cacheIndex(bdd: Bdd) usize { return @as(usize, bdd.index) * 2 + @intFromBool(bdd.complement); } fn bddFromCacheIndex(index: usize) Bdd { return Bdd{ .index = @intCast(index / 2), .complement = index % 2 == 1, }; }};Complete caller list for bdd.WmcContext.deinit
19 direct callers.
lib.pluck.src.bdd.test_WmcContext_-_basic_caching_correctness[function] — test source atlib/pluck/src/bdd.zig:4325in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_cache_invalidation_on_weight_change[function] — test source atlib/pluck/src/bdd.zig:4356in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_cache_size_and_trimming[function] — test source atlib/pluck/src/bdd.zig:4381in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_clear_resets_everything[function] — test source atlib/pluck/src/bdd.zig:4696in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_correctness_on_complex_BDD[function] — test source atlib/pluck/src/bdd.zig:4455in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_hit_rate_calculation[function] — test source atlib/pluck/src/bdd.zig:4430in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_correctness[function] — test source atlib/pluck/src/bdd.zig:4541in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_keeps_cache_version_stable[function] — test source atlib/pluck/src/bdd.zig:4644in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_preserves_unrelated_cache_entries[function] — test source atlib/pluck/src/bdd.zig:4575in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_removes_recursive_dependent_entries[function] — test source atlib/pluck/src/bdd.zig:4613in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_manager_change_clears_stale_entries[function] — test source atlib/pluck/src/bdd.zig:4477in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_memory_growth_with_lazy_invalidation[function] — test source atlib/pluck/src/bdd.zig:4671in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_multiple_queries_same_BDD[function] — test source atlib/pluck/src/bdd.zig:4511in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_structure_version_invalidation[function] — test source atlib/pluck/src/bdd.zig:4406in nearest public ownertiny.pluck.bddlib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_at_larger_scales[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:523in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_cache_invalidation[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:305in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_persistent_cache_scaling[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:58in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_XOR_chain_hard_instances[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:584in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_multi-step_conditioning_sequence[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:167in nearest public ownerlib.pluck.src.profiling.internal.incremental
Complete caller list for bdd.WmcContext.getStats
8 direct callers.
lib.pluck.src.bdd.test_WmcContext_-_basic_caching_correctness[function] — test source atlib/pluck/src/bdd.zig:4325in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_clear_resets_everything[function] — test source atlib/pluck/src/bdd.zig:4696in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_hit_rate_calculation[function] — test source atlib/pluck/src/bdd.zig:4430in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_preserves_unrelated_cache_entries[function] — test source atlib/pluck/src/bdd.zig:4575in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_multiple_queries_same_BDD[function] — test source atlib/pluck/src/bdd.zig:4511in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_structure_version_invalidation[function] — test source atlib/pluck/src/bdd.zig:4406in nearest public ownertiny.pluck.bddlib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_cache_invalidation[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:305in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_persistent_cache_scaling[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:58in nearest public ownerlib.pluck.src.profiling.internal.incremental
Complete caller list for bdd.WmcContext.init
19 direct callers.
lib.pluck.src.bdd.test_WmcContext_-_basic_caching_correctness[function] — test source atlib/pluck/src/bdd.zig:4325in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_cache_invalidation_on_weight_change[function] — test source atlib/pluck/src/bdd.zig:4356in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_cache_size_and_trimming[function] — test source atlib/pluck/src/bdd.zig:4381in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_clear_resets_everything[function] — test source atlib/pluck/src/bdd.zig:4696in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_correctness_on_complex_BDD[function] — test source atlib/pluck/src/bdd.zig:4455in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_hit_rate_calculation[function] — test source atlib/pluck/src/bdd.zig:4430in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_correctness[function] — test source atlib/pluck/src/bdd.zig:4541in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_keeps_cache_version_stable[function] — test source atlib/pluck/src/bdd.zig:4644in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_preserves_unrelated_cache_entries[function] — test source atlib/pluck/src/bdd.zig:4575in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_removes_recursive_dependent_entries[function] — test source atlib/pluck/src/bdd.zig:4613in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_manager_change_clears_stale_entries[function] — test source atlib/pluck/src/bdd.zig:4477in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_memory_growth_with_lazy_invalidation[function] — test source atlib/pluck/src/bdd.zig:4671in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_multiple_queries_same_BDD[function] — test source atlib/pluck/src/bdd.zig:4511in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_structure_version_invalidation[function] — test source atlib/pluck/src/bdd.zig:4406in nearest public ownertiny.pluck.bddlib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_at_larger_scales[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:523in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_cache_invalidation[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:305in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_persistent_cache_scaling[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:58in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_XOR_chain_hard_instances[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:584in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_multi-step_conditioning_sequence[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:167in nearest public ownerlib.pluck.src.profiling.internal.incremental
Complete caller list for bdd.WmcContext.wmcCached
19 direct callers.
lib.pluck.src.bdd.test_WmcContext_-_basic_caching_correctness[function] — test source atlib/pluck/src/bdd.zig:4325in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_cache_invalidation_on_weight_change[function] — test source atlib/pluck/src/bdd.zig:4356in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_cache_size_and_trimming[function] — test source atlib/pluck/src/bdd.zig:4381in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_clear_resets_everything[function] — test source atlib/pluck/src/bdd.zig:4696in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_correctness_on_complex_BDD[function] — test source atlib/pluck/src/bdd.zig:4455in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_hit_rate_calculation[function] — test source atlib/pluck/src/bdd.zig:4430in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_correctness[function] — test source atlib/pluck/src/bdd.zig:4541in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_keeps_cache_version_stable[function] — test source atlib/pluck/src/bdd.zig:4644in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_preserves_unrelated_cache_entries[function] — test source atlib/pluck/src/bdd.zig:4575in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_invalidateForVars_removes_recursive_dependent_entries[function] — test source atlib/pluck/src/bdd.zig:4613in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_manager_change_clears_stale_entries[function] — test source atlib/pluck/src/bdd.zig:4477in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_memory_growth_with_lazy_invalidation[function] — test source atlib/pluck/src/bdd.zig:4671in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_multiple_queries_same_BDD[function] — test source atlib/pluck/src/bdd.zig:4511in nearest public ownertiny.pluck.bddlib.pluck.src.bdd.test_WmcContext_-_structure_version_invalidation[function] — test source atlib/pluck/src/bdd.zig:4406in nearest public ownertiny.pluck.bddlib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_at_larger_scales[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:523in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_cache_invalidation[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:305in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_WmcContext_persistent_cache_scaling[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:58in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_XOR_chain_hard_instances[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:584in nearest public ownerlib.pluck.src.profiling.internal.incrementallib.pluck.src.profiling.internal.incremental.test_BENCHMARK:_multi-step_conditioning_sequence[function] — test source atlib/pluck/src/profiling/internal/incremental.zig:167in nearest public ownerlib.pluck.src.profiling.internal.incremental
Audit
| Definitions | 11 |
|---|---|
| Public names | 11 |
| Members | 8 |
| Version | 26.7.0 |
| Revision | daab053ee433 |