#线性规划 #求解器 #优化 #数学

sys highs-sys

Rust绑定HiGHS线性规划求解器。请参阅http://highs.dev。

20个版本 (7个稳定版)

1.6.2 2024年2月21日
1.6.0 2023年9月14日
1.5.3 2023年6月30日
1.5.0 2023年1月18日
0.1.4 2021年3月16日

#2185 in 算法

Download history 146/week @ 2024-03-13 164/week @ 2024-03-20 128/week @ 2024-03-27 184/week @ 2024-04-03 87/week @ 2024-04-10 58/week @ 2024-04-17 64/week @ 2024-04-24 61/week @ 2024-05-01 199/week @ 2024-05-08 182/week @ 2024-05-15 207/week @ 2024-05-22 155/week @ 2024-05-29 184/week @ 2024-06-05 182/week @ 2024-06-12 164/week @ 2024-06-19 250/week @ 2024-06-26

797 每月下载量
用于 4 个crate(通过 highs

MIT 许可证

4.5MB
94K SLoC

C++ 85K SLoC // 0.1% comments C 6K SLoC // 0.2% comments FORTRAN Modern 1K SLoC // 0.1% comments Python 1K SLoC // 0.2% comments C# 852 SLoC // 0.0% comments Rust 117 SLoC // 0.1% comments Julia 100 SLoC // 0.2% comments Bazel 79 SLoC // 0.3% comments Perl 51 SLoC // 0.4% comments Solidity 47 SLoC Shell 31 SLoC // 0.3% comments

highs-sys

docs.rs badge rust crate

Rust绑定HiGHS线性规划求解器。请参阅 http://highs.dev

此仓库包含HiGHS本身的源代码作为子模块。您应该使用以下命令克隆它:

git clone --recursive [email protected]:rust-or/highs-sys.git

此crate可以使用您系统上已安装和可用的HiGHS版本,或者构建并静态链接HiGHS本身。

使用方法

在运行时,HiGHS至少依赖于C++标准库。它需要安装到您的系统以及您想要部署应用程序的任何系统上。

如何安装这些取决于您的操作系统。

Debian

sudo apt-get install libstdc++6

(但可能已经安装到您的系统上)

macOS

当安装XCode时,libc++默认安装。

构建HiGHS

此crate可以选择构建HiGHS并将其静态链接,或者链接到已安装的版本。要构建HiGHS,您至少需要一个C++编译器和cmake。启用附加功能可能会产生额外的运行时依赖项。

Linux

这些可以使用您分发版的包管理器轻松安装。例如,在Debian上: sudo apt install g++ cmake

macOS

要安装C++编译器,运行 xcode-select --install。获取cmake的最简单方法是通过brew: brew install cmake

如果您启用了libzninja功能,也应该通过brew安装这些。

Windows

您需要安装CMakeClang(可在LLVM中找到)

它们可在winget中找到。

winget install -e --id Kitware.CMake
winget install -e --id LLVM.LLVM

如果您启用了Ninja功能,您也可以通过winget获取Ninja。

winget install -e --id Ninja-build.Ninja

如果需要,需要安装libz并设置环境变量ZLIB_ROOT以使其可被发现。

使用预安装的HiGHS版本

您可以选择不构建HiGHS,而是链接到您系统上已安装的版本。为此,在您的系统上安装pkg-config并在此crate上启用discover功能。

这通常会导致HiGHS以动态链接的方式链接,这意味着它还需要部署的系统上安装。

请注意,在撰写本文时,HiGHS在少数包管理器中进行了打包,因此您可能需要从源代码构建和安装HiGHS。

功能标志

build(默认启用):构建HiGHS并以静态方式链接highs_release:将CMake配置文件设置为“发布”,无论构建配置如何;仅当build启用时生效。 libz:启用HiGHS libz链接以支持读取'mps.gz';仅当build启用时生效。 ninja:将CMake生成器设置为Ninja;仅当build启用时生效。 discover:使用pkg-config发现并链接到已安装的HiGHS版本;如果两者都启用,则优先于build

示例

    // This illustrates the use of Highs_call, the simple C interface to
// HiGHS. It's designed to solve the general LP problem
//
// Min c^Tx subject to L <= Ax <= U; l <= x <= u
//
// where A is a matrix with m rows and n columns
//
// The scalar n is numcol
// The scalar m is numrow
//
// The vector c is colcost
// The vector l is collower
// The vector u is colupper
// The vector L is rowlower
// The vector U is rowupper
//
// The matrix A is represented in packed column-wise form: only its
// nonzeros are stored
//
// * The number of nonzeros in A is nnz
//
// * The row indices of the nonnzeros in A are stored column-by-column
// in aindex
//
// * The values of the nonnzeros in A are stored column-by-column in
// avalue
//
// * The position in aindex/avalue of the index/value of the first
// nonzero in each column is stored in astart
//
// Note that astart[0] must be zero
//
// After a successful call to Highs_call, the primal and dual
// solution, and the simplex basis are returned as follows
//
// The vector x is colvalue
// The vector Ax is rowvalue
// The vector of dual values for the variables x is coldual
// The vector of dual values for the variables Ax is rowdual
// The basic/nonbasic status of the variables x is colbasisstatus
// The basic/nonbasic status of the variables Ax is rowbasisstatus
//
// The status of the solution obtained is modelstatus
//
// To solve maximization problems, the values in c must be negated
//
// The use of Highs_call is illustrated for the LP
//
// Min    f  = 2x_0 + 3x_1
// s.t.                x_1 <= 6
//       10 <=  x_0 + 2x_1 <= 14
//        8 <= 2x_0 +  x_1
// 0 <= x_0 <= 3; 1 <= x_1

fn main() {
    let numcol: usize = 2;
    let numrow: usize = 3;
    let nnz: usize = 5;

    // Define the column costs, lower bounds and upper bounds
    let colcost: &mut [f64] = &mut [2.0, 3.0];
    let collower: &mut [f64] = &mut [0.0, 1.0];
    let colupper: &mut [f64] = &mut [3.0, 1.0e30];
    // Define the row lower bounds and upper bounds
    let rowlower: &mut [f64] = &mut [-1.0e30, 10.0, 8.0];
    let rowupper: &mut [f64] = &mut [6.0, 14.0, 1.0e30];
    // Define the constraint matrix column-wise
    let astart: &mut [c_int] = &mut [0, 2];
    let aindex: &mut [c_int] = &mut [1, 2, 0, 1, 2];
    let avalue: &mut [f64] = &mut [1.0, 2.0, 1.0, 2.0, 1.0];

    let colvalue: &mut [f64] = &mut vec![0.; numcol];
    let coldual: &mut [f64] = &mut vec![0.; numcol];
    let rowvalue: &mut [f64] = &mut vec![0.; numrow];
    let rowdual: &mut [f64] = &mut vec![0.; numrow];

    let colbasisstatus: &mut [c_int] = &mut vec![0; numcol];
    let rowbasisstatus: &mut [c_int] = &mut vec![0; numrow];

    let modelstatus: &mut c_int = &mut 0;

    let status: c_int = unsafe {
        Highs_call(
            numcol.try_into().unwrap(),
            numrow.try_into().unwrap(),
            nnz.try_into().unwrap(),
            colcost.as_mut_ptr(),
            collower.as_mut_ptr(),
            colupper.as_mut_ptr(),
            rowlower.as_mut_ptr(),
            rowupper.as_mut_ptr(),
            astart.as_mut_ptr(),
            aindex.as_mut_ptr(),
            avalue.as_mut_ptr(),
            colvalue.as_mut_ptr(),
            coldual.as_mut_ptr(),
            rowvalue.as_mut_ptr(),
            rowdual.as_mut_ptr(),
            colbasisstatus.as_mut_ptr(),
            rowbasisstatus.as_mut_ptr(),
            modelstatus
        )
    };

    assert_eq!(status, 0);
    // The solution is x_0 = 2 and x_1 = 4
    assert_eq!(colvalue, &[2., 4.]);
}

有关更多示例,请参阅tests

无运行时依赖