Skip to content

Commit 3418a38

Browse files
committed
Data.Set for class parents
For O(log n) append. The analysis worklist is more times appended to, so we also make it a Set.
1 parent 929cd89 commit 3418a38

File tree

4 files changed

+9
-12
lines changed

4 files changed

+9
-12
lines changed

src/Data/Equality/Graph.hs

+5-7
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ import Data.Function
3838
import Data.Bifunctor
3939
import Data.Containers.ListUtils
4040

41-
import Data.Sequence (Seq(..))
42-
import qualified Data.Sequence as Seq
4341
import qualified Data.Foldable as F
4442
import qualified Data.IntMap.Strict as IM
4543
import qualified Data.Set as S
@@ -85,7 +83,7 @@ add uncanon_e egr =
8583
-- to the e-class parents the new e-node and its e-class id
8684
--
8785
-- And add new e-class to existing e-classes
88-
new_parents = ((new_eclass_id, new_en) :<|)
86+
new_parents = (S.insert (new_eclass_id, new_en))
8987
new_classes = IM.insert new_eclass_id new_eclass $
9088
foldr (IM.adjust ((_parents %~ new_parents)))
9189
(classes egr)
@@ -154,7 +152,7 @@ merge a b egr0 =
154152

155153
-- Leader is the class with more parents
156154
(leader, leader_class, sub, sub_class) =
157-
if Seq.length (class_a^._parents) < Seq.length (class_b^._parents)
155+
if S.size (class_a^._parents) < S.size (class_b^._parents)
158156
then (b', class_b, a', class_a) -- b is leader
159157
else (a', class_a, b', class_b) -- a is leader
160158

@@ -181,7 +179,7 @@ merge a b egr0 =
181179
-- class whose data is different from the merged must be put on the
182180
-- analysisWorklist
183181
new_analysis_worklist =
184-
F.toList (
182+
(
185183
(if new_data /= (sub_class^._data)
186184
then sub_class^._parents
187185
else mempty) <>
@@ -222,7 +220,7 @@ rebuild (EGraph uf cls mm wl awl) =
222220
let
223221
emptiedEgr = EGraph uf cls mm mempty mempty
224222
wl' = nubOrd $ bimap (`find` emptiedEgr) (`canonicalize` emptiedEgr) <$> wl
225-
awl' = nubOrd $ bimap (`find` emptiedEgr) (`canonicalize` emptiedEgr) <$> awl
223+
awl' = S.map (bimap (`find` emptiedEgr) (`canonicalize` emptiedEgr)) awl
226224
egr' = foldr repair emptiedEgr wl'
227225
egr'' = foldr repairAnal egr' awl'
228226
in
@@ -258,7 +256,7 @@ repairAnal (repair_id, node) egr =
258256
if c^._data /= new_data
259257
-- Merge result is different from original class data, update class
260258
-- with new_data
261-
then egr { analysisWorklist = F.toList (c^._parents) <> analysisWorklist egr
259+
then egr { analysisWorklist = (c^._parents) <> analysisWorklist egr
262260
}
263261
& _class repair_id._data .~ new_data
264262
& modifyA repair_id

src/Data/Equality/Graph/Classes.hs

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ module Data.Equality.Graph.Classes
88
, module Data.Equality.Graph.Classes.Id
99
) where
1010

11-
import qualified Data.Sequence as Seq
1211
import qualified Data.Set as S
1312

1413
import Data.Functor.Classes
@@ -28,7 +27,7 @@ data EClass l = EClass
2827
{ eClassId :: {-# UNPACK #-} !ClassId -- ^ E-class identifier
2928
, eClassNodes :: !(S.Set (ENode l)) -- ^ E-nodes in this class
3029
, eClassData :: Domain l -- ^ The analysis data associated with this eclass.
31-
, eClassParents :: !(Seq.Seq (ClassId, ENode l)) -- ^ E-nodes which are parents of this e-class and their corresponding e-class ids.
30+
, eClassParents :: !(S.Set (ClassId, ENode l)) -- ^ E-nodes which are parents of this e-class and their corresponding e-class ids.
3231
}
3332

3433
instance (Show (Domain l), Show1 l) => Show (EClass l) where

src/Data/Equality/Graph/Internal.hs

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
module Data.Equality.Graph.Internal where
88

99
import Data.Functor.Classes
10+
import qualified Data.Set as S
1011

1112
import Data.Equality.Graph.ReprUnionFind
1213
import Data.Equality.Graph.Classes
@@ -23,7 +24,7 @@ data EGraph l = EGraph
2324
, classes :: !(ClassIdMap (EClass l)) -- ^ Map canonical e-class ids to their e-classes
2425
, memo :: !(Memo l) -- ^ Hashcons maps all canonical e-nodes to their e-class ids
2526
, worklist :: !(Worklist l) -- ^ Worklist of e-class ids that need to be upward merged
26-
, analysisWorklist :: !(Worklist l) -- ^ Like 'worklist' but for analysis repairing
27+
, analysisWorklist :: !(S.Set (ClassId, ENode l)) -- ^ Like 'worklist' but for analysis repairing
2728
}
2829

2930
-- | The hashcons 𝐻 is a map from e-nodes to e-class ids

src/Data/Equality/Graph/Lens.hs

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
-}
99
module Data.Equality.Graph.Lens where
1010

11-
import qualified Data.Sequence as Seq
1211
import qualified Data.IntMap.Strict as IM
1312
import qualified Data.Set as S
1413

@@ -62,7 +61,7 @@ _data afa EClass{..} = (\d1 -> EClass eClassId eClassNodes d1 eClassParents) <$>
6261
{-# INLINE _data #-}
6362

6463
-- | Lens for the parent e-classes of an e-class
65-
_parents :: Lens' (EClass l) (Seq.Seq (ClassId, ENode l))
64+
_parents :: Lens' (EClass l) (S.Set (ClassId, ENode l))
6665
_parents afa EClass{..} = (\ps -> EClass eClassId eClassNodes eClassData ps) <$> afa eClassParents
6766
{-# INLINE _parents #-}
6867

0 commit comments

Comments
 (0)