Skip to content
This repository was archived by the owner on Jul 2, 2020. It is now read-only.

Commit b7c8079

Browse files
authored
Merge pull request praalhans#28 from praalhans/feature/18
Feature/18
2 parents 7037ef2 + a30ef7e commit b7c8079

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+925
-152
lines changed

SimulationCore/src/com/aexiz/daviz/simulation/AbstractEvent.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
import com.aexiz.daviz.simulation.viewpoint.Locus;
1111
import com.aexiz.daviz.simulation.viewpoint.Node;
1212

13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.Map;
16+
1317
public abstract class AbstractEvent extends Locus implements Cloneable, Event {
1418
protected Simulation simulation;
1519
protected Execution execution;
@@ -142,6 +146,26 @@ public Node getReceiver() {
142146
throw new Error();
143147
}
144148

149+
@Override
150+
public void clearMatchingEvent() {
151+
matchingEvent = null;
152+
}
153+
154+
@Override
155+
public void clearPreviousEvent() {
156+
previousEvent = null;
157+
}
158+
159+
@Override
160+
public void setPreviousEvent(Event previousEvent) {
161+
this.previousEvent = previousEvent;
162+
}
163+
164+
@Override
165+
public void setMatchingEvent(Event matchingEvent) {
166+
this.matchingEvent = matchingEvent;
167+
}
168+
145169
@Override
146170
public abstract Event clone();
147171

@@ -151,4 +175,60 @@ protected AbstractEvent clone(AbstractEvent to) {
151175
to.happensAt = this.happensAt;
152176
return to;
153177
}
178+
179+
static public void matchAndLinkEvents(List<Event> events) {
180+
// First we clear the state of all events
181+
clearEvents(events);
182+
183+
// Match send and receive events
184+
matchSendAndReceiveEvents(events);
185+
186+
// Build a linked list of events and their predecessor within the same process
187+
linkPreviousEvents(events);
188+
}
189+
190+
private static void clearEvents(List<Event> events) {
191+
for (Event event : events) {
192+
event.clearMatchingEvent();
193+
event.clearPreviousEvent();
194+
}
195+
}
196+
197+
private static void matchSendAndReceiveEvents(List<Event> events) {
198+
for (int i = 0, size = events.size(); i < size; i++) {
199+
Event receiveEvent = events.get(i);
200+
if (receiveEvent instanceof tReceiveEvent) {
201+
boolean matched = false;
202+
for (int j = 0; j < i; j++) {
203+
Event sendEvent = events.get(j);
204+
if (sendEvent instanceof tSendEvent && areEventsMatched(sendEvent, receiveEvent)) {
205+
sendEvent.setMatchingEvent(receiveEvent);
206+
receiveEvent.setMatchingEvent(sendEvent);
207+
matched = true;
208+
break;
209+
}
210+
}
211+
if (!matched)
212+
throw new Error("Unmatched receive and send events");
213+
}
214+
}
215+
}
216+
217+
private static boolean areEventsMatched(Event sendEvent, Event receiveEvent) {
218+
if (sendEvent.getReceiver() != receiveEvent.getHappensAt()) return false;
219+
if (receiveEvent.getSender() != sendEvent.getHappensAt()) return false;
220+
if (sendEvent.hasMatchingEvent()) return false;
221+
if (!receiveEvent.getMessage().equals(sendEvent.getMessage())) return false;
222+
223+
return true;
224+
}
225+
226+
private static void linkPreviousEvents(List<Event> events) {
227+
Map<Node, Event> map = new HashMap<>();
228+
for (Event event : events) {
229+
Node happens = event.getHappensAt();
230+
event.setPreviousEvent(map.get(happens));
231+
map.put(happens, event);
232+
}
233+
}
154234
}

