File size: 7,129 Bytes
c8fa89c
 
8049238
 
8b7e088
b350371
760155b
b9b7087
eef89e3
094008d
c8fa89c
024ef47
c8fa89c
024ef47
3bdc105
094008d
 
 
 
 
 
 
 
 
64ad029
024ef47
4478774
094008d
 
d6b73ac
094008d
16e19a3
8a082d7
 
 
 
 
d6b73ac
094008d
 
 
 
8a082d7
094008d
 
 
 
 
8a082d7
094008d
8a082d7
094008d
8a082d7
 
094008d
bca8f87
094008d
2a78f31
094008d
 
 
 
64ad029
905c230
64ad029
21e8595
024ef47
 
09d65a8
 
 
 
 
 
 
 
d6b73ac
09d65a8
 
 
 
d6b73ac
09d65a8
 
 
 
 
 
 
 
 
 
 
 
c8fa89c
024ef47
57dab07
024ef47
 
 
5cfb8a3
024ef47
 
760155b
d6b73ac
 
760155b
 
024ef47
d6b73ac
024ef47
 
8a082d7
 
395b2f3
024ef47
 
d6b73ac
024ef47
 
 
395b2f3
024ef47
c8fa89c
760155b
5cfb8a3
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
import gradio as gr
import pandas as pd
import gc
import torch
import json

from cognitive_mapping_probe.orchestrator_seismograph import run_seismic_analysis
from cognitive_mapping_probe.auto_experiment import run_auto_suite, get_curated_experiments
from cognitive_mapping_probe.prompts import RESONANCE_PROMPTS
from cognitive_mapping_probe.utils import dbg, cleanup_memory

theme = gr.themes.Soft(primary_hue="indigo", secondary_hue="blue").set(body_background_fill="#f0f4f9", block_background_fill="white")

def run_single_analysis_display(*args, progress=gr.Progress(track_tqdm=True)):
    """Wrapper für den 'Manual Single Run'-Tab."""
    try:
        results = run_seismic_analysis(*args, progress_callback=progress)
        stats, deltas = results.get("stats", {}), results.get("state_deltas", [])
        df = pd.DataFrame({"Internal Step": range(len(deltas)), "State Change (Delta)": deltas})
        stats_md = f"### Statistical Signature\n- **Mean Delta:** {stats.get('mean_delta', 0):.4f}\n- **Std Dev Delta:** {stats.get('std_delta', 0):.4f}\n- **Max Delta:** {stats.get('max_delta', 0):.4f}\n"
        serializable_results = json.dumps(results, indent=2, default=str)
        return f"{results.get('verdict', 'Error')}\n\n{stats_md}", df, serializable_results
    finally:
        cleanup_memory()

def run_auto_suite_display(model_id, num_steps, seed, experiment_name, progress=gr.Progress(track_tqdm=True)):
    """Wrapper, der die speziellen Plots für die verschiedenen Experimente handhaben kann."""
    try:
        summary_df, plot_df, all_results = run_auto_suite(model_id, int(num_steps), int(seed), experiment_name, progress)
        
        dataframe_component = gr.DataFrame(label="Comparative Statistical Signature", value=summary_df, wrap=True, row_count=(len(summary_df), "dynamic"))

        # FINALE KORREKTUR: Robuste Plot-Parameter-Logik
        plot_params = {
            "title": "Comparative Cognitive Dynamics",
            "color_legend_position": "bottom", "show_label": True, "height": 400, "interactive": True
        }
        
        if experiment_name == "ACT Titration (Point of No Return)":
            plot_params.update({
                "x": "Patch Step", "y": "Post-Patch Mean Delta", "color": None,
                "title": "Attractor Capture Time (ACT) - Phase Transition", "mark": "line",
                "color_legend_title": None,
            })
        elif experiment_name == "Mechanistic Probe (Attention Entropies)":
            plot_params.update({
                "x": "Step", "y": "Value", "color": "Metric",
                "title": "Mechanistic Analysis: State Delta vs. Attention Entropy",
                "color_legend_title": "Metric",
            })
        else: # Default für alle anderen Multi-Lauf-Experimente
            plot_params.update({
                 "x": "Step", "y": "Delta", "color": "Experiment",
                 "color_legend_title": "Experiment Runs",
            })

        new_plot = gr.LinePlot(value=plot_df, **plot_params)

        serializable_results = json.dumps(all_results, indent=2, default=str)
        return dataframe_component, new_plot, serializable_results
    finally:
        cleanup_memory()

