File size: 1,668 Bytes
eaeea8f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Tests for Token Information State Module.
"""

import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import torch
import pytest
from src.information_state import TokenInformationState


def test_information_state_shape_and_range():
    d_model = 64
    n_heads = 4
    engine = TokenInformationState(d_model=d_model, n_heads=n_heads)

    batch_size = 2
    seq_len = 16
    x = torch.randn(batch_size, seq_len, d_model)
    attn = torch.softmax(torch.randn(batch_size, n_heads, seq_len, seq_len), dim=-1)

    z_t = engine(x, attn_weights=attn)

    assert z_t.shape == (batch_size, seq_len, 8), f"Expected (2, 16, 8), got {z_t.shape}"
    # Values should be normalized to [0, 1]
    assert z_t.min() >= 0.0, f"Min value {z_t.min()} < 0.0"
    assert z_t.max() <= 1.0, f"Max value {z_t.max()} > 1.0"
    print("✓ test_information_state_shape_and_range passed")


def test_information_state_ablation():
    engine = TokenInformationState(d_model=32, n_heads=2)
    x = torch.randn(1, 8, 32)

    # Disable predictive_entropy
    engine.set_ablation("predictive_entropy", False)
    z_t = engine(x)

    pred_idx = engine.FEATURE_NAMES.index("predictive_entropy")
    assert (z_t[:, :, pred_idx] == 0.0).all(), "Ablated feature should be zero"

    # Reset
    engine.reset_ablation()
    z_t_reset = engine(x)
    assert (z_t_reset[:, :, pred_idx] > 0.0).any(), "Reset feature should be restored"
    print("✓ test_information_state_ablation passed")


if __name__ == "__main__":
    test_information_state_shape_and_range()
    test_information_state_ablation()
    print("All Information State tests passed!")