File size: 6,921 Bytes
cbc33fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
"""
Unit tests for src/diversity.py.  Run: python3 -m pytest src/test_diversity.py -q
                                  or: python3 src/test_diversity.py
"""
import numpy as np

from diversity import (
    cosine_kernel,
    greedy_diverse_subset,
    l2_normalize,
    logdet_volume,
    marginal_contributions,
    pairwise_deviation,
    zscore,
)

RNG = np.random.default_rng(0)


def _orth(G, d):
    """G mutually orthonormal rows in R^d."""
    Q, _ = np.linalg.qr(RNG.standard_normal((d, G)))
    return Q.T[:G]


# ---------------------------------------------------------------- deviation
def test_deviation_duplicates_are_zero():
    """Exact duplicates: every pair distance is 0, so d_i == 0 for all."""
    e = l2_normalize(RNG.standard_normal((1, 32)))
    E = np.repeat(e, 8, axis=0)
    d = pairwise_deviation(E)
    assert np.allclose(d, 0.0, atol=1e-9), d


def test_deviation_orthogonal_is_one():
    """Orthogonal rows: cos = 0 for every pair, so d_i == 1 exactly."""
    E = _orth(8, 64)
    d = pairwise_deviation(E)
    assert np.allclose(d, 1.0, atol=1e-9), d


def test_deviation_singleton_and_empty():
    assert pairwise_deviation(np.zeros((1, 8))).shape == (1,)
    assert pairwise_deviation(np.zeros((1, 8)))[0] == 0.0
    assert pairwise_deviation(np.zeros((0, 8))).shape == (0,)


def test_deviation_flags_the_odd_one_out():
    """7 near-identical + 1 far: the outlier must have the highest d_i."""
    base = l2_normalize(RNG.standard_normal((1, 64)))
    tight = l2_normalize(np.repeat(base, 7, axis=0) + 0.01 * RNG.standard_normal((7, 64)))
    far = l2_normalize(RNG.standard_normal((1, 64)))
    E = np.vstack([tight, far])
    d = pairwise_deviation(E)
    assert d.argmax() == 7, d


# ------------------------------------------------------- marginal / logdet
def test_marginal_duplicate_is_large_negative():
    """A duplicated direction is already spanned -> dropping one costs ~nothing,
    so the PRESENT duplicate's marginal is driven to ~log(eps), very negative."""
    e = l2_normalize(RNG.standard_normal((1, 32)))
    E = np.vstack([np.repeat(e, 2, axis=0), _orth(4, 32)])
    m = marginal_contributions(E)
    # the two duplicates (rows 0,1) are the least valuable members
    assert m[0] < -3.0 and m[1] < -3.0, m
    assert m[:2].max() < m[2:].min(), m


def test_marginal_orthogonal_is_near_zero_and_uniform():
    """Orthonormal rows: L = (1+eps)I, dropping any row costs log(1+eps) ~ 0.
    'High m_i for all' in the sense of at-ceiling and symmetric."""
    E = _orth(8, 64)
    m = marginal_contributions(E)
    assert np.allclose(m, m[0], atol=1e-9), m
    assert abs(m[0] - np.log1p(1e-3)) < 1e-6, m[0]


def test_marginal_is_bounded_above_by_zero_ish():
    """logdet is monotone under adding a row with unit norm + jitter, so
    m_i can never exceed log(1+eps)."""
    E = l2_normalize(RNG.standard_normal((12, 64)))
    m = marginal_contributions(E)
    assert m.max() <= np.log1p(1e-3) + 1e-9, m.max()


def test_logdet_ordering_dup_lt_spread_lt_orthogonal():
    e = l2_normalize(RNG.standard_normal((1, 64)))
    dup = np.repeat(e, 8, axis=0)
    spread = l2_normalize(RNG.standard_normal((8, 64)))
    orth = _orth(8, 64)
    assert logdet_volume(dup) < logdet_volume(spread) < logdet_volume(orth)


