4个版本 (2个重大更新)
0.5.0 | 2021年1月29日 |
---|---|
0.4.0 | 2020年5月27日 |
0.3.1 | 2018年12月13日 |
0.3.0 | 2018年12月10日 |
在#ipopt中排名8
每月下载量 28次
用于descent_ipopt
34KB
721 行
Descent
一个带有一阶和二阶自动微分/源代码符号微分功能的非线性约束优化(数学规划)建模库。目前有一个接口连接到非线性求解器Ipopt。
依赖项
Ipopt(或Bonmin)必须在尝试构建descent_ipopt
之前单独安装,因为descent_ipopt
链接到libipopt.so共享库。
它仅在Linux上进行了测试,但可能在macos上也能正常工作,而且在适当的环境下可能在Windows上也能工作。
要在自己的crate中使用,请将以下内容添加到自己的Cargo.toml
文件中
[dependencies]
descent = "0.3"
descent_ipopt = "0.3"
descent_macro = "0.3" # for optional but recommended expr! procedural macro use
示例
以下代码演示了如何使用IPOPT解决以下简单问题:min 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