# Educational example from Sarovi journal. Python 3; no extra dependencies.
def loss(w):
    return (w - 3) ** 2

def train(rate, steps=100):
    w = 0.0
    costs = [loss(w)]
    for _ in range(steps):
        w -= rate * 2 * (w - 3)
        costs.append(loss(w))
    return w, costs

w, costs = train(.1)
assert abs(w - 3) < 1e-8
assert all(b <= a for a, b in zip(costs, costs[1:]))
print("weight:", w, "cost:", costs[-1])
print("rate=1:", train(1, 4))
