import numpy as np
y = np.a
ay([ XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX])
y = y.reshape(100,1)
x = np.a
ay([ XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX])
x = x.reshape(100,1)
def cvx_fn(x):
smoother = .005
minq = x-2
maxq = x+2
q = x
best = 1e10
for j in range(50):
v,s = env_helper(q)
best = min(best, v + 1/(2*smoother)*(x-q)*(x-q))
if (s + 1/smoother*(q-x)) <= 0:
minq = q
else:
maxq = q
q = (minq+maxq)/2
return best
def env_helper(q):
gamma = 100.0
best = -1e100
mina = -gamma
maxa = gamma
a = 0.0
slope = a
for j in range(100):
loc = np.argmin(y - a*(x-q));
if - x[loc] + q >= 0:
mina = a;
else:
maxa = a;
a = (maxa+mina)/2;
if np.amin(y - a*(x-q)) >= best:
best = max(best, np.amin(y - a*(x-q)));
slope = a;
return best, slope
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX
XXXXXXXXXX, XXXXXXXXXX