Skip to content

Commit ef0837b

Browse files
committed
Revert "Data.Set for class parents"
This reverts commit 557a46f6b8a4ea59331ea0609cd3ce0311ff9c01. Revert "Use Data.Sequence for classes parents" This reverts commit 308886f332bb4452713474577724f1d44466ddce.
1 parent 3418a38 commit ef0837b

File tree

4 files changed

+21
-20
lines changed

4 files changed

+21
-20
lines changed

src/Data/Equality/Graph.hs

+14-15
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@ import Data.Function
3838
import Data.Bifunctor
3939
import Data.Containers.ListUtils
4040

41-
import qualified Data.Foldable as F
4241
import qualified Data.IntMap.Strict as IM
4342
import qualified Data.Set as S
4443

44+
import Data.Equality.Utils.SizedList
45+
4546
import Data.Equality.Graph.Internal
4647
import Data.Equality.Graph.ReprUnionFind
4748
import Data.Equality.Graph.Classes
@@ -83,7 +84,7 @@ add uncanon_e egr =
8384
-- to the e-class parents the new e-node and its e-class id
8485
--
8586
-- And add new e-class to existing e-classes
86-
new_parents = (S.insert (new_eclass_id, new_en))
87+
new_parents = ((new_eclass_id, new_en) |:)
8788
new_classes = IM.insert new_eclass_id new_eclass $
8889
foldr (IM.adjust ((_parents %~ new_parents)))
8990
(classes egr)
@@ -152,7 +153,7 @@ merge a b egr0 =
152153

153154
-- Leader is the class with more parents
154155
(leader, leader_class, sub, sub_class) =
155-
if S.size (class_a^._parents) < S.size (class_b^._parents)
156+
if sizeSL (class_a^._parents) < sizeSL (class_b^._parents)
156157
then (b', class_b, a', class_a) -- b is leader
157158
else (a', class_a, b', class_b) -- a is leader
158159

@@ -173,20 +174,18 @@ merge a b egr0 =
173174
-- Add all subsumed parents to worklist We can do this instead of
174175
-- adding the new e-class itself to the worklist because it would end
175176
-- up adding its parents anyway
176-
new_worklist = F.toList (sub_class^._parents) <> worklist egr0
177+
new_worklist = toListSL (sub_class^._parents) <> (worklist egr0)
177178

178179
-- If the new_data is different from the classes, the parents of the
179180
-- class whose data is different from the merged must be put on the
180181
-- analysisWorklist
181182
new_analysis_worklist =
182-
(
183-
(if new_data /= (sub_class^._data)
184-
then sub_class^._parents
185-
else mempty) <>
186-
(if new_data /= (leader_class^._data)
187-
then leader_class^._parents
188-
else mempty)
189-
) <>
183+
(if new_data /= (sub_class^._data)
184+
then toListSL (sub_class^._parents)
185+
else mempty) <>
186+
(if new_data /= (leader_class^._data)
187+
then toListSL (leader_class^._parents)
188+
else mempty) <>
190189
(analysisWorklist egr0)
191190

192191
-- ROMES:TODO: The code that makes the -1 * cos test pass when some other things are tweaked
@@ -218,9 +217,9 @@ rebuild (EGraph uf cls mm wl awl) =
218217
-- empty worklists
219218
-- repair deduplicated e-classes
220219
let
221-
emptiedEgr = EGraph uf cls mm mempty mempty
220+
emptiedEgr = (EGraph uf cls mm mempty mempty)
222221
wl' = nubOrd $ bimap (`find` emptiedEgr) (`canonicalize` emptiedEgr) <$> wl
223-
awl' = S.map (bimap (`find` emptiedEgr) (`canonicalize` emptiedEgr)) awl
222+
awl' = nubOrd $ bimap (`find` emptiedEgr) (`canonicalize` emptiedEgr) <$> awl
224223
egr' = foldr repair emptiedEgr wl'
225224
egr'' = foldr repairAnal egr' awl'
226225
in
@@ -256,7 +255,7 @@ repairAnal (repair_id, node) egr =
256255
if c^._data /= new_data
257256
-- Merge result is different from original class data, update class
258257
-- with new_data
259-
then egr { analysisWorklist = (c^._parents) <> analysisWorklist egr
258+
then egr { analysisWorklist = toListSL (c^._parents) <> analysisWorklist egr
260259
}
261260
& _class repair_id._data .~ new_data
262261
& modifyA repair_id

src/Data/Equality/Graph/Classes.hs

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import Data.Functor.Classes
1515
import Data.Equality.Graph.Classes.Id
1616
import Data.Equality.Graph.Nodes
1717

18+
import Data.Equality.Utils.SizedList
19+
1820
import Data.Equality.Analysis
1921

2022
-- | An e-class (an equivalence class of terms) of a language @l@.
@@ -27,9 +29,9 @@ data EClass l = EClass
2729
{ eClassId :: {-# UNPACK #-} !ClassId -- ^ E-class identifier
2830
, eClassNodes :: !(S.Set (ENode l)) -- ^ E-nodes in this class
2931
, eClassData :: Domain l -- ^ The analysis data associated with this eclass.
30-
, eClassParents :: !(S.Set (ClassId, ENode l)) -- ^ E-nodes which are parents of this e-class and their corresponding e-class ids.
32+
, eClassParents :: !(SList (ClassId, ENode l)) -- ^ E-nodes which are parents of this e-class and their corresponding e-class ids.
3133
}
3234

3335
instance (Show (Domain l), Show1 l) => Show (EClass l) where
34-
show (EClass a b d c) = "Id: " <> show a <> "\nNodes: " <> show b <> "\nParents: " <> show c <> "\nData: " <> show d
36+
show (EClass a b d (SList c _)) = "Id: " <> show a <> "\nNodes: " <> show b <> "\nParents: " <> show c <> "\nData: " <> show d
3537

src/Data/Equality/Graph/Internal.hs

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

99
import Data.Functor.Classes
10-
import qualified Data.Set as S
1110

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

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

src/Data/Equality/Graph/Lens.hs

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import qualified Data.Set as S
1414
import Data.Functor.Identity
1515
import Data.Functor.Const
1616

17+
import Data.Equality.Utils.SizedList
1718
import Data.Equality.Graph.Internal
1819
import Data.Equality.Graph.Classes.Id
1920
import Data.Equality.Graph.Nodes
@@ -61,7 +62,7 @@ _data afa EClass{..} = (\d1 -> EClass eClassId eClassNodes d1 eClassParents) <$>
6162
{-# INLINE _data #-}
6263

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

0 commit comments

Comments
 (0)