diff --git a/alloy/cd/generate.als b/alloy/cd/generate.als index 842ba3bac..3894dbba3 100644 --- a/alloy/cd/generate.als +++ b/alloy/cd/generate.als @@ -152,6 +152,16 @@ pred flip [c : Change] { c.add in NonInheritance implies equalLimits [c.add, c.remove] } +pred flipInheritance [c : Change] { + flip [c] + c.add in Inheritance +} + +pred flipNonInheritance [c : Change] { + flip [c] + c.add in NonInheritance +} + pred changedKind [c : Change] { equalDirection [c.add, c.remove] not sameKind [c.add, c.remove] diff --git a/example/src/Modelling/CdOd/MatchCdOd/Config.hs b/example/src/Modelling/CdOd/MatchCdOd/Config.hs index 123562c76..fa4da2ca1 100644 --- a/example/src/Modelling/CdOd/MatchCdOd/Config.hs +++ b/example/src/Modelling/CdOd/MatchCdOd/Config.hs @@ -30,7 +30,8 @@ task2023_14 = MatchCdOdConfig { RemoveRelationship, MutateRelationship ChangeKind, MutateRelationship ChangeLimit, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], classConfig = ClassConfig { classLimits = (5, 5), @@ -82,7 +83,8 @@ task2023_15 = MatchCdOdConfig { RemoveRelationship, MutateRelationship ChangeKind, MutateRelationship ChangeLimit, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], classConfig = ClassConfig { classLimits = (5, 5), @@ -178,7 +180,8 @@ CPU usage: 130% task2024_18 :: MatchCdOdConfig task2024_18 = MatchCdOdConfig { allowedCdMutations = [ - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], classConfig = ClassConfig { classLimits = (5, 5), @@ -370,7 +373,8 @@ CPU usage: 141% task2024_58 :: MatchCdOdConfig task2024_58 = MatchCdOdConfig { allowedCdMutations = [ - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], classConfig = ClassConfig { classLimits = (5, 5), diff --git a/example/src/Modelling/CdOd/RepairCd/Config.hs b/example/src/Modelling/CdOd/RepairCd/Config.hs index cd03e016b..0cfa24e5a 100644 --- a/example/src/Modelling/CdOd/RepairCd/Config.hs +++ b/example/src/Modelling/CdOd/RepairCd/Config.hs @@ -32,7 +32,8 @@ task2023_07 = RepairCdConfig { RemoveRelationship, MutateRelationship ChangeKind, MutateRelationship ChangeLimit, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = False, @@ -93,7 +94,8 @@ task2023_08 = RepairCdConfig { RemoveRelationship, MutateRelationship ChangeKind, MutateRelationship ChangeLimit, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = True, @@ -153,7 +155,8 @@ task2024_12 = RepairCdConfig { allowedCdMutations = [ AddRelationship, MutateRelationship ChangeKind, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = False, @@ -212,7 +215,8 @@ task2024_13 :: RepairCdConfig task2024_13 = RepairCdConfig { allowedCdMutations = [ MutateRelationship ChangeKind, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = True, @@ -272,7 +276,8 @@ task2024_55 = RepairCdConfig { allowedCdMutations = [ AddRelationship, MutateRelationship ChangeKind, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = False, @@ -337,7 +342,8 @@ task2025_repeat_12 = RepairCdConfig { allowedCdMutations = [ AddRelationship, MutateRelationship ChangeKind, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = False, diff --git a/example/src/Modelling/CdOd/SelectValidCd/Config.hs b/example/src/Modelling/CdOd/SelectValidCd/Config.hs index 5517aa1d1..2792c89a3 100644 --- a/example/src/Modelling/CdOd/SelectValidCd/Config.hs +++ b/example/src/Modelling/CdOd/SelectValidCd/Config.hs @@ -35,7 +35,8 @@ task2023_05 = SelectValidCdConfig { RemoveRelationship, MutateRelationship ChangeKind, MutateRelationship ChangeLimit, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = True, @@ -98,7 +99,8 @@ task2023_06 = SelectValidCdConfig { RemoveRelationship, MutateRelationship ChangeKind, MutateRelationship ChangeLimit, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = False, @@ -159,7 +161,8 @@ task2024_06 = SelectValidCdConfig { allowedCdMutations = [ AddRelationship, MutateRelationship ChangeKind, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = True, @@ -221,7 +224,8 @@ task2024_07 = SelectValidCdConfig { AddRelationship, RemoveRelationship, MutateRelationship ChangeKind, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = False, @@ -342,7 +346,8 @@ task2024_51 = SelectValidCdConfig { allowedCdMutations = [ AddRelationship, MutateRelationship ChangeKind, - MutateRelationship Flip + MutateRelationship FlipInheritance, + MutateRelationship FlipNonInheritance ], allowedProperties = AllowedProperties { compositionCycles = True, diff --git a/src/Modelling/CdOd/CdAndChanges/Transform.hs b/src/Modelling/CdOd/CdAndChanges/Transform.hs index 38a42b663..19e605edd 100644 --- a/src/Modelling/CdOd/CdAndChanges/Transform.hs +++ b/src/Modelling/CdOd/CdAndChanges/Transform.hs @@ -329,7 +329,8 @@ changePredicate allowed = [__i| mutationConstraint mutation = case mutation of ChangeLimit -> [iii|changedLimit [c]|] ChangeKind -> [iii|changedKind [c]|] - Flip -> [iii|flip [c]|] + FlipInheritance -> [iii|flipInheritance [c]|] + FlipNonInheritance -> [iii|flipNonInheritance [c]|] changes :: Maybe ClassConfig diff --git a/src/Modelling/CdOd/MatchCdOd.hs b/src/Modelling/CdOd/MatchCdOd.hs index 4166a2dc7..377fc0826 100644 --- a/src/Modelling/CdOd/MatchCdOd.hs +++ b/src/Modelling/CdOd/MatchCdOd.hs @@ -237,7 +237,7 @@ defaultMatchCdOdConfig inheritanceLimits = (1, Just 2), relationshipLimits = (3, Just 4) }, - maxInstances = Just 200, + maxInstances = Just 500, objectConfig = ObjectConfig { linkLimits = (4, Just 10), linksPerObjectLimits = (0, Just 4), @@ -685,201 +685,214 @@ defaultMatchCdOdInstance = MatchCdOdInstance { }, diagrams = M.fromList [ (1, ClassDiagram { - classNames = ["C", "D", "B", "A"], + classNames = ["A", "D", "C", "B"], relationships = [ + Composition { + compositionName = "y", + compositionPart = LimitedLinking { + linking = "C", + limits = (1, Nothing) + }, + compositionWhole = LimitedLinking { + linking = "D", + limits = (1, Just 1) + } + }, + Inheritance { + subClass = "A", + superClass = "B" + }, Aggregation { aggregationName = "z", aggregationPart = LimitedLinking { - linking = "B", - limits = (0, Just 2) - }, - aggregationWhole = LimitedLinking { linking = "A", limits = (1, Nothing) + }, + aggregationWhole = LimitedLinking { + linking = "C", + limits = (1, Just 2) } }, - Association { - associationName = "w", - associationFrom = LimitedLinking { - linking = "C", - limits = (1, Nothing) - }, - associationTo = LimitedLinking { + Aggregation { + aggregationName = "u", + aggregationPart = LimitedLinking { linking = "D", - limits = (1, Nothing) + limits = (1, Just 2) + }, + aggregationWhole = LimitedLinking { + linking = "B", + limits = (1, Just 1) } }, - Composition { - compositionName = "x", - compositionPart = LimitedLinking { - linking = "D", + Association { + associationName = "w", + associationFrom = LimitedLinking { + linking = "B", limits = (1, Just 2) }, - compositionWhole = LimitedLinking { - linking = "A", + associationTo = LimitedLinking { + linking = "C", limits = (0, Just 1) } - }, - Inheritance { - subClass = "C", - superClass = "A" } ] }), (2, ClassDiagram { - classNames = ["B", "D", "A", "C"], + classNames = ["C", "B", "A", "D"], relationships = [ Association { associationName = "w", associationFrom = LimitedLinking { linking = "C", - limits = (1, Nothing) + limits = (1, Just 2) }, associationTo = LimitedLinking { - linking = "D", - limits = (1, Nothing) + linking = "B", + limits = (0, Just 1) } }, Aggregation { aggregationName = "z", aggregationPart = LimitedLinking { - linking = "B", - limits = (0, Just 2) - }, - aggregationWhole = LimitedLinking { linking = "A", limits = (1, Nothing) + }, + aggregationWhole = LimitedLinking { + linking = "C", + limits = (1, Just 2) } }, Composition { - compositionName = "x", + compositionName = "y", compositionPart = LimitedLinking { - linking = "A", - limits = (2, Nothing) + linking = "C", + limits = (1, Nothing) }, compositionWhole = LimitedLinking { linking = "D", - limits = (0, Just 1) + limits = (1, Just 1) } }, Inheritance { - subClass = "C", - superClass = "A" + subClass = "A", + superClass = "B" } ] }) ], hiddenReferenceCd = Just $ ClassDiagram { - classNames = ["A", "C", "D", "B"], + classNames = ["C", "B", "D", "A"], relationships = [ - Composition { - compositionName = "x", - compositionPart = LimitedLinking { + Aggregation { + aggregationName = "z", + aggregationPart = LimitedLinking { linking = "A", - limits = (1, Just 2) + limits = (0, Nothing) }, - compositionWhole = LimitedLinking { - linking = "D", - limits = (0, Just 1) + aggregationWhole = LimitedLinking { + linking = "C", + limits = (1, Just 2) } }, - Aggregation { - aggregationName = "w", - aggregationPart = LimitedLinking { + Composition { + compositionName = "y", + compositionPart = LimitedLinking { linking = "C", limits = (1, Nothing) }, - aggregationWhole = LimitedLinking { + compositionWhole = LimitedLinking { linking = "D", - limits = (1, Nothing) + limits = (1, Just 1) } }, - Inheritance { - subClass = "C", - superClass = "A" - }, - Aggregation { - aggregationName = "z", - aggregationPart = LimitedLinking { + Association { + associationName = "w", + associationFrom = LimitedLinking { linking = "B", - limits = (0, Just 2) + limits = (1, Just 2) }, - aggregationWhole = LimitedLinking { - linking = "A", - limits = (1, Nothing) + associationTo = LimitedLinking { + linking = "C", + limits = (0, Just 1) } + }, + Inheritance { + subClass = "A", + superClass = "B" } ] }, instances = M.fromList [ - ('a', ([1], ObjectDiagram { + ('a', ([], ObjectDiagram { objects = [ - Object {isAnonymous = True, objectName = "b1", objectClass = "B"}, Object {isAnonymous = False, objectName = "c", objectClass = "C"}, - Object {isAnonymous = False, objectName = "b", objectClass = "B"}, - Object {isAnonymous = False, objectName = "d", objectClass = "D"} + Object {isAnonymous = False, objectName = "d", objectClass = "D"}, + Object {isAnonymous = True, objectName = "a", objectClass = "A"}, + Object {isAnonymous = False, objectName = "a1", objectClass = "A"} ], links = [ - Link {linkLabel = "w", linkFrom = "c", linkTo = "d"}, - Link {linkLabel = "z", linkFrom = "b1", linkTo = "c"}, - Link {linkLabel = "z", linkFrom = "b", linkTo = "c"}, - Link {linkLabel = "x", linkFrom = "d", linkTo = "c"} + Link {linkLabel = "z", linkFrom = "a", linkTo = "c"}, + Link {linkLabel = "y", linkFrom = "c", linkTo = "d"}, + Link {linkLabel = "w", linkFrom = "a1", linkTo = "c"}, + Link {linkLabel = "z", linkFrom = "a1", linkTo = "c"} ] })), - ('b', ([], ObjectDiagram { + ('b', ([2], ObjectDiagram { objects = [ - Object {isAnonymous = True, objectName = "c", objectClass = "C"}, - Object {isAnonymous = False, objectName = "a", objectClass = "A"}, Object {isAnonymous = False, objectName = "d", objectClass = "D"}, - Object {isAnonymous = False, objectName = "b", objectClass = "B"} + Object {isAnonymous = False, objectName = "c1", objectClass = "C"}, + Object {isAnonymous = False, objectName = "a", objectClass = "A"}, + Object {isAnonymous = True, objectName = "c", objectClass = "C"} ], links = [ - Link {linkLabel = "w", linkFrom = "c", linkTo = "d"}, - Link {linkLabel = "z", linkFrom = "b", linkTo = "c"}, - Link {linkLabel = "z", linkFrom = "b", linkTo = "a"}, - Link {linkLabel = "x", linkFrom = "a", linkTo = "d"} + Link {linkLabel = "z", linkFrom = "a", linkTo = "c"}, + Link {linkLabel = "w", linkFrom = "c1", linkTo = "a"}, + Link {linkLabel = "y", linkFrom = "c", linkTo = "d"}, + Link {linkLabel = "y", linkFrom = "c1", linkTo = "d"}, + Link {linkLabel = "z", linkFrom = "a", linkTo = "c1"}, + Link {linkLabel = "w", linkFrom = "c", linkTo = "a"} ] })), - ('c', ([2], ObjectDiagram { + ('c', ([1], ObjectDiagram { objects = [ - Object {isAnonymous = False, objectName = "d", objectClass = "D"}, - Object {isAnonymous = True, objectName = "a1", objectClass = "A"}, Object {isAnonymous = False, objectName = "c", objectClass = "C"}, - Object {isAnonymous = False, objectName = "a", objectClass = "A"} + Object {isAnonymous = False, objectName = "d", objectClass = "D"}, + Object {isAnonymous = True, objectName = "a", objectClass = "A"} ], links = [ - Link {linkLabel = "x", linkFrom = "c", linkTo = "d"}, - Link {linkLabel = "w", linkFrom = "c", linkTo = "d"}, - Link {linkLabel = "x", linkFrom = "a", linkTo = "d"}, - Link {linkLabel = "x", linkFrom = "a1", linkTo = "d"} + Link {linkLabel = "w", linkFrom = "a", linkTo = "c"}, + Link {linkLabel = "u", linkFrom = "d", linkTo = "a"}, + Link {linkLabel = "z", linkFrom = "a", linkTo = "c"}, + Link {linkLabel = "y", linkFrom = "c", linkTo = "d"} ] })), - ('d', ([2], ObjectDiagram { + ('d', ([], ObjectDiagram { objects = [ - Object {isAnonymous = False, objectName = "d", objectClass = "D"}, Object {isAnonymous = False, objectName = "a", objectClass = "A"}, - Object {isAnonymous = True, objectName = "c", objectClass = "C"}, - Object {isAnonymous = False, objectName = "c1", objectClass = "C"} + Object {isAnonymous = False, objectName = "c", objectClass = "C"}, + Object {isAnonymous = True, objectName = "b", objectClass = "B"}, + Object {isAnonymous = False, objectName = "d", objectClass = "D"} ], links = [ - Link {linkLabel = "w", linkFrom = "c", linkTo = "d"}, - Link {linkLabel = "w", linkFrom = "c1", linkTo = "d"}, - Link {linkLabel = "x", linkFrom = "c", linkTo = "d"}, - Link {linkLabel = "x", linkFrom = "c1", linkTo = "d"} + Link {linkLabel = "w", linkFrom = "b", linkTo = "c"}, + Link {linkLabel = "w", linkFrom = "a", linkTo = "c"}, + Link {linkLabel = "y", linkFrom = "c", linkTo = "d"}, + Link {linkLabel = "z", linkFrom = "a", linkTo = "c"} ] })), - ('e', ([1], ObjectDiagram { + ('e', ([2], ObjectDiagram { objects = [ + Object {isAnonymous = True, objectName = "d", objectClass = "D"}, + Object {isAnonymous = False, objectName = "c1", objectClass = "C"}, Object {isAnonymous = False, objectName = "c", objectClass = "C"}, - Object {isAnonymous = False, objectName = "a", objectClass = "A"}, - Object {isAnonymous = True, objectName = "d1", objectClass = "D"}, - Object {isAnonymous = False, objectName = "d", objectClass = "D"} + Object {isAnonymous = False, objectName = "a", objectClass = "A"} ], links = [ - Link {linkLabel = "w", linkFrom = "c", linkTo = "d1"}, - Link {linkLabel = "w", linkFrom = "c", linkTo = "d"}, - Link {linkLabel = "x", linkFrom = "d", linkTo = "a"}, - Link {linkLabel = "x", linkFrom = "d1", linkTo = "c"} + Link {linkLabel = "w", linkFrom = "c1", linkTo = "a"}, + Link {linkLabel = "y", linkFrom = "c", linkTo = "d"}, + Link {linkLabel = "y", linkFrom = "c1", linkTo = "d"}, + Link {linkLabel = "z", linkFrom = "a", linkTo = "c1"}, + Link {linkLabel = "z", linkFrom = "a", linkTo = "c"} ] })) ], diff --git a/src/Modelling/CdOd/Types.hs b/src/Modelling/CdOd/Types.hs index 9e4ac2125..c4a647ec1 100644 --- a/src/Modelling/CdOd/Types.hs +++ b/src/Modelling/CdOd/Types.hs @@ -256,7 +256,8 @@ The basic mutation operations. data RelationshipMutation = ChangeKind | ChangeLimit - | Flip + | FlipInheritance + | FlipNonInheritance deriving (Bounded, Enum, Eq, Generic, Ord, Read, Reader, Show, ToDoc) deriveEnumerable ''RelationshipMutation diff --git a/test/Modelling/CdOd/MatchCdOdSpec.hs b/test/Modelling/CdOd/MatchCdOdSpec.hs index 484ff9dec..fdcf676f8 100644 --- a/test/Modelling/CdOd/MatchCdOdSpec.hs +++ b/test/Modelling/CdOd/MatchCdOdSpec.hs @@ -62,7 +62,7 @@ spec = do describe "matchingToSolution . toMatching" $ it "returns expected mapping for default instance" $ matchCdOdSolution defaultMatchCdOdInstance - `shouldBe` [(1, Letters "ae"), (2, Letters "cd")] + `shouldBe` [(1, Letters "c"), (2, Letters "be")] describe "getODsFor" $ do it "does not generate specific false instance" $ ioProperty $ do getOdsFor cdAggregateBofAs cdAtoB