diff options
Diffstat (limited to 'Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft')
3 files changed, 34 insertions, 4 deletions
diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/ComponentFaultTreeTrace.xtend b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/ComponentFaultTreeTrace.xtend index 7a3e377b..10c91fb4 100644 --- a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/ComponentFaultTreeTrace.xtend +++ b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/ComponentFaultTreeTrace.xtend | |||
@@ -2,6 +2,7 @@ package hu.bme.mit.inf.dslreasoner.faulttree.transformation.ecore2cft | |||
2 | 2 | ||
3 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.CftFactory | 3 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.CftFactory |
4 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.ComponentDefinition | 4 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.ComponentDefinition |
5 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Modality | ||
5 | import java.util.Map | 6 | import java.util.Map |
6 | import org.eclipse.viatra.query.runtime.api.IPatternMatch | 7 | import org.eclipse.viatra.query.runtime.api.IPatternMatch |
7 | import org.eclipse.xtend.lib.annotations.Accessors | 8 | import org.eclipse.xtend.lib.annotations.Accessors |
@@ -13,10 +14,16 @@ class ComponentFaultTreeTrace { | |||
13 | val Map<IPatternMatch, ComponentInstanceTrace> componentInstancesMap = newHashMap | 14 | val Map<IPatternMatch, ComponentInstanceTrace> componentInstancesMap = newHashMap |
14 | 15 | ||
15 | def instantiateComponent(IPatternMatch patternMatch, ComponentDefinition componenDefinition) { | 16 | def instantiateComponent(IPatternMatch patternMatch, ComponentDefinition componenDefinition) { |
17 | instantiateComponent(patternMatch, componenDefinition, Modality.MUST, false) | ||
18 | } | ||
19 | |||
20 | def instantiateComponent(IPatternMatch patternMatch, ComponentDefinition componenDefinition, Modality exists, | ||
21 | boolean allowMultiple) { | ||
16 | if (componentInstancesMap.containsKey(patternMatch)) { | 22 | if (componentInstancesMap.containsKey(patternMatch)) { |
17 | throw new IllegalArgumentException("Already instantiated component for match: " + patternMatch) | 23 | throw new IllegalArgumentException("Already instantiated component for match: " + patternMatch) |
18 | } | 24 | } |
19 | val componentTrace = new ComponentInstanceTrace(componentFaultTree, componenDefinition, nameGenerator) | 25 | val componentTrace = new ComponentInstanceTrace(componentFaultTree, componenDefinition, nameGenerator, |
26 | exists, allowMultiple) | ||
20 | componentInstancesMap.put(patternMatch, componentTrace) | 27 | componentInstancesMap.put(patternMatch, componentTrace) |
21 | componentTrace | 28 | componentTrace |
22 | } | 29 | } |
@@ -30,6 +37,9 @@ class ComponentFaultTreeTrace { | |||
30 | throw new IllegalArgumentException("Top level component must have 1 output, got " + outputs.size + | 37 | throw new IllegalArgumentException("Top level component must have 1 output, got " + outputs.size + |
31 | " instead") | 38 | " instead") |
32 | } | 39 | } |
40 | if (!trace.appearsExactlyOnce) { | ||
41 | throw new IllegalArgumentException("Top level must appear in the fault tree exactly once") | ||
42 | } | ||
33 | componentFaultTree.topEvent = outputs.head | 43 | componentFaultTree.topEvent = outputs.head |
34 | } | 44 | } |
35 | 45 | ||
diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/ComponentInstanceTrace.xtend b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/ComponentInstanceTrace.xtend index 7353bfe5..158ab2e1 100644 --- a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/ComponentInstanceTrace.xtend +++ b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/ComponentInstanceTrace.xtend | |||
@@ -6,18 +6,23 @@ import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.ComponentDefinition | |||
6 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.ComponentFaultTree | 6 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.ComponentFaultTree |
7 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.EventDeclaration | 7 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.EventDeclaration |
8 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.InputEvent | 8 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.InputEvent |
9 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Modality | ||
9 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Output | 10 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Output |
10 | import java.util.Map | 11 | import java.util.Map |
11 | 12 | ||
13 | import static extension hu.bme.mit.inf.dslreasoner.faulttree.model.util.CftExtensions.* | ||
14 | |||
12 | class ComponentInstanceTrace { | 15 | class ComponentInstanceTrace { |
13 | val componentInstance = CftFactory.eINSTANCE.createComponent | 16 | val componentInstance = CftFactory.eINSTANCE.createComponent |
14 | val Map<InputEvent, InputTrace> inputEventsMap | 17 | val Map<InputEvent, InputTrace> inputEventsMap |
15 | val Map<EventDeclaration, Output> outputEventsMap | 18 | val Map<EventDeclaration, Output> outputEventsMap |
16 | 19 | ||
17 | protected new(ComponentFaultTree faultTree, ComponentDefinition componentDefinition, | 20 | protected new(ComponentFaultTree faultTree, ComponentDefinition componentDefinition, |
18 | ComponentNameGenerator nameGenerator) { | 21 | ComponentNameGenerator nameGenerator, Modality exists, boolean multipleAllowed) { |
19 | componentInstance.componentDefinition = componentDefinition | 22 | componentInstance.componentDefinition = componentDefinition |
20 | componentInstance.name = nameGenerator.nextName(componentDefinition) | 23 | componentInstance.name = nameGenerator.nextName(componentDefinition) |
24 | componentInstance.exists = exists | ||
25 | componentInstance.multipleAllowed = multipleAllowed | ||
21 | inputEventsMap = Maps.newHashMapWithExpectedSize(componentDefinition.inputEvents.size) | 26 | inputEventsMap = Maps.newHashMapWithExpectedSize(componentDefinition.inputEvents.size) |
22 | for (inputEvent : componentDefinition.inputEvents) { | 27 | for (inputEvent : componentDefinition.inputEvents) { |
23 | val inputTrace = new InputTrace(componentInstance, inputEvent) | 28 | val inputTrace = new InputTrace(componentInstance, inputEvent) |
@@ -34,6 +39,11 @@ class ComponentInstanceTrace { | |||
34 | } | 39 | } |
35 | 40 | ||
36 | def void assign(EventDeclaration inputEvent, ComponentInstanceTrace sourceComponent, EventDeclaration outputEvent) { | 41 | def void assign(EventDeclaration inputEvent, ComponentInstanceTrace sourceComponent, EventDeclaration outputEvent) { |
42 | assign(inputEvent, sourceComponent, outputEvent, Modality.MUST) | ||
43 | } | ||
44 | |||
45 | def void assign(EventDeclaration inputEvent, ComponentInstanceTrace sourceComponent, EventDeclaration outputEvent, | ||
46 | Modality exists) { | ||
37 | val inputTrace = inputEventsMap.get(inputEvent) | 47 | val inputTrace = inputEventsMap.get(inputEvent) |
38 | if (inputTrace === null) { | 48 | if (inputTrace === null) { |
39 | throw new IllegalArgumentException("Unknown input: " + inputEvent) | 49 | throw new IllegalArgumentException("Unknown input: " + inputEvent) |
@@ -42,10 +52,14 @@ class ComponentInstanceTrace { | |||
42 | if (output === null) { | 52 | if (output === null) { |
43 | throw new IllegalArgumentException("Unknown output: " + outputEvent) | 53 | throw new IllegalArgumentException("Unknown output: " + outputEvent) |
44 | } | 54 | } |
45 | inputTrace.assign(output) | 55 | inputTrace.assign(output, exists) |
46 | } | 56 | } |
47 | 57 | ||
48 | protected def getOutputs() { | 58 | protected def getOutputs() { |
49 | componentInstance.outputs | 59 | componentInstance.outputs |
50 | } | 60 | } |
61 | |||
62 | protected def appearsExactlyOnce() { | ||
63 | componentInstance.appearsExactlyOnce | ||
64 | } | ||
51 | } | 65 | } |
diff --git a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/InputTrace.xtend b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/InputTrace.xtend index c529a09b..b892eff1 100644 --- a/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/InputTrace.xtend +++ b/Stochastic/hu.bme.mit.inf.dslreasoner.faulttree.transformation/src/hu/bme/mit/inf/dslreasoner/faulttree/transformation/ecore2cft/InputTrace.xtend | |||
@@ -5,9 +5,12 @@ import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Component | |||
5 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Connection | 5 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Connection |
6 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Input | 6 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Input |
7 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.InputEvent | 7 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.InputEvent |
8 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Modality | ||
8 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Output | 9 | import hu.bme.mit.inf.dslreasoner.faulttree.model.cft.Output |
9 | import java.util.Map | 10 | import java.util.Map |
10 | 11 | ||
12 | import static extension hu.bme.mit.inf.dslreasoner.faulttree.model.util.CftExtensions.* | ||
13 | |||
11 | class InputTrace { | 14 | class InputTrace { |
12 | val Input input = CftFactory.eINSTANCE.createInput | 15 | val Input input = CftFactory.eINSTANCE.createInput |
13 | val Map<Output, Connection> connectionsMap = newHashMap | 16 | val Map<Output, Connection> connectionsMap = newHashMap |
@@ -17,13 +20,16 @@ class InputTrace { | |||
17 | component.inputs += input | 20 | component.inputs += input |
18 | } | 21 | } |
19 | 22 | ||
20 | def void assign(Output output) { | 23 | def void assign(Output output, Modality exists) { |
21 | val connection = connectionsMap.get(output) | 24 | val connection = connectionsMap.get(output) |
22 | if (connection === null) { | 25 | if (connection === null) { |
23 | val newConnection = CftFactory.eINSTANCE.createConnection | 26 | val newConnection = CftFactory.eINSTANCE.createConnection |
24 | newConnection.output = output | 27 | newConnection.output = output |
28 | newConnection.exists = exists | ||
25 | input.incomingConnections += newConnection | 29 | input.incomingConnections += newConnection |
26 | connectionsMap.put(output, newConnection) | 30 | connectionsMap.put(output, newConnection) |
31 | } else if (exists.isMoreConcreteThan(connection.exists)) { | ||
32 | connection.exists = exists | ||
27 | } | 33 | } |
28 | } | 34 | } |
29 | } | 35 | } |