我正在通过COIN / OSI界面(OsiCpxSolverInterface
)运行CPLEX 。对于某些大型LP,我会收到一条错误消息,CPX0000 CPLEX Error 1001: Out of memory.
尽管有该错误消息,也不会CoinError
引发任何异常()。查看它的源代码,OsiCpxSolverInterface
看起来的返回码CPXlpopt
必须为0。
需要明确的是:我的问题不是如何避免内存不足的问题。我只是在寻找一种从程序中检测到它的方法。
我发现了一个对我有用的技巧。将错误处理程序日志级别设置为0仅允许通过错误消息。覆盖MessageHandler的print方法然后可以对错误做出反应。此解决方法绝对是一个hack。如果有人有更好的建议,我很乐意接受其他答案。
class ErrorCatchingCoinMessageHandler: public CoinMessageHandler {
public:
ErrorCatchingCoinMessageHandler()
: CoinMessageHandler() {
// Would be nice to also overwrite setLogLevel to avoid later changes
// but its not virtual
setLogLevel(0);
}
virtual int print() __attribute__((noreturn)) {
CoinMessageHandler::print();
abort(); // or throw a CoinError
}
};
// Use it like this
lp_solver->passInMessageHandler(new ErrorCatchingCoinMessageHandler());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句