Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
A
alpha-mind
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Dr.李
alpha-mind
Commits
8541e9e2
Commit
8541e9e2
authored
May 27, 2018
by
Dr.李
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
greatly enhance the optimizer performance by using factor model
parent
949d03a9
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
264 additions
and
77 deletions
+264
-77
optimizers.pyx
alphamind/cython/optimizers.pyx
+80
-49
sqlengine.py
alphamind/data/engines/sqlengine.py
+1
-1
pfopt
alphamind/pfopt
+1
-1
meanvariancebuilder.py
alphamind/portfolio/meanvariancebuilder.py
+16
-4
test_optimizers.py
alphamind/tests/cython/test_optimizers.py
+62
-0
Example 7 - Portfolio Optimizer Performance.ipynb
notebooks/Example 7 - Portfolio Optimizer Performance.ipynb
+104
-22
No files found.
alphamind/cython/optimizers.pyx
View file @
8541e9e2
...
...
@@ -10,6 +10,7 @@ cimport numpy as cnp
from libcpp.string cimport string
from libcpp.vector cimport vector
import numpy as np
from PyFin.api import pyFinAssert
cdef extern from "lpoptimizer.hpp" namespace "pfopt":
...
...
@@ -71,7 +72,11 @@ cdef extern from "tvoptimizer.hpp" namespace "pfopt":
double*,
double*,
double,
double) except +
double,
int,
double*,
double*,
double*) except +
vector[double] xValue()
double feval()
int status()
...
...
@@ -81,6 +86,7 @@ cdef class CVOptimizer:
cdef TVOptimizer* cobj
cdef int n
cdef int m
cdef int f
def __cinit__(self,
double[:] expected_return,
...
...
@@ -91,20 +97,26 @@ cdef class CVOptimizer:
double[:] clbound=None,
double[:] cubound=None,
double target_low=0.0,
double target_high=1.0):
double target_high=1.0,
cnp.ndarray[double, ndim=2] factor_cov_matrix=None,
cnp.ndarray[double, ndim=2] factor_loading_matrix=None,
double[:] idsync_risk=None):
self.n = lbound.shape[0]
self.m = 0
cdef double[:] cov = cov_matrix.flatten(order='C')
self.f = factor_cov_matrix.shape[0] if factor_cov_matrix is not None else 0
cdef double[:] cov = cov_matrix.flatten(order='C') if cov_matrix is not None else None
cdef double[:] cons
cdef double[:] factor_cov = factor_cov_matrix.flatten(order='C') if factor_cov_matrix is not None else None
cdef double[:] factor_loading = factor_loading_matrix.flatten(order='C') if factor_loading_matrix is not None else None
if cons_matrix is not None:
self.m = cons_matrix.shape[0]
cons = cons_matrix.flatten(order='C')
;
cons = cons_matrix.flatten(order='C')
self.cobj = new TVOptimizer(self.n,
&expected_return[0],
&cov[0],
&cov[0]
if cov is not None else NULL
,
&lbound[0],
&ubound[0],
self.m,
...
...
@@ -112,11 +124,15 @@ cdef class CVOptimizer:
&clbound[0],
&cubound[0],
target_low,
target_high)
target_high,
self.f,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&idsync_risk[0] if idsync_risk is not None else NULL)
else:
self.cobj = new TVOptimizer(self.n,
&expected_return[0],
&cov[0],
&cov[0]
if cov is not None else NULL
,
&lbound[0],
&ubound[0],
0,
...
...
@@ -124,7 +140,11 @@ cdef class CVOptimizer:
NULL,
NULL,
target_low,
target_high)
target_high,
self.f,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&idsync_risk[0] if idsync_risk is not None else NULL)
def __dealloc__(self):
del self.cobj
...
...
@@ -150,7 +170,11 @@ cdef extern from "mvoptimizer.hpp" namespace "pfopt":
double*,
double*,
double*,
double) except +
double,
int,
double*,
double*,
double*) except +
vector[double] xValue()
double feval()
int status()
...
...
@@ -171,30 +195,36 @@ cdef extern from "qpalglib.hpp" namespace "pfopt":
cdef class QPOptimizer:
cdef MVOptimizer* cobj
cdef QPAlglib* cobj2
cdef cnp.ndarray er
cdef cnp.ndarray cov
cdef double risk_aversion
cdef int n
cdef int m
cdef int f
def __cinit__(self,
double[:] expected_return,
cnp.ndarray[double, ndim=2] cov_matrix,
double[:] lbound,
double[:] ubound,
cnp.ndarray[double, ndim=2] cons_matrix=None,
double[:] clbound=None,
double[:] cubound=None,
double risk_aversion=1.0):
double[:] expected_return,
cnp.ndarray[double, ndim=2] cov_matrix,
double[:] lbound,
double[:] ubound,
cnp.ndarray[double, ndim=2] cons_matrix=None,
double[:] clbound=None,
double[:] cubound=None,
double risk_aversion=1.0,
cnp.ndarray[double, ndim=2] factor_cov_matrix=None,
cnp.ndarray[double, ndim=2] factor_loading_matrix=None,
double[:] idsync_risk=None):
self.n = lbound.shape[0]
self.m = 0
self.f = factor_cov_matrix.shape[0] if factor_cov_matrix is not None else 0
self.er = np.array(expected_return)
self.cov = np.array(cov_matrix)
self.risk_aversion = risk_aversion
cdef double[:] cov = cov_matrix.flatten(order='C')
cdef double[:] cov = cov_matrix.flatten(order='C')
if cov_matrix is not None else None
cdef double[:] cons
cdef double[:] factor_cov = factor_cov_matrix.flatten(order='C') if factor_cov_matrix is not None else None
cdef double[:] factor_loading = factor_loading_matrix.flatten(order='C') if factor_loading_matrix is not None else None
if cons_matrix is not None:
self.m = cons_matrix.shape[0]
...
...
@@ -202,48 +232,49 @@ cdef class QPOptimizer:
self.cobj = new MVOptimizer(self.n,
&expected_return[0],
&cov[0],
&cov[0]
if cov is not None else NULL
,
&lbound[0],
&ubound[0],
self.m,
&cons[0],
&clbound[0],
&cubound[0],
risk_aversion)
risk_aversion,
self.f,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&idsync_risk[0] if idsync_risk is not None else NULL)
else:
self.cobj2 = new QPAlglib(self.n,
&expected_return[0],
&cov[0],
&lbound[0],
&ubound[0],
risk_aversion)
# self.cobj2 = new QPAlglib(self.n,
# &expected_return[0],
# &cov[0] if cov is not None else NULL,
# &lbound[0],
# &ubound[0],
# risk_aversion)
self.cobj = new MVOptimizer(self.n,
&expected_return[0],
&cov[0] if cov is not None else NULL,
&lbound[0],
&ubound[0],
self.m,
NULL,
NULL,
NULL,
risk_aversion,
self.f,
&factor_cov[0] if factor_cov is not None else NULL,
&factor_loading[0] if factor_loading is not None else NULL,
&idsync_risk[0] if idsync_risk is not None else NULL)
def __dealloc__(self):
if self.cobj:
del self.cobj
else:
del self.cobj2
del self.cobj
def feval(self):
if self.cobj:
return self.cobj.feval()
else:
x = np.array(self.cobj2.xValue())
return 0.5 * self.risk_aversion * x @ self.cov @ x - self.er @ x
return self.cobj.feval()
def x_value(self):
if self.cobj:
return np.array(self.cobj.xValue())
else:
return np.array(self.cobj2.xValue())
return np.array(self.cobj.xValue())
def status(self):
if self.cobj:
return self.cobj.status()
else:
status = self.cobj2.status()
if 1 <= status <= 4:
return 0
else:
return status
return self.cobj.status()
alphamind/data/engines/sqlengine.py
View file @
8541e9e2
...
...
@@ -371,7 +371,7 @@ class SqlEngine(object):
res
[
'chgPct'
]
=
df
.
chgPct
res
=
res
.
loc
[
ref_date
]
res
.
index
=
list
(
range
(
len
(
res
)))
return
res
.
drop_duplicates
([
'trade_date'
,
'code'
])
return
res
def
fetch_factor_range
(
self
,
universe
:
Universe
,
...
...
pfopt
@
40976afd
Subproject commit
1dcecd88728512ff50730f418d9d58195bf33851
Subproject commit
40976afd3ea03b921177cef364fa8a6b37bf4dda
alphamind/portfolio/meanvariancebuilder.py
View file @
8541e9e2
...
...
@@ -51,7 +51,10 @@ def mean_variance_builder(er: np.ndarray,
ubound
:
Union
[
np
.
ndarray
,
float
],
risk_exposure
:
Optional
[
np
.
ndarray
],
risk_target
:
Optional
[
Tuple
[
np
.
ndarray
,
np
.
ndarray
]],
lam
:
float
=
1.
)
->
Tuple
[
str
,
float
,
np
.
ndarray
]:
lam
:
float
=
1.
,
factor_cov
:
np
.
ndarray
=
None
,
factor_loading
:
np
.
ndarray
=
None
,
idsync
:
np
.
ndarray
=
None
)
->
Tuple
[
str
,
float
,
np
.
ndarray
]:
lbound
,
ubound
,
cons_mat
,
clbound
,
cubound
=
_create_bounds
(
lbound
,
ubound
,
bm
,
risk_exposure
,
risk_target
)
optimizer
=
QPOptimizer
(
er
,
...
...
@@ -61,7 +64,10 @@ def mean_variance_builder(er: np.ndarray,
cons_mat
,
clbound
,
cubound
,
lam
)
lam
,
factor_cov
,
factor_loading
,
idsync
)
return
_create_result
(
optimizer
,
bm
)
...
...
@@ -74,7 +80,10 @@ def target_vol_builder(er: np.ndarray,
risk_exposure
:
Optional
[
np
.
ndarray
],
risk_target
:
Optional
[
Tuple
[
np
.
ndarray
,
np
.
ndarray
]],
vol_low
:
float
=
0.
,
vol_high
:
float
=
1.
)
->
Tuple
[
str
,
float
,
np
.
ndarray
]:
vol_high
:
float
=
1.
,
factor_cov
:
np
.
ndarray
=
None
,
factor_loading
:
np
.
ndarray
=
None
,
idsync
:
np
.
ndarray
=
None
)
->
Tuple
[
str
,
float
,
np
.
ndarray
]:
lbound
,
ubound
,
cons_mat
,
clbound
,
cubound
=
_create_bounds
(
lbound
,
ubound
,
bm
,
risk_exposure
,
risk_target
)
optimizer
=
CVOptimizer
(
er
,
...
...
@@ -85,7 +94,10 @@ def target_vol_builder(er: np.ndarray,
clbound
,
cubound
,
vol_low
,
vol_high
)
vol_high
,
factor_cov
,
factor_loading
,
idsync
)
return
_create_result
(
optimizer
,
bm
)
...
...
alphamind/tests/cython/test_optimizers.py
View file @
8541e9e2
...
...
@@ -54,6 +54,36 @@ class TestOptimizers(unittest.TestCase):
[
0.1996
,
0.3004
,
0.5000
],
4
)
def
test_qpoptimizer_with_factor_model
(
self
):
objective
=
np
.
array
([
0.1
,
0.2
,
0.3
])
lbound
=
np
.
array
([
0.0
,
0.0
,
0.0
])
ubound
=
np
.
array
([
1.0
,
1.0
,
1.0
])
factor_var
=
np
.
array
([[
0.5
,
-
0.3
],
[
-
0.3
,
0.7
]])
factor_load
=
np
.
array
([[
0.8
,
0.2
],
[
0.5
,
0.5
],
[
0.2
,
0.8
]])
idsync
=
np
.
array
([
0.1
,
0.3
,
0.2
])
cons
=
np
.
array
([[
1.
,
1.
,
1.
]])
clbound
=
np
.
array
([
1.
])
cubound
=
np
.
array
([
1.
])
optimizer
=
QPOptimizer
(
objective
,
None
,
lbound
,
ubound
,
cons
,
clbound
,
cubound
,
1.
,
factor_var
,
factor_load
,
idsync
)
# check against cvxpy result
np
.
testing
.
assert_array_almost_equal
(
optimizer
.
x_value
(),
[
0.2866857
,
0.21416417
,
0.49915014
],
4
)
def
test_qpoptimizer_with_identity_matrix
(
self
):
objective
=
np
.
array
([
-
0.02
,
0.01
,
0.03
])
cov
=
np
.
diag
([
1.
,
1.
,
1.
])
...
...
@@ -122,6 +152,38 @@ class TestOptimizers(unittest.TestCase):
[
-
0.3
,
-
0.10919033
,
0.40919033
],
4
)
def
test_cvoptimizer_with_factor_model
(
self
):
objective
=
np
.
array
([
0.1
,
0.2
,
0.3
])
lbound
=
np
.
array
([
0.0
,
0.0
,
0.0
])
ubound
=
np
.
array
([
1.0
,
1.0
,
1.0
])
factor_var
=
np
.
array
([[
0.5
,
-
0.3
],
[
-
0.3
,
0.7
]])
factor_load
=
np
.
array
([[
0.8
,
0.2
],
[
0.5
,
0.5
],
[
0.2
,
0.8
]])
idsync
=
np
.
array
([
0.1
,
0.3
,
0.2
])
cons
=
np
.
array
([[
1.
,
1.
,
1.
]])
clbound
=
np
.
array
([
1.
])
cubound
=
np
.
array
([
1.
])
target_vol
=
0.5
optimizer
=
CVOptimizer
(
objective
,
None
,
lbound
,
ubound
,
cons
,
clbound
,
cubound
,
0.
,
target_vol
,
factor_var
,
factor_load
,
idsync
)
# check against cvxpy result
np
.
testing
.
assert_array_almost_equal
(
optimizer
.
x_value
(),
[
0.26595552
,
0.21675092
,
0.51729356
],
4
)
def
test_cvoptimizer_with_cons_and_ieq
(
self
):
objective
=
np
.
array
([
0.1
,
0.2
,
0.3
])
cov
=
np
.
array
([[
0.05
,
0.01
,
0.02
],
...
...
notebooks/Example 7 - Portfolio Optimizer Performance.ipynb
View file @
8541e9e2
...
...
@@ -243,7 +243,7 @@
"metadata": {},
"outputs": [],
"source": [
"from cvxpy import
quad_form
\n",
"from cvxpy import
*
\n",
"\n",
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n",
...
...
@@ -262,16 +262,36 @@
" lbound = -np.ones(n) * np.inf\n",
" ubound = np.ones(n) * np.inf\n",
"\n",
" status, y, x1 = mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\n",
" elasped_time1 = timeit.timeit(\"mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\",\n",
" status, y, x1 = mean_variance_builder(er,\n",
" None,\n",
" bm,\n",
" lbound,\n",
" ubound,\n",
" None,\n",
" None,\n",
" lam=1,\n",
" factor_cov=risk_cov / 10000.,\n",
" factor_loading=risk_exposure,\n",
" idsync=(special_risk ** 2.) / 10000)\n",
" elasped_time1 = timeit.timeit(\"\"\"mean_variance_builder(er,\n",
" None,\n",
" bm,\n",
" lbound,\n",
" ubound,\n",
" None,\n",
" None,\n",
" lam=1,\n",
" factor_cov=risk_cov / 10000.,\n",
" factor_loading=risk_exposure,\n",
" idsync=(special_risk ** 2.) / 10000)\"\"\",\n",
" number=number, globals=globals()) / number * 1000\n",
" \n",
" w = cvxpy.Variable(n)\n",
" risk =
quad_form(w, sec_cov
)\n",
" risk =
sum_squares(mul_elemwise(special_risk / 100., w)) + quad_form((w.T * risk_exposure).T, risk_cov / 10000.
)\n",
" objective = cvxpy.Minimize(-w.T * er + 0.5 * risk)\n",
" prob = cvxpy.Problem(objective)\n",
" prob.solve(solver='
CVXOPT
')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='
CVXOPT
')\",\n",
" prob.solve(solver='
ECOS
')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='
ECOS
')\",\n",
" number=number, globals=globals()) / number * 1000\n",
" \n",
" u1 = -x1 @ er + 0.5 * x1 @ sec_cov @ x1\n",
...
...
@@ -325,18 +345,38 @@
" lbound = np.zeros(n)\n",
" ubound = np.ones(n) * 0.1\n",
"\n",
" status, y, x1 = mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\n",
" elasped_time1 = timeit.timeit(\"mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\",\n",
" status, y, x1 = mean_variance_builder(er,\n",
" None,\n",
" bm,\n",
" lbound,\n",
" ubound,\n",
" None,\n",
" None,\n",
" lam=1,\n",
" factor_cov=risk_cov / 10000.,\n",
" factor_loading=risk_exposure,\n",
" idsync=(special_risk ** 2.) / 10000)\n",
" elasped_time1 = timeit.timeit(\"\"\"mean_variance_builder(er,\n",
" None,\n",
" bm,\n",
" lbound,\n",
" ubound,\n",
" None,\n",
" None,\n",
" lam=1,\n",
" factor_cov=risk_cov / 10000.,\n",
" factor_loading=risk_exposure,\n",
" idsync=(special_risk ** 2.) / 10000)\"\"\",\n",
" number=number, globals=globals()) / number * 1000\n",
" \n",
" w = cvxpy.Variable(n)\n",
" risk =
quad_form(w, sec_cov
)\n",
" risk =
sum_squares(mul_elemwise(special_risk / 100., w)) + quad_form((w.T * risk_exposure).T, risk_cov / 10000.
)\n",
" objective = cvxpy.Minimize(-w.T * er + 0.5 * risk)\n",
" constraints = [w >= lbound,\n",
" w <= ubound]\n",
" prob = cvxpy.Problem(objective, constraints)\n",
" prob.solve(solver='
CVXOPT
')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='
CVXOPT
')\",\n",
" prob.solve(solver='
ECOS
')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='
ECOS
')\",\n",
" number=number, globals=globals()) / number * 1000\n",
" \n",
" u1 = -x1 @ er + 0.5 * x1 @ sec_cov @ x1\n",
...
...
@@ -393,20 +433,40 @@
" risk_constraints = np.ones((len(er), 1))\n",
" risk_target = (np.array([1.]), np.array([1.]))\n",
"\n",
" status, y, x1 = mean_variance_builder(er, sec_cov, bm, lbound, ubound, risk_constraints, risk_target, lam=1)\n",
" elasped_time1 = timeit.timeit(\"mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\",\n",
" status, y, x1 = mean_variance_builder(er,\n",
" None,\n",
" bm,\n",
" lbound,\n",
" ubound,\n",
" risk_constraints,\n",
" risk_target,\n",
" lam=1,\n",
" factor_cov=risk_cov / 10000.,\n",
" factor_loading=risk_exposure,\n",
" idsync=(special_risk ** 2.) / 10000)\n",
" elasped_time1 = timeit.timeit(\"\"\"mean_variance_builder(er,\n",
" None,\n",
" bm,\n",
" lbound,\n",
" ubound,\n",
" risk_constraints,\n",
" risk_target,\n",
" lam=1,\n",
" factor_cov=risk_cov / 10000.,\n",
" factor_loading=risk_exposure,\n",
" idsync=(special_risk ** 2.) / 10000)\"\"\",\n",
" number=number, globals=globals()) / number * 1000\n",
" \n",
" w = cvxpy.Variable(n)\n",
" risk =
quad_form(w, sec_cov
)\n",
" risk =
sum_squares(mul_elemwise(special_risk / 100., w)) + quad_form((w.T * risk_exposure).T, risk_cov / 10000.
)\n",
" objective = cvxpy.Minimize(-w.T * er + 0.5 * risk)\n",
" curr_risk_exposure = risk_constraints.T @ w\n",
" constraints = [w >= lbound,\n",
" w <= ubound,\n",
" curr_risk_exposure == risk_target[0]]\n",
" prob = cvxpy.Problem(objective, constraints)\n",
" prob.solve(solver='
CVXOPT
')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='
CVXOPT
')\",\n",
" prob.solve(solver='
ECOS
')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='
ECOS
')\",\n",
" number=number, globals=globals()) / number * 1000\n",
"\n",
" u1 = -x1 @ er + 0.5 * x1 @ sec_cov @ x1\n",
...
...
@@ -445,7 +505,7 @@
"source": [
"df = pd.DataFrame(columns=u_names, index=['cvxpy', 'alphamind'])\n",
"number = 1\n",
"target_vol = 0.
1
\n",
"target_vol = 0.
5
\n",
"\n",
"\n",
"for u_name, sample_data in zip(u_names, data_set):\n",
...
...
@@ -468,12 +528,34 @@
" risk_constraints = np.ones((n, 1))\n",
" risk_target = (np.array([bm.sum()]), np.array([bm.sum()]))\n",
"\n",
" status, y, x1 = target_vol_builder(er, sec_cov, bm, lbound, ubound, risk_constraints, risk_target, vol_low=0, vol_high=target_vol)\n",
" elasped_time1 = timeit.timeit(\"mean_variance_builder(er, sec_cov, bm, lbound, ubound, None, None, lam=1)\",\n",
" status, y, x1 = target_vol_builder(er,\n",
" None,\n",
" bm,\n",
" lbound,\n",
" ubound,\n",
" risk_constraints,\n",
" risk_target,\n",
" vol_low=0,\n",
" vol_high=target_vol,\n",
" factor_cov=risk_cov / 10000.,\n",
" factor_loading=risk_exposure,\n",
" idsync=(special_risk ** 2.) / 10000)\n",
" elasped_time1 = timeit.timeit(\"\"\"target_vol_builder(er,\n",
" None,\n",
" bm,\n",
" lbound,\n",
" ubound,\n",
" risk_constraints,\n",
" risk_target,\n",
" vol_low=0,\n",
" vol_high=target_vol,\n",
" factor_cov=risk_cov / 10000.,\n",
" factor_loading=risk_exposure,\n",
" idsync=(special_risk ** 2.) / 10000)\"\"\",\n",
" number=number, globals=globals()) / number * 1000\n",
" \n",
" w = cvxpy.Variable(n)\n",
" risk =
quad_form(w - bm, sec_cov
)\n",
" risk =
sum_squares(mul_elemwise(special_risk / 100., w)) + quad_form((w.T * risk_exposure).T, risk_cov / 10000.
)\n",
" objective = cvxpy.Minimize(-w.T * er)\n",
" curr_risk_exposure = risk_constraints.T @ w\n",
" constraints = [w >= lbound,\n",
...
...
@@ -481,8 +563,8 @@
" curr_risk_exposure == risk_target[0],\n",
" risk <= target_vol * target_vol]\n",
" prob = cvxpy.Problem(objective, constraints)\n",
" prob.solve(solver='
CVXOPT
')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='
CVXOPT
')\",\n",
" prob.solve(solver='
ECOS
')\n",
" elasped_time2 = timeit.timeit(\"prob.solve(solver='
ECOS
')\",\n",
" number=number, globals=globals()) / number * 1000\n",
"\n",
" u1 = -x1 @ er\n",
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment