- Implement CS2 min-cost-flow adaptor and generalize common min-cost-flow stuff
[match/match.git] / program / ProposalMatcher.hs
index 46a693c..3720fab 100644 (file)
@@ -1,12 +1,11 @@
 module ProposalMatcher where
-import NaiveMinCostFlow
 import Data.Array.IArray
 import Data.Graph.Inductive.Graph
 import Data.Graph.Inductive.Tree
 import Data.List
 
 import Instance
-import ProposalMatcherConfig
+import ProposalMatcherConfig -- gives us minCostFlow
 
 prefBoringness p = if prefIsVeryBoring p then 2
        else if prefIsBoring p then 1 else 0
@@ -77,11 +76,14 @@ doReduction (Instance numRvrs numProps rloadA prefA) =
                        i <- [0 .. numRvrs - 1]
                        j <- [0 .. numProps - 1]
                        let pref = prefA ! (i, j)
-                       if prefIsConflict pref
-                               then []
-                               else [(rvrNode i (prefBoringness pref),
-                                       propNode j (prefExpertness pref),
-                                       REdge (edIdx (i, j)) 1 (assignmentCost pref))]
+                       -- We must generate an edge even if there is a conflict
+                       -- of interest; otherwise we'll fail to read its flow
+                       -- value in doMatching.
+                       [(rvrNode i (prefBoringness pref),
+                               propNode j (prefExpertness pref),
+                               REdge (edIdx (i, j))
+                                       (if prefIsConflict pref then 0 else 1)
+                                       (assignmentCost pref))]
                edgesEFGH = do
                        j <- [0 .. numProps - 1]
                        let edgeE = (propNode j 2, propNode j 0, REdge undefined 1 (-expertBonus))