module Main ( main ) where
import Data.Map.Strict (
Map
, elems
, fromList
, mapWithKey
)
import Data.Maybe (
fromJust
)
import Data.Ratio ( (%) )
import Math.Optimization.Kantorovich (
kantorovich
, KantorovichResult
)
import Test.Tasty ( defaultMain, testGroup )
import Test.Tasty.HUnit ( testCase, assertEqual )
checkSolution :: KantorovichResult Int Int -> Map (Int, Int) Rational -> Bool
checkSolution (value, solution) dists = integral == value
where
integral = sum (zipWith (*) (elems dists) (elems solution))
main :: IO ()
main = defaultMain $
testGroup "Tests"
[
testCase "README example" $ do
let
mu = fromList $ zip [1, 2, 3] [1%7, 2%7, 4%7]
nu = fromList $ zip [1, 2, 3] [1%4, 1%4, 1%2]
dist :: (Int, Int) -> Rational
dist (i, j) = toRational $ abs (i - j)
maybeResult <- kantorovich mu nu dist False
let
result@(value, solution) = fromJust maybeResult
dists = mapWithKey (\ij _ -> dist ij) solution
assertEqual ""
(
value
, checkSolution result dists
)
(5%28, True)
]