Код CVXOPT, который работает с python 2.7, не работает с python 3.6 - PullRequest
0 голосов
/ 12 октября 2019

Я использовал 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 между версиями, которые я пропустил?

...