V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
MetaGen
V2EX  ›  Python

高效灵活的数学优化建模语言: PyOptInterface

  •  
  •   MetaGen · 11 天前 · 883 次点击

    最近开发了一个新的数学优化建模语言 PyOptInterface ,性能超过了 Pyomo ,JuMP.jl 等一众开源的优化建模语言(相比 Pyomo 有 10 倍以上的性能提升),很适合大规模数学优化问题(线性规划、二次规划、混合整数线性规划等)的建模和求解。

    欢迎对运筹优化领域感兴趣的 v 友试用。

    项目源码: https://github.com/metab0t/PyOptInterface

    项目文档地址: https://metab0t.github.io/PyOptInterface/

    7 条回复    2024-06-10 08:30:29 +08:00
    beneo
        1
    beneo  
       11 天前
    这么牛,一般人干不了这个
    chizuo
        2
    chizuo  
       11 天前
    这个和 Gurobi 相比咋样呢?
    MetaGen
        3
    MetaGen  
    OP
       11 天前
    @chizuo

    优化建模语言是负责建立模型的,是求解器接口的上层抽象,最终还是需要调用底层求解器(如 Gurobi 、COPT 、HiGHS 等)去求解。

    不过在建模性能方面,PyOptInterface 也是比 Gurobi 自带的 Python 接口要快的。至于求解问题的速度,这个取决于调用的求解器,像 Gurobi 等商业求解器速度都比较快。
    dayeye2006199
        4
    dayeye2006199  
       10 天前 via Android
    你这性能,是创建问题实例的速度吗?
    yenkn
        5
    yenkn  
       10 天前
    竟然也有做这个的 v 友,我之前也写过一个类似的库给 ipopt 做 codegen 然后 jit 编译成 python library ,用的是 sympy 来建模和自动微分,性能非常差,每次改完模型等很久,不过好在没有运行时的 overhead ,看到 op 这个工作简直相见恨晚;顺便提个小需求:可以把 codegen 结果生成独立的 C++ header/source 吗,这样 python 调试好的算法就可以直接部署了,也方便接入其他 C++ solver
    MetaGen
        6
    MetaGen  
    OP
       10 天前
    @dayeye2006199 是的,仅测量了创建模型的速度,因为求解问题的速度仅取决于求解器,和建模语言无关。
    MetaGen
        7
    MetaGen  
    OP
       10 天前
    @yenkn 碰上懂行的 v 友了,对于 ipopt 的支持我们也做了,只不过文档还没写,可以先看一下 https://github.com/metab0t/PyOptInterface/blob/master/tests/test_nlp.py 这个测试的例子。

    我们的思路也是使用 jit 来生成计算函数值和计算导数的代码,使用了 CppAD 做自动求导+手写的 LLVM IR 或者 C 代码生成+llvmlite 或者 Tiny C Compiler 做代码即时编译。CppAD 的性能本身就很快,而且 PyOptInterface 使用了注册非线性函数+复用的方式,对于同样结构的非线性函数只需要编译一次,很适合具有大量相似非线性结构的优化问题。我猜测你提到的速度很慢一方面是 sympy 速度慢,另一方面是因为对大规模优化问题的所有约束直接自动微分+代码生成会有效率上的问题。

    至于生成 C++ header/source 的需求,我没太明白意思,因为最终还是要调用求解器的底层 API ,没办法生成 dependency free 的代码。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2657 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:08 · PVG 23:08 · LAX 08:08 · JFK 11:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.