swish 0.6.0.0 → 0.6.0.1
raw patch · 8 files changed
+248/−109 lines, 8 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Swish.RDF.GraphClass: instance Hashable lb => Hashable (Arc lb)
+ Swish.RDF.GraphMem: instance Hashable LabelMem
Files
- Data/Interned/URI.hs +2/−2
- Swish/RDF/GraphClass.hs +10/−0
- Swish/RDF/GraphMatch.hs +31/−18
- Swish/RDF/GraphMem.hs +10/−3
- Swish/Utils/MiscHelpers.hs +5/−3
- Swish/Utils/QName.hs +4/−2
- swish.cabal +4/−1
- tests/GraphTest.hs +182/−80
Data/Interned/URI.hs view
@@ -56,8 +56,8 @@ instance Uninternable InternedURI where unintern (InternedURI _ b) = b --- Rather than be clever, use the reverse of the string--- representation of the URI+-- Rather than access the URI components, just use the reverse of the+-- string representation of the URI. instance Hashable (Description InternedURI) where hash = hashWithSalt 5381 -- use the stringSalt value from Data.Hashable hashWithSalt salt (DU u) = hashWithSalt salt ((reverse . show) u)
Swish/RDF/GraphClass.hs view
@@ -34,6 +34,8 @@ import qualified Data.Foldable as F import qualified Data.Traversable as T +import Data.Hashable (Hashable(..))+ import Data.List (foldl', union, (\\)) -- NOTE: I wanted to declare this as a subclass of Functor, but@@ -132,6 +134,10 @@ -- | Calculate the hash of the label using the supplied seed. labelHash :: Int -> lb -> Int + + -- could provide a default of + -- labelHash = hashWithSalt+ -- but this would then force a Hashable constraint -- | Extract the local id from a variable node. getLocal :: lb -> String@@ -150,6 +156,10 @@ , aobj :: lb -- ^ The object of the arc. } deriving (Eq, Functor, F.Foldable, T.Traversable)++instance (Hashable lb) => Hashable (Arc lb) where+ hash (Arc s p o) = hash s `hashWithSalt` p `hashWithSalt` o+ hashWithSalt salt (Arc s p o) = salt `hashWithSalt` s `hashWithSalt` p `hashWithSalt` o -- | Return the subject of the arc. arcSubj :: Arc lb -> lb
Swish/RDF/GraphMatch.hs view
@@ -34,19 +34,20 @@ ) where import Control.Exception.Base (assert)+import Control.Arrow (second) import Data.Ord (comparing) import Data.List (foldl', nub, sortBy, partition)-import qualified Data.List+import Data.Hashable (combine)+import qualified Data.List as L import Swish.RDF.GraphClass (Arc(..), Label(..),- arc, arcSubj, arcPred, arcObj, arcLabels,+ arcLabels, hasLabel, arcToTriple) import Swish.Utils.LookupMap (LookupEntryClass(..), LookupMap(..), makeLookupMap, listLookupMap, mapFind, mapReplaceAll, mapAddIfNew, mapReplaceMap, mapMerge) import Swish.Utils.ListHelpers (select, equiv, pairSort, pairGroup, pairUngroup)-import Swish.Utils.MiscHelpers (hash, hashModulus) -------------------------- -- Label index value type@@ -129,7 +130,7 @@ -} ecRemoveLabel :: (Label lb) => EquivalenceClass lb -> lb -> EquivalenceClass lb-ecRemoveLabel (lv,ls) l = (lv,Data.List.delete l ls)+ecRemoveLabel xs l = second (L.delete l) xs ------------------------------------------------------------ -- Augmented graph label value - for graph matching@@ -152,16 +153,14 @@ makeScopedLabel = ScopedLabel makeScopedArc :: (Label lb) => Int -> Arc lb -> Arc (ScopedLabel lb)-makeScopedArc scope a1 = arc (s arcSubj a1) (s arcPred a1) (s arcObj a1)- where- s f a = ScopedLabel scope (f a)+makeScopedArc scope = fmap (ScopedLabel scope) instance (Label lb) => Label (ScopedLabel lb) where getLocal lab = error $ "getLocal for ScopedLabel: "++show lab makeLabel locnam = error $ "makeLabel for ScopedLabel: "++locnam labelIsVar (ScopedLabel _ lab) = labelIsVar lab labelHash seed (ScopedLabel scope lab)- | labelIsVar lab = hash seed $ show scope ++ "???"+ | labelIsVar lab = seed `combine` scope -- MH.hash seed $ show scope ++ "???" | otherwise = labelHash seed lab instance (Label lb) => Eq (ScopedLabel lb) where@@ -363,6 +362,13 @@ assert (ev1==ev2) -- "GraphMatch2: Equivalence class value mismatch" $ $ try glp +-- this was in Swish.Utils.MiscHelpers along with a simple hash-based function+-- based on Sedgewick, Algorithms in C, p233. As we have now moved to using+-- Data.Hashable it is not clear whether this is still necessary or sensible.+--+hashModulus :: Int+hashModulus = 16000001+ -- | Returns a string representation of a LabelMap value -- showLabelMap :: (Label lb) => LabelMap lb -> String@@ -391,8 +397,8 @@ -- resulting label map is incremented. -- newLabelMap :: (Label lb) => LabelMap lb -> [(lb,Int)] -> LabelMap lb-newLabelMap (LabelMap g f) [] = LabelMap (g+1) f -- new generation-newLabelMap lmap (lv:lvs) = setLabelHash (newLabelMap lmap lvs) lv+newLabelMap lmap [] = newGenerationMap lmap+newLabelMap lmap (lv:lvs) = setLabelHash (newLabelMap lmap lvs) lv -- | Replace a label and its associated value in a label map -- with a new value using the supplied hash value and the current@@ -437,7 +443,8 @@ hashVal :: (Label lb) => Int -> lb -> Int hashVal seed lab =- if labelIsVar lab then hash seed "???" else labelHash seed lab+ if labelIsVar lab then seed `combine` 23 else labelHash seed lab+ -- if labelIsVar lab then hash seed "???" else labelHash seed lab equivalenceClasses :: (Label lb) @@ -502,16 +509,18 @@ LabelMap gen2 lm2 = remapLabels gs2 lmap $ foldl1 (++) $ map (ecLabels . snd) ecpairs lm' = mapReplaceMap lm $ mapMerge lm1 lm2+ + tmap f (a,b) = (f a, f b)+ -- ecGroups :: [([EquivalenceClass lb],[EquivalenceClass lb])]- ecGroups = [ (remapEc ec1,remapEc ec2) | (ec1,ec2) <- ecpairs ]+ ecGroups = map (tmap remapEc) ecpairs ecpairs' = concatMap (uncurry zip) ecGroups newPart = any pairG1 lenGroups matchPart = all pairEq lenGroups- lenGroups = map subLength ecGroups- pairEq (p1,p2) = p1 == p2+ lenGroups = map (tmap length) ecGroups+ pairEq = uncurry (==) pairG1 (p1,p2) = p1 > 1 || p2 > 1- subLength (ls1,ls2) = (length ls1,length ls2)- remapEc ec = pairGroup $ map (newIndex lm') $ pairUngroup ec+ remapEc = pairGroup . map (newIndex lm') . pairUngroup newIndex x (_,lab) = (mapFind nullLabelVal lab x,lab) -- | Calculate a new index value for a supplied list of labels based on the@@ -534,7 +543,8 @@ newIndex l | labelIsVar l = mapAdjacent l -- adjacency classifies variable labels | otherwise = hashVal gen l -- otherwise rehash (to disentangle collisions)- mapAdjacent l = sum (sigsOver l) `rem` hashModulus+ -- mapAdjacent l = sum (sigsOver l) `rem` hashModulus+ mapAdjacent l = sum (sigsOver l) `combine` hashModulus -- is this a sensible replacement for `rem` MH.hashModulus sigsOver l = select (hasLabel l) gs (arcSignatures lmap gs) -- | Return list of distinct labels used in a graph@@ -557,7 +567,10 @@ sigCalc (s,p,o) = ( labelVal2 s + labelVal2 p * 3 +- labelVal2 o * 5 ) `rem` hashModulus+ labelVal2 o * 5 )+ `combine` hashModulus+ -- `rem` hashModulus+ labelVal = mapLabelIndex lmap labelVal2 = uncurry (*) . labelVal
Swish/RDF/GraphMem.hs view
@@ -32,9 +32,9 @@ import Swish.RDF.GraphClass import Swish.RDF.GraphMatch-import Swish.Utils.MiscHelpers- ( hash )+-- import Swish.Utils.MiscHelpers (hash) +import Data.Hashable (Hashable(..), combine) import Data.Ord (comparing) import qualified Data.Foldable as F@@ -114,13 +114,20 @@ = LF String | LV String +instance Hashable LabelMem where+ hash (LF l) = 1 `hashWithSalt` l+ hash (LV l) = 2 `hashWithSalt` l+ hashWithSalt salt (LF l) = salt `combine` 1 `hashWithSalt` l+ hashWithSalt salt (LV l) = salt `combine` 2 `hashWithSalt` l+ instance Label LabelMem where labelIsVar (LV _) = True labelIsVar _ = False getLocal (LV loc) = loc getLocal lab = error "getLocal of non-variable label: " ++ show lab makeLabel = LV - labelHash seed lb = hash seed (show lb)+ -- labelHash seed lb = hash seed (show lb)+ labelHash = hashWithSalt instance Eq LabelMem where (LF l1) == (LF l2) = l1 == l2
Swish/Utils/MiscHelpers.hs view
@@ -13,12 +13,14 @@ -- This module defines a random set of helper functions -- used by the graph handling code. --+-- This module is *deprecated* and will be removed at the next possible+-- release.+-- -------------------------------------------------------------------------------- module Swish.Utils.MiscHelpers- ( hash -- RDFGraph, GraphMem, GraphMatch- , hashModulus -- GraphMatch- + ( hash+ , hashModulus ) where
Swish/Utils/QName.hs view
@@ -69,11 +69,13 @@ instance IsString QName where fromString = qnameFromString +-- | Equality is determined by a case sensitive comparison of the +-- URI. instance Eq QName where -- see qnEq comments below (QName u1 _ _) == (QName u2 _ _) = u1 == u2 --- ugly, use show instance+-- ugly, use show instance OR switch to the ordering of InternedURI instance Ord QName where {-@@ -104,7 +106,7 @@ (up2,ur2) = splitAt n u2 -} --- The format of show QName may well change to remove the <>+-- | The format used to display the URI is @<uri>@. instance Show QName where show (QName u _ _) = "<" ++ show u ++ ">"
swish.cabal view
@@ -1,5 +1,5 @@ Name: swish-Version: 0.6.0.0+Version: 0.6.0.1 Stability: experimental License: LGPL License-file: LICENSE @@ -45,6 +45,9 @@ * Complete, ready-to-run, command-line and script-driven programs. . Changes:+ .+ [Version 0.6.0.1] Moved to using hashing routine using the Data.Hashable+ interface rather than Swish.Utils.MiscHelpers which is deprecated. . [Version 0.6.0.0] Add Data.Interned.URI and use it to speed up the QName equality check.
tests/GraphTest.hs view
@@ -14,6 +14,13 @@ -- -------------------------------------------------------------------------------- +{- ++Note: after changing the hash module the order and values of some+of the tests; I have not checked that the new ordering makes sense.++-}+ module Main where import qualified Data.Foldable as F@@ -28,7 +35,6 @@ import Data.Ord (comparing) import Swish.Utils.ListHelpers-import Swish.Utils.MiscHelpers import Swish.RDF.GraphClass (Arc(..), LDGraph(..), Label(..), arc, arcFromTriple,arcToTriple)@@ -140,25 +146,6 @@ , testSubset "08" False [1,2,3] [] ] --- hash--testHash :: String -> Bool -> Int -> Int -> Test-testHash lab eq h1 h2 = testeq ("Hash"++lab ) eq (h1 == h2)--testHashEq :: String -> Int -> Int -> Test-testHashEq lab = testeq ("Hash"++lab ) --testHashSuite :: Test-testHashSuite = TestList- [ testHash "01" True (hash 0 base1) (hash 0 base1)- , testHash "02" True (hash 2 "") (hash 2 "")- , testHash "03" False (hash 3 base1) (hash 3 base2)- , testHash "04" False (hash 4 base1) (hash 5 base1)- , testHash "05" False (hash 2 "") (hash 3 "")- , testHashEq "06" 1424775 (hash 3 base1)- , testHashEq "07" 11801303 (hash 3 base2)- ]- ------------------------------------------------------------ -- Simple graph label tests ------------------------------------------------------------@@ -170,10 +157,11 @@ , testeq "Lab03" False (labelIsVar lab2f) , testeq "Lab04" True (labelIsVar lab2v) - , testeq "Lab05" 3436883 (labelHash 1 lab1f)- , testeq "Lab06" 10955600 (labelHash 1 lab1v)- , testeq "Lab07" 3436884 (labelHash 1 lab2f)- , testeq "Lab08" 10955601 (labelHash 1 lab2v)+ , testeq "Lab05" 39495998 (labelHash 1 lab1f)+ , testeq "Lab06" 45349309 (labelHash 1 lab1v)+ , testeq "Lab07" 39495997 (labelHash 1 lab2f)+ , testeq "Lab08" 45349310 (labelHash 1 lab2v)+ , testeq "Lab09" "!lab1" (show lab1f) , testeq "Lab10" "?lab1" (show lab1v)@@ -662,23 +650,85 @@ -- assignLabels :: (Label lb) => [lb] -> LabelMap lb -> LabelMap lb lmap5 :: LabelMap LabelMem+{- lmap5 = tstLabelMap 2 [(s1,(1,142577)),(s2,(1,142578)),(s3,(1,142579)), (p1,(1,142385)),(p2,(1,142386)),(p3,(1,142387)), (o1,(1,142321)),(o2,(1,142322)),(o3,(1,142323)), (l1,(1,142129)),(l4,(1,1709580)),(l10,(1,3766582)), (b3,(1,262143)),(b4,(1,262143))]- +-}++bhash :: Int+bhash = 23++l1hash, l4hash, l10hash :: Int+l1hash = 2524+l4hash = -1302210307+l10hash = 10836024 ++l1hash2, l4hash2, l10hash2 :: Int+l1hash2 = 2524+l4hash2 = -1302210307+l10hash2 = 10836024 ++o1hash, o2hash, o3hash :: Int+o1hash = 2623+o2hash = 2620+o3hash = 2621++p1hash, p2hash, p3hash :: Int+p1hash = 2624+p2hash = 2627+p3hash = 2626++s1hash, s2hash, s3hash :: Int+s1hash = 2723+s2hash = 2720+s3hash = 2721++lmap5 = tstLabelMap 2 + [+ (b4,(1,bhash)),+ (b3,(1,bhash)),+ (l10,(1,l10hash)),+ (l4,(1,l4hash)),+ (l1,(1,l1hash)),+ (o3,(1,o3hash)),+ (o2,(1,o2hash)),+ (o1,(1,o1hash)),+ (p3,(1,p3hash)),+ (p2,(1,p2hash)),+ (p1,(1,p1hash)),+ (s3,(1,s3hash)),+ (s2,(1,s2hash)),+ (s1,(1,s1hash))+ ]+ testAssignLabelMap05 :: Test testAssignLabelMap05 = testeq "AssignLabels05" lmap5 (newGenerationMap $ assignLabelMap ls5 emptyMap) lmap6 :: LabelMap LabelMem-lmap6 = tstLabelMap 2 [(s1,(1,142577)),(s2,(1,142578)),(s3,(1,142579)),- (p1,(1,142385)),(p2,(1,142386)),(p3,(1,142387)),- (o1,(1,142321)),(o2,(1,142322)),(o3,(1,142323)),- (l1,(1,142129)),(l4,(1,1709580)),(l10,(1,3766582)),- (b1,(2,262143)),(b2,(2,262143)),(b3,(1,262143)),(b4,(1,262143))]-+lmap6 = tstLabelMap 2+ [+ (b2,(2,bhash)),+ (b1,(2,bhash)),+ (b4,(1,bhash)),+ (b3,(1,bhash)),+ (l10,(1,l10hash)),+ (l4,(1,l4hash)),+ (l1,(1,l1hash)),+ (o3,(1,o3hash)),+ (o2,(1,o2hash)),+ (o1,(1,o1hash)),+ (p3,(1,p3hash)),+ (p2,(1,p2hash)),+ (p1,(1,p1hash)),+ (s3,(1,s3hash)),+ (s2,(1,s2hash)),+ (s1,(1,s1hash))+ ]+ testAssignLabelMap06 :: Test testAssignLabelMap06 = testeq "AssignLabels06" lmap6 (assignLabelMap ls6 lmap5) @@ -804,19 +854,42 @@ assignLabelMap (graphLabels as61) emptyMap eq1ltst :: LabelMap (ScopedLabel LabelMem)-eq1ltst = tstLabelMap 2 [- (s1_1,(1,142577)),(s2_1,(1,142578)),(s3_1,(1,142579)),- (p1_1,(1,142385)),(p2_1,(1,142386)),(p3_1,(1,142387)),- (o1_1,(1,142321)),(o2_1,(1,142322)),(o3_1,(1,142323)),- (l1_1,(1,142129)),(l4_1,(1,1709580)),(l10_1,(1,3766582)),- (b1_1,(1,262143)),(b2_1,(1,262143)),(b3_1,(1,262143)),(b4_1,(1,262143)),- (s1_2,(1,142577)),(s2_2,(1,142578)),(s3_2,(1,142579)),- (p1_2,(1,142385)),(p2_2,(1,142386)),(p3_2,(1,142387)),- (o1_2,(1,142321)),(o2_2,(1,142322)),(o3_2,(1,142323)),- (l1_2,(1,142129)),(l4_2,(1,1709580)),(l10_2,(1,3766582)),- (b1_2,(1,262143)),(b2_2,(1,262143)),(b3_2,(1,262143)),(b4_2,(1,262143))- ]- +eq1ltst = tstLabelMap 2 + [+ (b4_2,(1,bhash)),+ (b3_2,(1,bhash)),+ (p3_2,(1,p3hash)),+ (b2_2,(1,bhash)),+ (p2_2,(1,p2hash)),+ (b1_2,(1,bhash)),+ (l10_2,(1,l10hash)),+ (l4_2,(1,l4hash)),+ (l1_2,(1,l1hash)),+ (o3_2,(1,o3hash)),+ (s3_2,(1,s3hash)),+ (o2_2,(1,o2hash)),+ (s2_2,(1,s2hash)),+ (o1_2,(1,o1hash)),+ (p1_2,(1,p1hash)),+ (s1_2,(1,s1hash)),+ (b4_1,(1,bhash)),+ (b3_1,(1,bhash)),+ (p3_1,(1,p3hash)),+ (b2_1,(1,bhash)),+ (p2_1,(1,p2hash)),+ (b1_1,(1,bhash)),+ (l10_1,(1,l10hash)),+ (l4_1,(1,l4hash)),+ (l1_1,(1,l1hash)),+ (o3_1,(1,o3hash)),+ (s3_1,(1,s3hash)),+ (o2_1,(1,o2hash)),+ (s2_1,(1,s2hash)),+ (o1_1,(1,o1hash)),+ (p1_1,(1,p1hash)),+ (s1_1,(1,s1hash))+ ]+ testEqAssignMap01 :: Test testEqAssignMap01 = testeq "EqAssignMap01" eq1ltst eq1lmap @@ -882,17 +955,38 @@ assignLabelMap (graphLabels as41) emptyMap eq2ltst :: LabelMap (ScopedLabel LabelMem)-eq2ltst = tstLabelMap 2 [(s1_1,(1,142577)),(s2_1,(1,142578)),(s3_1,(1,142579)),- (p1_1,(1,142385)),(p2_1,(1,142386)),(p3_1,(1,142387)),- (o1_1,(1,142321)),(o2_1,(1,142322)),(o3_1,(1,142323)),- (l1_1,(1,142129)),(l4_1,(1,1709580)),(l10_1,(1,3766582)),- (b1_1,(1,262143)),(b2_1,(1,262143)),- (s1_2,(1,142577)),(s2_2,(1,142578)),(s3_2,(1,142579)),- (p1_2,(1,142385)),(p2_2,(1,142386)),(p3_2,(1,142387)),- (o1_2,(1,142321)),(o2_2,(1,142322)),(o3_2,(1,142323)),- (l1_2,(1,142129)),(l4_2,(1,1709580)),(l10_2,(1,3766582)),- (b1_2,(1,262143)),(b2_2,(1,262143))]- +eq2ltst = tstLabelMap 2+ [+ (p3_2,(1,p3hash)),+ (b2_2,(1,bhash)),+ (b1_2,(1,bhash)),+ (p2_2,(1,p2hash)),+ (l10_2,(1,l10hash)),+ (l4_2,(1,l4hash)),+ (l1_2,(1,l1hash)),+ (o3_2,(1,o3hash)),+ (s3_2,(1,s3hash)),+ (o2_2,(1,o2hash)),+ (s2_2,(1,s2hash)),+ (o1_2,(1,o1hash)),+ (p1_2,(1,p1hash)),+ (s1_2,(1,s1hash)),+ (p3_1,(1,p3hash)),+ (b2_1,(1,bhash)),+ (p2_1,(1,p2hash)),+ (b1_1,(1,bhash)),+ (l10_1,(1,l10hash)),+ (l4_1,(1,l4hash)),+ (l1_1,(1,l1hash)),+ (o3_1,(1,o3hash)),+ (s3_1,(1,s3hash)),+ (o2_1,(1,o2hash)),+ (s2_1,(1,s2hash)),+ (o1_1,(1,o1hash)),+ (p1_1,(1,p1hash)),+ (s1_1,(1,s1hash))+ ]+ testEqAssignMap21 :: Test testEqAssignMap21 = testeq "EqAssignMap21" eq2ltst eq2lmap @@ -960,16 +1054,23 @@ assignLabelMap (graphLabels as22) emptyMap eq3ltst :: LabelMap (ScopedLabel LabelMem)-eq3ltst = tstLabelMap 2- [ (s1_1,(1,142577))- , (p1_1,(1,142385))- , (o1_1,(1,142321))- , (s1_2,(1,142577)), (s2_2,(1,142578)), (s3_2,(1,142579))- , (p1_2,(1,142385))- , (o1_2,(1,142321)), (o2_2,(1,142322)), (o3_2,(1,142323))- , (l1_2,(1,142129)), (l4_2,(1,1709580)), (l10_2,(1,3766582))+eq3ltst = tstLabelMap 2+ [ + (o1_1,(1,o1hash))+ , (p1_1,(1,p1hash))+ , (s1_1,(1,s1hash))+ , (l10_2,(1,l10hash))+ , (l4_2,(1,l4hash))+ , (l1_2,(1,l1hash))+ , (o3_2,(1,o3hash))+ , (s3_2,(1,s3hash))+ , (o2_2,(1,o2hash))+ , (s2_2,(1,s2hash))+ , (o1_2,(1,o1hash))+ , (p1_2,(1,p1hash))+ , (s1_2,(1,s1hash)) ]- + testEqAssignMap32 :: Test testEqAssignMap32 = testeq "EqAssignMap32" eq3ltst eq3lmap @@ -981,9 +1082,9 @@ ec31test :: [EquivArgs] ec31test =- [ ((1,142321),[o1_1])- , ((1,142385),[p1_1])- , ((1,142577),[s1_1])+ [ ((1,2623),[o1_1])+ , ((1,2624),[p1_1])+ , ((1,2723),[s1_1]) ] ec32 :: [EquivClass]@@ -991,18 +1092,19 @@ ec32test :: [EquivArgs] ec32test =- [ ((1,142129),[l1_2])- , ((1,142321),[o1_2])- , ((1,142322),[o2_2])- , ((1,142323),[o3_2])- , ((1,142385),[p1_2])- , ((1,142577),[s1_2])- , ((1,142578),[s2_2])- , ((1,142579),[s3_2])- , ((1,1709580),[l4_2])- , ((1,3766582),[l10_2])+ [ + ((1,-1302210307),[l4_2])+ , ((1,2524),[l1_2])+ , ((1,2620),[o2_2])+ , ((1,2621),[o3_2])+ , ((1,2623),[o1_2])+ , ((1,2624),[p1_2])+ , ((1,2720),[s2_2])+ , ((1,2721),[s3_2])+ , ((1,2723),[s1_2])+ , ((1,10836024),[l10_2]) ]-+ testEquivClass33_1, testEquivClass33_2 :: Test testEquivClass33_1 = testeq "EquivClass33_1" ec31test ec31 testEquivClass33_2 = testeq "EquivClass33_2" ec32test ec32@@ -1013,6 +1115,8 @@ ec3pairs :: [(EquivClass, EquivClass)] ec3pairs = zip (pairSort ec31) (pairSort ec32) +{- This is a pointless test in this case+ ec3test :: [(EquivClass, EquivClass)] ec3test = [ ( ((1,142321),[o1_1]), ((1,142321),[o1_2]) )@@ -1020,7 +1124,6 @@ , ( ((1,142577),[s1_1]), ((1,142577),[s1_2]) ) ] -{- This is a pointless test in this case testEquivClass33_3 = testeq "EquivClass33_3" ec3test ec3pairs -} @@ -1731,7 +1834,6 @@ allTests = TestList [ testSelectSuite , testSubsetSuite- , testHashSuite , testLabSuite , testGraphSuite , testLabelEqSuite