Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Area Interchange Control as OuterLoop #1055

Open
wants to merge 54 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
08e2260
Add new OLF parameter to enable area interchange control
m-guibert Jul 1, 2024
b7e37e6
Add new OLF parameter to select the areaType used for Area Interchang…
vmouradian Jul 8, 2024
1c2dc4c
finish adding af the 2 new Control Area parameters
vmouradian Jul 12, 2024
c41efe6
add areaInterchangeControlAreaType to LfNetworkParameters
vmouradian Jul 12, 2024
a44d4f0
Initiate LfControlArea interface and impl + add to LfNetwork
vmouradian Jul 12, 2024
f30d7f7
Load Areas to lfNetwork in LfNetworkLoader
vmouradian Jul 12, 2024
5a5a00d
(wip) Unit test
vmouradian Jul 12, 2024
10bf131
change methods order in LfControlArea
vmouradian Jul 17, 2024
04dedf3
replace Evaluable by supplier in ControlArea boundaries
vmouradian Jul 17, 2024
bfc656a
LfNetworkLoader unit test
vmouradian Jul 17, 2024
1929b57
Merge branch 'main' into area_interchange_control_outerloop
vmouradian Jul 18, 2024
63eb397
rename
vmouradian Jul 18, 2024
743827b
rename LfcontrolArea to LfArea + move new parameters to bottom
vmouradian Jul 18, 2024
60adb95
rename
vmouradian Jul 18, 2024
097d801
clarify areas conversion in LfNetworkLoader
vmouradian Jul 18, 2024
5a29ee9
rename + clean
vmouradian Jul 19, 2024
42bfe28
(wip) Area Interchange Control outerloop first version
vmouradian Jul 22, 2024
ba86476
update behaviour in case of failed distribution
vmouradian Jul 22, 2024
5df88b2
style fix
vmouradian Jul 22, 2024
050514c
power distribution fail handled per Area
vmouradian Jul 23, 2024
bdf6261
add unit tests
vmouradian Jul 23, 2024
6a24636
update unit tests
vmouradian Jul 24, 2024
1b27134
add AreaInterchangeControl to LfNetworkParameters
vmouradian Jul 24, 2024
82dddbc
Load areas to LfNetwork only if AreaInterchangeControl is true
vmouradian Jul 24, 2024
d7456e7
Fix copyrights and javadoc
vmouradian Jul 25, 2024
e107aac
Improve logging and reports
vmouradian Jul 25, 2024
ad6a151
fix wrong slack injection computation
vmouradian Jul 25, 2024
05c9a97
improve comment
vmouradian Jul 25, 2024
b5fefc8
fix error message and unit test
vmouradian Jul 25, 2024
f3930a8
check buses with no areas and handle slack on boundary buses
vmouradian Jul 25, 2024
f8142ae
check areas duplicated over multiple LfNetworks
vmouradian Jul 26, 2024
a0d05fb
update unit tests
vmouradian Jul 26, 2024
a7c6a58
clean OpenLoadFlowParameters
jeandemanged Jul 29, 2024
995a1b4
fix
jeandemanged Jul 29, 2024
e83f8af
rename AreaInterchangeControlTest
vmouradian Aug 2, 2024
ccdd43d
fix logger
vmouradian Aug 2, 2024
7294008
add Area interchange control creation to ExplicitAcOuterLoopConfig
vmouradian Aug 2, 2024
c2f88b5
add setter for LfArea interchange target
vmouradian Aug 2, 2024
9a9478c
refactor Areas creation and slack handling in area interchange contro…
vmouradian Aug 2, 2024
8c0fc11
fix
vmouradian Aug 26, 2024
341a8de
remove unused slackBusCount attribute
vmouradian Aug 26, 2024
365e12a
add onAreaAdded post processor
vmouradian Aug 26, 2024
164e899
delete duplicated areas test, replace with testing that all boundarie…
vmouradian Aug 26, 2024
e8257b4
fix aic reports + add unit test
vmouradian Aug 26, 2024
66b0478
doc v1
vmouradian Aug 26, 2024
da68498
doc v2
vmouradian Aug 26, 2024
eea4667
fix Q state update
vmouradian Aug 28, 2024
672b513
Merge branch 'main' into area_interchange_control_outerloop
vmouradian Aug 28, 2024
a5c7e25
clean
vmouradian Aug 28, 2024
a49dc24
fix precision
vmouradian Sep 4, 2024
cdf29bb
fix np errors with tielines
vmouradian Sep 4, 2024
59bd9dc
handle networks with no-Area parts and Networks with fragmented areas
vmouradian Sep 5, 2024
f340a65
remove dead code
vmouradian Sep 5, 2024
dae8119
rename, clarify, comment, clean
vmouradian Sep 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 55 additions & 10 deletions src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@ public enum FictitiousGeneratorVoltageControlCheckMode {

protected static final FictitiousGeneratorVoltageControlCheckMode FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE_DEFAULT_VALUE = FictitiousGeneratorVoltageControlCheckMode.FORCED;

public static final boolean AREA_INTERCHANGE_CONTROL_DEFAULT_VALUE = false;

public static final String AREA_INTERCHANGE_CONTROL_AREA_TYPE_DEFAULT_VALUE = LfNetworkParameters.AREA_INTERCHANGE_CONTROL_AREA_TYPE_DEFAULT_VALUE;

public static final String SLACK_BUS_SELECTION_MODE_PARAM_NAME = "slackBusSelectionMode";

public static final String SLACK_BUSES_IDS_PARAM_NAME = "slackBusesIds";
Expand Down Expand Up @@ -263,6 +267,10 @@ public enum FictitiousGeneratorVoltageControlCheckMode {

public static final String FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE = "fictitiousGeneratorVoltageControlCheckMode";

public static final String AREA_INTERCHANGE_CONTROL_PARAM_NAME = "areaInterchangeControl";

public static final String AREA_INTERCHANGE_CONTROL_AREA_TYPE_PARAM_NAME = "areaInterchangeControlAreaType";

public static <E extends Enum<E>> List<Object> getEnumPossibleValues(Class<E> enumClass) {
return EnumSet.allOf(enumClass).stream().map(Enum::name).collect(Collectors.toList());
}
Expand Down Expand Up @@ -335,7 +343,9 @@ public static <E extends Enum<E>> List<Object> getEnumPossibleValues(Class<E> en
new Parameter(VOLTAGE_TARGET_PRIORITIES_PARAM_NAME, ParameterType.STRING_LIST, "Voltage target priorities for voltage controls", LfNetworkParameters.VOLTAGE_CONTROL_PRIORITIES_DEFAULT_VALUE, getEnumPossibleValues(VoltageControl.Type.class)),
new Parameter(TRANSFORMER_VOLTAGE_CONTROL_USE_INITIAL_TAP_POSITION_PARAM_NAME, ParameterType.BOOLEAN, "Maintain initial tap position if possible", LfNetworkParameters.TRANSFORMER_VOLTAGE_CONTROL_USE_INITIAL_TAP_POSITION_DEFAULT_VALUE),
new Parameter(GENERATOR_VOLTAGE_CONTROL_MIN_NOMINAL_VOLTAGE_PARAM_NAME, ParameterType.DOUBLE, "Nominal voltage under which generator voltage controls are disabled during transformer voltage control outer loop of mode AFTER_GENERATOR_VOLTAGE_CONTROL, < 0 means automatic detection", OpenLoadFlowParameters.GENERATOR_VOLTAGE_CONTROL_MIN_NOMINAL_VOLTAGE_DEFAULT_VALUE),
new Parameter(FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE, ParameterType.STRING, "Specifies fictitious generators active power checks exemption for voltage control", OpenLoadFlowParameters.FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE_DEFAULT_VALUE.name(), getEnumPossibleValues(FictitiousGeneratorVoltageControlCheckMode.class))
new Parameter(FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE, ParameterType.STRING, "Specifies fictitious generators active power checks exemption for voltage control", OpenLoadFlowParameters.FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE_DEFAULT_VALUE.name(), getEnumPossibleValues(FictitiousGeneratorVoltageControlCheckMode.class)),
new Parameter(AREA_INTERCHANGE_CONTROL_PARAM_NAME, ParameterType.BOOLEAN, "Area interchange control", AREA_INTERCHANGE_CONTROL_DEFAULT_VALUE),
new Parameter(AREA_INTERCHANGE_CONTROL_AREA_TYPE_PARAM_NAME, ParameterType.STRING, "Area type for area interchange control", AREA_INTERCHANGE_CONTROL_AREA_TYPE_DEFAULT_VALUE)
);

public enum VoltageInitModeOverride {
Expand Down Expand Up @@ -513,6 +523,10 @@ public enum ReactiveRangeCheckMode {

private FictitiousGeneratorVoltageControlCheckMode fictitiousGeneratorVoltageControlCheckMode = FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE_DEFAULT_VALUE;

private boolean areaInterchangeControl = AREA_INTERCHANGE_CONTROL_DEFAULT_VALUE;

private String areaInterchangeControlAreaType = AREA_INTERCHANGE_CONTROL_AREA_TYPE_DEFAULT_VALUE;

public static double checkParameterValue(double parameterValue, boolean condition, String parameterName) {
if (!condition) {
throw new IllegalArgumentException("Invalid value for parameter " + parameterName + ": " + parameterValue);
Expand Down Expand Up @@ -618,11 +632,6 @@ public boolean isVoltagePerReactivePowerControl() {
return voltagePerReactivePowerControl;
}

public OpenLoadFlowParameters setVoltagePerReactivePowerControl(boolean voltagePerReactivePowerControl) {
this.voltagePerReactivePowerControl = voltagePerReactivePowerControl;
return this;
}

public boolean isGeneratorReactivePowerRemoteControl() {
return generatorReactivePowerRemoteControl;
}
Expand Down Expand Up @@ -1209,6 +1218,29 @@ public OpenLoadFlowParameters setFictitiousGeneratorVoltageControlCheckMode(Fict
return this;
}

public boolean isAreaInterchangeControl() {
return areaInterchangeControl;
}

public OpenLoadFlowParameters setAreaInterchangeControl(boolean areaInterchangeControl) {
this.areaInterchangeControl = areaInterchangeControl;
return this;
}

public String getAreaInterchangeControlAreaType() {
return areaInterchangeControlAreaType;
}

public OpenLoadFlowParameters setAreaInterchangeControlAreaType(String areaInterchangeControlAreaType) {
this.areaInterchangeControlAreaType = Objects.requireNonNull(areaInterchangeControlAreaType);
return this;
}

public OpenLoadFlowParameters setVoltagePerReactivePowerControl(boolean voltagePerReactivePowerControl) {
jeandemanged marked this conversation as resolved.
Show resolved Hide resolved
this.voltagePerReactivePowerControl = voltagePerReactivePowerControl;
return this;
}

public static OpenLoadFlowParameters load() {
return load(PlatformConfig.defaultConfig());
}
Expand Down Expand Up @@ -1284,7 +1316,9 @@ public static OpenLoadFlowParameters load(PlatformConfig platformConfig) {
.setWriteReferenceTerminals(config.getBooleanProperty(WRITE_REFERENCE_TERMINALS_PARAM_NAME, WRITE_REFERENCE_TERMINALS_DEFAULT_VALUE))
.setVoltageTargetPriorities(config.getStringListProperty(VOLTAGE_TARGET_PRIORITIES_PARAM_NAME, LfNetworkParameters.VOLTAGE_CONTROL_PRIORITIES_DEFAULT_VALUE))
.setTransformerVoltageControlUseInitialTapPosition(config.getBooleanProperty(TRANSFORMER_VOLTAGE_CONTROL_USE_INITIAL_TAP_POSITION_PARAM_NAME, LfNetworkParameters.TRANSFORMER_VOLTAGE_CONTROL_USE_INITIAL_TAP_POSITION_DEFAULT_VALUE))
.setGeneratorVoltageControlMinNominalVoltage(config.getDoubleProperty(GENERATOR_VOLTAGE_CONTROL_MIN_NOMINAL_VOLTAGE_PARAM_NAME, GENERATOR_VOLTAGE_CONTROL_MIN_NOMINAL_VOLTAGE_DEFAULT_VALUE)));
.setGeneratorVoltageControlMinNominalVoltage(config.getDoubleProperty(GENERATOR_VOLTAGE_CONTROL_MIN_NOMINAL_VOLTAGE_PARAM_NAME, GENERATOR_VOLTAGE_CONTROL_MIN_NOMINAL_VOLTAGE_DEFAULT_VALUE))
.setAreaInterchangeControl(config.getBooleanProperty(AREA_INTERCHANGE_CONTROL_PARAM_NAME, AREA_INTERCHANGE_CONTROL_DEFAULT_VALUE))
.setAreaInterchangeControlAreaType(config.getStringProperty(AREA_INTERCHANGE_CONTROL_AREA_TYPE_PARAM_NAME, AREA_INTERCHANGE_CONTROL_AREA_TYPE_DEFAULT_VALUE)));
return parameters;
}

Expand Down Expand Up @@ -1439,6 +1473,10 @@ public OpenLoadFlowParameters update(Map<String, String> properties) {
.ifPresent(prop -> this.setGeneratorVoltageControlMinNominalVoltage(Double.parseDouble(prop)));
Optional.ofNullable(properties.get(FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE))
.ifPresent(prop -> this.setFictitiousGeneratorVoltageControlCheckMode(FictitiousGeneratorVoltageControlCheckMode.valueOf(prop)));
Optional.ofNullable(properties.get(AREA_INTERCHANGE_CONTROL_PARAM_NAME))
.ifPresent(prop -> this.setAreaInterchangeControl(Boolean.parseBoolean(prop)));
Optional.ofNullable(properties.get(AREA_INTERCHANGE_CONTROL_AREA_TYPE_PARAM_NAME))
.ifPresent(this::setAreaInterchangeControlAreaType);
return this;
}

Expand Down Expand Up @@ -1512,6 +1550,8 @@ public Map<String, Object> toMap() {
map.put(TRANSFORMER_VOLTAGE_CONTROL_USE_INITIAL_TAP_POSITION_PARAM_NAME, transformerVoltageControlUseInitialTapPosition);
map.put(GENERATOR_VOLTAGE_CONTROL_MIN_NOMINAL_VOLTAGE_PARAM_NAME, generatorVoltageControlMinNominalVoltage);
map.put(FICTITIOUS_GENERATOR_VOLTAGE_CONTROL_CHECK_MODE, fictitiousGeneratorVoltageControlCheckMode);
map.put(AREA_INTERCHANGE_CONTROL_PARAM_NAME, areaInterchangeControl);
map.put(AREA_INTERCHANGE_CONTROL_AREA_TYPE_PARAM_NAME, areaInterchangeControlAreaType);
return map;
}

Expand Down Expand Up @@ -1640,7 +1680,8 @@ static LfNetworkParameters getNetworkParameters(LoadFlowParameters parameters, O
.setSimulateAutomationSystems(parametersExt.isSimulateAutomationSystems())
.setReferenceBusSelector(ReferenceBusSelector.fromMode(parametersExt.getReferenceBusSelectionMode()))
.setVoltageTargetPriorities(parametersExt.getVoltageTargetPriorities())
.setFictitiousGeneratorVoltageControlCheckMode(parametersExt.getFictitiousGeneratorVoltageControlCheckMode());
.setFictitiousGeneratorVoltageControlCheckMode(parametersExt.getFictitiousGeneratorVoltageControlCheckMode())
.setAreaInterchangeControlAreaType(parametersExt.getAreaInterchangeControlAreaType());
}

public static AcLoadFlowParameters createAcParameters(Network network, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt,
Expand Down Expand Up @@ -1890,7 +1931,9 @@ public static boolean equals(LoadFlowParameters parameters1, LoadFlowParameters
Objects.equals(extension1.getVoltageTargetPriorities(), extension2.getVoltageTargetPriorities()) &&
extension1.isTransformerVoltageControlUseInitialTapPosition() == extension2.isTransformerVoltageControlUseInitialTapPosition() &&
extension1.getGeneratorVoltageControlMinNominalVoltage() == extension2.getGeneratorVoltageControlMinNominalVoltage() &&
extension1.getFictitiousGeneratorVoltageControlCheckMode() == extension2.getFictitiousGeneratorVoltageControlCheckMode();
extension1.getFictitiousGeneratorVoltageControlCheckMode() == extension2.getFictitiousGeneratorVoltageControlCheckMode() &&
extension1.isAreaInterchangeControl() == extension2.isAreaInterchangeControl() &&
Objects.equals(extension1.getAreaInterchangeControlAreaType(), extension2.getAreaInterchangeControlAreaType());
}

public static LoadFlowParameters clone(LoadFlowParameters parameters) {
Expand Down Expand Up @@ -1983,7 +2026,9 @@ public static LoadFlowParameters clone(LoadFlowParameters parameters) {
.setVoltageTargetPriorities(extension.getVoltageTargetPriorities())
.setTransformerVoltageControlUseInitialTapPosition(extension.isTransformerVoltageControlUseInitialTapPosition())
.setGeneratorVoltageControlMinNominalVoltage(extension.getGeneratorVoltageControlMinNominalVoltage())
.setFictitiousGeneratorVoltageControlCheckMode(extension.getFictitiousGeneratorVoltageControlCheckMode());
.setFictitiousGeneratorVoltageControlCheckMode(extension.getFictitiousGeneratorVoltageControlCheckMode())
.setAreaInterchangeControl(extension.isAreaInterchangeControl())
.setAreaInterchangeControlAreaType(extension.getAreaInterchangeControlAreaType());

if (extension2 != null) {
parameters2.addExtension(OpenLoadFlowParameters.class, extension2);
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/com/powsybl/openloadflow/network/LfArea.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.powsybl.openloadflow.network;

import com.powsybl.openloadflow.util.Evaluable;

import java.util.Set;
import java.util.function.Supplier;

public interface LfArea extends PropertyBag {
String getId();

double getInterchangeTarget();
jeandemanged marked this conversation as resolved.
Show resolved Hide resolved

double getInterchange();

Set<LfBus> getBuses();

LfArea addBus(LfBus bus);

LfArea addBoundaryP(Supplier<Evaluable> p);

LfNetwork getNetwork();

}
12 changes: 12 additions & 0 deletions src/main/java/com/powsybl/openloadflow/network/LfNetwork.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ public class LfNetwork extends AbstractPropertyBag implements PropertyBag {

private final Map<String, LfLoad> loadsById = new HashMap<>();

private final Map<String, LfArea> controlAreasById = new HashMap<>();

private final List<LfHvdc> hvdcs = new ArrayList<>();

private final Map<String, LfHvdc> hvdcsById = new HashMap<>();
Expand Down Expand Up @@ -299,6 +301,11 @@ public void addBus(LfBus bus) {
bus.getLoads().forEach(load -> load.getOriginalIds().forEach(id -> loadsById.put(id, load)));
}

public void addControlArea(LfArea controlArea) {
m-guibert marked this conversation as resolved.
Show resolved Hide resolved
Objects.requireNonNull(controlArea);
controlAreasById.put(controlArea.getId(), controlArea);
}

public List<LfBus> getBuses() {
return busesByIndex;
}
Expand Down Expand Up @@ -366,6 +373,11 @@ public LfLoad getLoadById(String id) {
return loadsById.get(id);
}

public LfArea getControlAreaById(String id) {
m-guibert marked this conversation as resolved.
Show resolved Hide resolved
Objects.requireNonNull(id);
return controlAreasById.get(id);
}

public void addHvdc(LfHvdc hvdc) {
Objects.requireNonNull(hvdc);
hvdc.setNum(hvdcs.size());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ public class LfNetworkParameters {

public static final boolean SIMULATE_AUTOMATION_SYSTEMS_DEFAULT_VALUE = false;

public static final String AREA_INTERCHANGE_CONTROL_AREA_TYPE_DEFAULT_VALUE = "ControlArea";

private SlackBusSelector slackBusSelector = new FirstSlackBusSelector(SLACK_BUS_COUNTRY_FILTER_DEFAULT_VALUE);

private GraphConnectivityFactory<LfBus, LfBranch> connectivityFactory = new EvenShiloachGraphDecrementalConnectivityFactory<>();
Expand Down Expand Up @@ -142,6 +144,8 @@ public class LfNetworkParameters {

private OpenLoadFlowParameters.FictitiousGeneratorVoltageControlCheckMode fictitiousGeneratorVoltageControlCheckMode = OpenLoadFlowParameters.FictitiousGeneratorVoltageControlCheckMode.FORCED;

private String areaInterchangeControlAreaType = AREA_INTERCHANGE_CONTROL_AREA_TYPE_DEFAULT_VALUE;

public LfNetworkParameters() {
}

Expand Down Expand Up @@ -186,6 +190,7 @@ public LfNetworkParameters(LfNetworkParameters other) {
this.referenceBusSelector = other.referenceBusSelector;
this.voltageTargetPriorities = new ArrayList<>(other.voltageTargetPriorities);
this.fictitiousGeneratorVoltageControlCheckMode = other.fictitiousGeneratorVoltageControlCheckMode;
this.areaInterchangeControlAreaType = other.areaInterchangeControlAreaType;
}

public SlackBusSelector getSlackBusSelector() {
Expand Down Expand Up @@ -571,6 +576,15 @@ public int getVoltageTargetPriority(VoltageControl.Type voltageControlType) {
return priority;
}

public String getAreaInterchangeControlAreaType() {
return areaInterchangeControlAreaType;
}

public LfNetworkParameters setAreaInterchangeControlAreaType(String areaInterchangeControlAreaType) {
this.areaInterchangeControlAreaType = areaInterchangeControlAreaType;
return this;
}

@Override
public String toString() {
return "LfNetworkParameters(" +
Expand Down Expand Up @@ -610,6 +624,7 @@ public String toString() {
", referenceBusSelector=" + referenceBusSelector.getClass().getSimpleName() +
", voltageTargetPriorities=" + voltageTargetPriorities +
", fictitiousGeneratorVoltageControlCheckMode=" + fictitiousGeneratorVoltageControlCheckMode +
", areaInterchangeControlAreaType=" + areaInterchangeControlAreaType +
')';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.powsybl.openloadflow.network.impl;

import com.powsybl.iidm.network.*;
import com.powsybl.openloadflow.network.*;
import com.powsybl.openloadflow.util.Evaluable;

import java.util.HashSet;
import java.util.Set;
import java.util.function.Supplier;

public class LfAreaImpl extends AbstractPropertyBag implements LfArea {

private final LfNetwork network;
private final Ref<Area> areaRef;

private final double interchangeTarget;

private final Set<LfBus> buses;

private Set<Supplier<Evaluable>> boundariesP;

public LfAreaImpl(Area area, LfNetwork network, LfNetworkParameters parameters) {
jeandemanged marked this conversation as resolved.
Show resolved Hide resolved
this.network = network;
this.areaRef = Ref.create(area, parameters.isCacheEnabled());
this.interchangeTarget = area.getInterchangeTarget().orElse(Double.NaN);
this.buses = new HashSet<>();
this.boundariesP = new HashSet<>();
}

public static LfAreaImpl create(Area area, LfNetwork network, LfNetworkParameters parameters) {
return new LfAreaImpl(area, network, parameters);
}

private Area getArea() {
return areaRef.get();
}

@Override
public String getId() {
return getArea().getId();
}

@Override
public double getInterchangeTarget() {
return interchangeTarget;
}

@Override
public double getInterchange() {
return boundariesP.stream().map(Supplier::get).mapToDouble(Evaluable::eval).sum();
}

@Override
public Set<LfBus> getBuses() {
return buses;
}

@Override
public LfArea addBus(LfBus bus) {
buses.add(bus);
return this;
}

@Override
public LfArea addBoundaryP(Supplier<Evaluable> getP) {
boundariesP.add(getP);
return this;
}

@Override
public LfNetwork getNetwork() {
return network;
}

}
Loading