Spaces:
Sleeping
Sleeping
| """ | |
| 功能柱 - 多种微柱混合组成的功能单元 | |
| 每种功能柱按仿生比例混合不同类型微柱 | |
| """ | |
| import numpy as np | |
| from typing import List, Dict, Optional | |
| import sys | |
| import os | |
| # 确保能正确导入同目录下的micro_columns包 | |
| sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) | |
| from micro_columns import get_micro_column, MICRO_COLUMN_TYPES | |
| # ============ 功能柱微柱组成配方(参考docs/functional_columns/) ============ | |
| COLUMN_RECIPES = { | |
| # ============ 六大功能区定义 ============ | |
| # 数据流: SENSORY → ASSOCIATION → (PREFRONTAL/ MEMORY/MOTOR) → MOTOR → 输出 | |
| # 监控流: THALAMUS 监控所有区域,检测异常并中断 | |
| # 控制流: PREFRONTAL 作为总控,协调所有区域 | |
| 'sensory': { | |
| 'name': '感知区', | |
| 'role': '输入信号预处理 - 接收原始输入,特征提取、归一化、降噪', | |
| 'composition': { | |
| 'sensory': 0.60, # 60% SensoryMicroColumn (特征提取) | |
| 'detector': 0.20, # 20% DetectorMicroColumn (模式检测) | |
| 'modulator': 0.20, # 20% ModulatorMicroColumn (增益调节) | |
| }, | |
| 'default_count': 10, | |
| 'count_range': (5, 20), | |
| 'connection_mode': 'hybrid', | |
| 'synaptic_tier': 'L1', | |
| 'inputs': ['raw_input'], # 外部输入 | |
| 'outputs': ['association'], # 输出到联通区 | |
| }, | |
| 'association': { | |
| 'name': '联通区', | |
| 'role': '通讯中转 - 四大区的信息汇聚与分发,区域间路由', | |
| 'composition': { | |
| 'integrator': 0.50, # 50% IntegratorMicroColumn (信息融合) | |
| 'selector': 0.30, # 30% SelectorMicroColumn (路由选择) | |
| 'detector': 0.20, # 20% DetectorMicroColumn (一致性校验) | |
| }, | |
| 'default_count': 6, | |
| 'count_range': (3, 10), | |
| 'connection_mode': 'hybrid', | |
| 'synaptic_tier': 'L1', | |
| 'inputs': ['sensory', 'memory', 'prefrontal', 'motor'], # 汇聚四大区 | |
| 'outputs': ['sensory', 'memory', 'prefrontal', 'motor'], # 分发到四大区 | |
| }, | |
| 'memory': { | |
| 'name': '记忆区', | |
| 'role': '记忆数据库 - 短期/长期记忆存储,检索,遗忘机制', | |
| 'composition': { | |
| 'memory': 0.50, # 50% MemoryMicroColumn (记忆存储) | |
| 'integrator': 0.30, # 30% IntegratorMicroColumn (关联整合) | |
| 'selector': 0.20, # 20% SelectorMicroColumn (检索选择) | |
| }, | |
| 'default_count': 8, | |
| 'count_range': (3, 50), # 支持大模型扩展 | |
| 'connection_mode': 'hybrid', | |
| 'synaptic_tier': 'L1', | |
| 'inputs': ['association'], | |
| 'outputs': ['association', 'prefrontal'], | |
| }, | |
| 'prefrontal': { | |
| 'name': '额叶区', | |
| 'role': '分析推理总控 - 协调所有区域,推理决策,微柱/功能柱裂变', | |
| 'composition': { | |
| 'manager': 0.10, # 10% ManagerMicroColumn (调度+监控+拆分) | |
| 'memory': 0.20, # 20% MemoryMicroColumn (工作记忆) | |
| 'integrator': 0.25, # 25% IntegratorMicroColumn (推理融合) - 增强 | |
| 'detector': 0.15, # 15% DetectorMicroColumn (一致性检测) | |
| 'motor': 0.15, # 15% MotorMicroColumn (决策输出) | |
| 'modulator': 0.10, # 10% ModulatorMicroColumn (增益调节) | |
| 'selector': 0.05, # 5% SelectorMicroColumn (模式选择) - 新增 | |
| }, | |
| 'default_count': 20, | |
| 'count_range': (10, 200), # 支持大模型扩展 | |
| 'connection_mode': 'recurrent', # 改为循环模式,支持深度推理 | |
| 'synaptic_tier': 'L3', # L3全突触,最强学习潜力(推理总控) | |
| 'inputs': ['association', 'memory', 'thalamus', 'sensory'], # 增加感官输入 | |
| 'outputs': ['association', 'motor', 'thalamus'], | |
| }, | |
| 'motor': { | |
| 'name': '运动区', | |
| 'role': '结果输出与工具调用 - 决策执行,外部工具调用,响应输出', | |
| 'composition': { | |
| 'motor': 0.50, # 50% MotorMicroColumn (动作执行) | |
| 'selector': 0.30, # 30% SelectorMicroColumn (动作选择) | |
| 'modulator': 0.20, # 20% ModulatorMicroColumn (力度调节) | |
| }, | |
| 'default_count': 3, | |
| 'count_range': (1, 30), # 支持大模型扩展 | |
| 'connection_mode': 'cascade', | |
| 'synaptic_tier': 'L1', | |
| 'inputs': ['association', 'prefrontal'], | |
| 'outputs': ['external', 'association'], # 外部输出 + 反馈 | |
| }, | |
| 'thalamus': { | |
| 'name': '丘脑区', | |
| 'role': '监控与异常中断 - 监控所有区域状态,检测异常,触发中断', | |
| 'composition': { | |
| 'selector': 0.50, # 50% SelectorMicroColumn (注意力监控) | |
| 'integrator': 0.30, # 30% IntegratorMicroColumn (状态评估) | |
| 'modulator': 0.20, # 20% ModulatorMicroColumn (门控中断) | |
| }, | |
| 'default_count': 2, | |
| 'count_range': (1, 3), | |
| 'connection_mode': 'parallel', | |
| 'synaptic_tier': 'L1', | |
| 'inputs': ['sensory', 'association', 'memory', 'prefrontal', 'motor'], # 监听所有区 | |
| 'outputs': ['prefrontal', 'motor'], # 异常反馈到额叶/运动区 | |
| }, | |
| } | |
| class FunctionalColumn: | |
| """功能柱:多种微柱按仿生比例混合组成""" | |
| def __init__( | |
| self, | |
| column_type: str = 'sensory', | |
| num_micro_columns: int = None, | |
| col_index: int = 0, | |
| neurons_per_micro: int = 100, | |
| synaptic_tier: str = None, | |
| ): | |
| self.column_type = column_type | |
| recipe = COLUMN_RECIPES.get(column_type, COLUMN_RECIPES['sensory']) | |
| self.recipe = recipe | |
| self.neurons_per_micro = neurons_per_micro | |
| self._override_tier = synaptic_tier | |
| # 微柱数量:默认使用配方中的数量 | |
| if num_micro_columns is None: | |
| num_micro_columns = recipe['default_count'] | |
| lo, hi = recipe['count_range'] | |
| self.num_micro_columns = max(lo, min(hi, num_micro_columns)) | |
| self.connection_mode = recipe['connection_mode'] | |
| # 按配方比例创建混合微柱 | |
| self.micro_columns: List = [] | |
| self.micro_column_types: List[str] = [] | |
| self._create_mixed_micro_columns(recipe['composition'], self.num_micro_columns, | |
| col_index=col_index) | |
| # ============ Manager微柱集成 ============ | |
| self.manager = None | |
| self._setup_manager_scheduling() | |
| def _setup_manager_scheduling(self): | |
| """设置Manager微柱调度系统""" | |
| # 找出Manager微柱 | |
| for mc, mc_type in zip(self.micro_columns, self.micro_column_types): | |
| if mc_type == 'manager': | |
| self.manager = mc | |
| break | |
| if self.manager is None: | |
| return | |
| # 给Manager注册所有其他微柱(按类型标签) | |
| type_to_tags = { | |
| 'memory': ['memory', 'working', 'semantic'], | |
| 'integrator': ['reasoning', 'fusion', 'semantic'], | |
| 'detector': ['detection', 'pattern', 'semantic'], | |
| 'motor': ['action', 'output', 'spatial'], | |
| 'modulator': ['modulation', 'gain', 'temporal'], | |
| 'sensory': ['perception', 'input', 'spatial'], | |
| } | |
| for i, mc in enumerate(self.micro_columns): | |
| mc_type = self.micro_column_types[i] | |
| if mc_type == 'manager': | |
| continue | |
| tags = type_to_tags.get(mc_type, [mc_type]) | |
| unit_id = f"mc_{i}_{mc_type}" | |
| capacity = getattr(mc, 'num_neurons', 64) | |
| self.manager.register(unit_id, tags, capacity=capacity) | |
| print(f" [Manager] 已注册 {len(self.manager._registry)} 个微柱") | |
| def _create_mixed_micro_columns(self, composition: Dict[str, float], total: int, | |
| col_index: int = 0): | |
| """按比例分配微柱类型""" | |
| # 计算每种类型的数量 | |
| type_counts = {} | |
| remaining = total | |
| types_sorted = sorted(composition.keys(), key=lambda k: -composition[k]) | |
| for i, mc_type in enumerate(types_sorted): | |
| if i == len(types_sorted) - 1: | |
| # 最后一个类型取剩余 | |
| count = remaining | |
| else: | |
| count = max(1, round(total * composition[mc_type])) | |
| remaining -= count | |
| type_counts[mc_type] = count | |
| # 获取突触档位(优先使用外部覆盖) | |
| synaptic_tier = self._override_tier or self.recipe.get('synaptic_tier', 'L1') | |
| # 按顺序创建微柱(主类型在前)— 支持感受野 | |
| mc_idx = 0 | |
| for mc_type in types_sorted: | |
| for _ in range(type_counts[mc_type]): | |
| # 感觉柱的sensory类型mc可选感受野(默认关闭) | |
| rf_kwargs = {} | |
| # 实验结论: RF=10对composite无显著改善(p=0.91) | |
| # 保留参数供未来更大数据集实验 | |
| if False and self.column_type == 'sensory' and mc_type == 'sensory': | |
| input_dim = 75 | |
| rf_size = 10 | |
| rf_offset = (col_index * 31 + mc_idx * 17) % input_dim | |
| rf_kwargs = { | |
| 'receptive_field_size': rf_size, | |
| 'receptive_field_offset': rf_offset, | |
| } | |
| mc = get_micro_column(mc_type, num_neurons=self.neurons_per_micro, | |
| synaptic_tier=synaptic_tier, **rf_kwargs) | |
| self.micro_columns.append(mc) | |
| self.micro_column_types.append(mc_type) | |
| mc_idx += 1 | |
| def add_micro_column(self, mc_type: str, count: int = 1, | |
| approver: str = None, reason: str = None): | |
| """按需增加内部微柱(需审批) | |
| Args: | |
| mc_type: 微柱类型 | |
| count: 增加数量 | |
| approver: 审批人标识(必须提供) | |
| reason: 扩容原因(必须提供) | |
| Raises: | |
| ValueError: 未审批/类型无效/超出上限 | |
| """ | |
| # 1. 审批检查 | |
| if not approver or not reason: | |
| raise ValueError( | |
| f"扩容需审批!请提供 approver 和 reason。" | |
| f"当前{self.recipe['name']}有{self.num_micro_columns}微柱," | |
| f"上限{self.recipe['count_range'][1]}" | |
| ) | |
| # 2. 类型检查 | |
| if mc_type not in MICRO_COLUMN_TYPES: | |
| raise ValueError(f"未知微柱类型: {mc_type}, 可选: {list(MICRO_COLUMN_TYPES.keys())}") | |
| # 3. 上限检查 | |
| max_count = self.recipe['count_range'][1] | |
| new_total = self.num_micro_columns + count | |
| if new_total > max_count: | |
| raise ValueError( | |
| f"{self.recipe['name']}微柱上限{max_count}," | |
| f"当前{self.num_micro_columns}+{count}={new_total},超出上限!" | |
| ) | |
| # 4. 执行扩容 | |
| for _ in range(count): | |
| mc = get_micro_column(mc_type, num_neurons=100) | |
| self.micro_columns.append(mc) | |
| self.micro_column_types.append(mc_type) | |
| self.num_micro_columns = len(self.micro_columns) | |
| # 5. 记录审批日志 | |
| if not hasattr(self, '_expansion_log'): | |
| self._expansion_log = [] | |
| self._expansion_log.append({ | |
| 'approver': approver, | |
| 'reason': reason, | |
| 'type': mc_type, | |
| 'count': count, | |
| 'total_after': self.num_micro_columns, | |
| }) | |
| def forward(self, inputs: np.ndarray) -> np.ndarray: | |
| """前向传播 - 支持Manager调度""" | |
| if self.manager is not None: | |
| # Manager调度:决定激活哪些微柱 | |
| active_unit_ids = self.manager.dispatch(inputs) | |
| if active_unit_ids: | |
| # 构建活跃微柱索引映射 | |
| unit_id_to_idx = {f"mc_{i}_{t}": i for i, t in enumerate(self.micro_column_types)} | |
| active_indices = [unit_id_to_idx[uid] for uid in active_unit_ids if uid in unit_id_to_idx] | |
| else: | |
| active_indices = list(range(len(self.micro_columns))) | |
| else: | |
| active_indices = list(range(len(self.micro_columns))) | |
| if self.connection_mode == 'parallel': | |
| return self._forward_parallel(inputs, active_indices) | |
| elif self.connection_mode == 'sequential': | |
| return self._forward_sequential(inputs, active_indices) | |
| elif self.connection_mode == 'hybrid': | |
| return self._forward_hybrid(inputs, active_indices) | |
| elif self.connection_mode == 'cascade': | |
| return self._forward_cascade(inputs, active_indices) | |
| else: | |
| return self._forward_parallel(inputs, active_indices) | |
| def _forward_parallel(self, inputs: np.ndarray, active_indices: list = None) -> np.ndarray: | |
| """并行模式:所有微柱独立处理,输出拼接""" | |
| if active_indices is None: | |
| active_indices = list(range(len(self.micro_columns))) | |
| outputs = [] | |
| for idx in active_indices: | |
| mc = self.micro_columns[idx] | |
| mc_type = self.micro_column_types[idx] | |
| out = self._call_micro_column(mc, mc_type, inputs) | |
| outputs.append(out) | |
| return np.concatenate(outputs) if outputs else inputs | |
| def _forward_sequential(self, inputs: np.ndarray, active_indices: list = None) -> np.ndarray: | |
| """顺序级联:上一个微柱输出作为下一个输入""" | |
| if active_indices is None: | |
| active_indices = list(range(len(self.micro_columns))) | |
| current = inputs | |
| for idx in active_indices: | |
| mc = self.micro_columns[idx] | |
| if hasattr(mc, 'num_neurons'): | |
| if current.shape[0] != mc.num_neurons: | |
| current = self._project_dim(current, mc.num_neurons) | |
| current = mc.forward(current) | |
| return current | |
| def _forward_hybrid(self, inputs: np.ndarray, active_indices: list = None) -> np.ndarray: | |
| """ | |
| 混合模式:按微柱类型分组 | |
| - 主类型组:并行处理同一输入 | |
| - 辅助类型组:级联细化 | |
| 注意:Integrator需要双输入(sensory, memory), | |
| Memory返回元组(result, confidence), | |
| 这里做统一适配 | |
| """ | |
| if active_indices is None: | |
| active_indices = list(range(len(self.micro_columns))) | |
| composition = self.recipe['composition'] | |
| types_sorted = sorted(composition.keys(), key=lambda k: -composition[k]) | |
| primary_type = types_sorted[0] | |
| # 分组 | |
| primary_outputs = [] | |
| secondary_outputs = [] | |
| for idx in active_indices: | |
| mc = self.micro_columns[idx] | |
| mc_type = self.micro_column_types[idx] | |
| out = self._call_micro_column(mc, mc_type, inputs) | |
| primary_outputs.append(out) if mc_type == primary_type else secondary_outputs.append(out) | |
| # 主组并行拼接 | |
| if primary_outputs: | |
| result = np.concatenate(primary_outputs) | |
| else: | |
| result = inputs | |
| # 辅助组级联细化 | |
| for out in secondary_outputs: | |
| min_dim = min(result.shape[0], out.shape[0]) | |
| result = 0.7 * result[:min_dim] + 0.3 * out[:min_dim] | |
| if result.shape[0] < out.shape[0]: | |
| result = np.concatenate([result, out[min_dim:]]) | |
| return result | |
| def _call_micro_column(self, mc, mc_type: str, inputs: np.ndarray) -> np.ndarray: | |
| """统一微柱调用接口,处理不同微柱的参数差异 | |
| 微柱返回类型分三类: | |
| 1. 单输入→单输出: sensory, detector, modulator, selector | |
| 2. 单输入→元组(result, confidence): memory, motor | |
| 3. 双输入→元组(result, coherence): integrator | |
| """ | |
| x = np.asarray(inputs, dtype=np.float32).flatten() | |
| # 维度适配:VariantB/C/D内部用inputs[index]索引,需要输入长度>=num_neurons | |
| target_dim = getattr(mc, 'num_neurons', getattr(mc, 'input_dim', 100)) | |
| if len(x) < target_dim: | |
| x = np.pad(x, (0, target_dim - len(x))) | |
| elif len(x) > target_dim: | |
| x = x[:target_dim] | |
| if mc_type == 'integrator': | |
| result, _coherence = mc.forward(x, x) | |
| elif mc_type == 'memory': | |
| result, _confidence = mc.forward(x) | |
| elif mc_type == 'motor': | |
| result, _confidence = mc.forward(x) | |
| else: | |
| result = mc.forward(x) | |
| return np.asarray(result, dtype=np.float32).flatten() | |
| def _forward_cascade(self, inputs: np.ndarray, active_indices: list = None) -> np.ndarray: | |
| """级联模式:逐级处理""" | |
| if active_indices is None: | |
| active_indices = list(range(len(self.micro_columns))) | |
| current = inputs | |
| for idx in active_indices: | |
| mc = self.micro_columns[idx] | |
| mc_type = self.micro_column_types[idx] | |
| current = self._call_micro_column(mc, mc_type, current) | |
| return current | |
| def _project_dim(self, x: np.ndarray, target_dim: int) -> np.ndarray: | |
| """调整维度 — 压缩时用均值池化保留信号,扩展时用复制""" | |
| current_dim = x.shape[0] | |
| if current_dim == target_dim: | |
| return x | |
| elif current_dim < target_dim: | |
| repeats = target_dim // current_dim | |
| remainder = target_dim % current_dim | |
| result = np.tile(x, repeats) | |
| if remainder > 0: | |
| result = np.concatenate([result, x[:remainder]]) | |
| return result.astype(x.dtype) | |
| else: | |
| chunk_size = current_dim / target_dim | |
| result = np.zeros(target_dim, dtype=x.dtype) | |
| for i in range(target_dim): | |
| start = int(i * chunk_size) | |
| end = int((i + 1) * chunk_size) | |
| result[i] = np.mean(x[start:end]) | |
| return result | |
| def get_state(self) -> Dict: | |
| """获取功能柱状态,供额叶区分析 | |
| Returns: | |
| 包含区域信息的字典 | |
| """ | |
| state = { | |
| 'column_type': self.column_type, | |
| 'num_micro_columns': len(self.micro_columns), | |
| 'active': True, | |
| } | |
| # 收集各微柱的状态信息 | |
| confidences = [] | |
| memory_states = [] | |
| activity_levels = [] | |
| for mc in self.micro_columns: | |
| # 置信度(SENSORY特有) | |
| if hasattr(mc, 'get_confidence'): | |
| conf = mc.get_confidence() | |
| confidences.append(conf) | |
| # 记忆状态(MEMORY特有) | |
| if hasattr(mc, 'get_memory_state'): | |
| mem_state = mc.get_memory_state() | |
| memory_states.append(mem_state) | |
| # 活动水平(通用) | |
| if hasattr(mc, 'get_strength'): | |
| activity_levels.append(mc.get_strength()) | |
| # 汇总信息 | |
| if confidences: | |
| state['avg_confidence'] = np.mean(confidences) | |
| state['min_confidence'] = np.min(confidences) | |
| if memory_states: | |
| # 聚合记忆信息 | |
| total_lt = sum(s.get('long_term_count', 0) for s in memory_states) | |
| total_st = sum(s.get('short_term_count', 0) for s in memory_states) | |
| state['long_term_memories'] = total_lt | |
| state['short_term_memories'] = total_st | |
| if activity_levels: | |
| state['avg_activity'] = np.mean(activity_levels) | |
| state['max_activity'] = np.max(activity_levels) | |
| return state | |
| def learn(self, force: bool = False, learn_prob: float = 0.3, | |
| area_states: Dict = None, **kwargs): | |
| """调用所有微柱的赫布学习 | |
| 改进: | |
| - learn_prob: 学习概率(避免每次都学习,减少过度训练) | |
| - force: 强制学习(忽略概率) | |
| - 只在信号足够强时学习(避免噪声学习) | |
| PREFRONTAL专有: | |
| - area_states: 其他功能区的状态(来自额叶区调用) | |
| """ | |
| # 采样学习:不是每次都学习,减少过度训练 | |
| if not force and np.random.rand() > learn_prob: | |
| return | |
| # PREFRONTAL区:接收并分析其他区域状态 | |
| if self.column_type == 'prefrontal' and area_states: | |
| self._analyze_area_states(area_states) | |
| for mc in self.micro_columns: | |
| if hasattr(mc, 'learn'): | |
| # 检查微柱是否有有效的学习信号 | |
| if hasattr(mc, '_synaptic') and mc._synaptic is not None: | |
| pre = getattr(mc._synaptic, '_last_pre', None) | |
| post = getattr(mc._synaptic, '_last_post', None) | |
| if pre is not None and post is not None: | |
| # 只在信号强度足够时学习 | |
| signal_strength = np.mean(np.abs(post)) | |
| if signal_strength < 0.01: # 信号太弱,跳过 | |
| continue | |
| # PREFRONTAL微柱:传入区域状态供学习 | |
| if self.column_type == 'prefrontal' and area_states: | |
| mc.learn(area_states=area_states, **kwargs) | |
| else: | |
| mc.learn(**kwargs) | |
| def _analyze_area_states(self, area_states: Dict): | |
| """PREFRONTAL:分析其他区域状态,进行推理决策""" | |
| if not hasattr(self, '_area_analysis'): | |
| self._area_analysis = { | |
| 'history': [], # 历史分析结果 | |
| 'low_confidence_count': 0, # 低置信度计数 | |
| 'fission_candidates': [], # 待决裂变候选 | |
| } | |
| # 分析各区域状态 | |
| issues = [] | |
| for area_name, state in area_states.items(): | |
| if area_name == 'prefrontal': | |
| continue | |
| # 检查置信度 | |
| conf = state.get('avg_confidence', 1.0) | |
| if conf < 0.6: | |
| issues.append(f"{area_name}:低置信度({conf:.2f})") | |
| self._area_analysis['low_confidence_count'] += 1 | |
| # 检查记忆压力 | |
| lt = state.get('long_term_memories', 0) | |
| st = state.get('short_term_memories', 0) | |
| if lt > 1000: | |
| issues.append(f"{area_name}:长期记忆过载({lt})") | |
| # 检查活动异常 | |
| activity = state.get('avg_activity', 0) | |
| if activity < 0.05: | |
| issues.append(f"{area_name}:低活动({activity:.3f})") | |
| # 记录分析结果 | |
| if issues: | |
| self._area_analysis['history'].append({ | |
| 'issues': issues, | |
| 'timestamp': __import__('time').time() | |
| }) | |
| # 保持历史记录不过长 | |
| if len(self._area_analysis['history']) > 50: | |
| self._area_analysis['history'] = self._area_analysis['history'][-50:] | |
| def decide_fission(self, area_states: Dict = None) -> Dict: | |
| """裂变决策:决定是否需要分裂微柱/功能柱 | |
| PREFRONTAL专用:基于对各区域状态的分析,决定是否进行裂变 | |
| Args: | |
| area_states: 其他功能区的状态(可选) | |
| Returns: | |
| 裂变决策结果 { | |
| 'should_fission': bool, | |
| 'target_area': str, # 目标区域 | |
| 'fission_type': str, # 'micro_column' / 'functional_column' | |
| 'reason': str, # 决策原因 | |
| 'priority': int, # 优先级 1-5 | |
| } | |
| """ | |
| # 只有PREFRONTAL区可以做裂变决策 | |
| if self.column_type != 'prefrontal': | |
| return {'should_fission': False, 'reason': '非额叶区无权限'} | |
| decision = { | |
| 'should_fission': False, | |
| 'target_area': None, | |
| 'fission_type': None, | |
| 'reason': '状态正常', | |
| 'priority': 0, | |
| } | |
| # 分析区域状态 | |
| if area_states: | |
| # 1. 检查是否有区域需要更多微柱 | |
| for area_name, state in area_states.items(): | |
| if area_name == 'prefrontal': | |
| continue | |
| # 置信度低 → 建议增加微柱 | |
| conf = state.get('avg_confidence', 1.0) | |
| if conf < 0.4: | |
| decision['should_fission'] = True | |
| decision['target_area'] = area_name | |
| decision['fission_type'] = 'micro_column' | |
| decision['reason'] = f'置信度过低({conf:.2f}),需更多微柱增强' | |
| decision['priority'] = 5 | |
| break | |
| # 活动过低 → 可能是微柱不足 | |
| activity = state.get('avg_activity', 0.5) | |
| num_mc = state.get('num_micro_columns', 1) | |
| if activity < 0.1 and num_mc < 10: | |
| decision['should_fission'] = True | |
| decision['target_area'] = area_name | |
| decision['fission_type'] = 'micro_column' | |
| decision['reason'] = f'活动过低({activity:.3f}),需更多微柱激活' | |
| decision['priority'] = 4 | |
| # 2. 检查自身的分析历史 | |
| if hasattr(self, '_area_analysis'): | |
| low_conf_count = self._area_analysis.get('low_confidence_count', 0) | |
| # 连续多次低置信度 → 建议功能柱分裂 | |
| if low_conf_count > 5: | |
| decision['should_fission'] = True | |
| decision['target_area'] = 'association' # 默认关联区 | |
| decision['fission_type'] = 'functional_column' | |
| decision['reason'] = f'连续{low_conf_count}次低置信度,需扩展功能' | |
| decision['priority'] = 3 | |
| return decision | |
| def get_info(self) -> Dict: | |
| """获取功能柱完整信息""" | |
| # 统计各类型微柱数量 | |
| type_counts = {} | |
| for t in self.micro_column_types: | |
| type_counts[t] = type_counts.get(t, 0) + 1 | |
| recipe = self.recipe | |
| return { | |
| 'column_type': self.column_type, | |
| 'column_name': recipe['name'], | |
| 'role': recipe.get('role', ''), | |
| 'num_micro_columns': self.num_micro_columns, | |
| 'micro_column_types': type_counts, | |
| 'composition': recipe['composition'], | |
| 'connection_mode': self.connection_mode, | |
| 'inputs': recipe.get('inputs', []), | |
| 'outputs': recipe.get('outputs', []), | |
| } | |
| # ============ THALAMUS 专用:监控与异常中断 ============ | |
| def monitor_all(self, area_states: Dict) -> Dict: | |
| """THALAMUS专用:监控所有区域状态,检测异常""" | |
| if self.column_type != 'thalamus': | |
| return {'error': '只有丘脑区可执行监控'} | |
| if not hasattr(self, '_monitor_stats'): | |
| self._monitor_stats = { | |
| 'check_count': 0, | |
| 'anomaly_count': 0, | |
| 'interrupt_count': 0, | |
| 'anomaly_history': [], | |
| } | |
| self._monitor_stats['check_count'] += 1 | |
| # 检测各区域异常 | |
| anomalies = [] | |
| interrupt_triggered = False | |
| for area_name, state in area_states.items(): | |
| if area_name == 'thalamus': | |
| continue | |
| # 1. 检查活动水平异常 | |
| activity = state.get('avg_activity', 0.5) | |
| if activity < 0.02: | |
| anomalies.append({ | |
| 'area': area_name, | |
| 'type': 'low_activity', | |
| 'value': float(activity), | |
| 'severity': 4, | |
| }) | |
| interrupt_triggered = True | |
| # 2. 检查置信度异常 | |
| conf = state.get('avg_confidence', 1.0) | |
| if conf < 0.3 and area_name in ['sensory', 'memory', 'association']: | |
| anomalies.append({ | |
| 'area': area_name, | |
| 'type': 'low_confidence', | |
| 'value': float(conf), | |
| 'severity': 5, | |
| }) | |
| interrupt_triggered = True | |
| # 3. 检查记忆过载 | |
| lt = state.get('long_term_memories', 0) | |
| if lt > 20000: | |
| anomalies.append({ | |
| 'area': area_name, | |
| 'type': 'memory_overload', | |
| 'value': int(lt), | |
| 'severity': 3, | |
| }) | |
| # 记录异常 | |
| if anomalies: | |
| self._monitor_stats['anomaly_count'] += len(anomalies) | |
| import time | |
| self._monitor_stats['anomaly_history'].append({ | |
| 'timestamp': time.time(), | |
| 'anomalies': anomalies, | |
| }) | |
| if len(self._monitor_stats['anomaly_history']) > 20: | |
| self._monitor_stats['anomaly_history'] = self._monitor_stats['anomaly_history'][-20:] | |
| if interrupt_triggered: | |
| self._monitor_stats['interrupt_count'] += 1 | |
| return { | |
| 'check_count': self._monitor_stats['check_count'], | |
| 'anomaly_count': self._monitor_stats['anomaly_count'], | |
| 'interrupt_triggered': interrupt_triggered, | |
| 'anomalies': anomalies, | |
| } | |
| # ============ 便捷创建函数 ============ | |
| def create_sensory_column(num_mcs: int = 10, col_index: int = 0, | |
| neurons_per_micro: int = 100, synaptic_tier: str = None) -> FunctionalColumn: | |
| return FunctionalColumn(column_type='sensory', num_micro_columns=num_mcs, col_index=col_index, | |
| neurons_per_micro=neurons_per_micro, synaptic_tier=synaptic_tier) | |
| def create_memory_column(num_mcs: int = 8, col_index: int = 0, | |
| neurons_per_micro: int = 100, synaptic_tier: str = None) -> FunctionalColumn: | |
| return FunctionalColumn(column_type='memory', num_micro_columns=num_mcs, col_index=col_index, | |
| neurons_per_micro=neurons_per_micro, synaptic_tier=synaptic_tier) | |
| def create_association_column(num_mcs: int = 6, col_index: int = 0, | |
| neurons_per_micro: int = 100, synaptic_tier: str = None) -> FunctionalColumn: | |
| return FunctionalColumn(column_type='association', num_micro_columns=num_mcs, col_index=col_index, | |
| neurons_per_micro=neurons_per_micro, synaptic_tier=synaptic_tier) | |
| def create_prefrontal_column(num_mcs: int = 20, col_index: int = 0, | |
| neurons_per_micro: int = 100, synaptic_tier: str = None) -> FunctionalColumn: | |
| """前额区 - 默认20个微柱,支持复杂推理和学习""" | |
| return FunctionalColumn(column_type='prefrontal', num_micro_columns=num_mcs, col_index=col_index, | |
| neurons_per_micro=neurons_per_micro, synaptic_tier=synaptic_tier) | |
| def create_motor_column(num_mcs: int = 3, col_index: int = 0, | |
| neurons_per_micro: int = 100, synaptic_tier: str = None) -> FunctionalColumn: | |
| return FunctionalColumn(column_type='motor', num_micro_columns=num_mcs, col_index=col_index, | |
| neurons_per_micro=neurons_per_micro, synaptic_tier=synaptic_tier) | |
| def create_thalamus_column(num_mcs: int = 2, col_index: int = 0, | |
| neurons_per_micro: int = 100, synaptic_tier: str = None) -> FunctionalColumn: | |
| return FunctionalColumn(column_type='thalamus', num_micro_columns=num_mcs, col_index=col_index, | |
| neurons_per_micro=neurons_per_micro, synaptic_tier=synaptic_tier) | |