lib/pluck/src/state/callstack.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const pluck = @import("../root.zig");
3
4 const Bdd = pluck.bdd.Bdd;
5
6 pub const CallstackKey = struct {
7 callstack: []const i32,
8 prob: f64,
9 };
10
11 pub const CallstackHashContext = struct {
12 pub fn hash(_: @This(), key: CallstackKey) u64 {
13 var h = std.hash.Wyhash.init(0);
14 h.update(std.mem.sliceAsBytes(key.callstack));
15 h.update(std.mem.asBytes(&key.prob));
16 return h.final();
17 }
18
19 pub fn eql(_: @This(), a: CallstackKey, b: CallstackKey) bool {
20 if (a.prob != b.prob) return false;
21 return std.mem.eql(i32, a.callstack, b.callstack);
22 }
23 };
24
25 pub fn compareCallstacks(a: []const i32, b: []const i32) std.math.Order {
26 const min_len = @min(a.len, b.len);
27 for (0..min_len) |i| {
28 if (a[i] < b[i]) return .lt;
29 if (a[i] > b[i]) return .gt;
30 }
31 if (a.len < b.len) return .lt;
32 if (a.len > b.len) return .gt;
33 return .eq;
34 }