0

COIN/OSI インターフェイス ( ) を介して CPLEX を実行していますOsiCpxSolverInterface。一部の大きな LP でエラー メッセージが表示される エラー メッセージCPX0000 CPLEX Error 1001: Out of memory. にもかかわらず、例外 ( CoinError) はスローされません。ソース コードをOsiCpxSolverInterface見ると、リターン コードはCPXlpopt0 だったはずです。

明確にするために: 私の質問は、メモリ不足の問題を回避する方法ではありません。プログラムからそれを検出する方法を探しています。

4

1 に答える 1

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());
于 2013-10-24T08:13:49.507 に答える