Make PMatching a newtype for clarity.
[match/match.git] / program / TestUtils.hs
index f2dbe11..d171850 100644 (file)
@@ -4,14 +4,20 @@ import Data.Array.IArray
 import Data.Graph.Inductive.Graph
 import Data.Graph.Inductive.Graphviz
 import Data.Graph.Inductive.Tree
+import Data.List
 import System.IO
 import System.Random
 import System.Posix.IO
 import System.Posix.Time
 import System.Process
-import Instance
+import PMInstance
+import PMConfig
 import ProposalMatcher
+import PMDefaults
+import PMInstanceGenerator
+import Evaluation
 import MonadStuff
+import RandomizedMonad
 
 -- This module has stuff that is helpful for testing but isn't itself an example.
 
@@ -27,8 +33,8 @@ flowAnnotate g fa =
        mkGraph (labNodes g) (map (\(n1, n2, REdge i ca co) ->
                (n1, n2, REdgeF i ca (fa ! i) co)) $ labEdges g) :: Gr () REdgeF
 
-showInstanceAsGraph :: Instance -> [(Int, Int)] -> Gr String String
-showInstanceAsGraph (Instance numRvrs numProps rloadA prefA) matchedPairs =
+showInstanceAsGraph :: PMInstance -> PMatching -> Gr String String
+showInstanceAsGraph (PMInstance numRvrs numProps rloadA prefA) (PMatching matchedPairs) =
        let
                rvrNode i = i
                propNode j = numRvrs + j
@@ -76,3 +82,23 @@ goGraph theGraph =
        waitForProcess dotPid
        -- Then open the file.
        goFile fname
+
+-- Both-ways list difference
+(/\) :: Eq a => [a] -> [a] -> ([a], [a])
+l1 /\ l2 = (l1 \\ l2, l2 \\ l1)
+
+-- Evaluation!
+runEvaluation cfg nr np = do
+       let inst = runRandom myGen $ randomInstance cfg nr np
+       putStr (show inst ++ "\n")
+       let PMatching m0 = doMatching cfg{loadTolerance = 0} inst
+       putStr ("Matching with load tolerance 0:\n" ++ show m0 ++ "\n")
+       let PMatching m1 = doMatching cfg{loadTolerance = 1} inst
+       putStr ("Matching with load tolerance 1:\n" ++ show m1 ++ "\n")
+       putStr ("Differences:\n" ++ show (m0 /\ m1) ++ "\n")
+       let e0 = evaluateMatching cfg{loadTolerance = 0} inst (PMatching m0)
+       putStr ("Evaluation of first matching:\n" ++ show e0 ++ "\n")
+       let e1 = evaluateMatching cfg{loadTolerance = 1} inst (PMatching m1)
+       putStr ("Evaluation of second matching:\n" ++ show e1 ++ "\n")
+       putStr ("Evaluation differences:\n" ++
+               show (sortedDiffEvaluations e0 e1) ++ "\n")