aboutsummaryrefslogtreecommitdiff
path: root/Math/LinProg/LPSolve.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Math/LinProg/LPSolve.hs')
-rw-r--r--Math/LinProg/LPSolve.hs27
1 files changed, 15 insertions, 12 deletions
diff --git a/Math/LinProg/LPSolve.hs b/Math/LinProg/LPSolve.hs
index 427c5d7..4e8385a 100644
--- a/Math/LinProg/LPSolve.hs
+++ b/Math/LinProg/LPSolve.hs
@@ -19,16 +19,18 @@ module Math.LinProg.LPSolve (
) where
import Control.Applicative
-import Control.Monad
-import Data.List
+import Control.Arrow
import Control.Lens
-import Math.LinProg.LPSolve.FFI hiding (solve)
-import qualified Math.LinProg.LPSolve.FFI as F
+import Control.Monad
+import Data.Hashable
+import Data.List hiding (nub)
import Math.LinProg.LP
+import Math.LinProg.LPSolve.FFI hiding (solve)
import Math.LinProg.Types
+import Prelude hiding (EQ, nub)
import qualified Data.HashMap.Strict as M
-import Data.Hashable
-import Prelude hiding (EQ)
+import qualified Data.HashSet as S
+import qualified Math.LinProg.LPSolve.FFI as F
solve :: (Hashable v, Eq v, Ord v) => LinProg Double v () -> IO (Maybe ResultCode, [(v, Double)])
solve = solveWithTimeout 0
@@ -47,8 +49,7 @@ solveWithTimeout t (compile -> lp) = do
let c = negate $ snd eq
setConstrType m i EQ
setRHS m i c
- forM_ (varTerms (fst eq)) $ \(v, w) ->
- setMat m i (varLUT M.! v) w
+ setRow' m i (fst eq)
return ()
-- Leqs
@@ -56,8 +57,7 @@ solveWithTimeout t (compile -> lp) = do
let c = negate $ snd eq
setConstrType m i LE
setRHS m i c
- forM_ (varTerms (fst eq)) $ \(v, w) ->
- setMat m i (varLUT M.! v) w
+ setRow' m i (fst eq)
return ()
-- Ints
@@ -69,8 +69,7 @@ solveWithTimeout t (compile -> lp) = do
setBin m (varLUT M.! v)
-- Objective
- forM_ (varTerms (lp ^. objective)) $ \(v, w) ->
- void $ setMat m 0 (varLUT M.! v) w
+ setRow' m 0 (lp ^. objective)
res <- F.solve m
sol <- snd <$> getSol nvars m
@@ -89,3 +88,7 @@ solveWithTimeout t (compile -> lp) = do
r <- f m
freeLP m
return r
+
+ nub = S.toList . S.fromList
+
+ setRow' m i eq = setRow m i (map (first ((M.!) varLUT)) $ varTerms eq)