#!/usr/bin/env bash

# Exit when command fails
set -e
#Attempt to use undefined variable outputs error message, and forces an exit
set -u
#Causes a pipeline to return the exit status of the last command in the pipe
#that returned a non-zero return value.
set -o pipefail
#set -x

source $COINBREW_HOME/scripts/generate_readme

pushd . > /dev/null
cd $(dirname $0)
SCRIPT_DIR=$PWD
popd > /dev/null

create_variables $SCRIPT_DIR/config.yml

make_header

echo "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, among others, the linear solver 
[Clp](https://github.com/coin-or/Clp) or the mixed integer linear programming solvers 
[Cbc](https://github.com/coin-or/Cbc) or [BCP](https://github.com/coin-or/Bcp). 
\`Cgl\` uses the abstract class \`OsiSolverInterface\` 
(see [Osi](https://github.com/coin-or/Osi)) to use or communicate with a solver.
It does not directly call a solver.

Each cut generator is in a separate directory with its own maintainer.
All generators are combined in one library when \`Cgl\` is compiled.

Available cut generators are: 

 * Combinatorial cuts:
   * [CglAllDifferent](https://github.com/coin-or/Cgl/wiki/CglAllDifferent)
   * CglBKClique
   * [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)
   * CglOddWheel
   * CglZeroHalf

 * Flow cover cuts:
   * [CglFlowCover](https://github.com/coin-or/Cgl/wiki/CglFlowCover)

 * Gomory cuts and variants:
   * [CglGomory](https://github.com/coin-or/Cgl/wiki/CglGomory)
   * CglGMI
   * [CglRedSplit](https://github.com/coin-or/Cgl/wiki/CglRedSplit)
   * CglRedSplit2

 * Lift-and-project cuts:
   * [CglLiftAndProject](https://github.com/coin-or/Cgl/wiki/CglLiftAndProject)
   * [CglLandP](https://github.com/coin-or/Cgl/wiki/CglLandP)

 * Mixed integer rounding cuts and variants:
   * [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)

 * Strengthening:
   * CglCliqueStrengthening
   * [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)

CoinUtils is an open-source collection of classes and helper functions
that are generally useful to multiple COIN-OR projects.
These utilities include:
 * classes for storing and manipulating sparse matrices and vectors,
 * performing matrix factorization,
 * parsing input files in standard formats, e.g. MPS,
 * building representations of mathematical programs,
 * performing simple presolve operations,
 * warm starting algorithms for mathematical programs,
 * comparing floating point numbers with a tolerance
 * classes for storing and manipulating conflict graphs, and
 * classes for searching and storing cliques and odd cycles in conflict graphs, among others.

The project managers of Cgl are Robin Lougee (@rlougee) and Francois Margot.
"

make_build_info

make_doxygen_info

make_links

echo "---------

## Information for Subproject Managers

A cut generator in \`Cgl\` must conform to the following:

 * Its main class \`CglCutGeneratorDeriv\` is derived from the class \`CglCutGenerator\`.
 * It has three related classes used for data, parameters and information with respect to the enumeration tree:
   * A class \`CglDataDeriv\` derived from \`CglData\`; it should contain pointers on all data used by the generator that might be obtained from an \`OsiSolverInterface\` object when calling \`generateCuts()\` with an \`OsiSolverInterface\` object as parameter. The class \`CglDataDeriv\` might be \`CglData\` if the latter is sufficient. An exception is made for generators needing information deemed too expensive to collect from the solver (for example the optimal Simplex tableau); in this case \`CglDataDeriv\` might still contain a pointer on the \`OsiSolverInterface\` object, but its use should be limited to obtaining the \"expensive\" information from the solver.
   * A class \`CglParamDeriv\` derived from \`CglParam\`. It should contain parameters of the generator that can be set by the user. The parameters in the class \`CglParamDeriv\` must be taken into account during the cut generation. The class \`CglParamDeriv\` might be \`CglParam\` if the latter is sufficient.
   * A class \`CglTreeInfoDeriv\` derived from \`CglTreeInfo\`. The class \`CglTreeInfoDeriv\` might be \`CglTreeInfo\` if the latter is sufficient.
 * The class \`CglCutGeneratorDeriv\` must have 
   * A member of type \`CglParamDeriv\` used to store the current parameters.
   * A method \`getParam()\` that returns the object storing the current parameters.
   * A method \`generateCuts(const OsiSolverInterface & si, OsiCuts & cs, const CglTreeInfoDeriv info)\`
   * A method \`generateCuts(const CglDataDeriv &data, OsiCuts & cs, const CglTreeInfoDeriv info)\`
 * The data class \`CglDataDeriv\` must have methods \`getMember()\` and \`setMember()\` for each \`member\` of the class. Data members in \`CglData\` irrelevant for a generator are completely ignored. If a data member that is used by a generator is not available when \`generateCuts(const CglDataDeriv &data, OsiCuts & cs, const CglTreeInfoDeriv info)\` is called, the call is aborted, as if no cuts were found. A warning message might be printed.
 * The class \`CglParamDeriv\` must have methods \`getMember()\` and \`setMember()\` for each \`member\` of the class. All parameters must have default values. Each cut generator with a derived class is free to change the default values for all the members of \`CglParamDeriv\`, including those from \`CglParam\`.
 * Once an object of the cut generator class is created, it should be possible to call generateCuts() several times in a row without having to destroy and re-create the object.
 * By default, a successful call to \`generateCuts()\` should not generate any output. If an error occurs, a message might be printed.
"
