from math import log

epsilon = 0.2

def clipped_objective(ratio, advantage):
    clipped_ratio = min(1 + epsilon, max(1 - epsilon, ratio))
    return min(ratio * advantage, clipped_ratio * advantage)

for ratio in (0.6, 0.8, 1.0, 1.2, 1.4):
    positive = clipped_objective(ratio, 2.0)
    negative = clipped_objective(ratio, -2.0)
    print(f"r={ratio:.1f}: A=+2 -> {positive:.1f}, A=-2 -> {negative:.1f}")

old = [0.5, 0.5]
new = [0.9, 0.1]
assert abs(sum(old) - 1) < 1e-12
assert abs(sum(new) - 1) < 1e-12
ratio = new[0] / old[0]
kl = sum(p * log(p / q) for p, q in zip(old, new))
assert ratio > 1 + epsilon
assert abs(clipped_objective(ratio, 1.0) - 1.2) < 1e-12
assert kl > 0.5
print(f"candidate_ratio={ratio:.2f}, objective={clipped_objective(ratio, 1):.2f}")
print(f"KL(old||new)={kl:.6f} nats")
