{-| A library for modeling and solving linear and integer programs. This library is merely a frontend to various solver backends. At the time this was written, the only known supported backend is <https://github.com/prsteele/math-programming-glpk GLPK>. -} module Math.Programming ( -- * Math programs -- $mathprograms -- ** Linear programs LPMonad (..) , Expr , Bounds (..) , SolutionStatus (..) , Sense (..) -- ** Integer programs , IPMonad (..) , Domain (..) -- * Model-building DSL -- $models -- ** Creating variables -- $variables -- *** Continuous variables , free , nonNeg , nonPos , bounded , within -- *** Integer variables , integer , binary , nonNegInteger , nonPosInteger , asKind -- ** Linear expressions -- $expressions , LinearExpression (..) , eval , simplify , var , con , exprSum , varSum -- *** Addition -- $addition , (.+.) , (@+@) , (.+@) , (@+.) , (@+#) , (#+@) , (#+.) , (.+#) -- *** Subtraction -- $subtraction , (.-.) , (@-@) , (.-@) , (@-.) , (@-#) , (#-@) , (#-.) , (.-#) -- *** Multiplication -- $multiplication , (#*@) , (@*#) , (#*.) , (.*#) -- *** Division -- $division , (@/#) , (./#) -- ** Constraints -- $constraints , Inequality (..) -- *** Less-than constraints -- $lt , (#<=@) , (#<=.) , (@<=#) , (@<=@) , (@<=.) , (.<=#) , (.<=@) , (.<=.) -- *** Greater-than constraints -- $gt , (#>=@) , (#>=.) , (@>=#) , (@>=@) , (@>=.) , (.>=#) , (.>=@) , (.>=.) -- *** Equality constraints -- $eq , (#==@) , (#==.) , (@==#) , (@==@) , (@==.) , (.==#) , (.==@) , (.==.) -- ** Specifying objectives , minimize , maximize -- ** Utilities , evalExpr , named , nameOf ) where import Math.Programming.Dsl import Math.Programming.Types -- $mathprograms -- -- The 'LPMonad' provides all the primitives necessary to formulate -- and solve linear programs; the 'IPMonad' provides the same for -- integer programs. However, you should not often need to use these -- APIs directly, as we provide more user-friendly functions wrapping -- these low-level functions below. -- $models -- -- The functions in the 'LPMonad' and 'IPMonad' typeclasses are -- designed to interface with low-level solver backends. We provide a -- cleaner interface in the following sections. -- $variables -- -- 'LPMonad' provides 'addVariable' and 'setVariableBounds', and -- 'IPMonad' additionally provides 'setVariableDomain'. While -- sufficient to create your programs, you are encouraged to use the -- more natural functions below. -- $expressions -- -- The module 'Math.Programming.LinearExpression' provides operators -- to build up 'LinearExpression' objects using declared variables. -- $addition -- -- We can summarize the addition operators with the table -- -- +-----------------+--------+--------+------------------+ -- | |Constant|Variable| Expression | -- +-----------------+--------+--------+------------------+ -- |Constant | '+' | '#+@' | '#+.' | -- +-----------------+--------+--------+------------------+ -- |Variable | '@+#' | '@+@' | '@+.' | -- +-----------------+--------+--------+------------------+ -- |Expression | '.+#' | '.+@' | '.+.' | -- +-----------------+--------+--------+------------------+ -- $subtraction -- -- We can summarize the subtraction operators with the table -- -- +-----------------+--------+--------+------------------+ -- | |Constant|Variable| Expression | -- +-----------------+--------+--------+------------------+ -- |Constant | '-' | '#-@' | '#-.' | -- +-----------------+--------+--------+------------------+ -- |Variable | '@-#' | '@-@' | '@-.' | -- +-----------------+--------+--------+------------------+ -- |Expression | '.-#' | '.-@' | '.-.' | -- +-----------------+--------+--------+------------------+ -- $multiplication -- -- We can summarize the multiplication operators with the table -- -- +-----------------+--------+--------+------------------+ -- | |Constant|Variable| Expression | -- +-----------------+--------+--------+------------------+ -- |Constant | '*' | '#*@' | '#*.' | -- +-----------------+--------+--------+------------------+ -- |Variable | '@*#' | | | -- +-----------------+--------+--------+------------------+ -- |Expression | '.*#' | | | -- +-----------------+--------+--------+------------------+ -- -- As there are few possibilities for valid multiplication, it can be -- convenient to define e.g. @.*@ or some other short operator as an -- alias for '#*@'. -- $division -- -- We can summarize the multiplication operators with the table -- -- +-----------------+--------+--------+------------------+ -- | |Constant|Variable| Expression | -- +-----------------+--------+--------+------------------+ -- |Constant | '/' | | | -- +-----------------+--------+--------+------------------+ -- |Variable | '@/#' | | | -- +-----------------+--------+--------+------------------+ -- |Expression | './#' | | | -- +-----------------+--------+--------+------------------+ -- -- As there are few possibilities for valid division, it -- can be convenient to define e.g. @./@ or some other short operator -- as an alias for '@/#'. -- $constraints -- -- The 'LPMonad' provides the 'addConstraint' function. However, you -- will typically use the operators below to directly apply -- constraints to the model. We follow the same conventions as with -- our arithmetic operators. -- $lt -- -- We can summarize the various inquality operators in the following table. -- -- +-----------------+--------+--------+------------------+ -- | |Constant|Variable| Expression | -- +-----------------+--------+--------+------------------+ -- |Constant | | '#<=@' | '#<=.' | -- +-----------------+--------+--------+------------------+ -- |Variable | '@<=#' | '@<=@' | '@<=.' | -- +-----------------+--------+--------+------------------+ -- |Expression | '.<=#' | '.<=@' | '.<=.' | -- +-----------------+--------+--------+------------------+ -- $gt -- -- We can summarize the various inquality operators in the following table. -- -- +-----------------+--------+--------+------------------+ -- | |Constant|Variable| Expression | -- +-----------------+--------+--------+------------------+ -- |Constant | | '#>=@' | '#>=.' | -- +-----------------+--------+--------+------------------+ -- |Variable | '@>=#' | '@>=@' | '@>=.' | -- +-----------------+--------+--------+------------------+ -- |Expression | '.>=#' | '.>=@' | '.>=.' | -- +-----------------+--------+--------+------------------+ -- $eq -- -- We can summarize the various inquality operators in the following table. -- -- +-----------------+--------+--------+------------------+ -- | |Constant|Variable| Expression | -- +-----------------+--------+--------+------------------+ -- |Constant | | '#==@' | '#==.' | -- +-----------------+--------+--------+------------------+ -- |Variable | '@==#' | '@==@' | '@==.' | -- +-----------------+--------+--------+------------------+ -- |Expression | '.==#' | '.==@' | '.==.' | -- +-----------------+--------+--------+------------------+