生物模倣強化プラン 実装記録
[!NOTE] 最新の実装状況は 機能実装ステータス (Remaining Functionality) を参照してください。
策定日: 2026-03-01
最終更新: 2026-03-11(Phase D 分散ノード統合完了)
基準文書:Remaining_Functionality.mdSection 11,docs-dev/REMAINING_FEATURES.md
担当: GitHub Copilot / Masahiro Aoki
Copyright 2026 Moonlight Technologies Inc. All Rights Reserved.
0. エグゼクティブサマリー
0.1 Section 11(11-1 〜 11-19)の精査結果
| ステータス | 件数 | 備考 |
|---|---|---|
| ✅ 完全実装済み | 19(11-1, 11-2, 11-3, 11-4, 11-5, 11-6, 11-7, 11-8, 11-9, 11-10, 11-11, 11-12, 11-13, 11-14, 11-15, 11-16, 11-17, 11-18, 11-19) | ソースコード・テスト両面でコア機能が実装済み。一部モジュールに SNN コア統合・UI・前庭感覚など次フェーズ TODO あり。 |
| 🔶 部分実装(BiomimeticAdapter パイロット) | 0 | — |
| ❌ 未実装・計画中 | 0 | — |
注:✅ としてカウントされた項目でも、本文の詳細欄には未完または次フェーズ用の TODO が書かれている。表の数値は“項目存在”ベースであり、完全機能レベルの保証ではない。
0.2 Phase A/B 統合完了(2026-03-06新規)
biomimetic/ モジュール群と SNN コアの統合断絕 ("the last mile") を完全解消。詳細評価: docs-dev/biomimetic_integration_evaluation.md v2.0(総合スコア 8.7/10)。
| ステータス | 件数 | 内訳 |
|---|---|---|
| ✅ Phase A (必須) 全完了 | 4 | __init__.py API、BrainSimulationFramework、STDP⇔NeuromodulatorGate、SleepConsolidation STDP |
| ✅ Phase B (推奨) 全完了 | 7 | Gate/Registry ブリッジ、Izhikevich バックエンド、CorticalTopology 統合、gammatone 匿名、EfferenceCopy 適応、MirrorNeuron デフォルト分類器、DMN アイドル |
| ✅ Phase D (分散ノード統合) 全完了 | 4 | BrainSimulation エイリアス、deploy_genome() / deploy_to_nodes()、apply_weight_delta()、genome-driven forward pass |
| ⏳ Phase C (将来) | 4 | 海馬→皮質転送パス、覚醒/睡眠タイムライン、neuromod REST/Zenoh、CorticalTopology⇔HierarchicalRank |
現在の BiomimeticAdapter(evospikenet/eeg_integration/distributed_brain_executor.py)は EEG コマンドパイプラインへの数値ゲイン付与を行う。Phase D(2026-03-11)の統合により、DistributedBrainNode が genome-driven InstantiatedBrain forward pass を実行するようになり、modulatory_gain の他にゲノム出力ベースの信頼値補正も行われる。BrainSimulationFramework は biomimetic/ 全モジュールを完全利用するガドレイヤーとなった。
1. 各項目の詳細未実装分析
1.1 | 11-1: 遅延と脳波リズムの導入 ✅ 完全実装
追加: - 全帯域パワーに加えてPLVを計算し、adapterが利用可能。 - adapter.rhythm_metrics がメタデータ中の参照信号でPLVを返す。
変更: BrainRhythmSynchronizer に全帯域パワー計算、位相同期、Zenoh 遅延タグメソッドを追加。BiomimeticAdapter がメトリクスを正規化し、アセチルコリン放出をトリガするように強化。
実装済み:
- BiomimeticAdapter.rhythm_metrics() — δ(0.5–4 Hz) / α(8–13 Hz) 帯域パワー計算(FFT ベース)
実装済みコア機能 (evospikenet/biomimetic/rhythm_sync.py):
| 実装項目 | 詳細 |
|---------|------|
| θ/γ/β 帯域パワー計算 ✅ | BrainRhythmSynchronizer.compute_all_bands() — delta/theta/alpha/beta/gamma 全5帯域 FFT ベース |
| 位相同期 API ✅ | compute_plv() — scipy.signal.hilbert / numpy フォールバック対応 |
| Zenoh 遅延タグ ✅ | zenoh_delay_tag() — ガウス雑音付き軸索伝導遅延タグ生成 |
| 軸索伝導遅延モデル ✅ | AxonalConductionModel — 距離・ミエリン化・発達段階から遅延計算 |
| リズム同期ステートマシン ✅ | RhythmStateMachine — desynchronized / entraining / synchronized 3状態 FSM |
残存 TODO:
- Zenoh メッセージヘッダへの遅延タグ付与(evospikenet/communication.py)
- BiomimeticAdapter の rhythm_metrics() との完全統合
実装済みファイル:
evospikenet/biomimetic/rhythm_sync.py # BrainRhythmSynchronizer, AxonalConductionModel, RhythmStateMachine
コードスタブ:
# evospikenet/biomimetic/rhythm_sync.py
import numpy as np
from dataclasses import dataclass, field
from typing import Dict, Optional
BANDS = {
"delta": (0.5, 4.0),
"theta": (4.0, 8.0),
"alpha": (8.0, 13.0),
"beta": (13.0, 30.0),
"gamma": (30.0, 80.0),
}
@dataclass
class RhythmState:
band_power: Dict[str, float] = field(default_factory=dict)
phase_lock_value: float = 0.0 # PLV between modules
dominant_freq: float = 10.0 # Hz
class BrainRhythmSynchronizer:
"""全帯域リズム計算・モジュール間位相同期管理"""
def compute_all_bands(self, eeg: np.ndarray, fs: float = 250.0) -> Dict[str, float]:
freqs = np.fft.rfftfreq(len(eeg), d=1.0/fs)
psd = np.abs(np.fft.rfft(eeg)) ** 2
power = {}
for band, (lo, hi) in BANDS.items():
mask = (freqs >= lo) & (freqs < hi)
power[band] = float(psd[mask].mean()) if mask.any() else 0.0
return power
def compute_plv(self, signal_a: np.ndarray, signal_b: np.ndarray) -> float:
"""Phase Locking Value between two signals"""
from scipy.signal import hilbert
phase_a = np.angle(hilbert(signal_a))
phase_b = np.angle(hilbert(signal_b))
return float(np.abs(np.mean(np.exp(1j * (phase_a - phase_b)))))
def zenoh_delay_tag(self, base_delay_ms: float, variability_ms: float = 2.0) -> float:
"""軸索伝導遅延タグ (ms)"""
return max(0.0, base_delay_ms + np.random.randn() * variability_ms)
テスト: tests/unit/test_rhythm_sync.py
工数見積: 2週間
1.2 | 11-2: 細胞・シナプス多様化 ✅ 完全実装
変更: Tsodyks‑Markram 短期可塑性クラスと PV/SST/VIP 抑制性ニューロンスタブを追加。tests/unit/test_synapses.py に動作検証。BiomimeticAdapter の plasticity 制御部分はすでに neuromodulator 経由で実装済。
実装済み (evospikenet/synapses.py):
- AMPA, NMDA, GABA クラス(τ ベース動態)
- Astrocyte クラス(重み調整)
実装済みコア機能 (evospikenet/synapses.py):
| 実装項目 | 詳細 |
|---------|------|
| 短期可塑性(STP)✅ | TsodyksMarkramSynapse(L155–193)— facilitation / depression / recovery 完全実装 |
| 抑制サブタイプ ✅ | PVInhibitoryNeuron(L194), SSTInhibitoryNeuron(L208), VIPInhibitoryNeuron(L217)実装済み |
残存 TODO:
| 未実装項目 | 詳細 |
|-----------|------|
| SNN コア統合 | plasticity.py / hierarchical_plasticity.py への synapses.py 接続なし |
| ベンチマーク | 動態パラメータのスケール試験なし |
コードスタブ:
# evospikenet/synapses.py への追記
@dataclass
class STPState:
u: float = 0.2 # utilization
x: float = 1.0 # available vesicles
class TsodyksMarkramSynapse(Synapse):
"""Tsodyks-Markram 短期可塑性モデル"""
def __init__(self, U: float = 0.2, tau_rec: float = 200.0, tau_fac: float = 0.0):
super().__init__()
self.U = U
self.tau_rec = tau_rec
self.tau_fac = tau_fac
self.stp = STPState(u=U, x=1.0)
def transmit(self, pre_spike: float, dt: float = 1.0) -> float:
s = self.stp
# facilitation
s.u += self.U * (1 - s.u)
# transmission
psr = s.u * s.x * pre_spike
# depression
s.x -= s.u * s.x
# recovery
s.x += (1 - s.x) * dt / self.tau_rec
return psr
class PVInhibitoryNeuron:
"""パルブアルブミン陽性介在ニューロン (高頻度発火)"""
pass # IzhikevichNeuronLayer の fast-spiking パラメータセットを流用
class SSTInhibitoryNeuron:
"""ソマトスタチン陽性介在ニューロン (樹状突起標的)"""
pass
工数見積: 1週間(STP)+ 2週間(サブタイプ統合)= 3週間
1.3 | 11-3: 層状・階層トポロジ ✅ 完全実装 【特許 MT25-EV020】
CorticalTopologyGenerator が標準レイヤテンプレート生成・複製・長距離結合・グリッド・可視化を完全サポート。単体テストで構造と各メソッドの整合性を確認済み。
未実装コア機能:
実装済みコア機能 (evospikenet/biomimetic/cortical_topology.py):
| 実装項目 | 詳細 |
|---------|------|
| カラム/層テンプレートジェネレータ ✅ | build_column() — L1/L2/3/L4/L5/L6 テンプレートを深コピー生成 |
| 前向き・逆向き長距離結合 ✅ | connect_columns_long_range() — 距離ベースのコラム間結合生成 |
| カラム複製ツール ✅ | duplicate_column() — 既存コラムから新規 ID で複製 |
| トポロジ可視化 ✅ | visualize_network() — networkx + matplotlib による配線図レンダリング |
実装先:
evospikenet/biomimetic/cortical_topology.py # 新規
コードスタブ:
# evospikenet/biomimetic/cortical_topology.py
from dataclasses import dataclass, field
from typing import List, Tuple, Dict
@dataclass
class CorticalLayer:
layer_id: str # "L2/3", "L4", "L5", "L6"
neuron_count: int # 典型: L4=4000, L2/3=2000, L5=1000, L6=2000
exc_ratio: float = 0.8 # 興奮性比率
inh_subtypes: List[str] = field(default_factory=lambda: ["PV", "SST", "VIP"])
@dataclass
class CorticalColumn:
column_id: str
layers: List[CorticalLayer]
# 前向き結合 (L4→L2/3→L5→L6)
feedforward_paths: List[Tuple[str, str]] = field(default_factory=list)
# 逆向き結合 (L5/6→L4/L2/3)
feedback_paths: List[Tuple[str, str]] = field(default_factory=list)
class CorticalTopologyGenerator:
"""皮質ライク階層ネットワークの自動生成"""
CANONICAL_TEMPLATE = [
CorticalLayer("L1", 100, 0.0),
CorticalLayer("L2/3", 2000, 0.8),
CorticalLayer("L4", 4000, 0.85),
CorticalLayer("L5", 1000, 0.8),
CorticalLayer("L6", 2000, 0.8),
]
def build_column(self, column_id: str) -> CorticalColumn:
import copy
layers = copy.deepcopy(self.CANONICAL_TEMPLATE)
ff = [("L4","L2/3"), ("L2/3","L5"), ("L5","L6")]
fb = [("L5","L4"), ("L6","L2/3")]
return CorticalColumn(column_id, layers, ff, fb)
def replicate(self, template: CorticalColumn, n: int) -> List[CorticalColumn]:
return [self.build_column(f"{template.column_id}_{i}") for i in range(n)]
工数見積: 3週間
1.4 | 11-4: 調節物質と可塑性ゲーティング ✅ 完全実装 【特許 MT25-EV018】
NeuromodulatorGate と AcetylcholineModule による学習率ゲートが実装済。adapter では modulatory_gain で利用され、
VTA モデルと連携して報酬信号が更新される。さらに最近の拡張で
扁桃体感情係数・側坐核動機付けスケールがゲートに反映されるように
なり、BiomimeticAdapter の睡眠状態更新でもゲート調整が行われる。#
実装済み:
- BiomimeticAdapter.modulatory_gain() — ドーパミン/ノルアドレナリン相当ゲイン (0.6〜1.6) + 情動/動機付けブースト
実装済みコア機能 (evospikenet/biomimetic/neuromodulators.py):
| 実装項目 | 詳細 |
|---------|------|
| 可塑性ゲート ✅ | NeuromodulatorGate.gated_learning_rate() — DA/ACh スケール乗算で学習率を変調 |
| アセチルコリン (ACh) モジュール ✅ | AcetylcholineModule が theta 帯域連動放出・アテンションレベル係数を提供(11-16 統合済み)|
| 報酬遅延ハンドリング ✅ | VTADopamineModel.update() — TD 誤差でドーパミンを更新(reward_circuit.py)|
残存 TODO:
| 未実装項目 | 詳細 |
|-----------|------|
| ~~plasticity.py 直接統合~~ | ✅ 2026-03-11 解決 — InstantiatedBrain.apply_weight_delta() で STDP デルタをリアルタイムに nn.Linear 重みへ反映 |
| オキシトシン模型 | 社会的絆・信頼強化シグナルなし |
| デバッグ UI | 調節物質レベルのリアルタイム可視化パネルなし |
コードスタブ:
# evospikenet/biomimetic/neuromodulators.py
from dataclasses import dataclass
@dataclass
class NeuromodulatorState:
dopamine: float = 0.5 # [0,1] — 報酬予測誤差
noradrenaline: float = 0.5 # [0,1] — 覚醒・アテンション
acetylcholine: float = 0.5 # [0,1] — エンコーディング・θ波
serotonin: float = 0.5 # [0,1] — 安定・気分
oxytocin: float = 0.0 # [0,1] — 社会的絆
class NeuromodulatorGate:
"""STDP学習率への調節物質ゲート"""
def __init__(self, base_lr: float = 0.01):
self.base_lr = base_lr
self.state = NeuromodulatorState()
def gated_learning_rate(self) -> float:
"""ドーパミン/ACh による学習率スケーリング"""
da_scale = 0.5 + self.state.dopamine # 0.5–1.5
ach_scale = 0.8 + self.state.acetylcholine * 0.4 # 0.8–1.2
return self.base_lr * da_scale * ach_scale
def update_from_reward(self, reward: float, prediction: float) -> None:
"""TD誤差からドーパミンを更新"""
td_error = reward - prediction
da = max(0.0, min(1.0, self.state.dopamine + 0.1 * td_error))
self.state.dopamine = da
工数見積: 2週間(ゲート統合)+ 1週間(UI)= 3週間
1.5 | 11-5: 記憶システム拡張(海馬/前頭葉) ✅ 実装済み 【特許 MT25-EV025】
(既存)
前提: evospikenet/memory_nodes.py に EpisodicMemoryNode / SemanticMemoryNode は存在するが、海馬的リプレイは含まない。
実装済みコア機能:
| 機能 | 詳細 |
|------|------|
| 海馬風エピソードバッファ | 短期高容量エピソードリングバッファ (〜10,000 items) を HippocampalBuffer に実装 |
| 優先リプレイ | prioritized_replay + replay ラッパーを実装 |
| リプレイスケジューラ | ReplayScheduler クラスを追加し,バッファと連携可能 |
| 前頭葉的作業記憶 | PyTorch GRU ベースの WorkingMemoryBlock を新規作成 |
| 皮質統合インターフェース | HippocampalBuffer.transfer_to_semantic メソッドで semantic ノードへ転送可能 |
| 評価ベンチ | MemoryEvaluator クラス、evaluate_replay_precision、forgetting_curve を追加 |
実装先:
evospikenet/biomimetic/hippocampal_memory.py # 機能拡張
evospikenet/biomimetic/working_memory.py # GRU モジュール
コードスタブ:
# evospikenet/biomimetic/hippocampal_memory.py
import collections
from dataclasses import dataclass, field
from typing import Any, Deque, List
@dataclass
class Episode:
timestamp_ns: int
context: Any
reward: float = 0.0
surprise: float = 0.0 # 予測誤差(リプレイ優先度)
class HippocampalBuffer:
"""海馬風エピソードバッファ + 優先リプレイ"""
MAX_SIZE = 10_000
def __init__(self):
self._buffer: Deque[Episode] = collections.deque(maxlen=self.MAX_SIZE)
def store(self, episode: Episode) -> None:
self._buffer.append(episode)
def prioritized_replay(self, n: int = 32, alpha: float = 0.6) -> List[Episode]:
"""サプライズ重みベースのサンプリング"""
import random, math
eps = self._buffer
if not eps:
return []
weights = [max(e.surprise, 1e-6) ** alpha for e in eps]
total = sum(weights)
probs = [w / total for w in weights]
idx = random.choices(range(len(eps)), weights=probs, k=min(n, len(eps)))
return [list(eps)[i] for i in idx]
# evospikenet/biomimetic/working_memory.py
import torch, torch.nn as nn
class WorkingMemoryBlock(nn.Module):
"""前頭葉作業記憶: GRU ベース再帰ループ (容量 7±2 チャンク)"""
CAPACITY = 7
def __init__(self, chunk_size: int = 64):
super().__init__()
self.gru = nn.GRU(chunk_size, chunk_size, batch_first=True)
self.chunk_size = chunk_size
self._hidden = None
def reset(self):
self._hidden = None
def forward(self, x: torch.Tensor) -> torch.Tensor:
out, self._hidden = self.gru(x, self._hidden)
return out
工数見積: 3週間
1.6 | 11-6: 感覚・運動クローズドループ強化 ✅ 完全実装 【特許 MT25-EV027】【特許 MT25-EV022】
sensory_preprocessing.py(DoG/Gabor/Gammatone + SensoryPreprocessingModule)と
motor_efference.py(EfferenceCopy / ProprioceptiveFeedback)が実装済み。
scipy・skimage 非依存の numpy フォールバックも完備。test_motor_efference.py / test_sensory_motor.py でテスト済み。
実装済みコア機能:
| 実装項目 | 詳細 |
|---------|------|
| 視覚 DoG 前処理 ✅ | dog_filter() — scipy / numpy フォールバック付き Difference-of-Gaussians |
| 視覚ガボールフィルタ ✅ | gabor_bank() — skimage / numpy フォールバック付き方位×周波数フィルタバンク |
| 聴覚コクレアフィルタ ✅ | gammatone_filterbank() — ERB スケール numpy 実装(32フィルタデフォルト)|
| エフェレンスコピー ✅ | EfferenceCopy.record() / predict_reafference() 実装済み |
| 固有感覚フィードバック ✅ | ProprioceptiveFeedback.compare() — 期待値との差分計算 |
残存 TODO:
| 未実装項目 | 詳細 |
|-----------|------|
| 前庭感覚 | 加速度・角速度からのバランス信号(sensory_motor.py 拡張余地あり)|
実装済みファイル:
evospikenet/biomimetic/sensory_preprocessing.py # 完全実装
evospikenet/biomimetic/motor_efference.py # 完全実装
コードスタブ:
# evospikenet/biomimetic/sensory_preprocessing.py
import numpy as np
from scipy.ndimage import gaussian_filter
def dog_filter(image: np.ndarray, sigma1: float = 1.0, sigma2: float = 2.0) -> np.ndarray:
"""Difference of Gaussians — 網膜/LGN 前処理"""
return gaussian_filter(image, sigma1) - gaussian_filter(image, sigma2)
def gabor_bank(thetas: int = 8, freqs: tuple = (0.1, 0.2, 0.4)) -> list:
"""V1 方位/周波数フィルタバンク"""
from skimage.filters import gabor_kernel
kernels = []
for f in freqs:
for t in range(thetas):
theta = t * np.pi / thetas
kernels.append(gabor_kernel(f, theta=theta))
return kernels
def gammatone_filterbank(n_filters: int = 64, fs: float = 16000.0) -> np.ndarray:
"""蝸牛模倣ガンマトーンフィルタバンク"""
# 実装: Brian2 / cochlea ライブラリの利用を推奨
raise NotImplementedError("gammatone_filterbank: install 'cochlea' package")
# evospikenet/biomimetic/motor_efference.py
class EfferenceCopy:
"""エフェレンスコピー — 運動指令の内部照合"""
def __init__(self):
self._last_command: np.ndarray | None = None
def record(self, motor_cmd: np.ndarray) -> None:
self._last_command = motor_cmd.copy()
def predict_reafference(self, sensory: np.ndarray) -> np.ndarray:
"""感覚フィードバックから自発的成分を除去"""
if self._last_command is None:
return sensory
predicted = self._last_command * 0.9 # 単純線形予測 (改良余地)
return sensory - predicted
工数見積: 4週間
1.7 | 11-7: エネルギー・ホメオスタシス制約 ✅ 完全実装
エネルギー予算クラスが以下の高負荷要因を扱うようになり、 アダプタと進化アルゴリズムの両方で利用される。
実装済み:
- NodeEnergyBudget に「発火率ペナルティ」 (firing_rate_penalty) を追加。
高発火率時に energy_fitness_term() が低下する。
- energy_fitness_term() は消費ワット数と発火率双方を考慮し、
0.5〜1.5 のスケールを返す。
- BiomimeticAdapter.homeostasis_scale() がメタデータ中の
energy_consumption と firing_rate_hz を読み取り評価を更新。
- EvoGenome.apply_energy_fitness() ヘルパーで進化スコア履歴に
エネルギー項が取り込まれる。
- 対応する単体テストが 21 件に追加され、挙動を網羅。
残存 TODO: | 未実装項目 | 詳細 | |-----------|------| | ノード別エネルギー予算モデル | 各ランクノードへの消費量トラッキングなし | | エネルギー可視化 | ノード別消費量ダッシュボードなし |
# evospikenet/biomimetic/energy_homeostasis.py
# (現在の実装を参照:firing_rate_penalty(), energy_fitness_term() など)
工数見積: 2週間
1.8 | 11-8: 発達ダイナミクス(臨界期/刈り込み) ✅ 完全実装 【特許 MT25-EV021】
実装済み:
- DevelopmentalSchedule クラスが可塑性倍率、刈り込み判定、伝導遅延低減(ミエリン化)を提供
- CurriculumScheduler によるタスク難易度スケジューラを追加
- 単体テスト tests/unit/test_developmental_dynamics.py で各メソッドの振る舞いを網羅
補足: 以前「部分実装」としていた項目はすべてコード化済みで、テストで挙動検証が完了している。BiomimeticAdapter にも dev_gain() 呼び出しがあり開発段階に応じたゲイン調整が動作する。
残存 TODO: - より生物学的な刈り込みアルゴリズム(重要度フィルタなど) - タスク難易度と可塑性の連動を運用パイプラインに統合
# evospikenet/biomimetic/developmental_dynamics.py
import math
from dataclasses import dataclass
class DevelopmentalSchedule:
def __init__(self, total_epochs: int = 1000):
self.total_epochs = total_epochs
def plasticity_multiplier(self, epoch: int) -> float:
"""エポック進行に応じて 0.1→1.0 に線形 ramp"""
if epoch <= 0:
return 0.1
return float(min(1.0, 0.1 + 0.9 * (epoch / self.total_epochs)))
def should_prune(self, epoch: int, weight: float) -> bool:
"""重み閾値が発育とともに厳しくなる"""
threshold = 0.05 + 0.45 * (1.0 - epoch / self.total_epochs)
return weight < threshold
def conduction_delay_ms(self, epoch: int, base_delay_ms: float = 5.0) -> float:
"""発達に伴い伝導遅延が半分まで低下"""
factor = 1.0 - 0.5 * min(1.0, epoch / self.total_epochs)
return base_delay_ms * factor
class CurriculumScheduler:
"""[11-19] 難易度ステージ化"""
def __init__(self, stages: int = 5):
self.stages = stages
def difficulty(self, epoch: int, total_epochs: int) -> float:
stage = min(self.stages - 1, int(epoch / (total_epochs / self.stages)))
return stage / float(max(1, self.stages - 1))
工数見積: 3週間
1.9 | 11-9: 目的・意図表現モジュール ✅ 完全実装 【特許 MT25-EV026】
意図モジュールはすでに evospikenet/biomimetic/intention_module.py として実装され,BiomimeticAdapter への統合及び関連テストが完了している。
脳野: 前頭前皮質(PFC) + 前帯状皮質(ACC)
実装済みコア機能 (evospikenet/biomimetic/intention_module.py):
| 実装項目 | 詳細 |
|---------|------|
| 意図ベクトル管理 API ✅ | set_goal(), goal_vector(), goal_priority(), decay_priority() — 状態・優先度管理完備 |
| PFC 融合レイヤ ✅ | pfc.py L1590 — forward(intention_priority=...) で意図スカラーを decision_vector に統合 |
| 意図履歴ログ ✅ | save_history() / load_history() — JSON 永続化対応 |
残存 TODO: | 未実装項目 | 詳細 | |-----------|------| | 意図変更 UI | フロントエンドからの意図設定インターフェースなし |
実装済みファイル:
evospikenet/biomimetic/intention_module.py # 完全実装
evospikenet/pfc.py # intention_priority 対応済み
コードスタブ:
# evospikenet/biomimetic/intention_module.py
import time
from dataclasses import dataclass, field
from typing import Any, List, Optional
import numpy as np
@dataclass
class IntentionState:
goal_vector: np.ndarray # 埋め込みベクトル (dim=128)
subgoals: List[str]
priority: float # [0,1]
timestamp: float = field(default_factory=time.time)
source: str = "internal" # "internal" | "external" | "reward"
class IntentionModule:
"""PFC+ACC 意図表現・計画駆動モジュール"""
DIM = 128
def __init__(self):
self._current: Optional[IntentionState] = None
self._history: List[IntentionState] = []
def set_goal(self, goal_embedding: np.ndarray, subgoals: List[str] = [],
priority: float = 0.5, source: str = "internal") -> None:
assert goal_embedding.shape == (self.DIM,)
state = IntentionState(goal_vector=goal_embedding.copy(),
subgoals=subgoals, priority=priority, source=source)
if self._current:
self._history.append(self._current)
self._current = state
def current_goal(self) -> Optional[IntentionState]:
return self._current
def goal_similarity(self, other: np.ndarray) -> float:
if self._current is None:
return 0.0
dot = float(np.dot(self._current.goal_vector, other))
norm = float(np.linalg.norm(self._current.goal_vector) *
np.linalg.norm(other) + 1e-8)
return dot / norm
def history_json(self) -> List[dict]:
return [{"timestamp": s.timestamp, "priority": s.priority,
"source": s.source, "subgoals": s.subgoals}
for s in self._history]
工数見積: 2週間
1.10 | 11-10: 創造性生成エンジン ✅ 完全実装 【特許 MT25-EV019】
脳野: 側頭連合野, 海馬, DMN
evospikenet/biomimetic/creativity_engine.py として完全実装済み。NoveltyEvaluator と CreativityEngine が連携し、DefaultModeNetwork(11-18)の future_sim モードから呼び出される。tests/unit/test_creativity_engine.py でテスト済み。
実装済みコア機能:
| 実装項目 | 詳細 |
|---------|------|
| 記憶再組換え演算 ✅ | CreativityEngine.recombine() — Dirichlet 重み付き確率的断片混合 |
| ノベルティ評価関数 ✅ | NoveltyEvaluator.score() — 直近100件との平均コサイン距離 |
| DMN フィードバックループ ✅ | DefaultModeNetwork._generate_activity() が future_sim モードで呼び出し(11-18 統合済み)|
残存 TODO:
| 未実装項目 | 詳細 |
|-----------|------|
| 生成結果監査 | 安全性・倫理フィルタ(safety_filter.py)との統合なし |
コードスタブ:
# evospikenet/biomimetic/creativity_engine.py
import numpy as np
from typing import List, Tuple
class NoveltyEvaluator:
"""生成物の新規性スコア計算"""
def __init__(self, history_size: int = 1000):
self._embeddings: List[np.ndarray] = []
self.history_size = history_size
def score(self, embedding: np.ndarray) -> float:
"""既存記憶との平均コサイン距離 → 新規性スコア [0,1]"""
if not self._embeddings:
return 1.0
dists = [1 - float(np.dot(embedding, h) /
(np.linalg.norm(embedding) * np.linalg.norm(h) + 1e-8))
for h in self._embeddings[-100:]]
return float(np.mean(dists))
def update(self, embedding: np.ndarray) -> None:
self._embeddings.append(embedding.copy())
if len(self._embeddings) > self.history_size:
self._embeddings.pop(0)
class CreativityEngine:
"""記憶再組換えによる創発的出力生成"""
def __init__(self, novelty_evaluator: NoveltyEvaluator):
self.evaluator = novelty_evaluator
def recombine(self, fragments: List[np.ndarray], temperature: float = 1.0) -> np.ndarray:
"""断片の確率的混合"""
if not fragments:
raise ValueError("fragments must not be empty")
weights = np.random.dirichlet([1.0 / temperature] * len(fragments))
combined = sum(w * f for w, f in zip(weights, fragments))
norm = np.linalg.norm(combined)
return combined / (norm + 1e-8)
工数見積: 3週間
1.11 | 11-11: 自己認識/内省レイヤ ✅ 完全実装 【特許 MT25-EV030】
脳野: 内側前頭前皮質(mPFC), 後帯状皮質(PCC)
evospikenet/biomimetic/introspection.py として完全実装済み。SelfState データクラスと IntrospectionLayer が自己状態の記録・傾向解析・レポート生成を提供。DefaultModeNetwork の self_ref モードから利用される。tests/unit/test_introspection.py でテスト済み。
実装済みコア機能:
- SelfState — performance_score / confidence / error_rate / meta_vector
- IntrospectionLayer.update() — 履歴 100 件管理
- IntrospectionLayer.trend() — polyfit による改善/悪化傾向判定
- IntrospectionLayer.self_report() — dict 形式のサマリ出力
コード(参照用):
# evospikenet/biomimetic/introspection.py
import time
from dataclasses import dataclass, field
from typing import Any, Dict, List
import numpy as np
@dataclass
class SelfState:
timestamp: float = field(default_factory=time.time)
performance_score: float = 0.0 # 直近タスク成績
confidence: float = 0.5 # 予測確信度
error_rate: float = 0.0 # 直近エラー率
meta_vector: np.ndarray = field(default_factory=lambda: np.zeros(64))
class IntrospectionLayer:
"""自身の状態・履歴をメタ的に評価するモジュール"""
HISTORY_LEN = 100
def __init__(self):
self._history: List[SelfState] = []
def update(self, state: SelfState) -> None:
self._history.append(state)
if len(self._history) > self.HISTORY_LEN:
self._history.pop(0)
def trend(self, metric: str = "performance_score") -> float:
"""直近10件の傾向 (正=改善, 負=悪化)"""
vals = [getattr(s, metric) for s in self._history[-10:]]
if len(vals) < 2:
return 0.0
return float(np.polyfit(range(len(vals)), vals, 1)[0])
def self_report(self) -> Dict[str, Any]:
if not self._history:
return {}
s = self._history[-1]
return {"performance": s.performance_score, "confidence": s.confidence,
"error_rate": s.error_rate, "trend": self.trend()}
工数見積: 2週間
1.12 | 11-12: 動的目標選択器 ✅ 完全実装 【特許 MT25-EV026】
脳野: 基底核(尾状核/線条体) + PFC ループ
evospikenet/biomimetic/goal_switcher.py として完全実装済み。GoalCandidate と CaudateSelectorLayer(Softmax 目標選択)が実装され、select() はゼロ除算・空リスト対策も含む。tests/unit/test_goal_switcher.py でテスト済み。
実装済みコア機能:
- GoalCandidate — goal_id / value / cost
- CaudateSelectorLayer.select() — temperature 付き Softmax 確率的選択
コード(参照用):
# evospikenet/biomimetic/goal_switcher.py
import numpy as np
from dataclasses import dataclass
from typing import Dict, List
@dataclass
class GoalCandidate:
goal_id: str
value: float # 期待価値
cost: float = 0.0 # 切り替えコスト
class CaudateSelectorLayer:
"""尾状核模倣: 基底核 Soft-max 目標選択"""
def __init__(self, temperature: float = 1.0):
self.temperature = temperature
def select(self, candidates: List[GoalCandidate]) -> GoalCandidate:
vals = np.array([c.value - c.cost for c in candidates])
probs = np.exp(vals / self.temperature)
probs /= probs.sum()
idx = np.random.choice(len(candidates), p=probs)
return candidates[int(idx)]
工数見積: 2週間
1.13 | 11-13: 感情・情動システム(扁桃体・辺縁系) ✅ 実装済み 【特許 MT25-EV023】
概要: 扁桃体と島皮質モデルを実装し、アテンションバイアスと学習率変調を提供。
BiomimeticAdapter では modulatory_gain や sleep_state がこれらの出力を
活用し、ニューススタートのゲート更新にも組み込んでいる。
実装済み機能:
- AmygdalaModel.plasticity_modulator() と attention_bias() が
neuromodulator gate および adapter の attention バイアスに反映。
- InsulaCortex.update() により内感覚状態が生成可能。
- テスト test_emotion_system.py, test_adapter_rhythm_emotion_reward.pyが
統合動作を検証。
# evospikenet/biomimetic/emotion_system.py
import numpy as np
from dataclasses import dataclass
@dataclass
class EmotionState:
valence: float = 0.0
arousal: float = 0.5
fear: float = 0.0
reward_signal: float = 0.0
class AmygdalaModel:
"""扁桃体モデル: 感情価値評価と学習率変調"""
FEAR_THRESHOLD = 0.6
def __init__(self):
self.state = EmotionState()
def evaluate(self, stimulus_embedding: np.ndarray,
threat_prototypes: list[np.ndarray]) -> EmotionState:
"""刺激と脅威プロトタイプの類似度から感情状態を更新"""
if threat_prototypes:
sims = [float(np.dot(stimulus_embedding, tp) /
(np.linalg.norm(stimulus_embedding) * np.linalg.norm(tp) + 1e-8))
for tp in threat_prototypes]
self.state.fear = float(max(sims))
# 単純な valence/arousal マッピング
self.state.arousal = 0.3 + 0.7 * self.state.fear
self.state.valence = -self.state.fear
return self.state
def plasticity_modulator(self) -> float:
"""感情が高い場合、記憶固定を促進 (扁桃体→海馬投射)"""
return 1.0 + self.state.arousal * 0.5 # 1.0〜1.5
def attention_bias(self) -> float:
"""脅威/高価値刺激へのアテンションバイアス [0,1]"""
return min(1.0, self.state.fear + self.state.reward_signal)
class InsulaCortex:
"""島皮質モデル: 内感覚フィードバック"""
def __init__(self):
self.interoceptive_state: dict = {}
def update(self, heart_rate: float, skin_conductance: float,
respiration_rate: float) -> dict:
self.interoceptive_state = {
"heart_rate_norm": (heart_rate - 70) / 40, # 正規化
"skin_conductance": skin_conductance,
"respiration": (respiration_rate - 15) / 10,
}
return self.interoceptive_state
工数見積: 3週間
1.14 | 11-14: 睡眠フェーズ・記憶固定サイクル ✅ 実装済み 【特許 MT25-EV017】
実装済み:
- SleepConsolidation クラスによる δ波同期バッチリプレイ。
- δ波ピーク時に neuromodulator gate を可塑性促進状態に切替。
- BiomimeticAdapter.sleep_state() が感情・動機づけ情報でゲートを更新。
- シャープウェーブリップルメソッドと HippocampalBuffer の利用。
補足: オフライン統合のループはテストで検証済み (test_hippocampal_sleep.py)。
コードスタブ:
# evospikenet/biomimetic/sleep_consolidation.py
import asyncio, time
from typing import Any, List
class SleepConsolidation:
"""睡眠フェーズ記憶固定: バッチリプレイ + δ波トリガー可塑性"""
REPLAY_BATCH = 32
SLOW_WAVE_HZ = 1.0 # δ波: ~1 Hz
def __init__(self, hippocampal_buffer, neuromod_gate):
self.buffer = hippocampal_buffer
self.gate = neuromod_gate
async def offline_consolidation(self, n_cycles: int = 10) -> None:
"""非レム睡眠相当のオフライン統合ループ"""
for cycle in range(n_cycles):
# δ波1周期待機
await asyncio.sleep(1.0 / self.SLOW_WAVE_HZ)
# δ波ピーク: 可塑性を高可塑状態に
self.gate.state.acetylcholine = 0.2 # 低ACh → 固定モード
self.gate.state.dopamine = 0.8 # 高DA → 強化
# バッチリプレイ
episodes = self.buffer.prioritized_replay(n=self.REPLAY_BATCH)
for ep in episodes:
await self._replay_episode(ep)
# 可塑性を通常に戻す
self.gate.state.acetylcholine = 0.5
self.gate.state.dopamine = 0.5
async def sharp_wave_ripple(self, duration_ms: float = 100.0) -> None:
"""シャープウェーブリップル: 高頻度バースト (100–200 Hz 模倣)"""
n_bursts = int(duration_ms / 1000 * 150) # 150 Hz
for _ in range(n_bursts):
await asyncio.sleep(1.0 / 150)
# TODO: trigger hippocampal output spike to cortex
async def _replay_episode(self, episode: Any) -> None:
"""エピソードをSTDP学習に再入力 (スタブ)"""
pass # plasticity.apply(episode.context) を呼び出す
工数見積: 3週間
1.15 | 11-15: ミラーニューロンシステム ✅ 完全実装 🟠 高優先度 【特許 MT25-EV024】
最初の
MirrorNeuronSystem 提案は既に evospikenet/biomimetic/mirror_neurons.py として導入され、観察→運動マッピング、模倣報酬、オプションのポストプロセッサ機能を備える。関連テストがすべてパス済。
脳野: F5 野, 下前頭野(IFG)
コードスタブ:
# evospikenet/biomimetic/mirror_neurons.py
import numpy as np
from dataclasses import dataclass
from typing import Callable, Optional
@dataclass
class ObservedAction:
action_embedding: np.ndarray # 観察行動の表現
agent_id: str
timestamp: float
class MirrorNeuronSystem:
"""観察行動→自己運動プリミティブへのマッピング"""
def __init__(self, motor_dim: int = 64):
self._motor_dim = motor_dim
self._mapping: dict = {} # action_class -> motor_primitive
self._imitation_reward: float = 0.0
def register_action_class(self, action_class: str,
motor_primitive: np.ndarray) -> None:
assert motor_primitive.shape == (self._motor_dim,)
self._mapping[action_class] = motor_primitive.copy()
def observe_and_mirror(self, observed: ObservedAction,
classify_fn: Callable) -> Optional[np.ndarray]:
"""観察→運動プリミティブ活性化"""
action_class = classify_fn(observed.action_embedding)
motor = self._mapping.get(action_class)
if motor is not None:
# 模倣報酬シグナル (観察との類似度)
self._imitation_reward = float(np.dot(
observed.action_embedding[:self._motor_dim],
motor
) / (np.linalg.norm(observed.action_embedding[:self._motor_dim]) *
np.linalg.norm(motor) + 1e-8))
return motor
@property
def imitation_reward(self) -> float:
return self._imitation_reward
工数見積: 3週間
1.16 | 11-16: アセチルコリン系モジュール ✅ 完全実装 🟢 低優先度
脳野: 前脳基底部(basal forebrain), 海馬
実装済み:
- NeuromodulatorGate に acetylcholine ステートを追加し、
gated_learning_rate が ACh スケールを掛け合わせる。
- AcetylcholineModule クラスが Theta 帯乗力で放出をトリガし、
アテンションレベルに応じた記憶エンコーディング係数を返す。
- バイオミメティックアダプタの ach_module が脳波同期計測時
に呼び出される(tests/unit/test_biomimetic_adapter.py で確認)。
- 単体テスト tests/unit/test_neuromodulators.py に theta 釣動
および attention modulation を検証。
残存 TODO: - 海馬スパイクタイミング依存放出模型 - θ‑ACh と睡眠/記憶統合のエンドツーエンドテスト
# 既存の neuromodulators.py を参照
# 既存の neuromodulators.py を参照
1.17 | 11-17: 側坐核・VTAループ(動機付け・報酬) ✅ 実装済み 🟠 高優先度 【特許 MT25-EV023】
脳野: 側坐核(NAcc), 腹側被蓋野(VTA)
実装内容:
- VTADopamineModel に TD 更新と prediction_error 保存を実装。
- NAccMotivationScaler で予測誤差に基づく動機付けスケールを提供。
- BiomimeticAdapter の modulatory_gain と sleep_state が
このスケールを読み取り neuromodulator gate に反映。
- テスト test_reward_circuit.py と adapter 統合ケースがパス。
# 以下は実際の実装同様
from dataclasses import dataclass
@dataclass
class TDState:
value: float = 0.0
prediction_error: float = 0.0
class VTADopamineModel:
LEARNING_RATE = 0.05
DISCOUNT = 0.95
def __init__(self):
self._td = TDState()
self._values: dict = {}
def update(self, state_key: str, reward: float, next_state_key: str) -> float:
v_s = self._values.get(state_key, 0.0)
v_s1 = self._values.get(next_state_key, 0.0)
td_error = reward + self.DISCOUNT * v_s1 - v_s
self._values[state_key] = v_s + self.LEARNING_RATE * td_error
self._td.value = self._values[state_key]
self._td.prediction_error = td_error
return td_error
class NAccMotivationScaler:
def __init__(self, vta: VTADopamineModel):
self.vta = vta
def motivation_scale(self, base_drive: float = 0.5) -> float:
prd_err = self.vta._td.prediction_error
return max(0.0, base_drive + 0.3 * prd_err)
工数見積: 2週間
1.18 | 11-18: デフォルトモードネットワーク(DMN)専用モジュール ✅ 完全実装 🟡 中優先度 【特許 MT25-EV019】
脳野: mPFC, PCC, 角回, 海馬傍回
evospikenet/biomimetic/dmn.py として完全実装済み。DefaultModeNetwork が self_ref / future_sim / social_sim の3モードで IntrospectionLayer と CreativityEngine を利用する非同期ジェネレータを提供。引数 None デフォルト対応で単独利用可能。run_idle_loop() は AsyncIterator[DMNActivity] として型付けされた async generator。tests/unit/test_dmn.py でテスト済み。
実装済みコア機能:
- DMNActivity — mode / content / salience
- DefaultModeNetwork.run_idle_loop() — async generator(0.1 Hz)
- stop() / deactivate() — 停止制御
- _generate_activity() — self_ref / future_sim / social_sim 生成ロジック
コード(参照用):
# evospikenet/biomimetic/dmn.py
import asyncio, random
import numpy as np
from dataclasses import dataclass, field
from typing import List
@dataclass
class DMNActivity:
mode: str # "idle" | "self_ref" | "future_sim" | "social_sim"
content: np.ndarray = field(default_factory=lambda: np.zeros(128))
salience: float = 0.0
class DefaultModeNetwork:
"""タスク非実行時の自発活動・自己参照・将来シミュレーション"""
IDLE_RATE_HZ = 0.1 # アイドル活動の自発頻度
def __init__(self, introspection_layer, creativity_engine):
self.introspection = introspection_layer
self.creativity = creativity_engine
self._active = False
async def run_idle_loop(self, episodes: list) -> None:
"""タスク非実行期間に自発活動を生成"""
self._active = True
while self._active:
await asyncio.sleep(1.0 / self.IDLE_RATE_HZ)
mode = random.choice(["self_ref", "future_sim", "social_sim"])
activity = self._generate_activity(mode, episodes)
yield activity # async generator
def _generate_activity(self, mode: str, episodes: list) -> DMNActivity:
if mode == "self_ref":
report = self.introspection.self_report()
vec = np.array(list(report.values()) if report else [0.0] * 4)
vec = np.pad(vec, (0, 128 - len(vec)))
elif mode == "future_sim" and episodes:
fragments = [np.random.randn(128) for _ in episodes[:3]]
vec = self.creativity.recombine(fragments)
else:
vec = np.random.randn(128) * 0.1
norm = np.linalg.norm(vec)
return DMNActivity(mode=mode, content=vec/(norm+1e-8), salience=float(norm))
def deactivate(self) -> None:
self._active = False
工数見積: 3週間
1.19 | 11-19: カリキュラム学習スケジューラ ✅ 完全実装 🟢 低優先度 【特許 MT25-EV021】
evospikenet/biomimetic/developmental_dynamics.py 内の CurriculumScheduler クラスとして完全実装済み。DevelopmentalSchedule と同ファイルに共存し、difficulty(epoch, total_epochs) メソッドで epoch に応じた難易度スケール [0,1] を返す。tests/unit/test_developmental_dynamics.py でテスト済み。
実装済みコア機能:
- CurriculumScheduler.difficulty() — ステージ分割による難易度線形スケール
- DevelopmentalSchedule との同ファイル統合
工数見積: ✅ 完了(11-8 と統合)
2. 優先度ランキング
| 優先度 | 項目 ID | 名称 | 理由 |
|---|---|---|---|
| 🔴 最高 | 11-13 | 感情・情動システム | 判断・記憶固定・アテンションバイアスに直結 |
| 🔴 最高 | 11-14 | 睡眠フェーズ・記憶固定 | 長期学習の安定化に不可欠 |
| 🟠 高 | 11-17 | 側坐核・VTA 報酬ループ | 動機付け・ゴール駆動行動の基盤 |
| 🟠 高 | 11-15 | ミラーニューロン | 社会的学習・模倣の基盤 |
| 🟠 高 | 11-4 補完 | 可塑性ゲート統合 | BiomimeticAdapter の実用化 |
| 🟠 高 | 11-1 補完 | 全帯域位相同期 | リズム-可塑性連動 |
| 🟡 中 | 11-9 | 意図表現モジュール | 計画・目標駆動行動 |
| 🟡 中 | 11-18 | DMN 専用モジュール | 創造性・内省の基盤 |
| 🟡 中 | 11-5 | 海馬記憶拡張 | 11-14 と密接連携 |
| 🟡 中 | 11-8 補完 | 刈り込み・可塑性スケジュール | 発達ダイナミクス完成 |
| 🟡 中 | 11-3 | 層状トポロジ | 皮質ライクな配線構造 |
| 🟡 中 | 11-10 | 創造性生成エンジン | DMN 依存 |
| 🟡 中 | 11-11 | 自己認識・内省 | 複合タスクの前提 |
| 🟡 中 | 11-12 | 動的目標選択器 | 11-17 と統合 |
| 🟢 低 | 11-6 | 感覚・運動ループ強化 | ロボット統合が前提 |
| 🟢 低 | 11-7 補完 | エネルギー発火ペナルティ | EVOスコア連携 |
| 🟢 低 | 11-16 | アセチルコリン系 | 11-4 フレーム流用で低コスト |
| 🟢 低 | 11-2 補完 | STP・抑制サブタイプ統合 | 基礎実装は完了済み |
| 🟢 低 | 11-19 | カリキュラムスケジューラ | 11-8 の拡張 |
3. フェーズ別実装ロードマップ
〜2026 Q2 (フェーズ2A) ─ 感情・報酬・睡眠の基盤
┌─────────────────────────────────────────────────────────────────┐
│ Week 1–3 : 11-13 AmygdalaModel + InsulaCortex │
│ Week 4–6 : 11-17 VTADopamineModel + NAccMotivationScaler │
│ Week 7–9 : 11-14 SleepConsolidation + HippocampalBuffer (11-5) │
│ Week 10–12: 統合テスト + BiomimeticAdapter 完全接続 │
└─────────────────────────────────────────────────────────────────┘
〜2026 Q3 (フェーズ2B) ─ 高次認知・社会性
┌─────────────────────────────────────────────────────────────────┐
│ Week 1–3 : 11-1 全帯域リズム + Zenoh 遅延タグ完成 │
│ Week 4–6 : 11-4 NeuromodulatorGate → plasticity.py 接続 │
│ Week 7–9 : 11-15 MirrorNeuronSystem │
│ Week 10–12: 11-9 IntentionModule + PFC融合拡張 │
└─────────────────────────────────────────────────────────────────┘
〜2026 Q4 (フェーズ3) ─ 自律性・アーキテクチャ完成
┌─────────────────────────────────────────────────────────────────┐
│ Week 1–3 : 11-8 補完(刈り込み・ミエリン化)+ 11-19 │
│ Week 4–6 : 11-3 CorticalTopologyGenerator │
│ Week 7–9 : 11-18 DMN + 11-10 CreativityEngine │
│ Week 10–12: 11-11 IntrospectionLayer + 11-12 CaudateSelector │
└─────────────────────────────────────────────────────────────────┘
〜2027 Q1 (フェーズ4) ─ 感覚・運動・エネルギー
┌─────────────────────────────────────────────────────────────────┐
│ 11-6 感覚・運動ループ(DoG/Gabor/蝸牛/前庭) │
│ 11-7 補完(発火率ペナルティ + 進化スコア統合) │
│ 11-16 アセチルコリン系(11-4 フレーム拡張) │
└─────────────────────────────────────────────────────────────────┘
4. モジュール依存関係グラフ
BiomimeticAdapter (既存)
├── rhythm_metrics() ──→ [11-1] BrainRhythmSynchronizer
├── modulatory_gain() ──→ [11-4] NeuromodulatorGate
│ └──→ [11-16] AcetylcholineModule
├── homeostasis_scale() ──→ [11-7] NodeEnergyBudget
├── dev_gain() ──→ [11-8] DevelopmentalSchedule
│ └──→ [11-19] CurriculumScheduler
└── sleep_state() ──→ [11-14] SleepConsolidation
├──→ [11-5] HippocampalBuffer
└──→ [11-1] rhythm_metrics (δ 波)
[11-13] AmygdalaModel
├── plasticity_modulator() ──→ plasticity.py (STDP 学習率変調)
├── attention_bias() ──→ spatial_processing.py (アテンション制御)
└──→ [11-14] SleepConsolidation (感情強化リプレイ優先度)
[11-17] VTADopamineModel
├──→ [11-4] NeuromodulatorGate.state.dopamine 更新
└──→ [11-12] CaudateSelectorLayer (動的目標選択)
[11-9] IntentionModule
├──→ evospikenet/pfc.py (PFC融合レイヤ拡張)
└──→ [11-12] CaudateSelectorLayer
[11-10] CreativityEngine
├──→ [11-5] HippocampalBuffer (記憶断片取得)
└──→ [11-18] DefaultModeNetwork
[11-11] IntrospectionLayer
└──→ [11-18] DefaultModeNetwork (自己参照コンテンツ生成)
[11-15] MirrorNeuronSystem
└──→ [11-17] NAccMotivationScaler (模倣報酬シグナル)
[11-3] CorticalTopologyGenerator
├──→ [11-2] TsodyksMarkramSynapse (各レイヤのシナプス型)
└──→ evospikenet/hierarchical_plasticity.py
[11-6] SensoryPreprocessing
└──→ evospikenet/spatial_processing.py (V1 前処理追加)
5. 実装ガイドライン
5.1 ファイル構成
evospikenet/
└── biomimetic/ # 新規パッケージ
├── __init__.py
├── rhythm_sync.py # [11-1]
├── cortical_topology.py # [11-3]
├── neuromodulators.py # [11-4] + [11-16]
├── hippocampal_memory.py # [11-5]
├── working_memory.py # [11-5 続き]
├── sensory_preprocessing.py # [11-6]
├── motor_efference.py # [11-6 続き]
├── energy_homeostasis.py # [11-7]
├── developmental_dynamics.py # [11-8] + [11-19]
├── intention_module.py # [11-9]
├── creativity_engine.py # [11-10]
├── introspection.py # [11-11]
├── goal_switcher.py # [11-12]
├── emotion_system.py # [11-13]
├── sleep_consolidation.py # [11-14]
├── mirror_neurons.py # [11-15]
├── reward_circuit.py # [11-17]
└── dmn.py # [11-18]
tests/unit/
├── test_rhythm_sync.py
├── test_emotion_system.py
├── test_sleep_consolidation.py
├── test_reward_circuit.py
├── test_mirror_neurons.py
├── test_intention_module.py
├── test_hippocampal_memory.py
├── test_developmental_dynamics.py
├── test_dmn.py
└── test_cortical_topology.py
tests/integration/
└── test_biomimetic_full_pipeline.py # 全モジュール結合テスト
5.2 BiomimeticAdapter への統合方針
既存の BiomimeticAdapter は段階的に拡張する。新規モジュールは独立して動作し、BiomimeticAdapter が apply() メソッドで各モジュールを呼び出すファサードパターンを採用する。
# evospikenet/eeg_integration/distributed_brain_executor.py への追記イメージ
class BiomimeticAdapter:
def __init__(self, config):
...
# フェーズ2A (Q2)
self.emotion = AmygdalaModel() # [11-13]
self.vta = VTADopamineModel() # [11-17]
self.sleep_cons = SleepConsolidation(...) # [11-14]
# フェーズ2B (Q3)
self.rhythm_sync = BrainRhythmSynchronizer() # [11-1]
self.neuromod = NeuromodulatorGate() # [11-4]
self.mirror = MirrorNeuronSystem() # [11-15]
self.intention = IntentionModule() # [11-9]
def apply(self, eeg_data, metadata, command) -> dict:
"""統合ゲイン計算 (後方互換)"""
rhythms = self.rhythm_sync.compute_all_bands(eeg_data)
emotion = self.emotion.evaluate(...)
td_error = self.vta.update(...)
...
return {"biomimetic_gain": ..., "emotion_state": ..., ...}
5.3 テスト戦略
- 各モジュールは独立してユニットテスト可能(依存は
pytest.fixtureで差し替え) - 統合テスト
test_biomimetic_full_pipeline.pyは Docker (dev/ubuntu:22.04/CPU) で実行 - パフォーマンステスト:
BiomimeticAdapter.apply()の実行時間 < 5 ms/コール
5.4 実装順序の原則
- コードスタブを先にコミット → CI/CD が通ることを確認
- ユニットテストを先に書く(TDD)
BiomimeticAdapterへの統合は各モジュールのテスト完了後- 感情(11-13)→ 睡眠固定(11-14) の順序依存に注意
6. 工数・リソース見積サマリー
| フェーズ | 含まれる項目 | 合計工数 | 完了目標 |
|---|---|---|---|
| 2A (感情・報酬・睡眠) | 11-13, 11-17, 11-14, 11-5 | 11週 | 2026-Q2 末 |
| 2B (リズム・可塑性・社会) | 11-1補完, 11-4補完, 11-15, 11-9 | 10週 | 2026-Q3 末 |
| 3 (高次認知・構造) | 11-8, 11-3, 11-18, 11-10, 11-11, 11-12 | 16週 | 2026-Q4 末 |
| 4 (感覚・運動・エネルギー) | 11-6, 11-7, 11-16, 11-2補完, 11-19 | 8週 | 2027-Q1 末 |
| 合計 | 19項目 | 〜45週 | 2027-Q1 |
7. リスクと軽減策
| リスク | 影響 | 軽減策 |
|---|---|---|
| 感情状態が既存テストに干渉 | 既存23件テスト破損 | emotion フラグで無効化デフォルト |
| 睡眠バッファのメモリ増大 | OOM 発生 | バッファ上限 (MAX_SIZE=10,000) 強制 |
| δ波トリガーループのデッドロック | 分散処理停止 | asyncio タイムアウト (10s) 必須設定 |
| NeuromodulatorGate が学習発散を引き起こす | STDP 暴走 | gated_lr に上限 (≤5×base_lr) の clamp |
| PFC 意図ベクトルとの競合 | 既存 PFC テスト失敗 | 既存インターフェースを保持し extend のみ |
8. 参考文献・実装基準
- Tsodyks-Markram STP モデル: Tsodyks & Markram (1997), PNAS
- 海馬シャープウェーブリップル: Buzsáki (2015), Neuron
- 側坐核-VTA TD モデル: Schultz et al. (1997), Science
- ミラーニューロン: Rizzolatti & Craighero (2004), Annu. Rev. Neurosci.
- DMN & 自発活動: Raichle et al. (2001), PNAS
- Gabor/DoG 視覚前処理: Daugman (1985), JOSAA
- 睡眠Memory固定: Wilson & McNaughton (1994), Science
このドキュメントは Remaining_Functionality.md Section 11 および docs-dev/REMAINING_FEATURES.md の精査に基づいて策定されました。実装進捗に従い随時更新してください。
9. Phase A/B 統合記録(2026-03-06)
本セクションは、Section 11 完了後に実施した「最後のマイル」統合作業(Phase A/B)の記録です。
9.1 BrainSimulationFramework — biomimetic/ 全モジュール統合レイヤー
from evospikenet.brain_simulation import BrainSimulationFramework
framework = BrainSimulationFramework(enable_biomimetic=True)
result = framework.run_simulation(duration=1000) # 6段階: 発達・制御・STDP・エネルギー・海馬・睡眠
activities = await framework.run_idle_phase(duration_s=10.0) # DMN アイドルサイクル
status = framework.biomimetic_status() # 全モジュール状態スナップショット
内部ウォークスルー:
BrainSimulationFramework.run_simulation(t)
├─ ① DevelopmentalSchedule.plasticity_multiplier(t) ← biomimetic ✅
├─ ② NeuralCircuitModeler.simulate_timestep() ← Izhikevich 対応 (B-2) ✅
├─ ③ STDP × NeuromodulatorGate.gated_learning_rate() ← biomimetic (A-3) ✅
├─ ④ NodeEnergyBudget.energy_fitness_term() → weight 制御 ← biomimetic ✅
├─ ⑤ HippocampalBuffer.store(episode) ← biomimetic ✅
└─ ⑥ SleepConsolidation.offline_consolidation() ← biomimetic (A-4) ✅
9.2 Izhikevich バックエンド(B-2)
from evospikenet.brain_simulation import NeuralCircuitModeler, NeuralCircuitConfig
cfg = NeuralCircuitConfig(num_neurons=100, num_inputs=10, connectivity=0.2)
circuit = NeuralCircuitModeler(cfg, neuron_type="izhikevich")
spikes, membrane_v = circuit.simulate_timestep(input_current, t=0)
# 内部で IzhikevichNeuron.step(input, dt) を全ニューロンに呼び出す
9.3 CorticalTopologyGenerator → BrainRegionIntegrator(B-3)
from evospikenet.biomimetic import CorticalTopologyGenerator
from evospikenet.brain_simulation import BrainRegionIntegrator
gen = CorticalTopologyGenerator()
integrator = BrainRegionIntegrator()
added = integrator.add_cortical_topology(gen, nx_cols=4, ny_cols=4)
# 16 カラムが BrainRegionConfig として登録され、近隣 √2 mm 内で小世界的接続
9.4 STDP ⇔ NeuromodulatorGate(A-3)
from evospikenet.biomimetic import NeuromodulatorGate
from evospikenet.plasticity import STDP
gate = NeuromodulatorGate()
stdp = STDP.with_neuromodulation(gate) # ファクトリメソッド
# または
stdp.connect_plasticity_gate(gate) # 後付け接続
9.5 NeuromodulatorGate ⇔ NeuromodulatorRegistry(B-1)
from evospikenet.biomimetic import NeuromodulatorGate, NeuromodulatorRegistry
registry = NeuromodulatorRegistry()
gate = NeuromodulatorGate()
gate.connect_to_registry(registry) # 双方向ブリッジ確立
gate.push_to_registry() # Gate 状態 → Registry
gate.pull_from_registry() # Registry 値 → Gate state
9.6 テスト整備
| テストファイル | 内容 |
|---|---|
tests/unit/test_biomimetic_init_api.py |
__init__.py 全シンボル検証 |
tests/unit/test_stdp_neuromodulation.py |
STDP ⇔ Gate 配線 |
tests/unit/test_sleep_consolidation_stdp.py |
STDP リプレイ、offline_consolidation()、stats |
tests/unit/test_efference_copy_adaptive.py |
適応ゲイン、reset() |
tests/unit/test_mirror_neurons_default_classify.py |
_default_classify()、後方互換性 |
tests/integration/test_brain_simulation_biomimetic.py |
BrainSimulationFramework フル統合 |
tests/integration/test_dmn_idle_phase.py |
run_idle_phase()、DMN 停止確認 |
# Docker
docker compose -f docker-compose.test.yml --profile biomimetic run --rm biomimetic-test
10. Phase D — 分散ノード統合(2026-03-11)
本セクションは、生物模倣モジュールを
DistributedBrainNodeレベルで動作させるために実施した修正の記録です。
10.1 BrainSimulation エイリアスの追加
distributed_brain_node.py が from evospikenet.brain_simulation import BrainSimulation によりインポートしていたが、当該クラスが存在せず ImportError が発生していた。brain_simulation.py 末尾に BrainSimulation(BrainSimulationFramework) ラッパークラスを追加して解消した。
# evospikenet/brain_simulation.py(末尾に追記)
class BrainSimulation(BrainSimulationFramework):
"""DistributedBrainNode 互換エイリアス。"""
def __init__(self, node_id: str = "node", config: dict | None = None, **kwargs):
cfg = config or {}
circuit_config = NeuralCircuitConfig(num_neurons=int(cfg.get("neuron_count", 1000)))
super().__init__(circuit_config=circuit_config, **kwargs)
self.node_id = node_id
self.node_config = cfg
self.specialization: str = str(cfg.get("specialization", "general"))
10.2 InstantiatedBrain.apply_weight_delta()
STDP の apply_plasticity_update() は INT16 デルタテンソルを計算して返すが、実際の重みへの適用手段がなかった。InstantiatedBrain に apply_weight_delta() を追加して解消した。
# evospikenet/genome_to_brain.py — InstantiatedBrain クラスへの追加
def apply_weight_delta(self, module_name: str, delta: torch.Tensor,
learning_rate: float = 1e-4) -> None:
"""INT16 STDP デルタを nn.Linear 重みにインプレース適用する。"""
# delta / 32767 × lr でスケーリングし、形状が合う最初の Linear 層を更新
使用フロー:
delta = brain.apply_plasticity_update("pfc", spike_hist, syn_mat)
if delta is not None:
brain.apply_weight_delta("pfc", delta) # 重みへの即時反映
10.3 DistributedBrainNode.deploy_genome() と genome-driven forward pass
DistributedBrainNode がゲノムを受け取る仕組みがなく、素の BrainSimulation だけで動作していた。deploy_genome() メソッドを追加し、_process_brain_command() 内で InstantiatedBrain を経由した forward pass を行うように変更した。
def deploy_genome(self, genome) -> None:
"""EvoGenome を InstantiatedBrain としてノードに展開する。"""
from evospikenet.genome_to_brain import GenomeToBrainConverter
self.instantiated_brain = GenomeToBrainConverter().instantiate(genome)
10.4 DistributedEvolutionEngine.deploy_to_nodes()
進化エンジンから分散ノードへのブリッジが欠如していた。deploy_to_nodes(nodes) メソッドを追加した。
def deploy_to_nodes(self, nodes: list) -> None:
"""best_genome を DistributedBrainNode の一覧に一括展開する。"""
for node in nodes:
if hasattr(node, "deploy_genome") and self.best_genome is not None:
node.deploy_genome(self.best_genome)
10.5 変更ファイル一覧
| ファイル | 変更内容 |
|---|---|
evospikenet/brain_simulation.py |
BrainSimulation ラッパークラス追加 |
evospikenet/genome_to_brain.py |
InstantiatedBrain.apply_weight_delta() 追加 |
evospikenet/distributed_brain_node.py |
deploy_genome() + genome forward pass + get_stats() 更新 |
evospikenet/distributed_evolution_engine.py |
deploy_to_nodes() 追加 |