-
Notifications
You must be signed in to change notification settings - Fork 40
/
_cvxopt.py
55 lines (49 loc) · 2.02 KB
/
_cvxopt.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
"Implements the GPkit interface to CVXOPT"
import numpy as np
from cvxopt import spmatrix, matrix, log
from cvxopt.solvers import gp
from gpkit.exceptions import (Infeasible, UnknownInfeasible,
PrimalInfeasible, DualInfeasible)
def cvxoptimize(c, A, k, *args, **kwargs):
"""Interface to the CVXOPT solver
Definitions
-----------
"[a,b] array of floats" indicates array-like data with shape [a,b]
n is the number of monomials in the gp
m is the number of variables in the gp
p is the number of posynomial constraints in the gp
Arguments
---------
c : floats array of shape n
Coefficients of each monomial
A : floats array of shape (n, m)
Exponents of the various free variables for each monomial.
k : ints array of shape p+1
k[0] is the number of monomials (rows of A) present in the objective
k[1:] is the number of monomials present in each constraint
Returns
-------
dict
Contains the following keys
"success": bool
"objective_sol" float
Optimal value of the objective
"primal_sol": floats array of size m
Optimal value of free variables. Note: not in logspace.
"dual_sol": floats array of size p
Optimal value of the dual variables, in logspace.
"""
g = log(matrix(c))
F = spmatrix(A.data, A.row, A.col, tc="d")
try:
solution = gp(k, F, g, *args, **kwargs)
except ValueError as e:
raise DualInfeasible() from e
if solution["status"] == "unknown":
raise UnknownInfeasible()
if solution["status"] != "optimal":
raise UnknownInfeasible("solution status: " + solution["status"])
return dict(status=solution["status"],
objective=np.exp(solution["primal objective"]),
primal=np.ravel(solution["x"]),
la=solution["znl"])