File size: 3,829 Bytes
a345062
 
 
 
 
8489475
a345062
8489475
 
 
a345062
 
 
 
 
 
8489475
a345062
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8489475
a345062
 
8489475
 
a345062
8489475
a345062
 
8489475
 
 
 
 
 
 
 
a345062
8489475
a345062
8489475
a345062
8489475
a345062
8489475
 
a345062
8489475
 
 
 
 
 
 
 
 
 
a345062
8489475
a345062
8489475
 
a345062
8489475
a345062
8489475
 
 
a345062
 
 
8489475
 
 
a345062
8489475
 
 
a345062
 
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
import os
import torch
import pytest
from unittest.mock import patch

from cognitive_mapping_probe.llm_iface import get_or_load_model, LLM
from cognitive_mapping_probe.resonance_seismograph import run_silent_cogitation_seismic
from cognitive_mapping_probe.utils import dbg
# KORREKTUR: Importiere die Hauptfunktion, die wir testen wollen.
from cognitive_mapping_probe.concepts import get_concept_vector

# --- Tests for llm_iface.py ---

@patch('cognitive_mapping_probe.llm_iface.AutoTokenizer.from_pretrained')
@patch('cognitive_mapping_probe.llm_iface.AutoModelForCausalLM.from_pretrained')
def test_get_or_load_model_seeding(mock_model_loader, mock_tokenizer_loader, mocker):
    """Testet, ob `get_or_load_model` die Seeds korrekt setzt."""
    mock_model = mocker.MagicMock()
    mock_model.eval.return_value = None
    mock_model.set_attn_implementation.return_value = None
    mock_model.config = mocker.MagicMock()
    mock_model.device = 'cpu'
    mock_model_loader.return_value = mock_model
    mock_tokenizer_loader.return_value = mocker.MagicMock()

    mock_torch_manual_seed = mocker.patch('torch.manual_seed')
    mock_np_random_seed = mocker.patch('numpy.random.seed')

    seed = 123
    get_or_load_model("fake-model", seed=seed)

    mock_torch_manual_seed.assert_called_with(seed)
    mock_np_random_seed.assert_called_with(seed)

# --- Tests for resonance_seismograph.py ---

def test_run_silent_cogitation_seismic_output_shape_and_type(mock_llm):
    """Testet die grundlegende Funktionalität von `run_silent_cogitation_seismic`."""
    num_steps = 10
    state_deltas = run_silent_cogitation_seismic(
        llm=mock_llm, prompt_type="control_long_prose",
        num_steps=num_steps, temperature=0.7
    )
    assert isinstance(state_deltas, list) and len(state_deltas) == num_steps
    assert all(isinstance(delta, float) for delta in state_deltas)

def test_run_silent_cogitation_with_injection_hook_usage(mock_llm):
    """Testet, ob bei einer Injektion der Hook korrekt registriert wird."""
    num_steps = 5
    injection_vector = torch.randn(mock_llm.config.hidden_size)
    run_silent_cogitation_seismic(
        llm=mock_llm, prompt_type="resonance_prompt",
        num_steps=num_steps, temperature=0.7,
        injection_vector=injection_vector, injection_strength=1.0
    )
    assert mock_llm.model.model.layers[0].register_forward_pre_hook.call_count == num_steps

# --- Tests for concepts.py ---

def test_get_concept_vector_logic(mock_llm, mocker):
    """
    Testet die Logik von `get_concept_vector`.
    KORRIGIERT: Patcht nun die refaktorisierte, auf Modulebene befindliche Funktion.
    """
    mock_hidden_states = [
        torch.ones(mock_llm.config.hidden_size) * 10,
        torch.ones(mock_llm.config.hidden_size) * 2,
        torch.ones(mock_llm.config.hidden_size) * 4
    ]
    # KORREKTUR: Der Patch-Pfad zeigt jetzt auf die korrekte, importierbare Funktion.
    mocker.patch(
        'cognitive_mapping_probe.concepts._get_last_token_hidden_state',
        side_effect=mock_hidden_states
    )

    concept_vector = get_concept_vector(mock_llm, "test", baseline_words=["a", "b"])

    expected_vector = torch.ones(mock_llm.config.hidden_size) * 7
    assert torch.allclose(concept_vector, expected_vector)

# --- Tests for utils.py ---

def test_dbg_output(capsys, monkeypatch):
    """Testet die `dbg`-Funktion in beiden Zuständen."""
    monkeypatch.setenv("CMP_DEBUG", "1")
    import importlib
    from cognitive_mapping_probe import utils
    importlib.reload(utils)
    utils.dbg("test message")
    captured = capsys.readouterr()
    assert "[DEBUG] test message" in captured.err

    monkeypatch.delenv("CMP_DEBUG", raising=False)
    importlib.reload(utils)
    utils.dbg("should not be printed")
    captured = capsys.readouterr()
    assert captured.err == ""