SimulationCore/src/com/aexiz/daviz/simulation/AbstractExecution.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,23 @@ public abstract class AbstractExecution implements Execution {
1818
*/
1919
Event lastEvent;
2020

21+
public AbstractExecution(Simulation simulation, Configuration configuration) {
22+
this.simulation = simulation;
23+
this.configuration = configuration;
24+
}
25+
26+
public AbstractExecution(Simulation simulation, Execution parent) {
27+
this.simulation = simulation;
28+
this.parent = parent;
29+
}
30+
31+
public AbstractExecution(Simulation simulation) {
32+
this.simulation = simulation;
33+
}
34+
35+
public AbstractExecution() {
36+
}
37+
2138
protected void isInvariant() {
2239
if (simulation == null) throw new Error("Invalid simulation");
2340
}
@@ -65,6 +82,11 @@ public void setLastEvent(Event lastEvent) {
6582
this.lastEvent = lastEvent;
6683
}
6784

85+
@Override
86+
public Event getLastEvent() {
87+
return lastEvent;
88+
}
89+
6890
@Override
6991
public boolean hasNext() {
7092
return successors.size() != 0;
@@ -120,4 +142,19 @@ public List<Execution> getExecutionPath() {
120142
Collections.reverse(result);
121143
return result;
122144
}
145+
146+
@Override
147+
public Event[] getLinkedEvents() {
148+
ArrayList<Event> events = new ArrayList<>();
149+
// Traverse and collect
150+
Execution elem = this;
151+
while (elem.hasEvents()) {
152+
events.add(elem.getLastEvent());
153+
elem = elem.getParent();
154+
}
155+
156+
Collections.reverse(events);
157+
AbstractEvent.matchAndLinkEvents(events);
158+
return events.toArray(new Event[0]);
159+
}
123160
}

SimulationCore/src/com/aexiz/daviz/simulation/AbstractNetwork.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import com.aexiz.daviz.simulation.viewpoint.Node;
55
import org.jetbrains.annotations.NotNull;
66

7-
import java.util.ArrayList;
8-
import java.util.UUID;
7+
import java.util.*;
98

109
public abstract class AbstractNetwork implements Network {
1110
protected ArrayList<Node> processes = new ArrayList<>();
@@ -127,6 +126,30 @@ public boolean belongsToSimulation() {
127126
return simulationUUID != null;
128127
}
129128

129+
@Override
130+
public List<Channel> getChannelsFromNode(Node node) {
131+
List<Channel> channels = new ArrayList<>();
132+
133+
this.channels.forEach((channel) -> {
134+
if (channel.from.isEqualTo(node)) {
135+
channels.add(channel);
136+
}
137+
});
138+
139+
return channels;
140+
}
141+
142+
@Override
143+
public Map<Node, List<Channel>> makeMapOfChannelsFromNodes() {
144+
Map<Node, List<Channel>> channelsFromNode = new HashMap<>();
145+
146+
processes.forEach((process) -> {
147+
channelsFromNode.put(process, getChannelsFromNode(process));
148+
});
149+
150+
return channelsFromNode;
151+
}
152+
130153
private void floodFill(@NotNull Node node) {
131154
if (node.isMarked()) return;
132155
node.setMarked(true);

SimulationCore/src/com/aexiz/daviz/simulation/Event.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,20 @@ public interface Event {
1818

1919
Node getHappensAt();
2020

21+
void clearPreviousEvent();
22+
23+
void setPreviousEvent(Event event);
24+
2125
void setHappensAt(Node happensAt);
2226

2327
boolean hasMatchingEvent();
2428

2529
Event getMatchingEvent();
2630

31+
void clearMatchingEvent();
32+
33+
void setMatchingEvent(Event event);
34+
2735
boolean hasHappensAt();
2836

2937
boolean hasNextState();

SimulationCore/src/com/aexiz/daviz/simulation/Execution.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ public interface Execution {
2929

3030
void setLastEvent(Event lastEvent);
3131

32+
Event getLastEvent();
33+
3234
Configuration getConfiguration();
3335

3436
void setConfiguration(Configuration configuration);
3537

36-
void loadFirst();
37-
3838
Simulation getSimulation();
3939

4040
void setSimulation(Simulation simulation);

SimulationCore/src/com/aexiz/daviz/simulation/Network.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import com.aexiz.daviz.simulation.viewpoint.Node;
55
import org.jetbrains.annotations.NotNull;
66

7+
import java.util.List;
8+
import java.util.Map;
9+
710
public interface Network {
811
Node addNode(@NotNull Node process);
912

@@ -17,6 +20,10 @@ public interface Network {
1720

1821
Channel[] getChannels();
1922

23+
List<Channel> getChannelsFromNode(Node node);
24+
25+
Map<Node, List<Channel>> makeMapOfChannelsFromNodes();
26+
2027
boolean isWeighted();
2128

2229
boolean isStronglyConnected();
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
package com.aexiz.daviz.simulation.algorithm.event;
22

3-
public interface tInternalEvent {
3+
import com.aexiz.daviz.simulation.Event;
4+
5+
public interface tInternalEvent extends Event {
46
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
package com.aexiz.daviz.simulation.algorithm.event;
22

3-
public interface tReceiveEvent {
3+
import com.aexiz.daviz.simulation.Event;
4+
5+
public interface tReceiveEvent extends Event {
46
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
package com.aexiz.daviz.simulation.algorithm.event;
22

3-
public interface tResultEvent {
3+
import com.aexiz.daviz.simulation.Event;
4+
5+
public interface tResultEvent extends Event {
46
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
package com.aexiz.daviz.simulation.algorithm.event;
22

3-
public interface tSendEvent {
3+
import com.aexiz.daviz.simulation.Event;
4+
5+
public interface tSendEvent extends Event {
46
}

SimulationCore/src/com/aexiz/daviz/simulation/algorithm/information/state/AbstractViewpointState.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,8 @@ public String toString() {
1717
Class<? extends Viewpoint> viewpointClass = viewpoint.getClass();
1818
return state + "<" + viewpointClass + ">";
1919
}
20+
21+
public Viewpoint getViewpoint() {
22+
return viewpoint;
23+
}
2024
}

SimulationCore/src/com/aexiz/daviz/simulation/algorithm/information/state/UndefinedState.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
public class UndefinedState extends AbstractState {
44
public UndefinedState() {
5-
super("Initiator");
5+
super("Undefined");
66
}
77
}

SimulationCore/src/com/aexiz/daviz/simulation/algorithm/space/AssumptionSpace.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

SimulationCore/src/com/aexiz/daviz/simulation/algorithm/space/MessageSpace.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

SimulationCore/src/com/aexiz/daviz/simulation/algorithm/space/ProcessDescription.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

SimulationCore/src/com/aexiz/daviz/simulation/algorithm/space/ResultSpace.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

SimulationCore/src/com/aexiz/daviz/simulation/algorithm/space/Space.java

Lines changed: 0 additions & 4 deletions
This file was deleted.

SimulationCore/src/com/aexiz/daviz/simulation/algorithm/space/StateSpace.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)