"""附录数学核对：稳定概率、均方误差梯度、离散期望；仅标准库。"""

from math import exp, log


def logsumexp(values):
    largest = max(values)
    return largest + log(sum(exp(v - largest) for v in values))


def cross_entropy(logits, label):
    return logsumexp(logits) - logits[label]


def softmax(logits):
    shifted = [exp(z - max(logits)) for z in logits]
    total = sum(shifted)
    return [v / total for v in shifted]


def mse(weights, bias, inputs, targets):
    return sum((sum(a * b for a, b in zip(row, weights)) + bias - y) ** 2
               for row, y in zip(inputs, targets)) / len(inputs)


def main():
    z = [1000.0, 1001.0, 999.0]
    p = softmax(z)
    gradient = [v - int(j == 1) for j, v in enumerate(p)]
    eps = 1e-4
    finite = []
    for j in range(len(z)):
        plus, minus = z.copy(), z.copy()
        plus[j] += eps
        minus[j] -= eps
        finite.append((cross_entropy(plus, 1) - cross_entropy(minus, 1)) / (2 * eps))
    assert max(abs(a - b) for a, b in zip(gradient, finite)) < 1e-8
    outcomes, probabilities = [0, 1, 2], [0.25, 0.5, 0.25]
    mean = sum(x * q for x, q in zip(outcomes, probabilities))
    variance = sum((x - mean) ** 2 * q for x, q in zip(outcomes, probabilities))
    x, w, y = [[10, 2], [4, 6], [8, 0]], [3.0, 5.0], [62, 60, 45]
    residual = [sum(a * b for a, b in zip(row, w)) + 20 - t for row, t in zip(x, y)]
    dw = [2 * sum(row[j] * e for row, e in zip(x, residual)) / len(x) for j in range(2)]
    print("稳定 softmax：", [round(v, 6) for v in p])
    print(f"真实类别为 1 时的交叉熵：{cross_entropy(z, 1):.6f}")
    print("交叉熵梯度：", [round(v, 6) for v in gradient])
    print("中心差分核对：通过")
    print("打印例子的权重梯度：", [round(v, 6) for v in dw])
    print(f"离散例子的期望：{mean:.3f}，方差：{variance:.3f}")


if __name__ == "__main__":
    main()
