File size: 2,422 Bytes
990895d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Unit tests for pure stats math fixtures."""

from app.stats_math import by_remedy, data_thin, server_picks


def _entries() -> list[dict]:
    # remedy "walk": 4 worked, 1 failed => n=5, p_helped=0.8
    # remedy "nap": 2 partial, 1 failed, 2 pending => scored n=3 (below min_n=5)
    rows = []
    for _ in range(4):
        rows.append(
            {
                "remedy": " Walk ",
                "result": "worked",
                "emotions": ["calm"],
                "tags": ["rerun"],
                "intensity": 5,
            }
        )
    rows.append(
        {
            "remedy": "walk",
            "result": "failed",
            "emotions": ["shame"],
            "tags": ["urge"],
            "intensity": 8,
        }
    )
    for _ in range(2):
        rows.append(
            {
                "remedy": "nap",
                "result": "partial",
                "emotions": ["tired"],
                "tags": ["home"],
                "intensity": 2,
            }
        )
    rows.append(
        {
            "remedy": "nap",
            "result": "failed",
            "emotions": ["tired"],
            "tags": ["home"],
            "intensity": 2,
        }
    )
    rows.append(
        {
            "remedy": "nap",
            "result": "pending",
            "emotions": ["tired"],
            "tags": ["home"],
            "intensity": 2,
        }
    )
    rows.append(
        {
            "remedy": "nap",
            "result": "pending",
            "emotions": ["tired"],
            "tags": ["home"],
            "intensity": 2,
        }
    )
    return rows


def test_p_helped_and_rank() -> None:
    rows = by_remedy(_entries(), min_n=5, shrink_k=3)
    assert len(rows) == 1
    walk = rows[0]
    assert walk["key"] == "walk"
    assert walk["n"] == 5
    assert walk["p_worked"] == 0.8
    assert walk["p_helped"] == 0.8
    assert abs(walk["rank"] - (0.8 * 5 / 8)) < 1e-9


def test_data_thin() -> None:
    assert data_thin(9) is True
    assert data_thin(10) is False


def test_server_picks_tag_boost() -> None:
    picks = server_picks(
        _entries(),
        ["rerun"],
        min_n=5,
        shrink_k=3,
        match_alpha=0.5,
    )
    assert len(picks) == 1
    assert picks[0]["remedy_key"] == "walk"
    assert picks[0]["match"] == 1.0
    expected = (0.8 * 5 / 8) * (1 + 0.5 * 1.0)
    assert abs(picks[0]["pick"] - expected) < 1e-9