AmplExporter.java
/**
* Copyright (c) 2016, All partners of the iTesla project (http://www.itesla-project.eu/consortium)
* Copyright (c) 2016, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.ampl.converter;
import com.google.auto.service.AutoService;
import com.powsybl.ampl.converter.version.AmplExportVersion;
import com.powsybl.commons.config.PlatformConfig;
import com.powsybl.commons.datasource.DataSource;
import com.powsybl.commons.parameters.ConfiguredParameter;
import com.powsybl.commons.parameters.Parameter;
import com.powsybl.commons.parameters.ParameterDefaultValueConfig;
import com.powsybl.commons.parameters.ParameterType;
import com.powsybl.iidm.network.Exporter;
import com.powsybl.iidm.network.Network;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
*/
@AutoService(Exporter.class)
public class AmplExporter implements Exporter {
public static final String EXPORT_SCOPE = "iidm.export.ampl.scope";
public static final String EXPORT_XNODES = "iidm.export.ampl.with-xnodes";
public static final String EXPORT_ACTION_TYPE = "iidm.export.ampl.action-type";
public static final String EXPORT_RATIOTAPCHANGER_VT = "iidm.export.ampl.export-ratio-tap-changer-voltage-target";
public static final String TWT_SPLIT_SHUNT_ADMITTANCE = "iidm.export.ampl.twt-split-shunt-admittance";
public static final String EXPORT_VERSION = "iidm.export.ampl.export-version";
public static final String EXPORT_SORTED = "iidm.export.ampl.export-sorted";
private static final Parameter EXPORT_SCOPE_PARAMETER = new Parameter(EXPORT_SCOPE, ParameterType.STRING, "Export scope",
AmplExportConfig.ExportScope.ALL.name(),
Arrays.stream(AmplExportConfig.ExportScope.values()).map(Enum::name).collect(Collectors.toList()));
private static final Parameter EXPORT_XNODES_PARAMETER = new Parameter(EXPORT_XNODES, ParameterType.BOOLEAN,
"Export Xnodes of tie-lines", Boolean.FALSE);
private static final Parameter EXPORT_ACTION_TYPE_PARAMETER = new Parameter(EXPORT_ACTION_TYPE,
ParameterType.STRING, "Type of the remedial actions (preventive or curative)",
AmplExportConfig.ExportActionType.CURATIVE.name(),
Arrays.stream(AmplExportConfig.ExportActionType.values()).map(Enum::name).collect(Collectors.toList()));
private static final Parameter EXPORT_RATIOTAPCHANGER_VT_PARAMETER = new Parameter(EXPORT_RATIOTAPCHANGER_VT,
ParameterType.BOOLEAN, "Export ratio tap changer voltage target", Boolean.FALSE)
.addAdditionalNames("iidm.export.ampl.exportRatioTapChangerVoltageTarget");
private static final Parameter TWT_SPLIT_SHUNT_ADMITTANCE_PARAMETER = new Parameter(TWT_SPLIT_SHUNT_ADMITTANCE,
ParameterType.BOOLEAN, "Export twt split shunt admittance", Boolean.FALSE)
.addAdditionalNames("iidm.export.ampl.specific-compatibility")
.addAdditionalNames("iidm.export.ampl.specificCompatibility");
private static final Parameter EXPORT_VERSION_PARAMETER = new Parameter(EXPORT_VERSION, ParameterType.STRING,
"The version of the export.",
AmplExportVersion.defaultVersion().getExporterId(),
new ArrayList<>(AmplExportVersion.exporterIdValues()));
private static final Parameter EXPORT_SORTED_PARAMETER = new Parameter(EXPORT_SORTED, ParameterType.BOOLEAN, "Export alphabetically sorted by equipment id", Boolean.FALSE);
private static final List<Parameter> STATIC_PARAMETERS = List.of(EXPORT_SCOPE_PARAMETER, EXPORT_XNODES_PARAMETER,
EXPORT_ACTION_TYPE_PARAMETER, EXPORT_RATIOTAPCHANGER_VT_PARAMETER, TWT_SPLIT_SHUNT_ADMITTANCE_PARAMETER,
EXPORT_VERSION_PARAMETER, EXPORT_SORTED_PARAMETER);
private final ParameterDefaultValueConfig defaultValueConfig;
public AmplExporter() {
this(PlatformConfig.defaultConfig());
}
public AmplExporter(PlatformConfig platformConfig) {
defaultValueConfig = new ParameterDefaultValueConfig(platformConfig);
}
@Override
public String getFormat() {
return "AMPL";
}
@Override
public String getComment() {
return "IIDM to AMPL converter";
}
@Override
public void export(Network network, Properties parameters, DataSource dataSource) {
Objects.requireNonNull(network);
Objects.requireNonNull(dataSource);
try {
AmplExportConfig.ExportScope scope = AmplExportConfig.ExportScope.valueOf(Parameter.readString(getFormat(), parameters, EXPORT_SCOPE_PARAMETER, defaultValueConfig));
boolean exportXnodes = Parameter.readBoolean(getFormat(), parameters, EXPORT_XNODES_PARAMETER, defaultValueConfig);
AmplExportConfig.ExportActionType actionType = AmplExportConfig.ExportActionType.valueOf(Parameter.readString(getFormat(), parameters, EXPORT_ACTION_TYPE_PARAMETER, defaultValueConfig));
boolean exportRatioTapChangerVoltageTarget = Parameter.readBoolean(getFormat(), parameters, EXPORT_RATIOTAPCHANGER_VT_PARAMETER, defaultValueConfig);
boolean twtSplitShuntAdmittance = Parameter.readBoolean(getFormat(), parameters,
TWT_SPLIT_SHUNT_ADMITTANCE_PARAMETER, defaultValueConfig);
AmplExportVersion exportVersion = AmplExportVersion.fromExporterId(
Parameter.readString(getFormat(), parameters, EXPORT_VERSION_PARAMETER, defaultValueConfig));
boolean exportSorted = Parameter.readBoolean(getFormat(), parameters, EXPORT_SORTED_PARAMETER, defaultValueConfig);
AmplExportConfig config = new AmplExportConfig(scope, exportXnodes, actionType,
exportRatioTapChangerVoltageTarget, twtSplitShuntAdmittance, exportVersion, exportSorted);
new AmplNetworkWriter(network, dataSource, config).write();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public void export(Network network, AmplExportConfig config, DataSource dataSource) {
Objects.requireNonNull(network);
Objects.requireNonNull(dataSource);
Objects.requireNonNull(config);
try {
new AmplNetworkWriter(network, dataSource, config).write();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Override
public List<Parameter> getParameters() {
return ConfiguredParameter.load(STATIC_PARAMETERS, getFormat(), defaultValueConfig);
}
}