Skip to content

Commit 50ca7b5

Browse files
topsortable graphs a lot of the time
1 parent cf71717 commit 50ca7b5

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

src/Constrained/Graph.hs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ module Constrained.Graph (
2525

2626
import Control.Monad
2727
import Data.Foldable
28-
import Data.List (sortOn)
28+
import Data.List (sortOn, nub)
2929
import Data.Map (Map)
3030
import Data.Map qualified as Map
3131
import Data.Maybe
@@ -72,8 +72,17 @@ mkGraph e0 = Graph e $ Map.unionsWith (<>)
7272
])
7373

7474
instance (Arbitrary node, Ord node) => Arbitrary (Graph node) where
75-
-- TODO: very high % of these graphs don't topsort nicely
76-
arbitrary = mkGraph <$> arbitrary
75+
arbitrary =
76+
frequency [ (1, mkGraph <$> arbitrary)
77+
, (3, do order <- nub <$> arbitrary
78+
mkGraph <$> buildGraph order
79+
)
80+
]
81+
where buildGraph [] = return mempty
82+
buildGraph [n] = return (Map.singleton n mempty)
83+
buildGraph (n:ns) = do
84+
deps <- listOf (elements ns)
85+
Map.insert n (Set.fromList deps) <$> buildGraph ns
7786
shrink g =
7887
[ mkGraph e'
7988
| e <- shrink (edges g)

test/Constrained/GraphSpec.hs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,18 @@ prop_op_topsort g =
4040

4141
prop_trC_topsort :: Graph Node -> Property
4242
prop_trC_topsort g =
43-
within 1_000_000 $ isRight (topsort g) === isRight (topsort $ transitiveClosure g)
43+
isRight (topsort g) === isRight (topsort $ transitiveClosure g)
4444

4545
prop_trC_opgraph_commute :: Graph Node -> Property
4646
prop_trC_opgraph_commute g =
47-
within 1_000_000 $ transitiveClosure (opGraph g) === opGraph (transitiveClosure g)
47+
transitiveClosure (opGraph g) === opGraph (transitiveClosure g)
4848

4949
prop_depends_grows :: Graph Node -> Graph Node -> Node -> Property
5050
prop_depends_grows g g' n = property $ dependencies n g `Set.isSubsetOf` dependencies n (g <> g')
5151

5252
prop_transitive_dependencies :: Graph Node -> Node -> Property
5353
prop_transitive_dependencies g n =
54-
within 1_000_000 $ transitiveDependencies n g === dependencies n (transitiveClosure g)
54+
transitiveDependencies n g === dependencies n (transitiveClosure g)
5555

5656
prop_topsort_all_nodes :: Graph Node -> Property
5757
prop_topsort_all_nodes g =
@@ -71,12 +71,12 @@ prop_topsort_sound g =
7171
tests :: Bool -> Spec
7272
tests _nightly =
7373
describe "Graph tests" $ do
74-
prop "prop_no_dependencies_topsort" prop_no_dependencies_topsort
75-
prop "prop_subtract_topsort" prop_subtract_topsort
76-
prop "prop_delete_topsort" prop_delete_topsort
77-
prop "prop_op_topsort" prop_op_topsort
78-
prop "prop_trC_topsort" prop_trC_topsort
79-
prop "prop_trC_opgraph_commute" prop_trC_opgraph_commute
80-
prop "prop_depends_grows" prop_depends_grows
81-
prop "prop_topsort_all_nodes" prop_topsort_all_nodes
82-
prop "prop_topsort_sound" prop_topsort_sound
74+
prop "prop_no_dependencies_topsort" $ withMaxSuccess 10000 prop_no_dependencies_topsort
75+
prop "prop_subtract_topsort" $ withMaxSuccess 10000 prop_subtract_topsort
76+
prop "prop_delete_topsort" $ withMaxSuccess 10000 prop_delete_topsort
77+
prop "prop_op_topsort" $ withMaxSuccess 10000 prop_op_topsort
78+
prop "prop_trC_topsort" $ withMaxSuccess 10000 prop_trC_topsort
79+
prop "prop_trC_opgraph_commute" $ withMaxSuccess 10000 prop_trC_opgraph_commute
80+
prop "prop_depends_grows" $ withMaxSuccess 10000 prop_depends_grows
81+
prop "prop_topsort_all_nodes" $ withMaxSuccess 10000 prop_topsort_all_nodes
82+
prop "prop_topsort_sound" $ withMaxSuccess 10000 prop_topsort_sound

0 commit comments

Comments
 (0)