0

我正在尝试使用 pyOptSparse 包安装 IPOPT 算法。我得到了 SNOPT 和 SLSQP 算法的工作。对于 IPOPT 算法,构建成功,但是在使用该算法时出现错误:

 pyOptSparse Error: There was an error importing the compiled IPOPT module

我正在基于 Ubuntu 的 Docker 容器中构建项目,并且非常准确地遵循了 pyOptSparse 中 IPOPT 上的文档(doc/optimizers/pyipopt.rst)。完整的dockerfile是可用的(我已经包含了我使用基于 apt 的包的尝试,以及根据这个建议对源代码的一些复制)。最相关的部分是:

RUN wget http://www.coin-or.org/download/source/Ipopt/Ipopt-3.11.7.tgz && \
    gunzip Ipopt-3.11.7.tgz && \
    tar -xvf Ipopt-3.11.7.tar && \
    rm -rf Ipopt-3.11.7.tar && \
    mv Ipopt-3.11.7 /pyoptsparse/pyoptsparse/pyIPOPT/Ipopt && \
    wget -P /pyoptsparse/pyoptsparse/pyIPOPT/Ipopt/ThirdParty/HSLold/ \
        https://bitbucket.org/mdolab/pyoptsparse/downloads/ma27ad.f && \
    cd /pyoptsparse/pyoptsparse/pyIPOPT/Ipopt/ThirdParty/Blas/ && \
    ./get.Blas && \
    cd /pyoptsparse/pyoptsparse/pyIPOPT/Ipopt/ThirdParty/Lapack/ && \
    ./get.Lapack && \
    cd /pyoptsparse/pyoptsparse/pyIPOPT/Ipopt && \
    ./configure --disable-linear-solver-loader && \
    make install

ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/pyoptsparse/pyoptsparse/pyIPOPT/Ipopt/lib
RUN cd pyoptsparse && \
    python setup.py build_ext --inplace

在构建的输出中,pyOptSparse 选择了 IPOPT "building 'pyoptsparse.pyIPOPT.pyipoptcore' extension"

有人对如何安装 IPOPT 算法或如何调试安装有任何建议吗?

谢谢!

补充说明:

  • 我没有让 pyOptSparse 的 SLSQP 算法最新提交起作用,因此我使用的是去年年底的提交 fd33788。
  • 我尝试了 --prefix=/usr/local 的各种组合,但如果有人对位置和环境变量有任何具体建议,我全都听
4

1 回答 1

0

原因

pyOptSparse 中的 pyIPOPT 目前不支持 Python3。具体来说,它使用调用Py_FindMethod和数字转换调用/pyoptsparse/pyoptsparse/pyIPOPT/src/

解决方案

原始的pyIPOPT 代码已更新为 Python3 支持,可以使用:

RUN git clone https://github.com/xuy/pyipopt.git && \
    mv /pyipopt/src/pyipoptcoremodule.c /pyoptsparse/pyoptsparse/pyIPOPT/src/pyipoptcoremodule.c && \
    mv /pyipopt/src/hook.h /pyoptsparse/pyoptsparse/pyIPOPT/src/hook.h && \
    mv /pyipopt/src/callback.c /pyoptsparse/pyoptsparse/pyIPOPT/src/callback.c

此时 IPOPT 运行,但没有调用目标就退出。这是因为状态码 -12,表示选项无效。编辑默认选项来def_opts = {}解决这个问题,算法能够收敛 OpenMDAO 抛物面示例。

进一步的工作

  • 用 pyIPOPT 的更新版本更新 pyIPOPT 的 pyOptSparse 版本
  • 可能弄清楚为什么 pyOptSparse 版本的 pyIPOPT 中的默认参数不起作用。将默认值转换为有效的东西
于 2017-03-08T11:43:41.247 回答