swarm-chat / src /core /micro_columns /association_cache.py
lk080424
虫巢-200M训练部署: npz+json替代pkl, 三区循环训练, 4454QA数据
358ab64
Raw
History Blame Contribute Delete
8.84 kB
"""
AssociationCache: 联合区缓存模块
功能:临时存储 + 信息路由 + 多源融合
"""
import numpy as np
from typing import Dict, List, Tuple, Optional
class AssociationCache:
"""
联合区缓存 - 信息传输枢纽
功能:
1. 临时存储多区输入(感觉区、记忆区、丘脑反馈)
2. 信息路由:根据目标区域选择输出
3. 多源融合:加权合并多路输入
"""
def __init__(
self,
capacity: int = 10, # 缓存容量(多少个时间步)
decay_rate: float = 0.9, # 自然衰减率
fusion_weights: Dict[str, float] = None # 多源融合权重
):
self.capacity = capacity
self.decay_rate = decay_rate
# 默认融合权重
self.fusion_weights = fusion_weights or {
'sensory': 0.4, # 感觉输入权重最高(实时性)
'memory': 0.3, # 记忆输入
'thalamus': 0.2, # 丘脑反馈
'prefrontal': 0.1 # 前额区残差
}
# 缓存存储:key=区域名, value=(时间步, 数据)
self._cache: Dict[str, Tuple[int, np.ndarray]] = {}
self._cache_order: List[str] = [] # 记录写入顺序(LRU)
self._time_step = 0
# 路由表:key=目标区域, value=源区域列表
self._routing_table: Dict[str, List[str]] = {
'prefrontal': ['sensory', 'memory', 'thalamus'],
'motor': ['prefrontal'],
'thalamus': ['prefrontal', 'motor'],
'memory': ['sensory', 'prefrontal']
}
# 统计
self._stats = {
'cache_hits': 0,
'cache_misses': 0,
'routing_count': 0,
'fusion_count': 0
}
def store(self, source: str, data: np.ndarray) -> None:
"""
存储数据到缓存
Args:
source: 来源区域 ('sensory', 'memory', 'thalamus', 'prefrontal')
data: 要存储的数据
"""
self._time_step += 1
# LRU淘汰:如果超过容量,删除最旧的
if len(self._cache) >= self.capacity and source not in self._cache:
oldest = self._cache_order[0] if self._cache_order else None
if oldest:
del self._cache[oldest]
self._cache_order.remove(oldest)
# 存储新数据
self._cache[source] = (self._time_step, data.copy())
# 更新LRU顺序
if source in self._cache_order:
self._cache_order.remove(source)
self._cache_order.append(source)
def retrieve(self, source: str) -> Optional[np.ndarray]:
"""
从缓存检索数据
Args:
source: 来源区域
Returns:
缓存的数据,如果不存在返回None
"""
if source in self._cache:
self._stats['cache_hits'] += 1
return self._cache[source][1].copy()
else:
self._stats['cache_misses'] += 1
return None
def route(self, target: str) -> Optional[np.ndarray]:
"""
路由:根据目标区域从缓存中选取数据
Args:
target: 目标区域
Returns:
路由的数据(如果有多源则融合)
"""
self._stats['routing_count'] += 1
# 查找目标区域的源区域
source_regions = self._routing_table.get(target, [])
# 收集可用的源数据
available_sources = []
for src in source_regions:
data = self.retrieve(src)
if data is not None:
available_sources.append((src, data))
if not available_sources:
return None
# 如果只有一个源,直接返回
if len(available_sources) == 1:
return available_sources[0][1]
# 多源融合
return self._fuse_sources(available_sources)
def _fuse_sources(self, sources: List[Tuple[str, np.ndarray]]) -> np.ndarray:
"""
多源融合
Args:
sources: [(源区域, 数据), ...]
Returns:
融合后的数据
"""
self._stats['fusion_count'] += 1
fused = np.zeros_like(sources[0][1])
total_weight = 0.0
for src, data in sources:
weight = self.fusion_weights.get(src, 0.25)
fused += weight * data
total_weight += weight
# 归一化
if total_weight > 0:
fused = fused / total_weight
return fused
def decay_all(self) -> None:
"""对所有缓存应用衰减"""
for key in list(self._cache.keys()):
time_step, data = self._cache[key]
age = self._time_step - time_step
decay = self.decay_rate ** age
self._cache[key] = (time_step, data * decay)
def clear(self) -> None:
"""清空缓存"""
self._cache.clear()
self._cache_order.clear()
def get_stats(self) -> Dict:
"""获取统计信息"""
total = self._stats['cache_hits'] + self._stats['cache_misses']
hit_rate = self._stats['cache_hits'] / total if total > 0 else 0.0
return {
'cache_size': len(self._cache),
'cache_capacity': self.capacity,
'cache_hits': self._stats['cache_hits'],
'cache_misses': self._stats['cache_misses'],
'hit_rate': hit_rate,
'routing_count': self._stats['routing_count'],
'fusion_count': self._stats['fusion_count']
}
class MultiRegionRouter:
"""
多区域路由器 - 控制信息流向
功能:
1. 决定信息从哪个区域流向哪个区域
2. 条件路由:根据当前状态选择不同路径
3. 广播:一对多信息分发
"""
def __init__(self):
# 路由策略:key=源区域, value={目标区域: 条件函数}
self._routes: Dict[str, Dict[str, callable]] = {}
# 当前激活路径
self._active_routes: List[Tuple[str, str]] = []
# 路由历史
self._route_history: List[Dict] = []
def add_route(
self,
source: str,
target: str,
condition: callable = None
) -> None:
"""
添加路由规则
Args:
source: 源区域
target: 目标区域
condition: 条件函数(可选),接收当前状态返回bool
"""
if source not in self._routes:
self._routes[source] = {}
self._routes[source][target] = condition
def route(
self,
source: str,
data: np.ndarray,
state: Dict = None
) -> List[Tuple[str, np.ndarray]]:
"""
执行路由
Args:
source: 源区域
data: 要路由的数据
state: 当前状态(用于条件判断)
Returns:
[(目标区域, 数据), ...]
"""
if source not in self._routes:
return [(source, data)] # 直通
state = state or {}
results = []
for target, condition in self._routes[source].items():
# 检查条件
if condition is None or condition(state):
results.append((target, data.copy()))
self._active_routes.append((source, target))
# 记录路由历史
self._route_history.append({
'source': source,
'targets': [t for t, _ in results],
'state_snapshot': state.copy() if state else {}
})
# 保持历史在100条以内
if len(self._route_history) > 100:
self._route_history = self._route_history[-100:]
return results if results else [(source, data)]
def broadcast(
self,
data: np.ndarray,
targets: List[str]
) -> List[Tuple[str, np.ndarray]]:
"""
广播到多个目标
Args:
data: 要广播的数据
targets: 目标区域列表
Returns:
[(目标区域, 数据), ...]
"""
return [(t, data.copy()) for t in targets]
def get_active_routes(self) -> List[Tuple[str, str]]:
"""获取当前激活的路由"""
return self._active_routes.copy()
def clear_routes(self) -> None:
"""清空激活路由"""
self._active_routes.clear()