Skip to content

Commit

Permalink
Optimize computation of transitive closure over constraints - Task #1044
Browse files Browse the repository at this point in the history


- the previous implementation had a quadratic worst-case complexity
- the improved implementation has linear complexity (in the number of
  state machines)
  • Loading branch information
pchrszon-dlr committed Aug 28, 2023
1 parent 5b5974b commit bd868d5
Showing 1 changed file with 22 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.Stack;

import de.dlr.sc.virsat.model.extension.statemachines.model.AConstraint;
import de.dlr.sc.virsat.model.extension.statemachines.model.StateMachine;
Expand All @@ -34,17 +35,27 @@ private StateMachineHelper() { }
* An extended set of state machines that does not contain dangling constraints.
*/
public static Set<StateMachine> transitiveClosureOverConstraints(Set<StateMachine> stateMachines) {
var result = new HashSet<StateMachine>(stateMachines);

Set<StateMachine> extension;
do {
extension = result.stream()
.flatMap(sm -> sm.getConstraints().stream().flatMap(c -> referencedStateMachines(c).stream()))
.filter(sm -> !result.contains(sm))
.collect(Collectors.toSet());
var stack = new Stack<Iterator<StateMachine>>();
var result = new HashSet<StateMachine>();

Check warning on line 39 in de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java

View check run for this annotation

Codecov / codecov/patch

de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java#L38-L39

Added lines #L38 - L39 were not covered by tests

stack.push(stateMachines.iterator());

Check warning on line 41 in de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java

View check run for this annotation

Codecov / codecov/patch

de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java#L41

Added line #L41 was not covered by tests

while (!stack.isEmpty()) {
var it = stack.peek();

Check warning on line 44 in de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java

View check run for this annotation

Codecov / codecov/patch

de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java#L44

Added line #L44 was not covered by tests

result.addAll(extension);
} while (!extension.isEmpty());
if (!it.hasNext()) {
stack.pop();
} else {
var sm = it.next();

Check warning on line 49 in de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java

View check run for this annotation

Codecov / codecov/patch

de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java#L47-L49

Added lines #L47 - L49 were not covered by tests

if (result.contains(sm)) {
continue;

Check warning on line 52 in de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java

View check run for this annotation

Codecov / codecov/patch

de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java#L52

Added line #L52 was not covered by tests
} else {
result.add(sm);
stack.push(sm.getConstraints().stream().flatMap(c -> referencedStateMachines(c).stream()).iterator());

Check warning on line 55 in de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java

View check run for this annotation

Codecov / codecov/patch

de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java#L54-L55

Added lines #L54 - L55 were not covered by tests
}
}
}

return result;

Check warning on line 60 in de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java

View check run for this annotation

Codecov / codecov/patch

de.dlr.sc.virsat.model.extension.statemachines/src/de/dlr/sc/virsat/model/extension/statemachines/util/StateMachineHelper.java#L60

Added line #L60 was not covered by tests
}
Expand Down

0 comments on commit bd868d5

Please sign in to comment.