toysolver-0.1.0: test/TestContiTraverso.hs
{-# LANGUAGE TemplateHaskell #-}
module Main (main) where
import Control.Monad
import Data.List
import qualified Data.IntMap as IM
import qualified Data.IntSet as IS
import qualified Data.Map as Map
import Data.VectorSpace
import Test.HUnit hiding (Test)
import Test.Framework (Test, defaultMain, testGroup)
import Test.Framework.TH
import Test.Framework.Providers.HUnit
import Data.OptDir
import ToySolver.ContiTraverso
import ToySolver.Data.ArithRel
import qualified ToySolver.Data.LA as LA
import ToySolver.Data.Polynomial (Polynomial)
import qualified ToySolver.Data.Polynomial as P
-- http://madscientist.jp/~ikegami/articles/IntroSequencePolynomial.html
-- optimum is (3,2,0)
case_ikegami = solve P.grlex (IS.fromList vs) OptMin obj cs @?= Just (IM.fromList [(1,3),(2,2),(3,0)])
where
vs = [1..3]
[x,y,z] = map LA.var vs
cs = [ 2*^x ^+^ 2*^y ^+^ 2*^z .==. LA.constant 10
, 3*^x ^+^ y ^+^ z .==. LA.constant 11
, x .>=. LA.constant 0
, y .>=. LA.constant 0
, z .>=. LA.constant 0
]
obj = x ^+^ 2*^y ^+^ 3*^z
case_ikegami' = solve' P.grlex (IS.fromList vs) obj cs @?= Just (IM.fromList [(1,3),(2,2),(3,0)])
where
vs@[x,y,z] = [1..3]
cs = [ (LA.fromTerms [(2,x),(2,y),(2,z)], 10)
, (LA.fromTerms [(3,x),(1,y),(1,z)], 11)
]
obj = LA.fromTerms [(1,x),(2,y),(3,z)]
-- http://posso.dm.unipi.it/users/traverso/conti-traverso-ip.ps
-- optimum is (39, 75, 1, 8, 122)
disabled_case_test1 = solve P.grlex (IS.fromList vs) OptMin obj cs @?= Just (IM.fromList [(1,39), (2,75), (3,1), (4,8), (5,122)])
where
vs = [1..5]
vs2@[x1,x2,x3,x4,x5] = map LA.var vs
cs = [ 2*^x1 ^+^ 5*^x2 ^-^ 3*^x3 ^+^ x4 ^-^ 2*^x5 .==. LA.constant 214
, x1 ^+^ 7*^x2 ^+^ 2*^x3 ^+^ 3*^x4 ^+^ x5 .==. LA.constant 712
, 4*^x1 ^-^ 2*^x2 ^-^ x3 ^-^ 5*^x4 ^+^ 3*^x5 .==. LA.constant 331
] ++
[ v .>=. LA.constant 0 | v <- vs2 ]
obj = x1 ^+^ x2 ^+^ x3 ^+^ x4 ^+^ x5
disabled_case_test1' = solve' P.grlex (IS.fromList vs) obj cs @?= Just (IM.fromList [(1,39), (2,75), (3,1), (4,8), (5,122)])
where
vs@[x1,x2,x3,x4,x5] = [1..5]
cs = [ (LA.fromTerms [(2, x1), ( 5, x2), (-3, x3), ( 1,x4), (-2, x5)], 214)
, (LA.fromTerms [(1, x1), ( 7, x2), ( 2, x3), ( 3,x4), ( 1, x5)], 712)
, (LA.fromTerms [(4, x1), (-2, x2), (-1, x3), (-5,x4), ( 3, x5)], 331)
]
obj = LA.fromTerms [(1,x1),(1,x2),(1,x3),(1,x4),(1,x5)]
-- optimum is (0,2,2)
case_test2 = solve P.grlex (IS.fromList vs) OptMin obj cs @?= Just (IM.fromList [(1,0),(2,2),(3,2)])
where
vs = [1..3]
vs2@[x1,x2,x3] = map LA.var vs
cs = [ 2*^x1 ^+^ 3*^x2 ^-^ x3 .==. LA.constant 4 ] ++
[ v .>=. LA.constant 0 | v <- vs2 ]
obj = 2*^x1 ^+^ x2
case_test2' = solve' P.grlex (IS.fromList vs) obj cs @?= Just (IM.fromList [(1,0),(2,2),(3,2)])
where
vs@[x1,x2,x3] = [1..3]
cs = [ (LA.fromTerms [(2, x1), (3, x2), (-1, x3)], 4) ]
obj = LA.fromTerms [(2,x1),(1,x2)]
-- infeasible
case_test3 = solve P.grlex (IS.fromList vs) OptMin obj cs @?= Nothing
where
vs = [1..3]
vs2@[x1,x2,x3] = map LA.var vs
cs = [ 2*^x1 ^+^ 2*^x2 ^+^ 2*^x3 .==. LA.constant 3 ] ++
[ v .>=. LA.constant 0 | v <- vs2 ]
obj = x1
case_test3' = solve' P.grlex (IS.fromList vs) obj cs @?= Nothing
where
vs@[x1,x2,x3] = [1..3]
cs = [ (LA.fromTerms [(2, x1), (2, x2), (2, x3)], 3) ]
obj = LA.fromTerms [(1,x1)]
------------------------------------------------------------------------
-- Test harness
main :: IO ()
main = $(defaultMainGenerator)