File size: 1,577 Bytes
d997548
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
"""
Contradiction Handler — when new knowledge contradicts existing.
"""
from dataclasses import dataclass


@dataclass
class ExperienceWeight:
    parent_cell_id: str
    value: float = 0.0
    n_updates: int = 0
    created_step: int = 0
    last_fp: str = ""


class ContradictionHandler:
    def __init__(self, similarity_threshold=0.75, verbose=False):
        self.similarity_threshold = similarity_threshold
        self.verbose = verbose
        self.experiences = {}
        self.n_contradictions = 0

    def detect(self, new_fp, existing_fps):
        try:
            from cognitive_log import hamming_similarity
        except ImportError:
            return None
        best = (None, 0.0)
        for fp in existing_fps:
            sim = hamming_similarity(new_fp, fp)
            if sim > best[1]:
                best = (fp, sim)
        if best[1] >= self.similarity_threshold:
            self.n_contradictions += 1
            return best[0]
        return None

    def attach_experience(self, parent_cell, new_fp, step):
        cid = parent_cell.cell_id
        if cid in self.experiences:
            exp = self.experiences[cid]
            exp.n_updates += 1
            exp.last_fp = new_fp
            return exp
        exp = ExperienceWeight(parent_cell_id=cid, value=0.0,
                                n_updates=1, created_step=step, last_fp=new_fp)
        self.experiences[cid] = exp
        return exp

    def stats(self):
        return {"n_contradictions": self.n_contradictions,
                "n_experiences": len(self.experiences)}