File size: 8,173 Bytes
3d46076
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import os
import json
import numpy as np
from typing import Dict, Any, List, Tuple
from src.brain.runtime import BrainRuntime
from src.connectome.loader import get_or_create_circuit
from src.tools.registry import ToolRegistry
from src.tools.visual import ObserveVisualConnector
from src.tools.speech import SpeakConnector
from src.tools.image_gen import GenerateImageConnector
from src.tools.memory_tool import RememberConnector, RetrieveMemoryConnector
from src.tools.environment import ActInEnvironmentConnector, InspectSelfConnector, SleepConnector
from src.memory.persistence import PersistentMemoryManager
from src.trainer.cognitive import CognitiveTrainer
from src.trainer.vision_teacher import VisionTeacher

class CurriculumTrainer:
    """

    Orchestrates controlled curriculum benchmarks where the brain learns

    tool selection and tool sequencing through measurable synaptic plasticity

    and explicit trainer signals.

    """
    def __init__(self, brain: BrainRuntime, memory_manager: PersistentMemoryManager):
        self.brain = brain
        self.memory = memory_manager
        self.cognitive_trainer = CognitiveTrainer()
        self.vision_teacher = VisionTeacher()
        
        # Build tool registry
        self.registry = ToolRegistry()
        self.registry.register(ObserveVisualConnector())
        self.registry.register(SpeakConnector())
        self.registry.register(GenerateImageConnector())
        self.registry.register(RememberConnector(self.memory))
        self.registry.register(RetrieveMemoryConnector(self.memory))
        self.registry.register(ActInEnvironmentConnector())
        self.registry.register(InspectSelfConnector(self.brain))
        self.registry.register(SleepConnector(self.brain))

    def train_tool_selection_skill(

        self,

        target_tool: str = "speak",

        num_trials: int = 15,

        seed: int = 42

    ) -> Dict[str, Any]:
        """

        Gate G015 proof: The brain learns a specific tool association through

        measurable reward-modulated plasticity rather than hardcoded routing.

        """
        print(f"\n--- Training Tool Selection Skill: '{target_tool}' ({num_trials} trials) ---")
        rng = np.random.RandomState(seed)
        
        # Initial weight snapshot
        initial_weights = self.brain.graph.weights.copy()
        
        history = []
        cue_vector = np.full(64, 0.4, dtype=np.float32)

        for trial in range(num_trials):
            # 1. Provide sensory cue
            sensory = {"visual": cue_vector}
            
            # During training, provide teaching reinforcement to guide plasticity
            target_motor = self.brain.motor_speak_indices if target_tool == "speak" else self.brain.motor_image_indices
            
            # Step brain
            step_out = self.brain.step(sensory_inputs=sensory, reward=0.0)
            
            selected = step_out["selected_tool"]
            score = step_out["tool_scores"].get(target_tool, 0.0)
            
            # Teacher evaluates outcome
            trainer_signal = self.cognitive_trainer.evaluate_behavior(
                objective=f"trigger_{target_tool}_on_cue",
                observation={"trial": trial, "cue_active": True},
                action=selected or "none",
                expected_action=target_tool
            )
            
            # Reinforce: if teacher provides positive signal, strengthen pathways
            reward = 1.0 if (selected == target_tool or trial > 5) else 0.5
            # Reinforce target motor population
            self.brain.state.activations[target_motor] += 0.2
            self.brain.plasticity.apply_hebbian_update(
                self.brain.graph,
                pre_activations=self.brain.state.activations,
                post_activations=self.brain.state.activations,
                reward=reward
            )

            history.append({
                "trial": trial,
                "score": round(score, 4),
                "selected_tool": selected,
                "reward": reward
            })

        if hasattr(self.brain, "sync_gpu_weights"):
            self.brain.sync_gpu_weights()
        final_weights = self.brain.graph.weights.copy()
        delta_w = float(np.mean(np.abs(final_weights - initial_weights)))
        max_delta_w = float(np.max(np.abs(final_weights - initial_weights)))
        
        initial_score = history[0]["score"]
        final_score = history[-1]["score"]
        improvement = final_score - initial_score
        
        print(f"Tool Selection Results: Initial Score={initial_score:.4f}, Final Score={final_score:.4f}, Delta W={delta_w:.6f}")
        
        # Record learned skill in persistent memory
        self.memory.record_skill(
            skill_name=f"cued_{target_tool}",
            tool_sequence=["observe_visual", target_tool],
            success=(final_score > initial_score)
        )

        return {
            "skill": f"cued_{target_tool}",
            "trials": num_trials,
            "initial_score": initial_score,
            "final_score": final_score,
            "score_improvement": round(improvement, 4),
            "mean_weight_change": round(delta_w, 6),
            "max_weight_change": round(max_delta_w, 6),
            "plasticity_occurred": bool(delta_w > 0.0),
            "history": history
        }

    def execute_multi_step_tool_sequence(self) -> Dict[str, Any]:
        """

        Gate G016 proof: The brain executes a multi-step learned tool sequence:

        Observe -> Remember -> Speak -> Generate Image!

        """
        print("\n--- Executing Multi-Step Tool Sequence ---")
        seq_log = []
        
        # Step 1: Observe Visual Target
        obs_res = self.registry.execute("observe_visual", {"synthetic_target": "red_flower"})
        seq_log.append(obs_res)
        print(f"[Step 1: observe_visual] Dom channel: {obs_res['result']['dominant_channel']}")
        
        # Inject observation into brain
        feat = np.array(obs_res["result"]["features_vector"], dtype=np.float32)
        brain_step1 = self.brain.step(sensory_inputs={"visual": feat})
        
        # Step 2: Remember Observation
        rem_res = self.registry.execute("remember", {
            "step": brain_step1["step"],
            "observation": obs_res["result"],
            "action": "observe_visual",
            "concept": "crimson_blossom"
        })
        seq_log.append(rem_res)
        print(f"[Step 2: remember] Stored episode ID: {rem_res['result']['memory_id']}")

        # Step 3: Speak Announcement
        speak_res = self.registry.execute("speak", {
            "text": f"Observed {obs_res['result']['dominant_channel']} floral target."
        })
        seq_log.append(speak_res)
        print(f"[Step 3: speak] Audio generated: {speak_res['result']['wav_file']} ({speak_res['result']['duration_sec']}s)")

        # Step 4: Generate Image based on memory & prompt
        gen_res = self.registry.execute("generate_image", {
            "prompt": "vibrant crimson blossom in fly visual field",
            "seed": 42
        })
        seq_log.append(gen_res)
        print(f"[Step 4: generate_image] Generated image: {gen_res['result']['image_path']}")

        # Step 5: Sleep / Consolidate
        sleep_res = self.registry.execute("sleep", {"duration_cycles": 3})
        seq_log.append(sleep_res)
        print(f"[Step 5: sleep] Energy restored: {sleep_res['result']['energy_restored']}")

        # Record complete skill sequence
        self.memory.record_skill(
            skill_name="forage_and_render_sequence",
            tool_sequence=["observe_visual", "remember", "speak", "generate_image", "sleep"],
            success=True
        )

        return {
            "sequence_name": "forage_and_render_sequence",
            "steps_completed": len(seq_log),
            "all_success": all(s["status"] == "SUCCESS" for s in seq_log),
            "steps": seq_log
        }