Skip to content

Commit 4e8d7d8

Browse files
committed
lazy equation sort by column
Signed-off-by: Didier Vidal <[email protected]>
1 parent 9cea097 commit 4e8d7d8

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

src/main/java/com/powsybl/openloadflow/ac/equations/vector/AcVectorEngine.java

+21-7
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,7 @@
2020
import org.slf4j.Logger;
2121
import org.slf4j.LoggerFactory;
2222

23-
import java.util.ArrayList;
24-
import java.util.Arrays;
25-
import java.util.Collection;
26-
import java.util.List;
23+
import java.util.*;
2724
import java.util.function.DoubleSupplier;
2825
import java.util.stream.IntStream;
2926

@@ -67,6 +64,8 @@ public class AcVectorEngine implements StateVectorListener, EquationSystemListen
6764

6865
// indexes to compute derivatives
6966
private boolean equationDataValid;
67+
private boolean equationOrderValid;
68+
private int[] sortedEquationIndexArray;
7069
private int[] variableCountPerEquation;
7170
private int[] variablePerEquationIndex;
7271
private Variable<AcVariableType>[] variablesPerEquation;
@@ -179,6 +178,7 @@ public void onEquationChange(Equation equation, EquationEventType eventType) {
179178
if (equation.getVectorIndex() >= 0) {
180179
equationColumn[equation.getVectorIndex()] = equation.getColumn();
181180
}
181+
equationOrderValid = false;
182182
break;
183183
}
184184
}
@@ -231,6 +231,7 @@ private void initEquationData() {
231231

232232
Collection<Equation<AcVariableType, AcEquationType>> equationList = equationSystem.getEquations();
233233
int equationCount = equationList.size();
234+
sortedEquationIndexArray = new int[equationCount];
234235
variableCountPerEquation = new int[equationCount];
235236
equationActiveStatus = new boolean[equationCount];
236237
equationColumn = new int[equationCount];
@@ -384,20 +385,33 @@ private void initEquationData() {
384385
equationDataValid = true;
385386
}
386387

388+
private void sortEquations() {
389+
Iterator<Integer> it = IntStream.range(0, equationColumn.length).boxed()
390+
.sorted((i1, i2) -> equationColumn[i1] - equationColumn[i2]).iterator();
391+
int i = 0;
392+
while (it.hasNext()) {
393+
sortedEquationIndexArray[i] = it.next();
394+
i += 1;
395+
}
396+
equationOrderValid = true;
397+
}
398+
387399
@Override
388400
public void der(boolean update, Matrix matrix) {
389401

390402
if (!equationDataValid) {
391403
initEquationData();
404+
equationOrderValid = false;
405+
}
406+
407+
if (!equationOrderValid) {
408+
sortEquations();
392409
}
393410

394411
updateVariables(); // do not depend on listener call order
395412

396413
derSortedTerms();
397414

398-
int[] sortedEquationIndexArray = IntStream.range(0, equationActiveStatus.length).boxed()
399-
.sorted((i1, i2) -> equationColumn[i1] - equationColumn[i2])
400-
.mapToInt(i -> i).toArray();
401415
for (int sortedEqIndex = 0; sortedEqIndex < equationActiveStatus.length; sortedEqIndex++) {
402416
int eqIndex = sortedEquationIndexArray[sortedEqIndex];
403417
if (equationActiveStatus[eqIndex]) {

0 commit comments

Comments
 (0)