# Cgl-src [![Package][package-img]][package-url] [![Documentation][documentation-img]][documentation-url] [![License][license-img]][license-url] ## description `Cgl-src` crate is a *-src crate. This links Cgl libraries to executable build by cargo, but does not provide Rust bindings. [Cgl] is built with [CoinUtils] ([CoinUtils-src]), [Osi] ([Clp-src]) and [Clp] ([Clp-src])(Optional). By this package, you don't need to worry about installing Cgl in the system, and it can be built for **all platforms**. The COIN-OR Cut Generation Library (Cgl) is a collection of cut generators that can be used with other COIN-OR packages that make use of cuts, such as, the mixed integer linear programming solvers [Cbc] ([Cbc-src]). Cgl uses the [Osi] ([Osi-src]) to use or communicate with a solver, such as the linear programming solvers [Clp] [Clp-src]. It does not directly call a solver. ## Usage 1. Add the following to your `Cargo.toml`: ```toml [dependencies] cgl-src = "\*" ``` 2. Add the following to your `lib.rs`: ```toml extern crate cgl_src; ``` This package does not provide bindings. Please use [coincbc-sys], [coinclp-sys] to use Cbc, Clp, e.g. ```toml [dependencies] coincbc-sys = { version = "\*" } ``` ## Configuration ### Features The following Cargo features are supported: * `default` to `with_clp` and `default_cuts` feature; * `with_clp` to build with Clp support; * `default_cuts` to provide all the following cut generators; * Combinatorial cuts * `CglAllDifferent` to provide [CglAllDifferent] cut generator; * `CglClique` to provide [CglClique] cut generator; * `CglKnapsackCover` to provide [CglKnapsackCover] cut generator; * `CglOddHole` to provide [CglOddHole] cut generator; * `CglZeroHalf` to provide [CglZeroHalf] cut generator; * flow cover cuts: * `CglFlowCover` to provide [CglFlowCover] cut generator; * Gomory cuts and variants: * `CglGomory` = to provide [CglGomory] cut generator, which requires `with_clp` feature to use [clp-src]; * `CglGMI` to provide [CglGMI] cut generator; * `CglRedSplit` to provide [CglRedSplit] cut generator; * `CglRedSplit2` to provide [CglRedSplit2] cut generator; * Lift and project cuts: * `CglLiftAndProject` to provide [CglLiftAndProject] cut generator; * `CglLandP` = to provide [CglLandP] cut generator, which requires `CglGomory` feature; * Mixed integer rounding cuts and variants: * `CglMixedIntegerRounding` to provide [CglMixedIntegerRounding] cut generator; * `CglMixedIntegerRounding2` to provide [CglMixedIntegerRounding2] cut generator; * `CglTwomir` to provide [CglTwomir] cut generator, which requires `with_clp` feature to use [clp-src]; * `CglResidualCapacity` to provide [CglResidualCapacity] cut generator; * Strengthening: * `CglDuplicateRow` to provide [CglDuplicateRow] cut generator; * `CglPreProcess` to provide [CglPreProcess] cut generator; * `CglProbing` to provide [CglProbing] cut generator; * `CglSimpleRounding` to provide [CglSimpleRounding] cut generator; ### Environment The package build from the source and link statically by default. It also provide the following environment variables to allow users to link to system library customly: * `CARGO_COINUTILS_STATIC` to link to CoinUtils statically; * `CARGO_COINUTILS_SYSTEM` to link to CoinUtils system library; * `CARGO_OSI_STATIC` to link to Osi statically; * `CARGO_OSI_SYSTEM` to link to Osi system library; * `CARGO_CLP_STATIC` to link to Clp statically if `with_clp` feature is enabled; * `CARGO_CLP_SYSTEM` to link to Clp system library if `with_clp` feature is enabled; * `CARGO_CGL_STATIC` to link to Cgl statically; * `CARGO_CGL_SYSTEM` to link to Cgl system library; Set the environment variable to `1` to enable the feature. For example, to link to system library dynamically, set `CARGO_${LIB_NAME}_SYSTEM` to `1`; to link to system library statically, set both `CARGO_${LIB_NAME}_SYSTEM` and `CARGO_${LIB_NAME}_STATIC` to `1`. ## Windows and vcpkg On Windows, if `${LIB_NAME}_SYSTEM` is set to `1`, `cgl-src` will use [vcpkg] to find Cgl. Before building, you must have the correct Cgl installed for your target triplet and kind of linking. For instance, to link dynamically for the `x86_64-pc-windows-msvc` toolchain, install `cgl` for the `x64-windows` triplet: ```sh vcpkg install cgl --triplet x64-windows ``` To link Cgl statically, install `cgl` for the `x64-windows-static-md` triplet: ```sh vcpkg install cgl --triplet x64-windows-static-md ``` To link Cgl and C Runtime (CRT) statically, install `cgl` for the `x64-windows-static` triplet: ```sh vcpkg install cgl --triplet x64-windows-static ``` and build with `+crt-static` option ```sh RUSTFLAGS='-C target-feature=+crt-static' cargo build --target x86_64-pc-windows-msvc ``` Please see the ["Static and dynamic C runtimes" in The Rust reference](https://doc.rust-lang.org/reference/linkage.html#static-and-dynamic-c-runtimes) for detail. ## Cross Compilation you can compile it for the other target by providing the `--target` option to `cargo build`. | Target | supported | |--------------------------------------|:-----------:| | `arm-unknown-linux-gnueabi` | ✓ | | `arm-unknown-linux-gnueabihf` | ✓ | | `armv7-unknown-linux-gnueabi` | ✓ | | `armv7-unknown-linux-gnueabihf` | ✓ | | `armv7-unknown-linux-musleabi` | ✓ | | `armv7-unknown-linux-musleabihf` | ✓ | | `aarch64-unknown-linux-gnu` | ✓ | | `aarch64-unknown-linux-musl` | ✓ | | `riscv64gc-unknown-linux-gnu` | ✓ | | `x86_64-pc-windows-msvc` | ✓ | | `x86_64-unknown-linux-gnu` | ✓ | | `x86_64-unknown-linux-musl` | ✓ | | others | not test | ## Contribution Your contribution is highly appreciated. Do not hesitate to open an issue or a pull request. Note that any contribution submitted for inclusion in the project will be licensed according to the terms given in [LICENSE](license-url). [CoinUtils]: https://github.com/coin-or/CoinUtils [Osi]: https://github.com/coin-or/Osi [Cgl]: https://github.com/coin-or/Cgl [Clp]: https://github.com/coin-or/Clp [Cbc]: https://github.com/coin-or/Cbc [CoinUtils-src]: https://github.com/Maroon502/coinutils-src [Osi-src]: https://github.com/Maroon502/osi-src [Clp-src]: https://github.com/Maroon502/clp-src [Cbc-src]: https://github.com/Maroon502/cbc-src [coincbc-sys]: https://github.com/Maroon502/coincbc-sys [coinclp-sys]: https://github.com/Maroon502/coinclp-sys [vcpkg]: https://github.com/Microsoft/vcpkg [documentation-img]: https://docs.rs/cgl-src/badge.svg [documentation-url]: https://docs.rs/cgl-src [package-img]: https://img.shields.io/crates/v/cgl-src.svg [package-url]: https://crates.io/crates/cgl-src [license-img]: https://img.shields.io/crates/l/cgl-src.svg [license-url]: https://github.com/Maroon502/cgl-src/blob/master/LICENSE.md [CglAllDifferent]: https://github.com/coin-or/Cgl/wiki/CglAllDifferent [CglClique]: https://github.com/coin-or/Cgl/wiki/CglClique [CglKnapSackCover]: https://github.com/coin-or/Cgl/wiki/CglKnapSackCover [CglOddHole]: https://github.com/coin-or/Cgl/wiki/CglOddHole [CglFlowCover]: https://github.com/coin-or/Cgl/wiki/CglFlowCover [CglGomory]: https://github.com/coin-or/Cgl/wiki/CglGomory [CglRedSplit]: https://github.com/coin-or/Cgl/wiki/CglRedSplit [CglLiftAndProject]: https://github.com/coin-or/Cgl/wiki/CglLiftAndProject [CglLandP]: https://github.com/coin-or/Cgl/wiki/CglLandP [CglMixedIntegerRounding]: https://github.com/coin-or/Cgl/wiki/CglMixedIntegerRounding [CglMixedIntegerRounding2]: https://github.com/coin-or/Cgl/wiki/CglMixedIntegerRounding2 [CglTwomir]: https://github.com/coin-or/Cgl/wiki/CglTwomir [CglResidualCapacity]: https://github.com/coin-or/Cgl/wiki/CglResidualCapacity [CglDuplicateRow]: https://github.com/coin-or/Cgl/wiki/CglDuplicateRow [CglPreProcess]: https://github.com/coin-or/Cgl/wiki/CglPreProcess [CglProbing]: https://github.com/coin-or/Cgl/wiki/CglProbing [CglSimpleRounding]: https://github.com/coin-or/Cgl/wiki/CglSimpleRounding