File size: 1,939 Bytes
80ce2b3
9669ef4
80ce2b3
8f7b2ac
1f5da16
d2eb959
 
 
 
 
e41cd5c
d2eb959
 
e41cd5c
d2eb959
 
 
 
e41cd5c
 
 
d2eb959
 
 
 
 
 
 
 
 
 
 
 
9669ef4
aa5223e
 
 
e41cd5c
 
 
 
aa5223e
 
e41cd5c
 
 
 
 
 
 
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
# Author: Liam Grinstead
# RFT-native scoring wrapped in Formula class

from math import exp

class Formula:
    def __init__(self, expression: str):
        self.expression = expression

    def evaluate(self, agent: dict) -> float:
        overlay = agent.get("collapse_overlay", {}) or {}
        tau_eff = overlay.get("tau_eff", 1.0)
        beta = overlay.get("beta_band", 0.5)
        weights = overlay.get("operator_weights", {}) or {}
        tier = agent.get("tier", "Tier_1")
        tier_level = int(tier.split("_")[1]) if "_" in tier else 1
        resonance = 1.2 if agent.get("emotional_resonance") else 1.0

        coupling_sum = sum(v for v in weights.values() if isinstance(v, (int, float)))
        weight_count = max(1, len(weights))
        coupling = coupling_sum / (1.0 + 0.25 * weight_count)

        drift_penalty = 0.18 * tier_level
        drift_resilience = 1.0 + 0.05 * (tier_level - 1)

        collapse_energy = tau_eff * (0.6 + 0.4 * beta) * (1.0 + 0.35 * coupling)
        coherence = exp(- (0.22 * tau_eff + 0.08 * tier_level)) * (0.9 + 0.1 * beta)

        gvu = (collapse_energy * resonance * drift_resilience) * (0.7 + 0.6 * coherence) - drift_penalty
        score = max(0.0, gvu)
        return round(score, 4)

GVU_FORMULAS = {
    "Formula_20": Formula("−τ_eff / (τ_c + 19/20) ⋅ P_standard ⋅ τ_eff ⋅ ℯ ⋅ |grad_R_O − grad_T_P| / GVU")
}

def rft_invariants(agent: dict) -> dict:
    """
    Always returns a dict; never None. Uses safe defaults if data is missing.
    """
    overlay = agent.get("collapse_overlay", {}) or {}
    tier = agent.get("tier", "Tier_1")
    tier_level = int(tier.split("_")[1]) if "_" in tier else 1
    operators = agent.get("symbolic_operators", []) or []
    return {
        "tau_eff": overlay.get("tau_eff", 1.0),
        "beta_band": overlay.get("beta_band", 0.5),
        "operator_count": len(operators),
        "tier_level": tier_level,
    }