with gr.Blocks(theme=theme, title="Cognitive Seismograph 2.3") as demo:
    gr.Markdown("# 🧠 Cognitive Seismograph 2.3: Advanced Experiment Suite")

    with gr.Tabs():
        with gr.TabItem("🔬 Manual Single Run"):
            gr.Markdown("Run a single experiment with manual parameters to explore specific hypotheses.")
            with gr.Row(variant='panel'):
                with gr.Column(scale=1):
                    gr.Markdown("### 1. General Parameters")
                    manual_model_id = gr.Textbox(value="google/gemma-3-1b-it", label="Model ID")
                    manual_prompt_type = gr.Radio(choices=list(RESONANCE_PROMPTS.keys()), value="resonance_prompt", label="Prompt Type")
                    manual_seed = gr.Slider(1, 1000, 42, step=1, label="Seed")
                    manual_num_steps = gr.Slider(50, 1000, 300, step=10, label="Number of Internal Steps")
                    
                    gr.Markdown("### 2. Modulation Parameters")
                    manual_concept = gr.Textbox(label="Concept to Inject", placeholder="e.g., 'calmness'")
                    manual_strength = gr.Slider(0.0, 5.0, 1.5, step=0.1, label="Injection Strength")
                    manual_run_btn = gr.Button("Run Single Analysis", variant="primary")
                
                with gr.Column(scale=2):
                    gr.Markdown("### Single Run Results")
                    manual_verdict = gr.Markdown("Analysis results will appear here.")
                    manual_plot = gr.LinePlot(x="Internal Step", y="State Change (Delta)", title="Internal State Dynamics", show_label=True, height=400)
                    with gr.Accordion("Raw JSON Output", open=False):
                        manual_raw_json = gr.JSON()

            manual_run_btn.click(
                fn=run_single_analysis_display,
                inputs=[manual_model_id, manual_prompt_type, manual_seed, manual_num_steps, manual_concept, manual_strength],
                outputs=[manual_verdict, manual_plot, manual_raw_json]
            )

        with gr.TabItem("🚀 Automated Suite"):
            gr.Markdown("Run a predefined, curated suite of experiments and visualize the results comparatively.")
            with gr.Row(variant='panel'):
                with gr.Column(scale=1):
                    gr.Markdown("### Auto-Experiment Parameters")
                    auto_model_id = gr.Textbox(value="google/gemma-3-1b-it", label="Model ID")
                    auto_num_steps = gr.Slider(50, 1000, 300, step=10, label="Steps per Run")
                    auto_seed = gr.Slider(1, 1000, 42, step=1, label="Seed")
                    auto_experiment_name = gr.Dropdown(
                        choices=list(get_curated_experiments().keys()), 
                        value="Causal Verification & Crisis Dynamics", 
                        label="Curated Experiment Protocol"
                    )
                    auto_run_btn = gr.Button("Run Curated Auto-Experiment", variant="primary")
                
                with gr.Column(scale=2):
                    gr.Markdown("### Suite Results Summary")
                    # Initialisiere den Plot mit den Default-Parametern
                    auto_plot_output = gr.LinePlot(x="Step", y="Delta", color="Experiment", title="Comparative Cognitive Dynamics")
                    auto_summary_df = gr.DataFrame(label="Comparative Statistical Signature", wrap=True)
                    with gr.Accordion("Raw JSON for all runs", open=False):
                        auto_raw_json = gr.JSON()
            
            auto_run_btn.click(
                fn=run_auto_suite_display,
                inputs=[auto_model_id, auto_num_steps, auto_seed, auto_experiment_name],
                outputs=[auto_summary_df, auto_plot_output, auto_raw_json]
            )

if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0", server_port=7860, debug=True)