" pyOptSparse错误:导入已编译的IPOPT模块时出错[&34;在关注文档时

时间:2017-03-03 11:01:23

标签: python-3.x openmdao ipopt

我正在尝试使用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的软件包,以及根据this suggestion复制源代码)。最相关的部分是:

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的各种组合,但如果有人对位置和环境变量有任何具体建议,我都是耳朵

1 个答案:

答案 0 :(得分:0)

原因

PyOptSparse中的pyIPOPT目前不支持Python3。具体来说,它使用Py_FindMethod来电和/pyoptsparse/pyoptsparse/pyIPOPT/src/中的号码转化来电。

解决方案

original pyIPOPT code已使用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 Paraboloid示例。

进一步的工作

  • 使用更新版本的pyIPOPT更新pyOptSparse版本的pyIPOPT
  • 可能弄清楚为什么PyOOPT的pyOptSparse版本中的默认参数不起作用。将默认值转换为有效的内容