|
|
import os |
|
|
import torch |
|
|
import pytest |
|
|
from unittest.mock import patch |
|
|
|
|
|
from cognitive_mapping_probe.llm_iface import get_or_load_model |
|
|
from cognitive_mapping_probe.resonance_seismograph import run_silent_cogitation_seismic |
|
|
from cognitive_mapping_probe.utils import dbg, DEBUG_ENABLED |
|
|
|
|
|
|
|
|
|
|
|
@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. |
|
|
Wir mocken hier die langsamen `from_pretrained`-Aufrufe. |
|
|
""" |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
|
|
|
def test_run_silent_cogitation_seismic_output_shape_and_type(mock_llm): |
|
|
""" |
|
|
Testet die Kernfunktion `run_silent_cogitation_seismic`. |
|
|
ASSERT: Gibt eine Liste von Floats zurück, deren Länge der Anzahl der Schritte entspricht. |
|
|
""" |
|
|
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) |
|
|
assert len(state_deltas) == num_steps |
|
|
assert all(isinstance(delta, float) for delta in state_deltas) |
|
|
assert all(delta >= 0 for delta in state_deltas) |
|
|
|
|
|
@pytest.mark.parametrize("num_steps", [0, 1, 100]) |
|
|
def test_run_silent_cogitation_seismic_num_steps(mock_llm, num_steps): |
|
|
""" |
|
|
Testet den Loop mit verschiedenen Anzahlen von Schritten. |
|
|
ASSERT: Die Länge der Ausgabe entspricht immer `num_steps`. |
|
|
""" |
|
|
state_deltas = run_silent_cogitation_seismic( |
|
|
llm=mock_llm, |
|
|
prompt_type="control_long_prose", |
|
|
num_steps=num_steps, |
|
|
temperature=0.7 |
|
|
) |
|
|
assert len(state_deltas) == num_steps |
|
|
|
|
|
|
|
|
|
|
|
def test_dbg_enabled(capsys): |
|
|
""" |
|
|
Testet die `dbg`-Funktion, wenn Debugging aktiviert ist. |
|
|
ASSERT: Die Nachricht wird auf stderr ausgegeben. |
|
|
""" |
|
|
|
|
|
os.environ["CMP_DEBUG"] = "1" |
|
|
|
|
|
|
|
|
import importlib |
|
|
from cognitive_mapping_probe import utils |
|
|
importlib.reload(utils) |
|
|
|
|
|
utils.dbg("test message", 123) |
|
|
|
|
|
captured = capsys.readouterr() |
|
|
assert "[DEBUG] test message 123" in captured.err |
|
|
|
|
|
def test_dbg_disabled(capsys): |
|
|
""" |
|
|
Testet die `dbg`-Funktion, wenn Debugging deaktiviert ist. |
|
|
ASSERT: Es wird keine Ausgabe erzeugt. |
|
|
""" |
|
|
|
|
|
if "CMP_DEBUG" in os.environ: |
|
|
del os.environ["CMP_DEBUG"] |
|
|
|
|
|
import importlib |
|
|
from cognitive_mapping_probe import utils |
|
|
importlib.reload(utils) |
|
|
|
|
|
utils.dbg("this should not be printed") |
|
|
|
|
|
captured = capsys.readouterr() |
|
|
assert captured.out == "" |
|
|
assert captured.err == "" |
|
|
|
|
|
|
|
|
if DEBUG_ENABLED: |
|
|
os.environ["CMP_DEBUG"] = "1" |
|
|
importlib.reload(utils) |
|
|
|