-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Use SMT solvers to solve linear systems of equations over integers and rationals. -- -- Express and solve linear systems of equations over integers and -- rationals, using an SMT solver to do the actual solving. By default, -- we use Microsoft's Z3 SMT solver -- (http://research.microsoft.com/en-us/um/redmond/projects/z3/). -- -- linearEqSolver is hosted at GitHub: -- http://github.com/LeventErkok/linearEqSolver. Comments, bug -- reports, and patches are always welcome. -- -- Release notes can be seen at: -- http://github.com/LeventErkok/linearEqSolver/blob/master/RELEASENOTES. @package linearEqSolver @version 1.1 -- | (The linear equation solver library is hosted at -- http://github.com/LeventErkok/linearEqSolver. Comments, bug -- reports, and patches are always welcome.) -- -- Solvers for linear equations over integers and rationals. Both single -- solution and all solution variants are supported. module Math.LinearEquationSolver -- | Solve a system of linear integer equations. The first argument is the -- matrix of coefficients, known as A, of size mxn. The -- second argument is the vector of results, known as B, of size -- mx1. The result will be either Nothing, if there is no -- solution, or Just x -- such that Ax = B holds. -- (Naturally, the result x will be a vector of size -- nx1 in this case.) -- -- Here's an example call, to solve the following system of equations: -- --
--   2x + 3y + 4z = 20
--   6x - 3y + 9z = -6
--   2x      +  z = 8
--   
-- --
--   >>> solveIntegerLinearEqs [[2, 3, 4],[6, -3, 9],[2, 0, 1]] [20, -6, 8]
--   Just [5,6,-2]
--   
-- -- In case there are no solutions, we will get Nothing: -- --
--   >>> solveIntegerLinearEqs [[1], [1]] [2, 3]
--   Nothing
--   
-- -- Note that there are no solutions to this second system as it -- stipulates the unknown is equal to both 2 and 3. (Overspecified.) solveIntegerLinearEqs :: [[Integer]] -> [Integer] -> IO (Maybe [Integer]) -- | Similar to solveIntegerLinearEqs, except returns all possible -- solutions. Note that there might be an infinite number of solutions if -- the system is underspecified, in which case the result will be a lazy -- list of solutions that the caller can consume as much as needed. -- -- Here's an example call, where we underspecify the system and hence -- there are multiple (in this case an infinite number of) solutions. -- Here, we only take the first 3 elements, for testing purposes, but all -- such results can be computed lazily. Our system is: -- --
--   2x + 3y + 4z = 20
--   6x - 3y + 9z = -6
--   
-- -- We have: -- --
--   >>> take 3 `fmap` solveIntegerLinearEqsAll [[2, 3, 4],[6, -3, 9]] [20, -6]
--   [[5,6,-2],[-8,4,6],[18,8,-10]]
--   
solveIntegerLinearEqsAll :: [[Integer]] -> [Integer] -> IO [[Integer]] -- | Solve a system of linear equations over rationals. Same as the integer -- version solveIntegerLinearEqs, except it takes rational -- coefficients and returns rational results. -- -- Here's an example call, to solve the following system of equations: -- --
--   2.4x + 3.6y = 12
--   7.2x - 5y   = -8.5
--   
-- --
--   >>> solveRationalLinearEqs [[2.4, 3.6],[7.2, -5]] [12, -8.5]
--   Just [245 % 316,445 % 158]
--   
solveRationalLinearEqs :: [[Rational]] -> [Rational] -> IO (Maybe [Rational]) -- | Solve a system of linear equations over rationals. Similar to -- solveRationalLinearEqs, except it returns all solutions lazily. -- -- Example system: -- --
--   2.4x + 3.6y = 12
--   
-- -- In this case, the system has infinitely many solutions. We can compute -- three of them as follows: -- --
--   >>> take 3 `fmap` solveRationalLinearEqsAll [[2.4, 3.6]] [12]
--   [[5 % 1,0 % 1],[0 % 1,10 % 3],[3 % 2,7 % 3]]
--   
solveRationalLinearEqsAll :: [[Rational]] -> [Rational] -> IO [[Rational]]