File size: 2,497 Bytes
b9301f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Speech-lock repairs: no unigram broadcast, soup not re-ingested."""

from __future__ import annotations

import inspect
import unittest

import torch

from src.atom_native import AtomNativeModel, AtomSurfaceHead
from src.io.atomizer import Atomizer
from src.speech_lock import format_dialogue_prompt, speech_ok


class SpeechLockUnitTests(unittest.TestCase):
    def test_dialogue_wrap(self) -> None:
        self.assertEqual(
            format_dialogue_prompt("Bonjour"),
            "Utilisateur: Bonjour\nAssistant:",
        )
        self.assertIn("Assistant:", format_dialogue_prompt("Utilisateur: Hi\nAssistant:"))

    def test_speech_ok_rejects_attractor_soup(self) -> None:
        self.assertFalse(speech_ok(b""))
        self.assertFalse(speech_ok(b"auiseateu : aernun e"))
        self.assertFalse(speech_ok(b"asssuatiur:i derouin"))
        self.assertTrue(speech_ok(b"Salut"))
        self.assertTrue(speech_ok(b"Je suis la."))

    def test_payload_copy_is_position_aligned_not_broadcast(self) -> None:
        torch.manual_seed(0)
        head = AtomSurfaceHead(d_model=8, max_payload_bytes=8, n_modes=8)
        a_only = torch.ones(16)
        a_hat = a_only / a_only.norm().clamp_min(1e-8)
        byte_logits, _ = head.payload_produce(
            [b"abc"],
            a_hat,
            a_only,
            atom_energies=[1.0],
        )
        aligned = "No unigram broadcast" in inspect.getsource(head.payload_produce)
        if not aligned:
            self.skipTest("run python3 scripts/apply_speech_lock.py")
        self.assertGreater(
            float(byte_logits[0, ord("a")]),
            float(byte_logits[3, ord("a")]),
        )


class SpeechGenerateTests(unittest.TestCase):
    def test_generate_does_not_commit_soup(self) -> None:
        sig = inspect.signature(AtomNativeModel.generate_packets)
        if "speech_gate" not in sig.parameters:
            self.skipTest("run python3 scripts/apply_speech_lock.py")
        model = AtomNativeModel(
            d_model=8,
            n_modes=8,
            n_atoms_max=32,
            max_payload_bytes=8,
            atomizer=Atomizer(max_span_bytes=8),
        )
        model.eval()
        raw = model.generate_packets(
            "Bonjour",
            max_packets=4,
            deterministic=True,
            payload_copy=False,
            dialogue_wrap=True,
            speech_gate=True,
        )
        self.assertNotIn(b"auiseateu", raw)


if __name__ == "__main__":
    unittest.main()