qualia_core_db/inference/runtime/graph_assist/
identity.rs1use crate::NQuin;
2
3#[repr(C)]
4#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
5pub struct PrefixIdentity {
6 pub words: [u64; 4],
7}
8
9#[inline]
10fn mix(mut value: u64) -> u64 {
11 value ^= value >> 30;
12 value = value.wrapping_mul(0xbf58_476d_1ce4_e5b9);
13 value ^= value >> 27;
14 value = value.wrapping_mul(0x94d0_49bb_1331_11eb);
15 value ^ (value >> 31)
16}
17
18pub fn derive_prefix_identity(
20 model_instance: u64,
21 tokenizer_revision: u64,
22 graph_context: u64,
23 graph_revision: u64,
24 facts: &[NQuin],
25) -> PrefixIdentity {
26 let mut words = [
27 mix(model_instance ^ 0x243f_6a88_85a3_08d3),
28 mix(tokenizer_revision ^ 0x1319_8a2e_0370_7344),
29 mix(graph_context ^ 0xa409_3822_299f_31d0),
30 mix(graph_revision ^ 0x082e_fa98_ec4e_6c89),
31 ];
32 for (index, fact) in facts.iter().enumerate() {
33 let lanes = [
34 fact.subject,
35 fact.predicate,
36 fact.object,
37 fact.context,
38 fact.metadata,
39 fact.parity,
40 ];
41 for (lane, value) in lanes.into_iter().enumerate() {
42 let target = (index + lane) & 3;
43 words[target] = mix(words[target] ^ value ^ ((index as u64) << 32) ^ lane as u64);
44 }
45 }
46 PrefixIdentity { words }
47}