我正在通过COIN / OSI界面(OsiCpxSolverInterface
)运行CPLEX。对于某些大型LP,我收到错误消息CPX0000 CPLEX Error 1001: Out of memory.
尽管出现错误消息,但不会抛出任何异常(CoinError
)。查看source code of OsiCpxSolverInterface
看起来CPXlpopt
的返回码必须为0。
要明确:我的问题不是如何避免内存不足的问题。我只是想找一种从程序中检测它的方法。
答案 0 :(得分:0)
我发现了一个适合我的黑客攻击。将错误处理程序日志级别设置为0仅允许错误消息通过。覆盖MessageHandler的print方法然后允许对错误做出反应。这种解决方法绝对是一种黑客行为。如果有人有更好的建议,我很乐意接受不同的答案。
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());