首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mosek + Cvxpy捕获超时异常

Mosek + Cvxpy捕获超时异常
EN

Stack Overflow用户
提问于 2021-09-08 13:35:22
回答 3查看 92关注 0票数 0

我们正在使用Cvxpy和Mosek解决我们的大规模MI优化问题。

通常情况下,Mosek消耗的运行时间比我们规定的两个小时的超时时间要长。

有没有办法系统地捕获这些超时异常?

最小可重复性示例:

代码语言:javascript
复制
import cvxpy as cp
import numpy as np
import mosek

m = 15
n = 10
np.random.seed(1)
s0 = np.random.randn(m)
lamb0 = np.maximum(-s0, 0)
s0 = np.maximum(s0, 0)
x0 = np.random.randn(n)
A = np.random.randn(m, n)
b = A @ x0 + s0
c = -A.T @ lamb0

# Define and solve the CVXPY problem.
x = cp.Variable(n)
prob = cp.Problem(cp.Minimize(c.T@x),
                 [A @ x <= b])
# try:
prob.solve(cp.MOSEK, mosek_params={mosek.dparam.optimizer_max_time: 0.01})   # set verbose=True (to see actual error in solver logs)
# except Timeout exception
#     print('Timeout occured')

print(prob.value)

def execute_other_important_stuff():
    print("Hello world")

execute_other_important_stuff()  # Not executed currently
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-09 06:18:28

当MOSEK由于超时而终止时,永远不会有任何异常-您设置了超时,因此在该点终止是正常的,而不是异常的情况。我不确定你指的是什么“错误”。

如果你是指像这样的东西

代码语言:javascript
复制
Cannot unpack invalid solution: Solution(status=UNKNOWN

然后,它与超时本身无关,而是与没有可用的解决方案的事实有关(目前,唯一可用的“解决方案”具有未知状态),CVXPY通过抛出异常来处理此问题。所以问题是,在这两个小时之后,你的问题有没有找到任何解决方案?如果是,应该会返回,没有问题。如果不是,你可能会看到上面的内容,我猜唯一的方法就是捕捉恰好抛出的ValueError

如果您使用的是原生Mosek接口,那么您可以从各种响应代码中找出它终止的原因,但是I CVXPY不传播它们。

票数 1
EN

Stack Overflow用户

发布于 2021-09-08 16:59:08

我不确定这是否是Cvxpy的问题。

然而,一般的评论是Mosek不能连续检查时间限制,因此它很可能会随着时间的推移而过去。

例如,对于SDP,它必须计算潜在大矩阵的特征值,并且在完成之前无法检查时间限制。

票数 1
EN

Stack Overflow用户

发布于 2021-09-08 17:47:18

对于发生这种情况的原因,我没有其他见解(除了ErlingMOSEK所建议的),但是您可以使用signals库来强制停止.solve方法。

这是一种独立的方法,可以确保您可以在任何时候停止函数。请参阅Timeout a function call中的示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69104127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档