#优化 #自动微分 #Ipopt #微分 #约束 #建模 #运算符重载

nightly descent

建模和自动微分用于约束优化

5 个版本 (破坏性)

0.5.0 2021年1月29日
0.4.0 2020年5月27日
0.3.0 2018年12月10日
0.2.0 2018年7月20日
0.1.0 2018年7月19日

#460 in 科学


2 crates 中使用

Apache-2.0 OR MIT

78KB
1.5K SLoC

下降

一个带有第一和二阶自动微分/源代码符号微分的非线性约束优化(数学规划)建模库。目前有一个接口到非线性求解器 Ipopt

依赖项

Ipopt(或Bonmin)必须在尝试构建之前单独安装,因为 descent_ipopt 链接到 libipopt.so 共享库。

仅在 Linux 上进行过测试,但预计在 macOS 上也能正常工作,在适当的环境中可能在 Windows 上也能工作。

要在您的 own crate 中使用,请在您的 own Cargo.toml 文件中添加以下内容

[dependencies]
descent = "0.3"
descent_ipopt = "0.3"
descent_macro = "0.3" # for optional but recommended expr! procedural macro use

示例

以下代码显示了如何解决以下简单问题:在 IPOPT 中最小化 2 y s.t. y >= x * x - x, x in [-10, 10]

use descent::model::Model;
use descent_ipopt::IpoptModel;

let mut m = IpoptModel::new();

let x = m.add_var(-10.0, 10.0, 0.0);
let y = m.add_var(std::f64::NEG_INFINITY, std::f64::INFINITY, 0.0);
m.set_obj(2.0 * y);
m.add_con(y - x * x + x, 0.0, std::f64::INFINITY);

let (stat, sol) = m.solve();

提供了完整的示例,包含更多详细信息,请参阅 descent_ipopt/examples/simple.rs,可以按如下方式构建和运行

cargo build --release --example simple
./target/release/examples/simple

代码优化很重要,所以在测试代码性能时,请确保开启优化或使用发布构建选项。

建模

支持在数学表达式中使用运算符 +-*.powi(i32).sin().cos()。表达式可以通过运算符重载或过程宏(需要nightly rust)来生成。

通过运算符重载进行自动微分

可以使用运算符重载动态地生成具有最大灵活性的表达式。上面提供的示例采用了这种方法。

通过过程宏进行源代码转换

如果可用nightly rust,则可以使用过程宏来“静态”生成评估表达式及其一阶和二阶导数的函数。这比动态运算符重载和AD方法提供了巨大的性能提升。使用过程宏表达式生成方法的上例如下

#![feature(proc_macro_hygiene)]

use descent::model::Model;
use descent_ipopt::IpoptModel;
use descent_macro::expr;

let mut m = IpoptModel::new();

let x = m.add_var(-10.0, 10.0, 0.0);
let y = m.add_var(std::f64::NEG_INFINITY, std::f64::INFINITY, 0.0);
m.set_obj(expr!(2.0 * y; y));
m.add_con(expr!(y - x * x + x; x, y), 0.0, std::f64::INFINITY);

let (stat, sol) = m.solve();

更完整的示例可以在 descent_ipopt/examples/problem_macro.rs 中找到。

参数化

该库允许对值进行参数化,并简化求解器的预热启动,以实现快速模型调整和解决。

待办事项

  • 整理草率编写的进程宏。
  • 与 ipopt-sys crate 集成,可能还会与 ipopt crate 集成,而不是使用/维护自己的绑定。
  • Bonmin 绑定(启用 MINLP)。

许可

Apache-2.0 或 MIT

依赖项

~1.5MB
~37K SLoC