import cvxpy
import random
import numpy
from scipy import sparse
(x, y, z) = (cvxpy.Variable(name="x", shape=3), cvxpy.Variable(name="y", shape=3), cvxpy.Variable(name="z", shape=3))
ellipsoids = [ (((1, 0, 0), (2.,0.,0.), 0.0), -5.)]
a = cvxpy.Variable(shape=2)
problem = cvxpy.Problem(cvxpy.Maximize(a[0]), [cvxpy.norm(a + [2,0]) <= 50])
probdata, chain, inverse_data = problem.get_problem_data(cvxpy.SCS)
soln = chain.solve_via_data(problem, probdata)
print(problem)
print(probdata['A'].todense())
print(probdata['A'].__dict__)
print(probdata['b'])
print(probdata['c'])
cone_dims = probdata['dims']
cones = {
"f": cone_dims.zero,
"l": cone_dims.nonpos,
"q": cone_dims.soc,
"ep": cone_dims.exp,
"s": cone_dims.psd,
}
print(cones)
print(soln)
exit()
objective = cvxpy.Maximize(808)
constraints = []
seen_foci = {}
for e in ellipsoids:
expr = e[-1]
for focus in e[:-1]:
if focus in seen_foci:
expr += seen_foci[focus]
continue
seen_foci[focus] = cvxpy.Variable(name="f" + str(len(seen_foci)))
expr += seen_foci[focus]
nonzero = False
mom = 0
for sign, v in zip(focus[0], (x, y, z)):
if sign != 0:
r = v if sign == 1 else -v
if not nonzero:
nonzero = True
mom = r
else:
if sign == 1:
mom += v
else:
mom -= v
if focus[2] != 0.:
constraints.append(cvxpy.norm(cvxpy.hstack([focus[2], mom + list(focus[1])]), 2) <= seen_foci[focus])
else:
constraints.append(cvxpy.norm(mom + list(focus[1]), 2) <= seen_foci[focus])
constraints.append(expr <= 0)
b = [-e[-1] for e in ellipsoids] + [b for a in [[0.] + ([f[2]] if f[2] != 0. else []) + list(f[1]) for e in ellipsoids for f in e[:-1]] for b in a]
varcount = sum(1 if any(f[0][i] != 0 for e in ellipsoids for f in e[:-1]) else 0 for i in range(3))
width = 3 * varcount + sum(len(e[:-1]) for e in ellipsoids)
a = [ [0. for _ in range(width)] for _ in range(len(b))]
focus_row_counter = len(ellipsoids)
for row_a, e in enumerate(ellipsoids):
pos = 3 * varcount + sum(len(ee[:-1]) for ee in ellipsoids[:row_a])
range_len = len(e[:-1])
for ii in range(range_len):
a[row_a][pos + ii] = 1.0
for foc_index, (variables, shift, mass) in enumerate(e[:-1]):
a[focus_row_counter][pos + foc_index] = -1.
focus_row_counter += 1
if mass != 0.:
focus_row_counter += 1
for dir_index in range(3):
for var_index, v in enumerate(variables):
if v != 0:
a[focus_row_counter][3 * var_index + dir_index] = -float(v)
focus_row_counter += 1
problem = cvxpy.Problem(objective, constraints)
probdata, chain, inverse_data = problem.get_problem_data(cvxpy.SCS)
soln = chain.solve_via_data(problem, probdata)
print(soln)
print(probdata['A'].todense())
print(probdata['b'])
print(problem)
import time
accumtime = 0
N = 1
for _ in range(N):
start = time.time()
problem.solve(cvxpy.SCS, verbose=True) print(x.value, y.value, z.value)
end = time.time()
accumtime += end - start
print('avg time', accumtime / N)