module Numeric.Limp.Solvers.Cbc.Solve where
import Numeric.Limp.Canon
import Numeric.Limp.Rep
import Numeric.Limp.Solvers.Cbc.Error
import Numeric.Limp.Solvers.Cbc.MatrixRepr
import qualified Data.Vector.Storable as V
import Numeric.Limp.Solvers.Cbc.Internal.Wrapper
import System.IO.Unsafe
solve :: (Ord z, Ord r) => Program z r IntDouble -> Either Error (Assignment z r IntDouble)
solve p
= let mr = matrixReprOfProgram p
in unsafePerformIO $ do
m <- newModel
setQuiet m
loadProblem m (_starts mr) (_inds mr) (_vals mr)
(_colLs mr) (_colUs mr) (_obj mr)
(_rowLs mr) (_rowUs mr)
V.forM_ (_ints mr) $ setInteger m
setObjSense m 1
branchAndBound m
infeasible <- isProvenInfeasible m
case infeasible of
True
-> return $ Left $ Infeasible
False
-> do vs <- getSolution m
return $ Right $ makeAssignment p vs