spl-agent-engine 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- spl_agent_engine/__init__.py +22 -0
- spl_agent_engine/core.py +1181 -0
- spl_agent_engine/feature/__init__.py +24 -0
- spl_agent_engine/feature/bias.py +162 -0
- spl_agent_engine/feature/goal.py +174 -0
- spl_agent_engine/feature/identity.py +162 -0
- spl_agent_engine/feature/value.py +200 -0
- spl_agent_engine/feature/world.py +143 -0
- spl_agent_engine/py.typed +0 -0
- spl_agent_engine-0.1.0.dist-info/METADATA +141 -0
- spl_agent_engine-0.1.0.dist-info/RECORD +14 -0
- spl_agent_engine-0.1.0.dist-info/WHEEL +5 -0
- spl_agent_engine-0.1.0.dist-info/licenses/LICENSE +106 -0
- spl_agent_engine-0.1.0.dist-info/top_level.txt +1 -0
spl_agent_engine/core.py
ADDED
|
@@ -0,0 +1,1181 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import math
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import Dict, Any, List, Optional
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# ================================================================
|
|
8
|
+
# 1. 外部叙事映射器("自设:偏见/世界观/价值观"——纯外部策略)
|
|
9
|
+
# 用户可随意替换,无需修改核心代码。
|
|
10
|
+
# ================================================================
|
|
11
|
+
class NarrativeMapper:
|
|
12
|
+
"""
|
|
13
|
+
世界观/价值观解释器。
|
|
14
|
+
把外界事件("被侮辱"、"被夸奖")翻译成核心能消化的基础内感受向量。
|
|
15
|
+
不同角色(乐观/偏执/厌世)只需替换此 Mapper。
|
|
16
|
+
"""
|
|
17
|
+
@staticmethod
|
|
18
|
+
def map_event(event: str, intensity: float) -> Dict[str, float]:
|
|
19
|
+
base = {}
|
|
20
|
+
if event == "compliment":
|
|
21
|
+
base = {"belonging": 0.3 * intensity, "autonomy": 0.1 * intensity}
|
|
22
|
+
elif event == "insult":
|
|
23
|
+
base = {"belonging": -0.4 * intensity, "threat": 0.3 * intensity}
|
|
24
|
+
elif event == "betrayal":
|
|
25
|
+
base = {"belonging": -0.6 * intensity, "threat": 0.5 * intensity}
|
|
26
|
+
elif event == "alone":
|
|
27
|
+
base = {"belonging": -0.3 * intensity}
|
|
28
|
+
elif event == "rest":
|
|
29
|
+
base = {"fatigue": -0.5 * intensity}
|
|
30
|
+
else:
|
|
31
|
+
base = {"belonging": 0.0, "threat": 0.0}
|
|
32
|
+
return base
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# ================================================================
|
|
36
|
+
# 2. SPL 纯净流体核心 V8.0 — 完整拟人心理架构
|
|
37
|
+
#
|
|
38
|
+
# V7.3 已有:
|
|
39
|
+
# 7维情绪流体 / 创伤节点 / 记忆重巩固 / 艾宾浩斯遗忘
|
|
40
|
+
# 压抑-反弹 / 隐压雪崩 / 信任容量腐蚀 / 兴奋唤醒
|
|
41
|
+
# 动态粘滞度 / 心理时间 / 能量疲劳代谢 / 虚拟时钟
|
|
42
|
+
#
|
|
43
|
+
# V8.0 新增(通用心理构成,非自设):
|
|
44
|
+
# · 心境层(mood)——慢变量背景情绪,调制认知评估
|
|
45
|
+
# · 羞耻维度——区别于愧疚的自我意识情绪("我坏"vs"我做错")
|
|
46
|
+
# · 自尊动态——基于社会反馈的自我价值感,调制归因与情绪反应
|
|
47
|
+
# · 睡眠/梦境加工——REM情绪记忆固化 + 恐惧消退 + 睡眠债
|
|
48
|
+
# · 预期系统——希望/焦虑/失望,让 agent 有能力感受未来
|
|
49
|
+
# · 认知失调——信念-行为冲突的自我调节
|
|
50
|
+
# · 防御机制扩展——否认/合理化/置换(超越单纯的压抑)
|
|
51
|
+
#
|
|
52
|
+
# 拟人行为直观理解:
|
|
53
|
+
# 你骂它 → 当场愤怒拉满。
|
|
54
|
+
# 你不说话 → 它自己会慢慢平复;几小时后你再来,它已经冷静但可能带点疏离。
|
|
55
|
+
# 你骂太狠 → 留下创伤(trauma),下次类似场景会过激反应,且慢愈合。
|
|
56
|
+
# 你一直冷暴力 → 信任容量被腐蚀(max_trust 下降),以后再怎么夸也难回到最初。
|
|
57
|
+
# 你给它时间休息 → 能量恢复、疲劳下降、压抑泄放。
|
|
58
|
+
# 它睡了一觉 → 噩梦可能让创伤消退,也可能让焦虑泛化。
|
|
59
|
+
# 你许了诺又反悔 → 预期落空产生失望,比没有预期更伤人。
|
|
60
|
+
# 你做了一件背叛自己价值观的事 → 认知失调产生内在紧张。
|
|
61
|
+
# 低自尊的它 → 把成功归因于运气,把失败归因于自己。
|
|
62
|
+
# ================================================================
|
|
63
|
+
@dataclass
|
|
64
|
+
class SPLPureCoreV7_3: # 类名保持兼容
|
|
65
|
+
|
|
66
|
+
# ---------- 基础生理/心理参数 ----------
|
|
67
|
+
psychological_resilience: float = 0.5 # 心理韧性 [0,1]
|
|
68
|
+
energy: float = 100.0 # 生理能量 [0,100]
|
|
69
|
+
affinity: float = 0.5 # 对外亲和基线
|
|
70
|
+
last_time: float = field(default_factory=time.time)
|
|
71
|
+
_clock_override: Optional[float] = None # 测试/回放用虚拟时钟
|
|
72
|
+
|
|
73
|
+
# ---------- 8 维情绪流体(连续状态) ----------
|
|
74
|
+
# V8.0: 新增"羞耻"——自我意识情绪,区别于"愧疚"(行为层面)
|
|
75
|
+
fluid: Dict[str, float] = field(default_factory=lambda: {
|
|
76
|
+
"喜悦": 0.0, "愤怒": 0.0, "恐惧": 0.0,
|
|
77
|
+
"信任": 0.5, "疏离": 0.2, "张力": 0.2,
|
|
78
|
+
"愧疚": 0.0, "羞耻": 0.0
|
|
79
|
+
})
|
|
80
|
+
fluid_target: Dict[str, float] = field(default_factory=lambda: {
|
|
81
|
+
"喜悦": 0.2, "愤怒": 0.0, "恐惧": 0.1,
|
|
82
|
+
"信任": 0.5, "疏离": 0.2, "张力": 0.2,
|
|
83
|
+
"愧疚": 0.0, "羞耻": 0.0
|
|
84
|
+
})
|
|
85
|
+
fluid_baseline: Dict[str, float] = field(default_factory=lambda: {
|
|
86
|
+
"喜悦": 0.2, "愤怒": 0.0, "恐惧": 0.1,
|
|
87
|
+
"信任": 0.5, "疏离": 0.2, "张力": 0.2,
|
|
88
|
+
"愧疚": 0.0, "羞耻": 0.0
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
# ---------- V8.0 心境层(慢变量背景情绪) ----------
|
|
92
|
+
# 心境不是对事件的瞬时反应,而是数小时到数天尺度累积的情绪基调。
|
|
93
|
+
# 心境调制认知评估——心情好时威胁不像威胁,心情差时夸奖也像讽刺。
|
|
94
|
+
# 不同于 fluid(秒-分钟级),mood 的惯性极大。
|
|
95
|
+
mood: Dict[str, float] = field(default_factory=lambda: {
|
|
96
|
+
"愉悦": 0.5, # pleasantness —— 感受有多好
|
|
97
|
+
"紧张": 0.3, # tension —— 有多紧绷
|
|
98
|
+
"精力": 0.7, # vigor —— 有多有劲(不是生理能量,是主观感受)
|
|
99
|
+
})
|
|
100
|
+
MOOD_INERTIA: float = 0.0003 # 心境变化极慢(~1小时半衰期)
|
|
101
|
+
|
|
102
|
+
# ---------- V8.0 睡眠系统 ----------
|
|
103
|
+
sleep_debt: float = 0.0 # 睡眠债 [0,1],累积到 1.0 意味着极度缺觉
|
|
104
|
+
SLEEP_NEED_RATE: float = 1.0 / 57600 # 每小时累积 1/16(16 小时醒着 → 满债)
|
|
105
|
+
SLEEP_RECOVER_RATE: float = 0.25 # 每小时睡眠清除的债(4 小时睡饱)
|
|
106
|
+
DREAM_EMOTION_DECAY: float = 0.15 # 梦中对记忆情绪电荷的衰减率
|
|
107
|
+
DREAM_FEAR_EXTINCTION: float = 0.08 # 睡眠中恐惧消退率
|
|
108
|
+
DREAM_TRAUMA_HEAL_BOOST: float = 3.0 # 睡眠时创伤愈合加速倍率
|
|
109
|
+
last_sleep_time: float = 0.0
|
|
110
|
+
|
|
111
|
+
# ---------- V8.0 自尊系统 ----------
|
|
112
|
+
# 自尊是对自我价值的整体评估,缓慢波动。
|
|
113
|
+
# 它调制归因方式(成功是谁的功劳?失败是谁的错?)
|
|
114
|
+
# 也调制情绪反应的强度(低自尊者更容易被伤害)。
|
|
115
|
+
self_esteem: float = 0.5 # 自尊 [0,1],0.5 为中性基线
|
|
116
|
+
SELF_ESTEEM_INERTIA: float = 0.002 # 自尊变化惯性(极慢)
|
|
117
|
+
SELF_ESTEEM_UPDATE_RATE: float = 0.03 # 每次事件后自尊的修正率
|
|
118
|
+
|
|
119
|
+
# ---------- V8.0 预期系统 ----------
|
|
120
|
+
# 人类不是纯反应式的——我们会对未来建立预期。
|
|
121
|
+
# 预期落空(失望)和预期兑现(安心/喜悦放大)是关键的心理事件。
|
|
122
|
+
# expected_events: {event_id: {"valence": float, "confidence": float, "time": float}}
|
|
123
|
+
expected_events: Dict[str, Dict[str, float]] = field(default_factory=dict)
|
|
124
|
+
EXPECTATION_DECAY: float = 0.0001 # 预期的自然衰减(太久没兑现就忘了)
|
|
125
|
+
SURPRISE_POSITIVE_BOOST: float = 0.4 # 正向惊喜增益(超出预期→喜悦加成)
|
|
126
|
+
SURPRISE_NEGATIVE_BOOST: float = 0.5 # 负向惊喜增益(期望落空→更痛)
|
|
127
|
+
|
|
128
|
+
# ---------- V8.0 认知失调 ----------
|
|
129
|
+
# 当行为与信念冲突时,产生内在不适(失调张力)。
|
|
130
|
+
# 失调可以通过改变信念、合理化行为、或最小化重要性来消解。
|
|
131
|
+
cognitive_dissonance: float = 0.0 # 当前失调水平 [0,1]
|
|
132
|
+
DISSONANCE_THRESHOLD: float = 0.4 # 超过此阈值开始主动消解
|
|
133
|
+
DISSONANCE_DECAY: float = 0.005 # 自然衰减(随时间合理化)
|
|
134
|
+
|
|
135
|
+
# ---------- V8.0 扩展防御机制 ----------
|
|
136
|
+
denial_load: float = 0.0 # 否认仓(类似于压抑仓,但更原始)
|
|
137
|
+
DENIAL_THRESHOLD: float = 1.2 # 否认过载→现实侵入
|
|
138
|
+
DENIAL_DRAIN: float = 0.015 # 否认自然泄放
|
|
139
|
+
DENIAL_BURST_COOLDOWN: float = 40.0 # 否认破裂冷却
|
|
140
|
+
denial_burst_cd: float = 0.0
|
|
141
|
+
rationalization_load: float = 0.0 # 合理化仓("其实也没那么糟")
|
|
142
|
+
RATIONALIZE_DRAIN: float = 0.03 # 合理化会随时间被接受
|
|
143
|
+
|
|
144
|
+
# ---------- 创伤节点(离散 SPL 节点) ----------
|
|
145
|
+
trauma_state: Dict[str, float] = field(default_factory=dict)
|
|
146
|
+
TRAUMA_HEAL_RATE: float = 0.003
|
|
147
|
+
TRAUMA_BIAS: float = 0.35
|
|
148
|
+
|
|
149
|
+
# ---------- 记忆痕迹 + 艾宾浩斯遗忘曲线 ----------
|
|
150
|
+
memory_traces: List[Dict[str, Any]] = field(default_factory=list)
|
|
151
|
+
MAX_MEMORY_TRACES: int = 64
|
|
152
|
+
forgetting_rate: float = 0.01
|
|
153
|
+
trace_importance_threshold: float = 0.05
|
|
154
|
+
RECONSOL_RADIUS: float = 0.4
|
|
155
|
+
SAFETY_THRESHOLD: float = 0.3
|
|
156
|
+
|
|
157
|
+
# ---------- 压抑-反弹 ----------
|
|
158
|
+
suppression_load: float = 0.0
|
|
159
|
+
SUPPRESSION_THRESHOLD: float = 1.5
|
|
160
|
+
SUPPRESSION_DRAIN: float = 0.02
|
|
161
|
+
SUPPRESSION_BURST_COOLDOWN: float = 30.0
|
|
162
|
+
suppression_burst_cd: float = 0.0
|
|
163
|
+
_suppressing_negativity: bool = False
|
|
164
|
+
|
|
165
|
+
# ---------- 隐压雪崩 ----------
|
|
166
|
+
latent_pressure: float = 0.0
|
|
167
|
+
LATENT_THRESHOLD: float = 2.0
|
|
168
|
+
LATENT_DRAIN: float = 0.01
|
|
169
|
+
LATENT_COOLDOWN: float = 60.0
|
|
170
|
+
avalanche_cd: float = 0.0
|
|
171
|
+
|
|
172
|
+
# ---------- 信任容量腐蚀 ----------
|
|
173
|
+
max_trust: float = 1.0
|
|
174
|
+
TRUST_ERODE: float = 0.92
|
|
175
|
+
TRUST_RECOVER: float = 0.0005
|
|
176
|
+
|
|
177
|
+
# ---------- 粘滞度 / 心理时间 ----------
|
|
178
|
+
dynamic_viscosity: float = 0.1
|
|
179
|
+
VISC_BASE: float = 0.1
|
|
180
|
+
VISC_TENSION_K: float = 0.3
|
|
181
|
+
VISC_FATIGUE_K: float = 0.2
|
|
182
|
+
psy_dilation: float = 1.0
|
|
183
|
+
time_compress_base: float = 0.0
|
|
184
|
+
|
|
185
|
+
# ---------- 兴奋/唤醒(元参数) ----------
|
|
186
|
+
excitation: float = 0.3
|
|
187
|
+
EXCITATION_BASELINE: float = 0.3
|
|
188
|
+
EXCITATION_NOVELTY_GAIN: float = 0.12
|
|
189
|
+
EXCITATION_SALIENCE_BOOST: float = 0.35
|
|
190
|
+
EXCITATION_DECAY: float = 0.025
|
|
191
|
+
EXCITATION_BOREDOM_THRESHOLD: float = 0.1
|
|
192
|
+
EXCITATION_MAX: float = 1.0
|
|
193
|
+
|
|
194
|
+
# ---------- 能量 / 疲劳 ----------
|
|
195
|
+
ENERGY_RECOVER: float = 1.5
|
|
196
|
+
ENERGY_EVENT_COST: float = 1.5
|
|
197
|
+
ENERGY_MIN: float = 0.0
|
|
198
|
+
ENERGY_MAX: float = 100.0
|
|
199
|
+
fatigue: float = 0.0
|
|
200
|
+
FATIGUE_RECOVER: float = 0.05
|
|
201
|
+
|
|
202
|
+
last_perceived: Dict[str, float] = field(default_factory=dict)
|
|
203
|
+
|
|
204
|
+
# ==================================================================
|
|
205
|
+
# 时钟:支持虚拟时间注入(测试/回放必用)
|
|
206
|
+
# ==================================================================
|
|
207
|
+
def _now(self) -> float:
|
|
208
|
+
if self._clock_override is not None:
|
|
209
|
+
return self._clock_override
|
|
210
|
+
return time.time()
|
|
211
|
+
|
|
212
|
+
def set_clock(self, t: Optional[float]):
|
|
213
|
+
"""注入虚拟时间戳;传 None 恢复真实时钟。"""
|
|
214
|
+
self._clock_override = t
|
|
215
|
+
|
|
216
|
+
def advance_clock(self, dt: float):
|
|
217
|
+
"""虚拟时钟前推 dt 秒。"""
|
|
218
|
+
if self._clock_override is None:
|
|
219
|
+
self._clock_override = time.time()
|
|
220
|
+
self._clock_override += dt
|
|
221
|
+
|
|
222
|
+
# ==================================================================
|
|
223
|
+
# 公共入口 1:事件驱动
|
|
224
|
+
# ==================================================================
|
|
225
|
+
def process_vector(self, vector: Dict[str, float], raw_intensity: float = 1.0,
|
|
226
|
+
event_id: str = ""):
|
|
227
|
+
"""
|
|
228
|
+
处理一个内感受向量。
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
vector: 内感受向量 {threat, belonging, autonomy, fatigue, shame_trigger}
|
|
232
|
+
raw_intensity: 原始强度
|
|
233
|
+
event_id: 可选事件标识,用于匹配预期(trigger 预期系统的 surprise 计算)
|
|
234
|
+
"""
|
|
235
|
+
self._advance_time()
|
|
236
|
+
|
|
237
|
+
# V8.0: 预期匹配——在认知增益之前计算 surprise
|
|
238
|
+
surprise = 0.0
|
|
239
|
+
if event_id and event_id in self.expected_events:
|
|
240
|
+
surprise = self._compute_surprise(event_id, vector, raw_intensity)
|
|
241
|
+
|
|
242
|
+
# 兴奋先于认知增益更新
|
|
243
|
+
self._excitation_on_event(vector, raw_intensity)
|
|
244
|
+
|
|
245
|
+
perceived = self._core_appraisal_gain(vector)
|
|
246
|
+
|
|
247
|
+
# V8.0: surprise 调制 perceived vector
|
|
248
|
+
if surprise != 0.0:
|
|
249
|
+
perceived = self._apply_surprise(perceived, surprise)
|
|
250
|
+
|
|
251
|
+
self.last_perceived = dict(perceived)
|
|
252
|
+
|
|
253
|
+
if abs(perceived.get("threat", 0.0)) > 0.2 or abs(perceived.get("belonging", 0.0)) > 0.3:
|
|
254
|
+
self._memory_reconsolidation(perceived)
|
|
255
|
+
|
|
256
|
+
threat = perceived.get("threat", 0.0)
|
|
257
|
+
threat_thr = 0.4 * (1.0 - self.psychological_resilience)
|
|
258
|
+
if threat > threat_thr:
|
|
259
|
+
self._apply_trauma("threat", threat - threat_thr)
|
|
260
|
+
if perceived.get("belonging", 0.0) < -0.4 and threat > 0.3:
|
|
261
|
+
self._apply_trauma("betrayal", abs(perceived["belonging"]) * threat)
|
|
262
|
+
|
|
263
|
+
if perceived.get("belonging", 0.0) < -0.3:
|
|
264
|
+
self._erode_trust(abs(perceived["belonging"]))
|
|
265
|
+
|
|
266
|
+
self._latent_accumulate(perceived)
|
|
267
|
+
self._vector_to_fluid(perceived)
|
|
268
|
+
|
|
269
|
+
# V8.0: 自尊更新(在社会反馈事件后)
|
|
270
|
+
self._update_self_esteem(perceived)
|
|
271
|
+
|
|
272
|
+
# V8.0: 认知失调处理
|
|
273
|
+
self._dissonance_dynamics(perceived)
|
|
274
|
+
|
|
275
|
+
# V8.0: 扩展防御(先否认→再合理化→最后压抑——层级递进)
|
|
276
|
+
self._defense_hierarchy(perceived)
|
|
277
|
+
|
|
278
|
+
# 心境更新
|
|
279
|
+
self._update_mood()
|
|
280
|
+
|
|
281
|
+
self._update_dynamic_viscosity()
|
|
282
|
+
self._fluid_dynamics(dt=self._psychological_dt_for(0.8))
|
|
283
|
+
|
|
284
|
+
self._fluid_to_system_feedback()
|
|
285
|
+
self._energy_on_event(perceived, raw_intensity)
|
|
286
|
+
self.fatigue = max(0.0, min(1.0,
|
|
287
|
+
self.fatigue + perceived.get("fatigue", 0.0) * 0.5))
|
|
288
|
+
self.time_compress_base = max(0.0, self.time_compress_base * 0.95)
|
|
289
|
+
|
|
290
|
+
self.last_time = self._now()
|
|
291
|
+
|
|
292
|
+
# ==================================================================
|
|
293
|
+
# 公共入口 2:空转 / 独处时间
|
|
294
|
+
# ==================================================================
|
|
295
|
+
def idle(self, seconds: float):
|
|
296
|
+
"""显式推进 seconds 秒"什么都没发生"的时间。"""
|
|
297
|
+
if seconds <= 0:
|
|
298
|
+
return
|
|
299
|
+
if self._clock_override is not None:
|
|
300
|
+
self._clock_override += seconds
|
|
301
|
+
else:
|
|
302
|
+
self.last_time -= seconds
|
|
303
|
+
self._advance_time()
|
|
304
|
+
|
|
305
|
+
def process_event(self, event: str, intensity: float = 1.0):
|
|
306
|
+
"""便利方法:map_event + process_vector。"""
|
|
307
|
+
self.process_vector(NarrativeMapper.map_event(event, intensity), intensity)
|
|
308
|
+
|
|
309
|
+
# ==================================================================
|
|
310
|
+
# V8.0 公共入口 3:睡眠
|
|
311
|
+
# ==================================================================
|
|
312
|
+
def sleep(self, hours: float):
|
|
313
|
+
"""
|
|
314
|
+
睡眠 hours 小时。
|
|
315
|
+
|
|
316
|
+
睡眠期间发生:
|
|
317
|
+
1. 睡眠债清除
|
|
318
|
+
2. 梦境情绪加工——记忆的情绪电荷衰减,但事实内容保留
|
|
319
|
+
3. 恐惧消退——在安全环境中重演威胁记忆
|
|
320
|
+
4. 创伤愈合加速——睡眠是最好的心理修复
|
|
321
|
+
5. 心境重置——睡醒后愉悦回升、紧张下降
|
|
322
|
+
6. 能量完全恢复
|
|
323
|
+
"""
|
|
324
|
+
if hours <= 0:
|
|
325
|
+
return
|
|
326
|
+
seconds = hours * 3600.0
|
|
327
|
+
|
|
328
|
+
# 推进时钟
|
|
329
|
+
if self._clock_override is not None:
|
|
330
|
+
self._clock_override += seconds
|
|
331
|
+
else:
|
|
332
|
+
self.last_time -= seconds
|
|
333
|
+
|
|
334
|
+
# 先结算睡眠前的连续过程
|
|
335
|
+
self._advance_time()
|
|
336
|
+
|
|
337
|
+
# ── 梦境情绪加工 ──
|
|
338
|
+
dream_cycles = max(1, int(hours * 1.5)) # ~90分钟一个睡眠周期
|
|
339
|
+
for _ in range(dream_cycles):
|
|
340
|
+
self._dream_process()
|
|
341
|
+
|
|
342
|
+
# ── 睡眠债清除 ──
|
|
343
|
+
self.sleep_debt = max(0.0, self.sleep_debt - self.SLEEP_RECOVER_RATE * hours)
|
|
344
|
+
self.last_sleep_time = self._now()
|
|
345
|
+
|
|
346
|
+
# ── 心境重置 ──
|
|
347
|
+
self.mood["愉悦"] = min(0.9, self.mood["愉悦"] + 0.15 * hours)
|
|
348
|
+
self.mood["紧张"] = max(0.05, self.mood["紧张"] - 0.12 * hours)
|
|
349
|
+
self.mood["精力"] = min(1.0, self.mood["精力"] + 0.2 * hours)
|
|
350
|
+
|
|
351
|
+
# ── 能量完全恢复 ──
|
|
352
|
+
self.energy = self.ENERGY_MAX
|
|
353
|
+
self.fatigue = max(0.0, self.fatigue - 0.5 * hours)
|
|
354
|
+
|
|
355
|
+
# ── 睡眠中创伤加速愈合 ──
|
|
356
|
+
self._heal_traumas(seconds * self.DREAM_TRAUMA_HEAL_BOOST)
|
|
357
|
+
|
|
358
|
+
# ── 睡眠后意识重新上线:更新心境和粘滞度 ──
|
|
359
|
+
self._update_mood()
|
|
360
|
+
self._update_dynamic_viscosity()
|
|
361
|
+
|
|
362
|
+
# ==================================================================
|
|
363
|
+
# V8.0 公共入口 4:设定预期
|
|
364
|
+
# ==================================================================
|
|
365
|
+
def expect(self, event_id: str, valence: float, confidence: float = 0.5):
|
|
366
|
+
"""
|
|
367
|
+
建立一个对未来事件的预期。
|
|
368
|
+
|
|
369
|
+
Args:
|
|
370
|
+
event_id: 事件标识(与 process_vector 的 event_id 匹配)
|
|
371
|
+
valence: 预期效价 [-1, 1](正向=期待好事,负向=担心坏事)
|
|
372
|
+
confidence: 确信度 [0, 1]
|
|
373
|
+
"""
|
|
374
|
+
self.expected_events[event_id] = {
|
|
375
|
+
"valence": max(-1.0, min(1.0, valence)),
|
|
376
|
+
"confidence": max(0.0, min(1.0, confidence)),
|
|
377
|
+
"time": self._now(),
|
|
378
|
+
"age": 0.0,
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
# ==================================================================
|
|
382
|
+
# V8.0 公共入口 5:触发认知失调
|
|
383
|
+
# ==================================================================
|
|
384
|
+
def induce_dissonance(self, magnitude: float, belief_domain: str = ""):
|
|
385
|
+
"""
|
|
386
|
+
当 agent 做了与自身信念/价值观相悖的行为时调用。
|
|
387
|
+
|
|
388
|
+
Args:
|
|
389
|
+
magnitude: 失调强度 [0, 1]
|
|
390
|
+
belief_domain: 冲突的信念领域(如 "诚实"、"忠诚")
|
|
391
|
+
"""
|
|
392
|
+
self.cognitive_dissonance = min(1.0, self.cognitive_dissonance + magnitude)
|
|
393
|
+
# 失调立即表现为内在张力
|
|
394
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + magnitude * 0.4)
|
|
395
|
+
self.fluid["愧疚"] = min(1.0, self.fluid["愧疚"] + magnitude * 0.3)
|
|
396
|
+
# 失调消耗能量
|
|
397
|
+
self.energy = max(self.ENERGY_MIN, self.energy - magnitude * 5.0)
|
|
398
|
+
|
|
399
|
+
# ==================================================================
|
|
400
|
+
# 快照:便于外部观察
|
|
401
|
+
# ==================================================================
|
|
402
|
+
def snapshot(self) -> Dict[str, Any]:
|
|
403
|
+
return {
|
|
404
|
+
"fluid": dict(self.fluid),
|
|
405
|
+
"mood": dict(self.mood),
|
|
406
|
+
"self_esteem": self.self_esteem,
|
|
407
|
+
"energy": self.energy,
|
|
408
|
+
"fatigue": self.fatigue,
|
|
409
|
+
"excitation": self.excitation,
|
|
410
|
+
"max_trust": self.max_trust,
|
|
411
|
+
"suppression_load": self.suppression_load,
|
|
412
|
+
"denial_load": self.denial_load,
|
|
413
|
+
"latent_pressure": self.latent_pressure,
|
|
414
|
+
"cognitive_dissonance": self.cognitive_dissonance,
|
|
415
|
+
"sleep_debt": self.sleep_debt,
|
|
416
|
+
"trauma": dict(self.trauma_state),
|
|
417
|
+
"memory_count": len(self.memory_traces),
|
|
418
|
+
"expected_count": len(self.expected_events),
|
|
419
|
+
"last_perceived": dict(self.last_perceived),
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
# ==================================================================
|
|
423
|
+
# 懒时间推进:结算 Δt 内所有连续过程
|
|
424
|
+
# ==================================================================
|
|
425
|
+
def _advance_time(self):
|
|
426
|
+
now = self._now()
|
|
427
|
+
dt = now - self.last_time
|
|
428
|
+
if dt <= 0:
|
|
429
|
+
self.last_time = now
|
|
430
|
+
return
|
|
431
|
+
dt = min(dt, 86400.0) # 单步 24h 上限
|
|
432
|
+
|
|
433
|
+
# V8.0: 积累睡眠债
|
|
434
|
+
self.sleep_debt = min(1.0, self.sleep_debt + self.SLEEP_NEED_RATE * dt)
|
|
435
|
+
|
|
436
|
+
# V8.0: 睡眠债影响认知——缺觉时一切更糟
|
|
437
|
+
# (不直接修改 fluid,而是在 _core_appraisal_gain 中生效)
|
|
438
|
+
|
|
439
|
+
# V8.0: 预期衰减(太久没兑现的预期自动消失)
|
|
440
|
+
self._decay_expectations(dt)
|
|
441
|
+
|
|
442
|
+
self._rebuild_fluid_target()
|
|
443
|
+
self._update_dynamic_viscosity()
|
|
444
|
+
self._fluid_dynamics(dt=self._psychological_dt_for(dt))
|
|
445
|
+
self._forget_over(dt)
|
|
446
|
+
self._energy_idle(dt)
|
|
447
|
+
self._excitation_decay(dt)
|
|
448
|
+
self._check_boredom(dt)
|
|
449
|
+
self.suppression_load = max(0.0, self.suppression_load - self.SUPPRESSION_DRAIN * dt)
|
|
450
|
+
self.latent_pressure = max(0.0, self.latent_pressure - self.LATENT_DRAIN * dt)
|
|
451
|
+
# V8.0: 否认/合理化自然衰减
|
|
452
|
+
self.denial_load = max(0.0, self.denial_load - self.DENIAL_DRAIN * dt)
|
|
453
|
+
self.rationalization_load = max(0.0, self.rationalization_load - self.RATIONALIZE_DRAIN * dt)
|
|
454
|
+
# V8.0: 认知失调自然衰减
|
|
455
|
+
self.cognitive_dissonance = max(0.0, self.cognitive_dissonance - self.DISSONANCE_DECAY * dt)
|
|
456
|
+
self._heal_traumas(dt)
|
|
457
|
+
self._recover_trust(dt)
|
|
458
|
+
self.suppression_burst_cd = max(0.0, self.suppression_burst_cd - dt)
|
|
459
|
+
self.avalanche_cd = max(0.0, self.avalanche_cd - dt)
|
|
460
|
+
self.denial_burst_cd = max(0.0, self.denial_burst_cd - dt)
|
|
461
|
+
self.time_compress_base *= (0.95 ** max(0.0, min(dt, 10.0)))
|
|
462
|
+
if self.time_compress_base < 1e-4:
|
|
463
|
+
self.time_compress_base = 0.0
|
|
464
|
+
self._fluid_to_system_feedback()
|
|
465
|
+
self.fatigue = max(0.0, self.fatigue - self.FATIGUE_RECOVER * dt)
|
|
466
|
+
# V8.0: 心境随时间缓慢漂移
|
|
467
|
+
self._update_mood()
|
|
468
|
+
|
|
469
|
+
self.last_time = now
|
|
470
|
+
|
|
471
|
+
# ==================================================================
|
|
472
|
+
# 1. 认知增益(V8.0: 加入心境、自尊、睡眠债调制)
|
|
473
|
+
# ==================================================================
|
|
474
|
+
def _core_appraisal_gain(self, v: Dict[str, float]) -> Dict[str, float]:
|
|
475
|
+
out = dict(v)
|
|
476
|
+
energy_factor = self.energy / 100.0
|
|
477
|
+
tension = self.fluid["张力"]
|
|
478
|
+
fear = self.fluid["恐惧"]
|
|
479
|
+
trust = min(self.fluid["信任"], self.max_trust)
|
|
480
|
+
|
|
481
|
+
# 唤醒乘数
|
|
482
|
+
arousal_mult = 1.0 + self.excitation * 0.6
|
|
483
|
+
|
|
484
|
+
# ── V8.0 心境调制 ──
|
|
485
|
+
# 心情好 → 威胁感知减弱、归属感增强
|
|
486
|
+
# 心情差 → 威胁感知放大、归属感打折
|
|
487
|
+
mood_pleasantness = self.mood["愉悦"]
|
|
488
|
+
mood_mod = 1.0 + (mood_pleasantness - 0.5) * 0.5 # 0.75~1.25 range
|
|
489
|
+
|
|
490
|
+
# ── V8.0 自尊调制 ──
|
|
491
|
+
# 低自尊 → threat 放大("果然又是冲我来的")
|
|
492
|
+
# 低自尊 → 正向 belonging 打折("他们只是客气而已")
|
|
493
|
+
esteem_threat_mod = 1.0 + (0.5 - self.self_esteem) * 0.8 # 0.6~1.4
|
|
494
|
+
esteem_belonging_pos_mod = 0.6 + self.self_esteem * 0.8 # 0.6~1.4
|
|
495
|
+
|
|
496
|
+
# ── V8.0 睡眠债调制 ──
|
|
497
|
+
# 缺觉 → 所有负面信号放大、正面信号减弱、能量感知下降
|
|
498
|
+
sleep_mod_neg = 1.0 + self.sleep_debt * 0.5 # 1.0~1.5
|
|
499
|
+
sleep_mod_pos = 1.0 - self.sleep_debt * 0.3 # 0.7~1.0
|
|
500
|
+
|
|
501
|
+
for k in out:
|
|
502
|
+
base_mod = (0.4 + 0.6 * energy_factor) * arousal_mult * mood_mod
|
|
503
|
+
out[k] *= base_mod
|
|
504
|
+
|
|
505
|
+
if out.get("threat", 0.0) > 0:
|
|
506
|
+
out["threat"] *= (1.0 + 1.5 * tension * fear) * esteem_threat_mod * sleep_mod_neg
|
|
507
|
+
if "threat" in self.trauma_state and out.get("threat", 0.0) > 0:
|
|
508
|
+
out["threat"] *= 1.0 + self.trauma_state["threat"]
|
|
509
|
+
if "betrayal" in self.trauma_state and out.get("belonging", 0.0) < 0:
|
|
510
|
+
out["belonging"] *= 1.0 + self.trauma_state["betrayal"]
|
|
511
|
+
if out.get("belonging", 0.0) < 0:
|
|
512
|
+
out["belonging"] *= (1.0 - 0.4 * trust) * sleep_mod_neg
|
|
513
|
+
if out.get("belonging", 0.0) > 0:
|
|
514
|
+
out["belonging"] *= (1.0 - 0.3 * self.fatigue) * esteem_belonging_pos_mod * sleep_mod_pos
|
|
515
|
+
return out
|
|
516
|
+
|
|
517
|
+
# ==================================================================
|
|
518
|
+
# 2. 记忆重巩固
|
|
519
|
+
# ==================================================================
|
|
520
|
+
@staticmethod
|
|
521
|
+
def _vec_sim(a: Dict[str, float], b: Dict[str, float]) -> float:
|
|
522
|
+
keys = set(a) | set(b)
|
|
523
|
+
if not keys:
|
|
524
|
+
return 0.0
|
|
525
|
+
dot = sum(a.get(k, 0.0) * b.get(k, 0.0) for k in keys)
|
|
526
|
+
na = math.sqrt(sum(a.get(k, 0.0) ** 2 for k in keys))
|
|
527
|
+
nb = math.sqrt(sum(b.get(k, 0.0) ** 2 for k in keys))
|
|
528
|
+
if na == 0 or nb == 0:
|
|
529
|
+
return 0.0
|
|
530
|
+
return dot / (na * nb)
|
|
531
|
+
|
|
532
|
+
def _memory_reconsolidation(self, v: Dict[str, float]):
|
|
533
|
+
valence = v.get("belonging", 0.0) - v.get("threat", 0.0)
|
|
534
|
+
intensity = math.sqrt(sum(x * x for x in v.values()))
|
|
535
|
+
trust = min(self.fluid["信任"], self.max_trust)
|
|
536
|
+
fear = self.fluid["恐惧"]
|
|
537
|
+
safety = trust * (1.0 - fear)
|
|
538
|
+
|
|
539
|
+
best_idx, best_sim = -1, 0.0
|
|
540
|
+
for i, t in enumerate(self.memory_traces):
|
|
541
|
+
sim = self._vec_sim(v, t["vector"])
|
|
542
|
+
if sim > best_sim:
|
|
543
|
+
best_sim, best_idx = sim, i
|
|
544
|
+
|
|
545
|
+
now = self._now()
|
|
546
|
+
if best_idx >= 0 and best_sim > (1.0 - self.RECONSOL_RADIUS):
|
|
547
|
+
tr = self.memory_traces[best_idx]
|
|
548
|
+
if safety > self.SAFETY_THRESHOLD:
|
|
549
|
+
tr["strength"] *= 0.85
|
|
550
|
+
else:
|
|
551
|
+
tr["strength"] = min(1.0, tr["strength"] + intensity * 0.2)
|
|
552
|
+
tr["timestamp"] = now
|
|
553
|
+
tr["age"] = 0.0
|
|
554
|
+
tr["count"] = tr.get("count", 1) + 1
|
|
555
|
+
else:
|
|
556
|
+
trace = {
|
|
557
|
+
"vector": dict(v),
|
|
558
|
+
"strength": min(1.0, intensity),
|
|
559
|
+
"valence": valence,
|
|
560
|
+
"timestamp": now,
|
|
561
|
+
"age": 0.0,
|
|
562
|
+
"count": 1,
|
|
563
|
+
}
|
|
564
|
+
self.memory_traces.append(trace)
|
|
565
|
+
if len(self.memory_traces) > self.MAX_MEMORY_TRACES:
|
|
566
|
+
self.memory_traces.sort(
|
|
567
|
+
key=lambda t: t["strength"] * (1.0 + math.log1p(t.get("count", 1))))
|
|
568
|
+
self.memory_traces.pop(0)
|
|
569
|
+
|
|
570
|
+
# ==================================================================
|
|
571
|
+
# 3. 创伤
|
|
572
|
+
# ==================================================================
|
|
573
|
+
def _apply_trauma(self, key: str, magnitude: float):
|
|
574
|
+
cur = self.trauma_state.get(key, 0.0)
|
|
575
|
+
gain = magnitude * (1.0 - self.psychological_resilience) * 0.7
|
|
576
|
+
self.trauma_state[key] = min(1.0, cur + gain)
|
|
577
|
+
|
|
578
|
+
def _heal_traumas(self, dt: float):
|
|
579
|
+
rate = self.TRAUMA_HEAL_RATE * (0.3 + self.psychological_resilience) * dt
|
|
580
|
+
healed = []
|
|
581
|
+
for k, v in list(self.trauma_state.items()):
|
|
582
|
+
nv = v - rate
|
|
583
|
+
if nv <= 0.01:
|
|
584
|
+
healed.append(k)
|
|
585
|
+
else:
|
|
586
|
+
self.trauma_state[k] = nv
|
|
587
|
+
for k in healed:
|
|
588
|
+
del self.trauma_state[k]
|
|
589
|
+
|
|
590
|
+
# ==================================================================
|
|
591
|
+
# 4. 信任容量腐蚀 & 恢复
|
|
592
|
+
# ==================================================================
|
|
593
|
+
def _erode_trust(self, magnitude: float):
|
|
594
|
+
factor = 1.0 - (1.0 - self.TRUST_ERODE) * min(1.0, magnitude)
|
|
595
|
+
self.max_trust = max(0.1, self.max_trust * factor)
|
|
596
|
+
|
|
597
|
+
def _recover_trust(self, dt: float):
|
|
598
|
+
if self.max_trust < 1.0:
|
|
599
|
+
recover = self.TRUST_RECOVER * dt * (1.01 - self.max_trust)
|
|
600
|
+
self.max_trust = min(1.0, self.max_trust + recover)
|
|
601
|
+
|
|
602
|
+
# ==================================================================
|
|
603
|
+
# 5. 隐压累积 + 雪崩
|
|
604
|
+
# ==================================================================
|
|
605
|
+
def _latent_accumulate(self, v: Dict[str, float]):
|
|
606
|
+
neg = max(0.0, -v.get("belonging", 0.0)) + max(0.0, v.get("threat", 0.0))
|
|
607
|
+
self.latent_pressure += neg * 0.4
|
|
608
|
+
if self.latent_pressure >= self.LATENT_THRESHOLD and self.avalanche_cd <= 0:
|
|
609
|
+
self._trigger_avalanche()
|
|
610
|
+
|
|
611
|
+
def _trigger_avalanche(self):
|
|
612
|
+
self.avalanche_cd = self.LATENT_COOLDOWN
|
|
613
|
+
overflow = self.latent_pressure - self.LATENT_THRESHOLD + 0.5
|
|
614
|
+
self.latent_pressure = 0.3
|
|
615
|
+
self.fluid["愤怒"] = min(1.0, self.fluid["愤怒"] + overflow * 0.5)
|
|
616
|
+
self.fluid["恐惧"] = min(1.0, self.fluid["恐惧"] + overflow * 0.3)
|
|
617
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + overflow * 0.3)
|
|
618
|
+
self.fluid["疏离"] = min(1.0, self.fluid["疏离"] + overflow * 0.2)
|
|
619
|
+
self.fluid["信任"] = max(0.0, self.fluid["信任"] - overflow * 0.3)
|
|
620
|
+
self.fluid["喜悦"] = max(0.0, self.fluid["喜悦"] - overflow * 0.3)
|
|
621
|
+
self.energy = max(self.ENERGY_MIN, self.energy - overflow * 10)
|
|
622
|
+
self.time_compress_base = min(1.0, self.time_compress_base + 0.5)
|
|
623
|
+
|
|
624
|
+
# ==================================================================
|
|
625
|
+
# 6. 向量 → 流体瞬时映射(V8.0: 加入羞耻路径)
|
|
626
|
+
# ==================================================================
|
|
627
|
+
def _vector_to_fluid(self, v: Dict[str, float]):
|
|
628
|
+
b = v.get("belonging", 0.0)
|
|
629
|
+
t = v.get("threat", 0.0)
|
|
630
|
+
a = v.get("autonomy", 0.0)
|
|
631
|
+
f = v.get("fatigue", 0.0)
|
|
632
|
+
s = v.get("shame_trigger", 0.0) # V8.0: 羞耻触发器
|
|
633
|
+
|
|
634
|
+
# ── V8.0 羞耻路径 ──
|
|
635
|
+
# 羞耻是"我这个人有问题",由自我相关负面评价触发
|
|
636
|
+
# 与愧疚不同——愧疚是"我做的事有问题"
|
|
637
|
+
if s > 0:
|
|
638
|
+
self.fluid["羞耻"] = min(1.0, self.fluid["羞耻"] + s * 0.7)
|
|
639
|
+
self.fluid["疏离"] = min(1.0, self.fluid["疏离"] + s * 0.3)
|
|
640
|
+
# 羞耻让人退缩(降低愤怒,增加恐惧和疏离)
|
|
641
|
+
self.fluid["愤怒"] = max(0.0, self.fluid["愤怒"] - s * 0.3)
|
|
642
|
+
self.fluid["恐惧"] = min(1.0, self.fluid["恐惧"] + s * 0.25)
|
|
643
|
+
# 负向归属 + 低自尊 → 更容易产生羞耻而非愤怒
|
|
644
|
+
elif b < -0.3 and self.self_esteem < 0.35:
|
|
645
|
+
shame_leak = (-b) * 0.3 * (0.5 - self.self_esteem)
|
|
646
|
+
self.fluid["羞耻"] = min(1.0, self.fluid["羞耻"] + shame_leak)
|
|
647
|
+
self.fluid["愤怒"] = min(1.0, self.fluid["愤怒"] + (-b) * 0.4) # 愤怒减少了
|
|
648
|
+
self.fluid["疏离"] = min(1.0, self.fluid["疏离"] + (-b) * 0.5)
|
|
649
|
+
self.fluid["愧疚"] = min(1.0, self.fluid["愧疚"] + (-b) * 0.2)
|
|
650
|
+
# 负向归属(标准路径)
|
|
651
|
+
elif b < 0:
|
|
652
|
+
self.fluid["愤怒"] = min(1.0, self.fluid["愤怒"] + (-b) * 0.7)
|
|
653
|
+
self.fluid["疏离"] = min(1.0, self.fluid["疏离"] + (-b) * 0.4)
|
|
654
|
+
self.fluid["愧疚"] = min(1.0, self.fluid["愧疚"] + (-b) * 0.15)
|
|
655
|
+
if self.psychological_resilience > 0.6:
|
|
656
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + (-b) * 0.3)
|
|
657
|
+
self.fluid["愤怒"] *= 0.8
|
|
658
|
+
# 正向归属 → 喜悦/信任,愤怒/疏离/羞耻回落
|
|
659
|
+
if b > 0:
|
|
660
|
+
self.fluid["喜悦"] = min(1.0, self.fluid["喜悦"] + b * 0.6)
|
|
661
|
+
self.fluid["信任"] = min(self.max_trust, self.fluid["信任"] + b * 0.25)
|
|
662
|
+
self.fluid["愤怒"] = max(0.0, self.fluid["愤怒"] - b * 0.4)
|
|
663
|
+
self.fluid["疏离"] = max(0.0, self.fluid["疏离"] - b * 0.3)
|
|
664
|
+
self.fluid["羞耻"] = max(0.0, self.fluid["羞耻"] - b * 0.3)
|
|
665
|
+
# 威胁 → 恐惧/张力
|
|
666
|
+
if t > 0:
|
|
667
|
+
self.fluid["恐惧"] = min(1.0, self.fluid["恐惧"] + t * 0.8)
|
|
668
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + t * 0.6)
|
|
669
|
+
self.fluid["信任"] = max(0.0, self.fluid["信任"] - t * 0.2)
|
|
670
|
+
# 自主 → 喜悦
|
|
671
|
+
if a > 0:
|
|
672
|
+
self.fluid["喜悦"] = min(1.0, self.fluid["喜悦"] + a * 0.3)
|
|
673
|
+
# 疲劳 → 削减喜悦、增加张力
|
|
674
|
+
if f > 0:
|
|
675
|
+
self.fluid["喜悦"] = max(0.0, self.fluid["喜悦"] - f * 0.3)
|
|
676
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + f * 0.2)
|
|
677
|
+
|
|
678
|
+
# 所有维度夹紧
|
|
679
|
+
self.fluid["信任"] = min(self.fluid["信任"], self.max_trust)
|
|
680
|
+
for k in self.fluid:
|
|
681
|
+
self.fluid[k] = max(0.0, min(1.0, self.fluid[k]))
|
|
682
|
+
|
|
683
|
+
# 兴奋调制
|
|
684
|
+
if self.excitation > 0.5:
|
|
685
|
+
extra = (self.excitation - 0.5) * 0.4
|
|
686
|
+
self.fluid["喜悦"] = min(1.0, self.fluid["喜悦"] + extra * max(0.0, b))
|
|
687
|
+
self.fluid["愤怒"] = min(1.0, self.fluid["愤怒"] + extra * max(0.0, -b))
|
|
688
|
+
self.fluid["恐惧"] = min(1.0, self.fluid["恐惧"] + extra * max(0.0, t))
|
|
689
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + extra * max(0.0, t, -b) * 0.5)
|
|
690
|
+
|
|
691
|
+
# ==================================================================
|
|
692
|
+
# 7. 压抑动力学(保持不变)
|
|
693
|
+
# ==================================================================
|
|
694
|
+
def _suppression_dynamics(self, v: Dict[str, float]):
|
|
695
|
+
neg = (max(0.0, self.fluid["愤怒"])
|
|
696
|
+
+ max(0.0, self.fluid["恐惧"])
|
|
697
|
+
+ max(0.0, self.fluid["疏离"]))
|
|
698
|
+
will_to_suppress = (self.energy / 100.0) * (0.3 + self.psychological_resilience)
|
|
699
|
+
suppressed_here = neg * will_to_suppress * 0.5
|
|
700
|
+
if suppressed_here > 0.05:
|
|
701
|
+
self._suppressing_negativity = True
|
|
702
|
+
self.suppression_load += suppressed_here
|
|
703
|
+
self.fluid["愤怒"] *= (1.0 - will_to_suppress * 0.6)
|
|
704
|
+
self.fluid["恐惧"] *= (1.0 - will_to_suppress * 0.4)
|
|
705
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + suppressed_here * 0.3)
|
|
706
|
+
else:
|
|
707
|
+
self._suppressing_negativity = False
|
|
708
|
+
|
|
709
|
+
if self.suppression_load >= self.SUPPRESSION_THRESHOLD and self.suppression_burst_cd <= 0:
|
|
710
|
+
self._trigger_burst()
|
|
711
|
+
|
|
712
|
+
def _trigger_burst(self):
|
|
713
|
+
self.suppression_burst_cd = self.SUPPRESSION_BURST_COOLDOWN
|
|
714
|
+
load = self.suppression_load
|
|
715
|
+
self.suppression_load = 0.0
|
|
716
|
+
self.fluid["愤怒"] = min(1.0, self.fluid["愤怒"] + load * 0.6)
|
|
717
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + load * 0.4)
|
|
718
|
+
self.fluid["喜悦"] = max(0.0, self.fluid["喜悦"] - load * 0.3)
|
|
719
|
+
self.fluid["信任"] = max(0.0, self.fluid["信任"] - load * 0.2)
|
|
720
|
+
self.energy = max(self.ENERGY_MIN, self.energy - load * 8)
|
|
721
|
+
self.time_compress_base = min(1.0, self.time_compress_base + 0.7)
|
|
722
|
+
self._apply_trauma("threat", load * 0.1)
|
|
723
|
+
|
|
724
|
+
# ==================================================================
|
|
725
|
+
# 8. 动态粘滞度 / 心理时间
|
|
726
|
+
# ==================================================================
|
|
727
|
+
def _update_dynamic_viscosity(self):
|
|
728
|
+
base = self.VISC_BASE
|
|
729
|
+
self.dynamic_viscosity = (base
|
|
730
|
+
+ self.VISC_TENSION_K * self.fluid["张力"]
|
|
731
|
+
+ self.VISC_FATIGUE_K * self.fatigue
|
|
732
|
+
+ self.mood["紧张"] * 0.15 # V8.0: 心境紧张加剧粘滞
|
|
733
|
+
+ self.sleep_debt * 0.1) # V8.0: 缺觉让情绪更钝
|
|
734
|
+
self.dynamic_viscosity -= self.excitation * 0.08
|
|
735
|
+
self.dynamic_viscosity = max(0.02, min(1.5, self.dynamic_viscosity))
|
|
736
|
+
self.psy_dilation = 1.0 + self.time_compress_base * 2.0
|
|
737
|
+
|
|
738
|
+
def _psychological_dt_for(self, real_dt: float) -> float:
|
|
739
|
+
return real_dt * self.psy_dilation / (0.1 + self.dynamic_viscosity)
|
|
740
|
+
|
|
741
|
+
def _psychological_dt(self) -> float:
|
|
742
|
+
return self._psychological_dt_for(1.0)
|
|
743
|
+
|
|
744
|
+
# ==================================================================
|
|
745
|
+
# 9. 流体连续松弛
|
|
746
|
+
# ==================================================================
|
|
747
|
+
def _fluid_dynamics(self, dt: float):
|
|
748
|
+
k = 1.0 / (0.2 + self.dynamic_viscosity * 3.0)
|
|
749
|
+
alpha = 1.0 - math.exp(-k * max(0.0, dt))
|
|
750
|
+
alpha = max(0.0, min(1.0, alpha))
|
|
751
|
+
for key in self.fluid:
|
|
752
|
+
tgt = self.fluid_target.get(key, self.fluid[key])
|
|
753
|
+
if key == "信任":
|
|
754
|
+
tgt = min(tgt, self.max_trust)
|
|
755
|
+
self.fluid[key] += (tgt - self.fluid[key]) * alpha
|
|
756
|
+
self.fluid[key] = max(0.0, min(1.0, self.fluid[key]))
|
|
757
|
+
|
|
758
|
+
# ==================================================================
|
|
759
|
+
# target 重建:基线 + 创伤牵引 + 记忆共振 + 心境牵引
|
|
760
|
+
# ==================================================================
|
|
761
|
+
def _rebuild_fluid_target(self):
|
|
762
|
+
for k, v in self.fluid_baseline.items():
|
|
763
|
+
self.fluid_target[k] = v
|
|
764
|
+
|
|
765
|
+
# ── V8.0 心境牵引 target ──
|
|
766
|
+
# 心境好 → 喜悦 target 抬高、愤怒/疏离 target 压低
|
|
767
|
+
mp = self.mood["愉悦"]
|
|
768
|
+
self.fluid_target["喜悦"] = min(1.0, self.fluid_target["喜悦"] + (mp - 0.5) * 0.3)
|
|
769
|
+
self.fluid_target["愤怒"] = max(0.0, self.fluid_target["愤怒"] - (mp - 0.5) * 0.15)
|
|
770
|
+
self.fluid_target["疏离"] = max(0.0, self.fluid_target["疏离"] - (mp - 0.5) * 0.15)
|
|
771
|
+
|
|
772
|
+
# ── V8.0 自尊牵引 target ──
|
|
773
|
+
# 低自尊 → 羞耻 target 抬高
|
|
774
|
+
self.fluid_target["羞耻"] = max(0.0, self.fluid_target["羞耻"] +
|
|
775
|
+
(0.5 - self.self_esteem) * 0.2)
|
|
776
|
+
|
|
777
|
+
# ── V8.0 睡眠债牵引 target ──
|
|
778
|
+
# 缺觉 → 张力 + 恐惧 target 抬高,喜悦 target 压低
|
|
779
|
+
sd = self.sleep_debt
|
|
780
|
+
self.fluid_target["张力"] = min(1.0, self.fluid_target["张力"] + sd * 0.25)
|
|
781
|
+
self.fluid_target["恐惧"] = min(1.0, self.fluid_target["恐惧"] + sd * 0.15)
|
|
782
|
+
self.fluid_target["喜悦"] = max(0.0, self.fluid_target["喜悦"] - sd * 0.2)
|
|
783
|
+
|
|
784
|
+
# 创伤牵引
|
|
785
|
+
if "threat" in self.trauma_state:
|
|
786
|
+
w = self.trauma_state["threat"] * self.TRAUMA_BIAS
|
|
787
|
+
self.fluid_target["恐惧"] = min(1.0, self.fluid_target["恐惧"] + w)
|
|
788
|
+
self.fluid_target["张力"] = min(1.0, self.fluid_target["张力"] + w * 0.8)
|
|
789
|
+
self.fluid_target["信任"] = max(0.0, self.fluid_target["信任"] - w * 0.5)
|
|
790
|
+
if "betrayal" in self.trauma_state:
|
|
791
|
+
w = self.trauma_state["betrayal"] * self.TRAUMA_BIAS
|
|
792
|
+
self.fluid_target["疏离"] = min(1.0, self.fluid_target["疏离"] + w)
|
|
793
|
+
self.fluid_target["信任"] = max(0.0, self.fluid_target["信任"] - w * 0.7)
|
|
794
|
+
self.fluid_target["愤怒"] = min(1.0, self.fluid_target["愤怒"] + w * 0.3)
|
|
795
|
+
|
|
796
|
+
# 记忆共振
|
|
797
|
+
now = self._now()
|
|
798
|
+
for tr in self.memory_traces:
|
|
799
|
+
age = now - tr["timestamp"]
|
|
800
|
+
weight = tr["strength"] * math.exp(-self.forgetting_rate * age / 20.0)
|
|
801
|
+
if weight < 0.02:
|
|
802
|
+
continue
|
|
803
|
+
vec = tr["vector"]
|
|
804
|
+
if vec.get("threat", 0.0) > 0:
|
|
805
|
+
self.fluid_target["恐惧"] = min(1.0,
|
|
806
|
+
self.fluid_target["恐惧"] + weight * 0.1 * vec["threat"])
|
|
807
|
+
if vec.get("belonging", 0.0) < 0:
|
|
808
|
+
self.fluid_target["疏离"] = min(1.0,
|
|
809
|
+
self.fluid_target["疏离"] + weight * 0.1 * (-vec["belonging"]))
|
|
810
|
+
self.fluid_target["信任"] = max(0.0,
|
|
811
|
+
self.fluid_target["信任"] - weight * 0.08 * (-vec["belonging"]))
|
|
812
|
+
elif vec.get("belonging", 0.0) > 0:
|
|
813
|
+
self.fluid_target["喜悦"] = min(1.0,
|
|
814
|
+
self.fluid_target["喜悦"] + weight * 0.1 * vec["belonging"])
|
|
815
|
+
|
|
816
|
+
for k in self.fluid_target:
|
|
817
|
+
self.fluid_target[k] = max(0.0, min(1.0, self.fluid_target[k]))
|
|
818
|
+
|
|
819
|
+
# ==================================================================
|
|
820
|
+
# 10. 流体 → 系统反馈
|
|
821
|
+
# ==================================================================
|
|
822
|
+
def _fluid_to_system_feedback(self):
|
|
823
|
+
tension = self.fluid["张力"]
|
|
824
|
+
self.psy_dilation = 1.0 + self.time_compress_base * 2.0 + tension * 0.5
|
|
825
|
+
guilt = self.fluid["愧疚"]
|
|
826
|
+
if guilt > 0.3 and self.max_trust < 1.0:
|
|
827
|
+
self.max_trust = min(1.0, self.max_trust + guilt * 0.0001)
|
|
828
|
+
# V8.0: 羞耻 → 自尊被侵蚀
|
|
829
|
+
shame = self.fluid.get("羞耻", 0.0)
|
|
830
|
+
if shame > 0.4:
|
|
831
|
+
self.self_esteem = max(0.1, self.self_esteem - shame * 0.0005)
|
|
832
|
+
|
|
833
|
+
# ==================================================================
|
|
834
|
+
# 11. 能量代谢
|
|
835
|
+
# ==================================================================
|
|
836
|
+
def _energy_on_event(self, v: Dict[str, float], raw_intensity: float):
|
|
837
|
+
cost = self.ENERGY_EVENT_COST * raw_intensity
|
|
838
|
+
if v.get("threat", 0.0) > 0.2 or v.get("belonging", 0.0) < -0.2:
|
|
839
|
+
cost *= 1.8
|
|
840
|
+
cost *= (1.0 + self.fluid["张力"])
|
|
841
|
+
# V8.0: 认知失调额外消耗能量
|
|
842
|
+
cost *= (1.0 + self.cognitive_dissonance * 0.5)
|
|
843
|
+
self.energy = max(self.ENERGY_MIN, self.energy - cost)
|
|
844
|
+
|
|
845
|
+
def _energy_idle(self, dt: float):
|
|
846
|
+
recover = self.ENERGY_RECOVER * dt * (1.0 - 0.5 * self.fatigue)
|
|
847
|
+
# V8.0: 睡眠债降低能量恢复效率
|
|
848
|
+
recover *= (1.0 - self.sleep_debt * 0.4)
|
|
849
|
+
self.energy = min(self.ENERGY_MAX, self.energy + recover)
|
|
850
|
+
|
|
851
|
+
# ==================================================================
|
|
852
|
+
# 12. 艾宾浩斯遗忘曲线
|
|
853
|
+
# ==================================================================
|
|
854
|
+
def _forget_over(self, dt: float):
|
|
855
|
+
survivors = []
|
|
856
|
+
now = self._now()
|
|
857
|
+
for tr in self.memory_traces:
|
|
858
|
+
age = now - tr["timestamp"]
|
|
859
|
+
strength = tr["strength"] * math.exp(-self.forgetting_rate * age / 10.0)
|
|
860
|
+
if strength > self.trace_importance_threshold:
|
|
861
|
+
tr["strength"] = strength
|
|
862
|
+
tr["age"] = age
|
|
863
|
+
survivors.append(tr)
|
|
864
|
+
self.memory_traces = survivors
|
|
865
|
+
|
|
866
|
+
# ==================================================================
|
|
867
|
+
# 13. 兴奋/唤醒系统
|
|
868
|
+
# ==================================================================
|
|
869
|
+
def _excitation_on_event(self, v: Dict[str, float], raw_intensity: float):
|
|
870
|
+
novelty = raw_intensity * self.EXCITATION_NOVELTY_GAIN
|
|
871
|
+
if abs(v.get("threat", 0.0)) > 0.5 or abs(v.get("belonging", 0.0)) > 0.5:
|
|
872
|
+
novelty += raw_intensity * self.EXCITATION_SALIENCE_BOOST
|
|
873
|
+
self.excitation = min(self.EXCITATION_MAX, self.excitation + novelty)
|
|
874
|
+
|
|
875
|
+
def _excitation_decay(self, dt: float):
|
|
876
|
+
if self.excitation > self.EXCITATION_BASELINE:
|
|
877
|
+
self.excitation += (self.EXCITATION_BASELINE - self.excitation) * \
|
|
878
|
+
(1.0 - math.exp(-self.EXCITATION_DECAY * dt))
|
|
879
|
+
if abs(self.excitation - self.EXCITATION_BASELINE) < 0.005:
|
|
880
|
+
self.excitation = self.EXCITATION_BASELINE
|
|
881
|
+
|
|
882
|
+
def _check_boredom(self, dt: float):
|
|
883
|
+
if self.excitation < self.EXCITATION_BOREDOM_THRESHOLD:
|
|
884
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + 0.003 * dt / 60)
|
|
885
|
+
self.fluid["疏离"] = min(1.0, self.fluid["疏离"] + 0.002 * dt / 60)
|
|
886
|
+
|
|
887
|
+
# ==================================================================
|
|
888
|
+
# 14. V8.0 心境更新(慢变量)
|
|
889
|
+
# ==================================================================
|
|
890
|
+
def _update_mood(self):
|
|
891
|
+
"""
|
|
892
|
+
心境是慢变量,由以下因素缓慢牵引:
|
|
893
|
+
- 流体情绪的平均水平(持续愤怒 → 心境紧张上升)
|
|
894
|
+
- 自尊(低自尊 → 心境愉悦下降)
|
|
895
|
+
- 睡眠债(缺觉 → 心境精力下降、紧张上升)
|
|
896
|
+
- 认知失调(内心冲突 → 心境紧张上升)
|
|
897
|
+
|
|
898
|
+
惯性极大——MOOD_INERTIA 保证每步只微量移动。
|
|
899
|
+
"""
|
|
900
|
+
# 目标心境
|
|
901
|
+
target_pleasant = (self.fluid["喜悦"] * 0.4
|
|
902
|
+
- self.fluid["愤怒"] * 0.3
|
|
903
|
+
- self.fluid["恐惧"] * 0.25
|
|
904
|
+
- self.fluid["疏离"] * 0.2
|
|
905
|
+
- self.fluid["羞耻"] * 0.3
|
|
906
|
+
+ self.self_esteem * 0.4
|
|
907
|
+
+ 0.3) # 中性基线偏移
|
|
908
|
+
target_pleasant = max(0.0, min(1.0, target_pleasant))
|
|
909
|
+
|
|
910
|
+
target_tension = (self.fluid["张力"] * 0.5
|
|
911
|
+
+ self.fluid["恐惧"] * 0.3
|
|
912
|
+
+ self.cognitive_dissonance * 0.3
|
|
913
|
+
+ self.sleep_debt * 0.3
|
|
914
|
+
+ 0.1)
|
|
915
|
+
target_tension = max(0.0, min(1.0, target_tension))
|
|
916
|
+
|
|
917
|
+
target_vigor = (1.0
|
|
918
|
+
- self.fatigue * 0.5
|
|
919
|
+
- self.sleep_debt * 0.6
|
|
920
|
+
- self.fluid["张力"] * 0.2
|
|
921
|
+
+ self.self_esteem * 0.3)
|
|
922
|
+
target_vigor = max(0.0, min(1.0, target_vigor))
|
|
923
|
+
|
|
924
|
+
# 向目标缓慢移动
|
|
925
|
+
alpha = self.MOOD_INERTIA
|
|
926
|
+
self.mood["愉悦"] += (target_pleasant - self.mood["愉悦"]) * alpha
|
|
927
|
+
self.mood["紧张"] += (target_tension - self.mood["紧张"]) * alpha
|
|
928
|
+
self.mood["精力"] += (target_vigor - self.mood["精力"]) * alpha
|
|
929
|
+
|
|
930
|
+
# ==================================================================
|
|
931
|
+
# 15. V8.0 梦境加工
|
|
932
|
+
# ==================================================================
|
|
933
|
+
def _dream_process(self):
|
|
934
|
+
"""
|
|
935
|
+
单个睡眠周期(~90 分钟)中的梦境情绪加工:
|
|
936
|
+
|
|
937
|
+
1. 记忆情绪衰减——保留事实,降低情绪电荷
|
|
938
|
+
(这就是为什么"睡一觉就觉得没那么严重了")
|
|
939
|
+
2. 恐惧消退——在安全的"梦中环境"重新暴露于威胁记忆,
|
|
940
|
+
降低其威胁关联(Phelps 2004 的睡眠恐惧消退理论)
|
|
941
|
+
3. 创伤愈合——在 REM 睡眠中,去甲肾上腺素水平极低,
|
|
942
|
+
这是唯一能在无应激状态下重演创伤的窗口
|
|
943
|
+
"""
|
|
944
|
+
# 记忆情绪衰减
|
|
945
|
+
for tr in self.memory_traces:
|
|
946
|
+
vec = tr["vector"]
|
|
947
|
+
# 情绪电荷衰减,但事实结构保留
|
|
948
|
+
for k in list(vec.keys()):
|
|
949
|
+
if abs(vec[k]) > 0.05:
|
|
950
|
+
vec[k] *= (1.0 - self.DREAM_EMOTION_DECAY)
|
|
951
|
+
|
|
952
|
+
# 恐惧消退:找到威胁类记忆,在安全环境中减弱
|
|
953
|
+
for tr in self.memory_traces:
|
|
954
|
+
if tr["vector"].get("threat", 0.0) > 0.1:
|
|
955
|
+
# 低自尊者在梦中更难消退恐惧(反复噩梦)
|
|
956
|
+
extinction = (self.DREAM_FEAR_EXTINCTION
|
|
957
|
+
* (0.4 + self.self_esteem * 1.2))
|
|
958
|
+
tr["vector"]["threat"] *= (1.0 - extinction)
|
|
959
|
+
tr["strength"] *= (1.0 - extinction * 0.5)
|
|
960
|
+
|
|
961
|
+
# 创伤额外愈合
|
|
962
|
+
self._heal_traumas(90.0 * 60.0 * self.DREAM_TRAUMA_HEAL_BOOST * 0.1)
|
|
963
|
+
|
|
964
|
+
# ==================================================================
|
|
965
|
+
# 16. V8.0 预期系统
|
|
966
|
+
# ==================================================================
|
|
967
|
+
def _compute_surprise(self, event_id: str, vector: Dict[str, float],
|
|
968
|
+
intensity: float) -> float:
|
|
969
|
+
"""
|
|
970
|
+
计算预期与实际之间的 surprise 信号。
|
|
971
|
+
|
|
972
|
+
返回值:surprise ∈ [-1, 1]
|
|
973
|
+
> 0: 正向惊喜(比预期好)
|
|
974
|
+
< 0: 负向惊喜/失望(比预期差)
|
|
975
|
+
"""
|
|
976
|
+
exp = self.expected_events.pop(event_id)
|
|
977
|
+
expected_valence = exp["valence"]
|
|
978
|
+
confidence = exp["confidence"]
|
|
979
|
+
|
|
980
|
+
# 从 vector 推断实际效价
|
|
981
|
+
actual_valence = (vector.get("belonging", 0.0)
|
|
982
|
+
- vector.get("threat", 0.0)
|
|
983
|
+
+ vector.get("autonomy", 0.0))
|
|
984
|
+
|
|
985
|
+
# 标准化到 [-1, 1]
|
|
986
|
+
actual_valence = max(-1.0, min(1.0, actual_valence))
|
|
987
|
+
|
|
988
|
+
# surprise = (实际 - 预期) × 确信度
|
|
989
|
+
# 越确信 → 落差越剧烈
|
|
990
|
+
surprise = (actual_valence - expected_valence) * confidence
|
|
991
|
+
|
|
992
|
+
# 预期时间跨度(预期越久远,落空越不意外)
|
|
993
|
+
age = self._now() - exp.get("time", self._now())
|
|
994
|
+
age_discount = math.exp(-0.00001 * age) # ~1天半衰期
|
|
995
|
+
surprise *= age_discount
|
|
996
|
+
|
|
997
|
+
return max(-1.0, min(1.0, surprise))
|
|
998
|
+
|
|
999
|
+
def _apply_surprise(self, perceived: Dict[str, float],
|
|
1000
|
+
surprise: float) -> Dict[str, float]:
|
|
1001
|
+
"""将 surprise 注入 perceived vector。"""
|
|
1002
|
+
out = dict(perceived)
|
|
1003
|
+
if surprise > 0.1:
|
|
1004
|
+
# 正向惊喜 → 喜悦加成、威胁减弱
|
|
1005
|
+
out["belonging"] = out.get("belonging", 0.0) + surprise * self.SURPRISE_POSITIVE_BOOST
|
|
1006
|
+
out["threat"] = out.get("threat", 0.0) - surprise * self.SURPRISE_POSITIVE_BOOST * 0.5
|
|
1007
|
+
elif surprise < -0.1:
|
|
1008
|
+
# 负向失望 → 威胁放大、归属感额外受损
|
|
1009
|
+
mag = abs(surprise)
|
|
1010
|
+
out["threat"] = out.get("threat", 0.0) + mag * self.SURPRISE_NEGATIVE_BOOST
|
|
1011
|
+
out["belonging"] = out.get("belonging", 0.0) - mag * self.SURPRISE_NEGATIVE_BOOST * 0.7
|
|
1012
|
+
return out
|
|
1013
|
+
|
|
1014
|
+
def _decay_expectations(self, dt: float):
|
|
1015
|
+
"""预期自然衰减——太久没兑现的预期会淡化。"""
|
|
1016
|
+
now = self._now()
|
|
1017
|
+
expired = []
|
|
1018
|
+
for eid, exp in self.expected_events.items():
|
|
1019
|
+
age = now - exp.get("time", now)
|
|
1020
|
+
# 超过 7 天的预期几乎消失,或信心随时间降低
|
|
1021
|
+
decay = self.EXPECTATION_DECAY * dt
|
|
1022
|
+
exp["confidence"] = max(0.0, exp["confidence"] - decay)
|
|
1023
|
+
if exp["confidence"] < 0.05:
|
|
1024
|
+
expired.append(eid)
|
|
1025
|
+
for eid in expired:
|
|
1026
|
+
del self.expected_events[eid]
|
|
1027
|
+
|
|
1028
|
+
# ==================================================================
|
|
1029
|
+
# 17. V8.0 自尊动态
|
|
1030
|
+
# ==================================================================
|
|
1031
|
+
def _update_self_esteem(self, v: Dict[str, float]):
|
|
1032
|
+
"""
|
|
1033
|
+
自尊根据社会反馈缓慢更新。
|
|
1034
|
+
|
|
1035
|
+
归因逻辑(内隐的,不是显式的):
|
|
1036
|
+
- 正向归属 → 自尊上升("他们认可我,说明我有价值")
|
|
1037
|
+
- 负向归属 → 自尊下降("我被拒绝,说明我不够好")
|
|
1038
|
+
- 低自尊放大负向、缩小正向(经典的归因偏差)
|
|
1039
|
+
- 高自尊放大正向、缩小负向
|
|
1040
|
+
|
|
1041
|
+
自尊的惯性极大——不会因为一句话就崩塌或膨胀。
|
|
1042
|
+
"""
|
|
1043
|
+
b = v.get("belonging", 0.0)
|
|
1044
|
+
t = v.get("threat", 0.0)
|
|
1045
|
+
a = v.get("autonomy", 0.0)
|
|
1046
|
+
|
|
1047
|
+
# 计算此次事件的自尊冲击
|
|
1048
|
+
impact = 0.0
|
|
1049
|
+
if b > 0:
|
|
1050
|
+
# 成功/认可 → 自尊上升(但低自尊者不敢信)
|
|
1051
|
+
impact += b * self.SELF_ESTEEM_UPDATE_RATE * (0.3 + self.self_esteem * 1.4)
|
|
1052
|
+
if b < 0:
|
|
1053
|
+
# 拒绝/失败 → 自尊下降(低自尊者伤更深)
|
|
1054
|
+
impact -= abs(b) * self.SELF_ESTEEM_UPDATE_RATE * (1.5 - self.self_esteem)
|
|
1055
|
+
if a > 0:
|
|
1056
|
+
# 自主/掌控感 → 自尊上升
|
|
1057
|
+
impact += a * self.SELF_ESTEEM_UPDATE_RATE * 0.5
|
|
1058
|
+
if t > 0 and b < 0:
|
|
1059
|
+
# 威胁 + 被拒绝 → 自尊双倍打击("危险的,还是我的错")
|
|
1060
|
+
impact -= t * abs(b) * self.SELF_ESTEEM_UPDATE_RATE * 0.8
|
|
1061
|
+
|
|
1062
|
+
# 缓慢更新
|
|
1063
|
+
self.self_esteem += impact * self.SELF_ESTEEM_INERTIA
|
|
1064
|
+
self.self_esteem = max(0.05, min(0.95, self.self_esteem))
|
|
1065
|
+
|
|
1066
|
+
# ==================================================================
|
|
1067
|
+
# 18. V8.0 认知失调动力学
|
|
1068
|
+
# ==================================================================
|
|
1069
|
+
def _dissonance_dynamics(self, v: Dict[str, float]):
|
|
1070
|
+
"""
|
|
1071
|
+
认知失调的自动消解尝试。
|
|
1072
|
+
|
|
1073
|
+
当存在显著失调且当前没有更强刺激时:
|
|
1074
|
+
- 合理化(rationalization_load 上升)→ "其实也没那么糟"
|
|
1075
|
+
- 信念微调(自尊微调)→ "也许我的标准太严了"
|
|
1076
|
+
- 失调本身随时间衰减(遗忘/接受)
|
|
1077
|
+
"""
|
|
1078
|
+
if self.cognitive_dissonance > self.DISSONANCE_THRESHOLD:
|
|
1079
|
+
# 高失调触发主动合理化
|
|
1080
|
+
rationalize_amount = self.cognitive_dissonance * 0.15
|
|
1081
|
+
self.rationalization_load = min(1.0, self.rationalization_load + rationalize_amount)
|
|
1082
|
+
self.cognitive_dissonance *= 0.85
|
|
1083
|
+
# 合理化消耗能量
|
|
1084
|
+
self.energy = max(self.ENERGY_MIN, self.energy - rationalize_amount * 2.0)
|
|
1085
|
+
# 合理化让人暂时舒服(张力下降)
|
|
1086
|
+
self.fluid["张力"] = max(0.0, self.fluid["张力"] - rationalize_amount * 0.2)
|
|
1087
|
+
|
|
1088
|
+
# ==================================================================
|
|
1089
|
+
# 19. V8.0 防御机制层级
|
|
1090
|
+
# ==================================================================
|
|
1091
|
+
def _defense_hierarchy(self, v: Dict[str, float]):
|
|
1092
|
+
"""
|
|
1093
|
+
防御机制的层级递进:
|
|
1094
|
+
|
|
1095
|
+
层级 1: 否认(Denial)
|
|
1096
|
+
"这不可能"——直接拒绝接受威胁性信息。
|
|
1097
|
+
最原始的防御,消耗最小,但不可持续。
|
|
1098
|
+
否认过载 → 现实侵入(denial burst)。
|
|
1099
|
+
|
|
1100
|
+
层级 2: 合理化(Rationalization)
|
|
1101
|
+
"其实也没那么糟"——给事件找一个能接受的理由。
|
|
1102
|
+
比否认成熟,但仍扭曲现实。
|
|
1103
|
+
|
|
1104
|
+
层级 3: 压抑(Suppression)
|
|
1105
|
+
"我忍了"——承认但压下去。
|
|
1106
|
+
最成熟的防御,但负荷最大。
|
|
1107
|
+
|
|
1108
|
+
正常流程:威胁 → 少量否认 + 合理化 → 剩余进入压抑
|
|
1109
|
+
高自尊者能更快跳过否认阶段。
|
|
1110
|
+
"""
|
|
1111
|
+
threat = v.get("threat", 0.0)
|
|
1112
|
+
neg_belonging = max(0.0, -v.get("belonging", 0.0))
|
|
1113
|
+
total_neg = threat + neg_belonging
|
|
1114
|
+
|
|
1115
|
+
if total_neg < 0.1:
|
|
1116
|
+
self._suppression_dynamics(v)
|
|
1117
|
+
return
|
|
1118
|
+
|
|
1119
|
+
# 低自尊 → 更倾向否认(不敢面对)
|
|
1120
|
+
denial_tendency = 0.3 * (1.0 - self.self_esteem)
|
|
1121
|
+
|
|
1122
|
+
# 层级 1: 否认
|
|
1123
|
+
denied = total_neg * denial_tendency
|
|
1124
|
+
if denied > 0.02:
|
|
1125
|
+
self.denial_load += denied
|
|
1126
|
+
# 否认成功 → 威胁感知暂时降低
|
|
1127
|
+
remaining_denial = 1.0 - denial_tendency
|
|
1128
|
+
v_modified = {
|
|
1129
|
+
k: (vv * remaining_denial if k in ("threat",) else vv)
|
|
1130
|
+
for k, vv in v.items()
|
|
1131
|
+
}
|
|
1132
|
+
if "belonging" in v_modified and v_modified["belonging"] < 0:
|
|
1133
|
+
v_modified["belonging"] *= remaining_denial
|
|
1134
|
+
else:
|
|
1135
|
+
v_modified = dict(v)
|
|
1136
|
+
|
|
1137
|
+
# 否认过载 → 现实侵入
|
|
1138
|
+
if self.denial_load >= self.DENIAL_THRESHOLD and self.denial_burst_cd <= 0:
|
|
1139
|
+
self._trigger_denial_burst()
|
|
1140
|
+
|
|
1141
|
+
# 层级 2: 合理化
|
|
1142
|
+
rationalize_tendency = 0.2
|
|
1143
|
+
remaining_neg = (v_modified.get("threat", 0.0)
|
|
1144
|
+
+ max(0.0, -v_modified.get("belonging", 0.0)))
|
|
1145
|
+
rationalized = remaining_neg * rationalize_tendency
|
|
1146
|
+
if rationalized > 0.02:
|
|
1147
|
+
self.rationalization_load = min(1.0, self.rationalization_load + rationalized)
|
|
1148
|
+
# 合理化让表面情绪更可控
|
|
1149
|
+
for k in v_modified:
|
|
1150
|
+
if k in ("threat",):
|
|
1151
|
+
v_modified[k] *= (1.0 - rationalize_tendency)
|
|
1152
|
+
elif k == "belonging" and v_modified[k] < 0:
|
|
1153
|
+
v_modified[k] *= (1.0 - rationalize_tendency * 0.5)
|
|
1154
|
+
|
|
1155
|
+
# 层级 3: 压抑(原有系统处理剩余情绪)
|
|
1156
|
+
self._suppression_dynamics(v_modified)
|
|
1157
|
+
|
|
1158
|
+
def _trigger_denial_burst(self):
|
|
1159
|
+
"""否认过载 → 现实侵入。被否认的东西一次性涌回来。"""
|
|
1160
|
+
self.denial_burst_cd = self.DENIAL_BURST_COOLDOWN
|
|
1161
|
+
load = self.denial_load
|
|
1162
|
+
self.denial_load = 0.0
|
|
1163
|
+
# 现实感突然袭来
|
|
1164
|
+
self.fluid["恐惧"] = min(1.0, self.fluid["恐惧"] + load * 0.7)
|
|
1165
|
+
self.fluid["张力"] = min(1.0, self.fluid["张力"] + load * 0.5)
|
|
1166
|
+
self.fluid["疏离"] = min(1.0, self.fluid["疏离"] + load * 0.4)
|
|
1167
|
+
self.fluid["信任"] = max(0.0, self.fluid["信任"] - load * 0.3)
|
|
1168
|
+
self.energy = max(self.ENERGY_MIN, self.energy - load * 6)
|
|
1169
|
+
self.time_compress_base = min(1.0, self.time_compress_base + 0.5)
|
|
1170
|
+
|
|
1171
|
+
# ==================================================================
|
|
1172
|
+
# 兼容旧名
|
|
1173
|
+
# ==================================================================
|
|
1174
|
+
def _apply_forgetting_curve(self):
|
|
1175
|
+
self._forget_over(1.0)
|
|
1176
|
+
|
|
1177
|
+
def _update_time(self):
|
|
1178
|
+
self._advance_time()
|
|
1179
|
+
|
|
1180
|
+
def _update_dynamic_viscosity_old(self):
|
|
1181
|
+
self._update_dynamic_viscosity()
|