Я использовал cvxopt для задачи квадратичной оптимизации в python 2.7. Я обновляюсь до python 3.6.5, но когда я запускаю код, который использовал в 2.7, он не работает в 3.6.5.
Я проверил все входные данные, и они кажутся одинаковыми между версиями python,Что-то изменилось с матрицами numpy, cvxopt или с тем, как cvxopt работает между версиями python?
def quadprog_optimize(H, f, A, b):
cvxopt.solvers.options['abstol'] = 1.e-8
H = cvxopt.matrix(H)
f = cvxopt.matrix(f)
A = cvxopt.matrix(A)
b = cvxopt.matrix(b)
output = cvxopt.solvers.qp(H, f, A, b)
return output
Вышеописанное отлично работает в python 2.7. Когда я запускаю вышеупомянутое в python 3.6.5, я получаю следующую ошибку:
---------------------------------------------------------------------------
ArithmeticError Traceback (most recent call last)
C:\Anaconda3\envs\py\lib\site-packages\cvxopt\misc.py in factor(W, H, Df)
1428 if type(F['S']) is matrix:
-> 1429 lapack.potrf(F['S'])
1430 else:
ArithmeticError: 4
During handling of the above exception, another exception occurred:
ArithmeticError Traceback (most recent call last)
C:\Anaconda3\envs\py\lib\site-packages\cvxopt\coneprog.py in coneqp(P, q, G, h, dims, A, b, initvals, kktsolver, xnewcopy, xdot, xaxpy, xscal, ynewcopy, ydot, yaxpy, yscal, **kwargs)
2064 for rti in W['rti']: rti[::rti.size[0]+1 ] = 1.0
-> 2065 try: f = kktsolver(W)
2066 except ArithmeticError:
C:\Anaconda3\envs\py\lib\site-packages\cvxopt\coneprog.py in kktsolver(W)
1980 def kktsolver(W):
-> 1981 return factor(W, P)
1982
C:\Anaconda3\envs\py\lib\site-packages\cvxopt\misc.py in factor(W, H, Df)
1443 if type(F['S']) is matrix:
-> 1444 lapack.potrf(F['S'])
1445 else:
ArithmeticError: 4
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<ipython-input-3-90eb40883072> in <module>
10 return output
11
---> 12 quadprog_optimize(H, f, A, b)
<ipython-input-3-90eb40883072> in quadprog(H, f, A, b)
8 cvxopt.solvers.options['abstol'] = 1.e-8
----> 9 output = cvxopt.solvers.qp(H, f, A, b)
10 return output
11
C:\Anaconda3\envs\py\lib\site-packages\cvxopt\coneprog.py in qp(P, q, G, h, A, b, solver, kktsolver, initvals, **kwargs)
4485 'residual as dual infeasibility certificate': dinfres}
4486
-> 4487 return coneqp(P, q, G, h, None, A, b, initvals, kktsolver = kktsolver, options = options)
C:\Anaconda3\envs\py\lib\site-packages\cvxopt\coneprog.py in coneqp(P, q, G, h, dims, A, b, initvals, kktsolver, xnewcopy, xdot, xaxpy, xscal, ynewcopy, ydot, yaxpy, yscal, **kwargs)
2065 try: f = kktsolver(W)
2066 except ArithmeticError:
-> 2067 raise ValueError("Rank(A) < p or Rank([P; A; G]) < n")
2068
2069
ValueError: Rank(A) < p or Rank([P; A; G]) < n
Что-то значительно изменилось с cvxopt, numpy или python между версиями, которые я пропустил?