scripts/generate_banner.py (48 lines of code) (raw):
from collections import OrderedDict
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import rosen, rosen_der
from dict_minimize.numpy_api import minimize
def rosen_obj(params):
val = rosen(params["x"])
dval = OrderedDict()
dval["x"] = rosen_der(params["x"])
return val, dval
np.random.seed(0)
banner = False
lr = 0.05
X = np.arange(-2.0, 2.0, 0.005)
Y = np.arange(-1.2, 1.2, 0.005)
X, Y = np.meshgrid(X, Y)
XY = np.stack((X, Y), axis=-1)
assert XY.shape[-1] == 2
Z = np.zeros_like(X)
for ii in range(X.shape[0]):
for jj in range(X.shape[1]):
Z[ii, jj] = rosen(XY[ii, jj, :])
params0 = OrderedDict()
params0["x"] = np.array([-0.1, -1.0])
log = []
def callback(xk):
print(xk)
print(rosen_der(xk["x"]))
dr = rosen_der(xk["x"])
log.append([xk["x"][0], xk["x"][1], -lr * dr[0], -lr * dr[1]])
params = minimize(rosen_obj, params0, method="L-BFGS-B", options={"disp": False}, callback=callback)
levels = np.percentile(Z.ravel(), np.linspace(5, 95, 20))
if banner:
# For github README
fig = plt.figure(figsize=(6, 2), dpi=320)
else:
# for github social preview
fig = plt.figure(figsize=(4, 2), dpi=320)
ax = fig.add_axes([0, 0, 1, 1], frameon=False, xticks=[], yticks=[])
CS = plt.contour(X, Y, Z, levels=levels, zorder=0)
for xx, yy, dx, dy in log:
plt.arrow(xx, yy, dx, dy, zorder=1, color="silver")
xx, yy, dx, dy = zip(*log)
plt.plot(xx, yy, "r", zorder=2)
plt.plot(1, 1, "*", markersize=20, zorder=3)
plt.xticks(ticks=[])
plt.yticks(ticks=[])
plt.xlim(-1, 1.5)
plt.ylim(-0.5, 1.2)
plt.savefig("banner.png", dpi=320, pad_inches=0, bbox_inches="tight", transparent=False, format="png")