0

我正在通过 COIN/OSI 接口 ( OsiCpxSolverInterface) 运行 CPLEX。对于一些大型 LP,我收到一条错误消息CPX0000 CPLEX Error 1001: Out of memory. 尽管有错误消息,但没有抛出异常 ( CoinError)。查看它的源代码OsiCpxSolverInterface看起来它的返回码CPXlpopt一定是 0。

需要明确的是:我的问题不是如何避免内存不足的问题。我只是在寻找一种从我的程序中检测到它的方法。

4

1 回答 1

0

我找到了一个适合我的 hack。将错误处理程序日志级别设置为 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());
于 2013-10-24T08:13:49.507 回答