"""第 12 章：手工设置一个能表达 XOR 的网络；只用标准库。"""

from math import exp


def relu(value):
    return max(0.0, value)


def sigmoid(value):
    if value >= 0:
        return 1/(1+exp(-value))
    e = exp(value)
    return e/(1+e)


def forward(x1, x2):
    hidden = [relu(x1+x2), relu(x1+x2-1)]
    score = 12*(hidden[0]-2*hidden[1]-0.5)
    return hidden, sigmoid(score)


def main():
    for x1, x2 in [(0, 0), (0, 1), (1, 0), (1, 1)]:
        hidden, probability = forward(x1, x2)
        print(f"输入=({x1},{x2})，隐藏表示={hidden}，"
              f"类别1概率={probability:.4f}，预测={int(probability >= 0.5)}")
    parameters = (2*2+2)+(2*1+1)
    print(f"2→2→1 全连接网络的可调参数位置：{parameters}")


if __name__ == "__main__":
    main()
