Make PMatching a newtype for clarity.
[match/match.git] / program / ProposalMatcher.hs
index 2f5f63f..dcc757a 100644 (file)
@@ -5,24 +5,7 @@ import Data.Graph.Inductive.Tree
 import Data.List
 
 import PMInstance
-import IMinCostFlow
-
-data PMConfig = PMConfig {
-       minCostFlow :: MinCostFlowImpl,
-       reviewsEachProposal :: Int,
-       prefIsExpert :: Wt -> Bool,
-       prefIsKnowledgeable :: Wt -> Bool,
-       prefIsBoring :: Wt -> Bool,
-       prefIsVeryBoring :: Wt -> Bool,
-       prefIsConflict :: Wt -> Bool,
-       loadTolerance :: Int,
-       marginalLoadCost :: Wt -> Wt,
-       marginalBoringCost :: Wt -> Wt,
-       marginalVeryBoringCost :: Wt -> Wt,
-       assignmentCost :: Wt -> Wt,
-       knowledgeableBonus :: Wt,
-       expertBonus :: Wt
-}
+import PMConfig
 
 prefBoringness cfg p = if prefIsVeryBoring cfg p then 2
        else if prefIsBoring cfg p then 1 else 0
@@ -71,7 +54,7 @@ doReduction cfg (PMInstance numRvrs numProps rloadA prefA) =
        let
                totalReviews = (reviewsEachProposal cfg) * numProps
                totalRelativeLoad = foldl (+) 0 (map (rloadA !) [0 .. numRvrs - 1])
-               targetLoad i = ceiling (numAsWt totalReviews * (rloadA ! i) / totalRelativeLoad)
+               targetLoad i = ceiling (widenInteger totalReviews * (rloadA ! i) / totalRelativeLoad)
                -- A...H refer to idea book p.429
                edgesABC = do
                        i <- [0 .. numRvrs - 1]
@@ -79,13 +62,13 @@ doReduction cfg (PMInstance numRvrs numProps rloadA prefA) =
                        let freeEdgeA = (source, rvrNode i 0, REdge undefined tl 0)
                        let nonfreeEdgesA = do
                                l <- [tl .. tl + (loadTolerance cfg) - 1]
-                               let costA = marginalLoadCost cfg ((numAsWt (l - tl) + 1/2) / numAsWt (loadTolerance cfg))
+                               let costA = marginalLoadCost cfg ((widenInteger (l - tl) + 1/2) / widenInteger (loadTolerance cfg))
                                [(source, rvrNode i 0, REdge undefined 1 costA)]
                        let edgesBC = do
                                l <- [0 .. tl + (loadTolerance cfg) - 1]
-                               let costB = marginalBoringCost cfg ((numAsWt l + 1/2) / numAsWt tl)
+                               let costB = marginalBoringCost cfg ((widenInteger l + 1/2) / widenInteger tl)
                                let edgeB = (rvrNode i 0, rvrNode i 1, REdge undefined 1 costB)
-                               let costC = marginalVeryBoringCost cfg ((numAsWt l + 1/2) / numAsWt tl)
+                               let costC = marginalVeryBoringCost cfg ((widenInteger l + 1/2) / widenInteger tl)
                                let edgeC = (rvrNode i 1, rvrNode i 2, REdge undefined 1 costC)
                                [edgeB, edgeC]
                        [freeEdgeA] ++ nonfreeEdgesA ++ edgesBC
@@ -129,4 +112,4 @@ doMatching cfg inst@(PMInstance numRvrs numProps _ _) =
                        then [(i, j)]
                        else []
                in
-       sort pairs -- for prettiness
+       PMatching (sort pairs) -- for prettiness