Skip to documentation
SLOP

tiny.pluck.bdd.WmcContext

Reference tiny.pluck bdd WmcContext

Defined in bdd.

API (18)

Actions

Public operations.

Fields and members

Public fields and members.

No direct callersNo direct callsbddWmcContext
Static calls · unresolved targets: unknown · external targets: unknown.

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,        };    }};
Called byCallsNo direct callstest sourcelib.pluck.src.bddtest: WmcContext - cache size and tri...test sourcelib.pluck.src.bddtest: WmcContext - clear resets every...test sourcelib.pluck.src.bddtest: WmcContext - invalidateForVars ...test sourcelib.pluck.src.bddtest: WmcContext - memory growth with...bdd.WmcContextcacheSize
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.pluck.src.bddtest: WmcContext - clear resets every...test sourcelib.pluck.src.profiling.internal.incrementaltest: BENCHMARK: WmcContext persisten...private sourcelib.pluck.src.bdd.WmcContextclearEntriesbdd.WmcContextclear
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.pluck.src.bddtest: WmcContext - basic caching corr...test sourcelib.pluck.src.bddtest: WmcContext - cache invalidation...test sourcelib.pluck.src.bddtest: WmcContext - cache size and tri...test sourcelib.pluck.src.bddtest: WmcContext - clear resets every...test sourcelib.pluck.src.bddtest: WmcContext - correctness on com...+14 morebdd.WmcContextdeinit
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallsNo direct callstest sourcelib.pluck.src.bddtest: WmcContext - basic caching corr...test sourcelib.pluck.src.bddtest: WmcContext - clear resets every...test sourcelib.pluck.src.bddtest: WmcContext - hit rate calculati...test sourcelib.pluck.src.bddtest: WmcContext - invalidateForVars ...test sourcelib.pluck.src.bddtest: WmcContext - multiple queries s...+3 morebdd.WmcContextgetStats
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.pluck.src.bddtest: WmcContext - basic caching corr...test sourcelib.pluck.src.bddtest: WmcContext - cache invalidation...test sourcelib.pluck.src.bddtest: WmcContext - cache size and tri...test sourcelib.pluck.src.bddtest: WmcContext - clear resets every...test sourcelib.pluck.src.bddtest: WmcContext - correctness on com...+14 morebdd.WmcContextinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.pluck.src.bddtest: WmcContext - structure version ...test sourcelib.pluck.src.profiling.internal.incrementaltest: BENCHMARK: WmcContext cache inv...private sourcelib.pluck.src.bdd.WmcContextadvanceGenerationbdd.WmcContextinvalidateAll
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.pluck.src.bddtest: WmcContext - invalidateForVars ...test sourcelib.pluck.src.bddtest: WmcContext - invalidateForVars ...test sourcelib.pluck.src.bddtest: WmcContext - invalidateForVars ...test sourcelib.pluck.src.bddtest: WmcContext - invalidateForVars ...test sourcelib.pluck.src.profiling.internal.incrementaltest: BENCHMARK: WmcContext cache inv...private sourcelib.pluck.src.bdd.WmcContextbddFromCacheIndexbdd.WmcContextinvalidateForVars
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallstest sourcelib.pluck.src.bddtest: WmcContext - cache invalidation...test sourcelib.pluck.src.bddtest: WmcContext - clear resets every...test sourcelib.pluck.src.bddtest: WmcContext - memory growth with...test sourcelib.pluck.src.profiling.internal.incrementaltest: BENCHMARK: WmcContext cache inv...private sourcelib.pluck.src.bdd.WmcContextadvanceGenerationbdd.WmcContextinvalidateWeights
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.pluck.src.bddtest: WmcContext - cache size and tri...test sourcelib.pluck.src.bddtest: WmcContext - memory growth with...bdd.WmcContexttrimToSize
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.pluck.src.bddtest: WmcContext - basic caching corr...test sourcelib.pluck.src.bddtest: WmcContext - cache invalidation...test sourcelib.pluck.src.bddtest: WmcContext - cache size and tri...test sourcelib.pluck.src.bddtest: WmcContext - clear resets every...test sourcelib.pluck.src.bddtest: WmcContext - correctness on com...+14 moreprivate sourcelib.pluck.src.bdd.WmcContextbindManagerprivate sourcelib.pluck.src.bdd.WmcContextensureCapacityprivate sourcelib.pluck.src.bdd.WmcContextgetCachedprivate sourcelib.pluck.src.bdd.WmcContextwmcHelperCachedbddwmcWithAllocatorbdd.WmcContextwmcCached
Static calls · unresolved targets: 0 · external targets: 2.

Complete caller list for bdd.WmcContext.deinit

19 direct callers.

Complete caller list for bdd.WmcContext.getStats

8 direct callers.

Complete caller list for bdd.WmcContext.init

19 direct callers.

Complete caller list for bdd.WmcContext.wmcCached

19 direct callers.

Audit

Definitions11
Public names11
Members8
Version26.7.0
Revisiondaab053ee433