def test_kernel_is_psd_even_with_duplicates():
    e = l2_normalize(RNG.standard_normal((1, 16)))
    L = cosine_kernel(np.repeat(e, 6, axis=0))
    assert np.linalg.eigvalsh(L).min() > 0, "jitter failed to make L PD"
    assert np.isfinite(logdet_volume(np.repeat(e, 6, axis=0)))


# --------------------------------------- THE E1-vs-E2 HYPOTHESIS, AS A TEST
def test_two_clusters_fool_deviation_but_not_logdet():
    """This is the claim E2 rests on, so it gets asserted rather than assumed.

    Config A: two tight antipodal clusters of 4 (rank ~2, 'diverse' only in
              the sense that half the samples are far from the other half).
    Config B: 8 genuinely spread directions (rank ~8).

    Pairwise deviation cannot tell these apart -- mean pairwise distance for A
    is actually HIGHER, because antipodal pairs sit at cos = -1. Log-det sees
    straight through it: A occupies a 2-dimensional subspace.
    """
    u, v = _orth(2, 64)
    jit = 0.01
    A = l2_normalize(np.vstack([
        np.repeat(u[None], 4, axis=0) + jit * RNG.standard_normal((4, 64)),
        np.repeat(-u[None], 4, axis=0) + jit * RNG.standard_normal((4, 64)),
    ]))
    B = _orth(8, 64)

    dev_A, dev_B = pairwise_deviation(A).mean(), pairwise_deviation(B).mean()
    vol_A, vol_B = logdet_volume(A), logdet_volume(B)

    # deviation RANKS THE DEGENERATE SET HIGHER -- the failure mode, reproduced
    assert dev_A > dev_B, (dev_A, dev_B)
    # log-det correctly ranks the spread set far higher
    assert vol_B > vol_A + 10.0, (vol_A, vol_B)

    # and per-sample: in A every member is redundant (its twin covers it),
    # so marginal contributions are uniformly terrible
    assert marginal_contributions(A).max() < -3.0
    assert marginal_contributions(B).min() > -1e-3
    _ = v  # second basis vector unused, kept for clarity of construction


# ------------------------------------------------------------------ zscore
def test_zscore_constant_input_is_zeros_not_nan():
    """A constant reward column must degrade to 0, never NaN -- otherwise it
    poisons the whole advantage tensor."""
    z = zscore(np.full(8, 3.7))
    assert np.all(np.isfinite(z)) and np.allclose(z, 0.0)


def test_zscore_standardizes():
    z = zscore(RNG.standard_normal(64))
    assert abs(z.mean()) < 1e-9 and abs(z.std() - 1.0) < 1e-9


# ------------------------------------------------------------ greedy subset
def test_greedy_avoids_duplicates_when_quality_is_flat():
    """With flat quality, selection is pure logdet: must not pick both dupes."""
    e = l2_normalize(RNG.standard_normal((1, 64)))
    E = np.vstack([np.repeat(e, 3, axis=0), _orth(3, 64)])  # rows 0,1,2 identical
    sel = greedy_diverse_subset(np.ones(6), E, k=3, lam=1.0)
    assert len(sel) == 3
    assert len(set(sel) & {0, 1, 2}) <= 1, sel


def test_greedy_respects_quality_when_lambda_is_zero():
    E = l2_normalize(RNG.standard_normal((10, 64)))
    q = np.arange(10, dtype=float)
    sel = greedy_diverse_subset(q, E, k=3, lam=0.0)
    assert sorted(sel) == [7, 8, 9], sel


def test_greedy_k_larger_than_pool():
    E = l2_normalize(RNG.standard_normal((3, 32)))
    assert len(greedy_diverse_subset(np.ones(3), E, k=8)) == 3


if __name__ == "__main__":
    import sys, traceback
    fns = [(n, f) for n, f in sorted(globals().items())
           if n.startswith("test_") and callable(f)]
    bad = 0
    for n, f in fns:
        try:
            f()
            print(f"  PASS  {n}")
        except Exception:
            bad += 1
            print(f"  FAIL  {n}")
            traceback.print_exc()
    print(f"\n{len(fns)-bad}/{len(fns)} passed")
    sys.exit(1 if bad else 0)