import math

def sigmoid(z):
    if z >= 0:
        return 1/(1+math.exp(-z))
    ez = math.exp(z)
    return ez/(1+ez)

print([round(sigmoid(-2+1.5*x), 6) for x in [0, 1, 2]])
x, y, w, b, rate = 2.0, 1.0, 0.5, -1.0, 0.1
p0 = sigmoid(w*x+b)
gw, gb = (p0-y)*x, p0-y
w1, b1 = w-rate*gw, b-rate*gb
p1 = sigmoid(w1*x+b1)
print('new weights', w1, b1)
print('p before/after', p0, round(p1, 6))
print('loss before/after', round(-math.log(p0), 6), round(-math.log(p1), 6))
assert abs(w1-0.6) < 1e-12 and abs(b1+0.95) < 1e-12
assert abs(p1-0.5621765008857981) < 1e-12
assert sigmoid(-1000) == 0.0 and sigmoid(1000) == 1.0
