Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def cost_l(x, x_ref, covar_x, u, delta_u, Q, R_u, R_du, K, s=1):
""" Stage cost function: Expected Value of Quadratic Cost
"""
Q_s = ca.SX.sym('Q', ca.MX.size(Q))
R_s = ca.SX.sym('R', ca.MX.size(R_u))
K_s = ca.SX.sym('K', ca.MX.size(K))
x_s = ca.SX.sym('x', ca.MX.size(x))
u_s = ca.SX.sym('u', ca.MX.size(u))
covar_x_s = ca.SX.sym('covar_x', ca.MX.size(covar_x))
covar_u_s = ca.SX.sym('covar_u', ca.MX.size(R_u))
sqnorm_x = ca.Function('sqnorm_x', [x_s, Q_s],
[ca.mtimes(x_s.T, ca.mtimes(Q_s, x_s))])
sqnorm_u = ca.Function('sqnorm_u', [u_s, R_s],
[ca.mtimes(u_s.T, ca.mtimes(R_s, u_s))])
covar_u = ca.Function('covar_u', [covar_x_s, K_s],
[ca.mtimes(K_s, ca.mtimes(covar_x_s, K_s.T))])
trace_u = ca.Function('trace_u', [R_s, covar_u_s],
[s * ca.trace(ca.mtimes(R_s, covar_u_s))])
trace_x = ca.Function('trace_x', [Q_s, covar_x_s],
def __cost_saturation_l(self, x, x_ref, covar_x, u, covar_u, delta_u, Q, R, S):
""" Stage Cost function: Expected Value of Saturating Cost
"""
Nx = ca.MX.size1(Q)
Nu = ca.MX.size1(R)
# Create symbols
Q_s = ca.SX.sym('Q', Nx, Nx)
R_s = ca.SX.sym('Q', Nu, Nu)
x_s = ca.SX.sym('x', Nx)
u_s = ca.SX.sym('x', Nu)
covar_x_s = ca.SX.sym('covar_z', Nx, Nx)
covar_u_s = ca.SX.sym('covar_u', ca.MX.size(R))
Z_x = ca.SX.eye(Nx) + 2 * covar_x_s @ Q_s
Z_u = ca.SX.eye(Nu) + 2 * covar_u_s @ R_s
cost_x = ca.Function('cost_x', [x_s, Q_s, covar_x_s],
[1 - ca.exp(-(x_s.T @ ca.solve(Z_x.T, Q_s.T).T @ x_s))
/ ca.sqrt(ca.det(Z_x))])
cost_u = ca.Function('cost_u', [u_s, R_s, covar_u_s],
[1 - ca.exp(-(u_s.T @ ca.solve(Z_u.T, R_s.T).T @ u_s))
/ ca.sqrt(ca.det(Z_u))])
return cost_x(x - x_ref, Q, covar_x) + cost_u(u, R, covar_u)
def cost_l(x, x_ref, covar_x, u, delta_u, Q, R_u, R_du, K, s=1):
""" Stage cost function: Expected Value of Quadratic Cost
"""
Q_s = ca.SX.sym('Q', ca.MX.size(Q))
R_s = ca.SX.sym('R', ca.MX.size(R_u))
K_s = ca.SX.sym('K', ca.MX.size(K))
x_s = ca.SX.sym('x', ca.MX.size(x))
u_s = ca.SX.sym('u', ca.MX.size(u))
covar_x_s = ca.SX.sym('covar_x', ca.MX.size(covar_x))
covar_u_s = ca.SX.sym('covar_u', ca.MX.size(R_u))
sqnorm_x = ca.Function('sqnorm_x', [x_s, Q_s],
[ca.mtimes(x_s.T, ca.mtimes(Q_s, x_s))])
sqnorm_u = ca.Function('sqnorm_u', [u_s, R_s],
[ca.mtimes(u_s.T, ca.mtimes(R_s, u_s))])
covar_u = ca.Function('covar_u', [covar_x_s, K_s],
[ca.mtimes(K_s, ca.mtimes(covar_x_s, K_s.T))])
trace_u = ca.Function('trace_u', [R_s, covar_u_s],
[s * ca.trace(ca.mtimes(R_s, covar_u_s))])
trace_x = ca.Function('trace_x', [Q_s, covar_x_s],
[s * ca.trace(ca.mtimes(Q_s, covar_x_s))])
return sqnorm_x(x - x_ref, Q) + sqnorm_u(u, R_u) + sqnorm_u(delta_u, R_du) \
+ trace_x(Q, covar_x) + trace_u(R_u, covar_u(covar_x, K))
def cost_l(x, x_ref, covar_x, u, delta_u, Q, R_u, R_du, K, s=1):
""" Stage cost function: Expected Value of Quadratic Cost
"""
Q_s = ca.SX.sym('Q', ca.MX.size(Q))
R_s = ca.SX.sym('R', ca.MX.size(R_u))
K_s = ca.SX.sym('K', ca.MX.size(K))
x_s = ca.SX.sym('x', ca.MX.size(x))
u_s = ca.SX.sym('u', ca.MX.size(u))
covar_x_s = ca.SX.sym('covar_x', ca.MX.size(covar_x))
covar_u_s = ca.SX.sym('covar_u', ca.MX.size(R_u))
sqnorm_x = ca.Function('sqnorm_x', [x_s, Q_s],
[ca.mtimes(x_s.T, ca.mtimes(Q_s, x_s))])
sqnorm_u = ca.Function('sqnorm_u', [u_s, R_s],
[ca.mtimes(u_s.T, ca.mtimes(R_s, u_s))])
covar_u = ca.Function('covar_u', [covar_x_s, K_s],
[ca.mtimes(K_s, ca.mtimes(covar_x_s, K_s.T))])
trace_u = ca.Function('trace_u', [R_s, covar_u_s],
[s * ca.trace(ca.mtimes(R_s, covar_u_s))])
trace_x = ca.Function('trace_x', [Q_s, covar_x_s],
[s * ca.trace(ca.mtimes(Q_s, covar_x_s))])
return sqnorm_x(x - x_ref, Q) + sqnorm_u(u, R_u) + sqnorm_u(delta_u, R_du) \
def gp_casadi(invK, hyp, X, Y, z):
E = len(invK)
n = ca.MX.size(X[:, 1])[0]
D = ca.MX.size(X[1, :])[1]
mean = ca.MX.zeros(E, 1)
var = ca.MX.zeros(E, 1)
for a in range(E):
ell = ca.MX(hyp[a, 0:D])
sf2 = ca.MX(hyp[a, D]**2)
m = 0 #hyp[a, D + 2]
kss = covSEard2(z, z, ell, sf2)
ks = ca.MX.zeros(n, 1)
for i in range(n):
ks[i] = covSEard2(X[i, :] - m, z - m, ell, sf2)
#ks = repmat()
ksK = ca.mtimes(ks.T, invK[a])
def __cost_l(self, x, x_ref, covar_x, u, covar_u, delta_u, Q, R, S, s=1):
""" Stage cost function: Expected Value of Quadratic Cost
"""
Q_s = ca.SX.sym('Q', ca.MX.size(Q))
R_s = ca.SX.sym('R', ca.MX.size(R))
x_s = ca.SX.sym('x', ca.MX.size(x))
u_s = ca.SX.sym('u', ca.MX.size(u))
covar_x_s = ca.SX.sym('covar_x', ca.MX.size(covar_x))
covar_u_s = ca.SX.sym('covar_u', ca.MX.size(R))
sqnorm_x = ca.Function('sqnorm_x', [x_s, Q_s],
[ca.mtimes(x_s.T, ca.mtimes(Q_s, x_s))])
sqnorm_u = ca.Function('sqnorm_u', [u_s, R_s],
[ca.mtimes(u_s.T, ca.mtimes(R_s, u_s))])
trace_u = ca.Function('trace_u', [R_s, covar_u_s],
[s * ca.trace(ca.mtimes(R_s, covar_u_s))])
trace_x = ca.Function('trace_x', [Q_s, covar_x_s],
[s * ca.trace(ca.mtimes(Q_s, covar_x_s))])
return sqnorm_x(x - x_ref, Q) + sqnorm_u(u, R) + sqnorm_u(delta_u, S) \
+ trace_x(Q, covar_x) + trace_u(R, covar_u)
def __cost_lf(self, x, x_ref, covar_x, P, s=1):
""" Terminal cost function: Expected Value of Quadratic Cost
"""
P_s = ca.SX.sym('Q', ca.MX.size(P))
x_s = ca.SX.sym('x', ca.MX.size(x))
covar_x_s = ca.SX.sym('covar_x', ca.MX.size(covar_x))
sqnorm_x = ca.Function('sqnorm_x', [x_s, P_s],
[ca.mtimes(x_s.T, ca.mtimes(P_s, x_s))])
trace_x = ca.Function('trace_x', [P_s, covar_x_s],
[s * ca.trace(ca.mtimes(P_s, covar_x_s))])
return sqnorm_x(x - x_ref, P) + trace_x(P, covar_x)
def calc_NLL(hyper, X, Y, squaredist, meanFunc='zero', prior=None):
""" Objective function
Calculate the negative log likelihood function using Casadi SX symbols.
# Arguments:
hyper: Array with hyperparameters [ell_1 .. ell_Nx sf sn], where Nx is the
number of inputs to the GP.
X: Training data matrix with inputs of size (N x Nx).
Y: Training data matrix with outpyts of size (N x Ny), with Ny number of outputs.
# Returns:
NLL: The negative log likelihood function (scalar)
"""
N, Nx = ca.MX.size(X)
ell = hyper[:Nx]
sf2 = hyper[Nx]**2
sn2 = hyper[Nx + 1]**2
m = get_mean_function(hyper, X.T, func=meanFunc)
# Calculate covariance matrix
K_s = ca.SX.sym('K_s',N, N)
sqdist = ca.SX.sym('sqd', N, N)
elli = ca.SX.sym('elli')
ki = ca.Function('ki', [sqdist, elli, K_s], [sqdist / elli**2 + K_s])
K1 = ca.MX(N, N)
for i in range(Nx):
K1 = ki(squaredist[:, (i * N):(i + 1) * N], ell[i], K1)
sf2_s = ca.SX.sym('sf2')
sqdist = ca.SX.sym('sqd', N, N)
elli = ca.SX.sym('elli')
ki = ca.Function('ki', [sqdist, elli, K_s], [sqdist / elli**2 + K_s])
K1 = ca.MX(N, N)
for i in range(Nx):
K1 = ki(squaredist[:, (i * N):(i + 1) * N], ell[i], K1)
sf2_s = ca.SX.sym('sf2')
exponent = ca.SX.sym('exp', N, N)
K_exp = ca.Function('K', [exponent, sf2_s], [sf2_s * ca.SX.exp(-.5 * exponent)])
K2 = K_exp(K1, sf2)
K = K2 + sn2 * ca.MX.eye(N)
K = (K + K.T) * 0.5 # Make sure matrix is symmentric
A = ca.SX.sym('A', ca.MX.size(K))
cholesky = ca.Function('cholesky', [A], [ca.chol(A).T])
L = cholesky(K)
B = 2 * ca.sum1(ca.SX.log(ca.diag(A)))
log_determinant = ca.Function('log_det', [A], [B])
log_detK = log_determinant(L)
Y_s = ca.SX.sym('Y', ca.MX.size(Y))
L_s = ca.SX.sym('L', ca.Sparsity.lower(N))
sol = ca.Function('sol', [L_s, Y_s], [ca.solve(L_s, Y_s)])
invLy = sol(L, Y - m(X.T))
invLy_s = ca.SX.sym('invLy', ca.MX.size(invLy))
sol2 = ca.Function('sol2', [L_s, invLy_s], [ca.solve(L_s.T, invLy_s)])
alpha = sol2(L, invLy)
def constraint(mean, covar, H, quantile):
r = ca.SX.sym('r')
mean_s = ca.SX.sym('mean', ca.MX.size(mean))
covar_s = ca.SX.sym('r', ca.MX.size(covar))
H_s = ca.SX.sym('H', 1, ca.MX.size2(H))
con_func = ca.Function('con', [mean_s, covar_s, H_s, r],
[H_s @ mean_s + r * ca.sqrt(H_s @ covar_s @ H_s.T)])
con = []
r = quantile
for i in range(ca.MX.size1(mean)):
con.append(con_func(mean, covar, H[i, :], quantile[i]))
return con