Skip to content

Commit

Permalink
Merge pull request #122 from SES-fortiss/feat-connection-extension-debug
Browse files Browse the repository at this point in the history
Feat connection extension debugged.
  • Loading branch information
bytschkow authored Dec 17, 2020
2 parents 3a62df9 + 88b525b commit a3848cb
Show file tree
Hide file tree
Showing 321 changed files with 7,105 additions and 7,927 deletions.
5 changes: 5 additions & 0 deletions projects/memapCore/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,11 @@
</organization>

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ private void setProfiles(String csvFile) {
FileManager fm = new FileManager();
if (csvFile.isEmpty()) {

OriginalCSVHandler ocsv = new OriginalCSVHandler(fm.getBuffer("EXAMPLE0"), topologyConfig);
OriginalCSVHandler ocsv = new OriginalCSVHandler(fm.getBuffer("CONSUMPTIONEXAMPLE0"), topologyConfig);
electricityProfile = ocsv.getElectricityProfile();
heatProfile = ocsv.getHeatProfile();

Expand All @@ -102,7 +102,7 @@ private void setProfiles(String csvFile) {
}
} catch (IOException | ParseException e) {

System.err.println("Error reading or parsing CSV data from " + csvFile + " - we try a second format now.");
System.out.println("Reading new format of " + csvFile);
try {
// If the first reader does not work, we try a second format style, that is specified as another scenario

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import behavior.BehaviorModel;
import lpsolve.LpSolveException;
import memap.controller.TopologyController;
import memap.helper.MEMAPLogging;
import memap.helper.SolutionHandler;
import memap.helper.configurationOptions.OptHierarchy;
import memap.helper.configurationOptions.Optimizer;
Expand Down Expand Up @@ -61,8 +62,8 @@ public Building(TopologyController topologyController, int port) {
totalCO2Vector = new double[topologyConfig.getNrOfIterations()];
solutionPerTimeStep = new double[topologyConfig.getNrOfIterations()][];
nStepsMPC = topologyConfig.getNrStepsMPC();
lpSolHandler = new SolutionHandler(nStepsMPC);
milpSolHandler = new SolutionHandler(nStepsMPC);
lpSolHandler = new SolutionHandler(nStepsMPC, topologyConfig);
milpSolHandler = new SolutionHandler(nStepsMPC, topologyConfig);
}

@Override
Expand Down Expand Up @@ -108,15 +109,18 @@ private void optimizeBuilding() {
}
}

double costTotal = 0;
double CO2Total = 0;
for (int i = 0; i < totalEURVector.length; i++) {
costTotal += totalEURVector[i];
CO2Total += totalCO2Vector[i];
if (topologyController.getLogging() == MEMAPLogging.ALL) {
double costTotal = 0;
double CO2Total = 0;
for (int i = 0; i < totalEURVector.length; i++) {
costTotal += totalEURVector[i];
CO2Total += totalCO2Vector[i];
}

System.out.println(topologyController.getOptimizer() + ": " + this.actorName + " cost = "
+ String.format("%.03f", costTotal) + " EUR ; CO2: " + String.format("%.03f", CO2Total) + " kg");
}
System.out.println(topologyController.getOptimizer() + ": " + this.actorName + " cost = "
+ String.format("%.03f", costTotal) + " EUR ; CO2: " + String.format("%.03f", CO2Total) + " kg");


}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

public class Connection extends Device {

// for deserialization
public String sourceBuilding;
public String connectedBuilding;
public double q_max;
public double efficiency;
Expand All @@ -18,9 +20,10 @@ public class Connection extends Device {
public double[] linprogConnectionInput;
public double[] linprogConnectionOutput;

public Connection(String connectedBuilding, double pipeLengthInMeter, double lossesPer100m, double q_max) {
super("connection", 0);
public Connection(String sourceBuilding, String connectedBuilding, double pipeLengthInMeter, double lossesPer100m, double q_max) {
super("connection_From" + sourceBuilding + "_To"+connectedBuilding, 0);

this.sourceBuilding = sourceBuilding;
this.connectedBuilding = connectedBuilding;
this.q_max = q_max;
this.operationalPrice = 0.0001;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ public MEMAPCoordination(TopologyController topologyController) {
totalCO2Vector = new double[topologyConfig.getNrOfIterations()];
solutionPerTimeStep = new double[topologyConfig.getNrOfIterations()][];
nStepsMPC = topologyConfig.getNrStepsMPC();
lpSolHandler = new SolutionHandler(nStepsMPC);
milpSolHandler = new SolutionHandler(nStepsMPC);
lpSolHandler = new SolutionHandler(nStepsMPC, topologyConfig);
milpSolHandler = new SolutionHandler(nStepsMPC, topologyConfig);
}

@Override
Expand Down
194 changes: 105 additions & 89 deletions projects/memapCore/src/main/java/memap/controller/GuiController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
Expand All @@ -12,149 +13,164 @@
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import com.google.gson.JsonStreamParser;
import com.google.gson.reflect.TypeToken;

import memap.components.CSVConsumer;
import memap.components.CSVCoupler;
import memap.components.CSVProducer;
import memap.components.CSVStorage;
import memap.components.CSVVolatileProducer;
import memap.components.prototypes.Connection;
import memap.helper.EnergyPrices;
import memap.helper.MEMAPLogging;
import memap.helper.configurationOptions.OptHierarchy;
import memap.helper.configurationOptions.OptimizationCriteria;
import memap.helper.configurationOptions.Optimizer;
import memap.helper.configurationOptions.ToolUsage;
import memap.main.SimulationProgress;
import memap.main.Status;
import memap.main.TopologyConfig;
import memap.messages.extension.NetworkType;

public class GuiController {

private TopologyController topMemapOn;
private TopologyController topMemapOff;
private String pathToConfigJson;
private String topologyFilePath;

public GuiController(String pathToConfigJson) {
this.pathToConfigJson = pathToConfigJson;
public GuiController(String topologyFilePath) {
this.topologyFilePath = topologyFilePath;
}

public void setUp() throws FileNotFoundException {
FileReader reader = new FileReader(pathToConfigJson);
JsonParser jsonParser = new JsonParser();
JsonObject configJson = (JsonObject) jsonParser.parse(reader);

topMemapOn = createTopology(configJson);
topMemapOn.setOptimizationHierarchy(OptHierarchy.MEMAP);

topMemapOff = createTopology(configJson);
topMemapOff.setOptimizationHierarchy(OptHierarchy.BUILDING);
System.out.print("");
topMemapOn = createTopology(OptHierarchy.MEMAP);
topMemapOff = createTopology(OptHierarchy.BUILDING);
}

public void startSimulation() {
System.out.println("====== START GUI SIMULATON =====");

Thread helperThread = new Thread(topMemapOff);
helperThread.start();

//topMemapOff.run();
topMemapOn.run();
}

private TopologyController createTopology(JsonObject json) {
private TopologyController createTopology(OptHierarchy optimizationHierarchy) {

FileReader reader = null;
try {
reader = new FileReader(topologyFilePath);
} catch (FileNotFoundException e) {
SimulationProgress.getInstance().setStatus(Status.ERROR, "Failed to read topology in " + topologyFilePath);
e.printStackTrace();
}

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(TopologyController.class, new TopologyControllerDeserializer());
Gson gson = gsonBuilder.create();
gsonBuilder.registerTypeAdapter(BuildingController.class, new BuildingControllerDeserializer());
Type connectionMapType = new TypeToken<ArrayList<Connection>>() {
}.getType();
gsonBuilder.registerTypeAdapter(Connection.class, new ConnectionTypeAdapter());

TopologyController top = gson.fromJson(json, TopologyController.class);
Gson gson = gsonBuilder.enableComplexMapKeySerialization().create();
JsonStreamParser p = new JsonStreamParser(reader);

return top;
// Buildings
JsonElement topology = p.next();
JsonArray buildings = topology.getAsJsonArray();

}
// Connections
JsonElement connections = p.next();
ArrayList<Connection> connectionList = gson.fromJson(connections, connectionMapType);

// Parameters
JsonElement parameters = p.next();

class TopologyControllerDeserializer implements JsonDeserializer<TopologyController> {
// Create topology
JsonObject jObject = parameters.getAsJsonObject();

@Override
public TopologyController deserialize(JsonElement jsonElement, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
// Configure simulation parameters
TopologyConfig topologyConfig = TopologyConfig.getInstance();

JsonObject jObject = (JsonObject) jsonElement;

// Configure simulation parameters
TopologyConfig topologyConfig = TopologyConfig.getInstance();

boolean isFixedPrice = jObject.get("hasfixedPrice").getAsBoolean();
double fixedPrice = jObject.get("fixedMarketPrice").getAsDouble();
int nrStepsMPC = jObject.get("steps").getAsInt();
int timeStepsPerDay = jObject.get("length").getAsInt();
int nrDays = jObject.get("days").getAsInt();
String variablePriceFile = jObject.get("marketPriceFile").getAsString();

/* jObject.get("steps").getAsInt(), jObject.get("length").getAsInt(), jObject.get("days").getAsInt(),
jObject.get("fixedPrice").getAsBoolean(), jObject.get("fixedMarketPrice").getAsDouble(),
jObject.get("marketPriceFile").getAsString(), 0, 0
*
*/
topologyConfig.init(nrStepsMPC, timeStepsPerDay, nrDays, 0, 0);

// Configure topology
EnergyPrices energyPrices = EnergyPrices.getInstance();
if (isFixedPrice) {
energyPrices.init(fixedPrice);
} else {
energyPrices.init(variablePriceFile);
}
boolean isFixedPrice = jObject.get("hasfixedPrice").getAsBoolean();
double fixedPrice = jObject.get("fixedMarketPrice").getAsDouble();
int nrStepsMPC = jObject.get("steps").getAsInt();
int timeStepsPerDay = jObject.get("length").getAsInt();
int nrDays = jObject.get("days").getAsInt();
String variablePriceFile = jObject.get("marketPriceFile").getAsString();

topologyConfig.init(nrStepsMPC, timeStepsPerDay, nrDays, 0, 0);


// Configure tool parameters
EnergyPrices energyPrices = EnergyPrices.getInstance();
if (isFixedPrice) {
energyPrices.init(fixedPrice);
} else {
energyPrices.init(variablePriceFile);
}

OptHierarchy optHierarchy = (jObject.get("memapON").getAsBoolean() == true) ? OptHierarchy.MEMAP
: OptHierarchy.BUILDING;
Optimizer optimizer = (jObject.get("optimizer").getAsString().contentEquals("lp")) ? Optimizer.LP
: Optimizer.MILP;
OptimizationCriteria optimizationCriteria = (jObject.get("optCriteria").getAsString().contentEquals("cost"))
? OptimizationCriteria.EUR
: OptimizationCriteria.CO2;
Optimizer optimizer = null;
String optimizerType = jObject.get("optimizer").getAsString();

String loggingST = jObject.get("loggingMode").getAsString();
if (optimizerType.equals("lp")) {
if (connectionList.size() > 0) {
optimizer = Optimizer.LPwithConnections;
} else {
optimizer = Optimizer.LP;
}
} else {
if (connectionList.size() > 0) {
optimizer = Optimizer.MILPwithConnections;
} else {
optimizer = Optimizer.MILP;
}
}

MEMAPLogging loggingMode = MEMAPLogging.ALL;
if (loggingST.equals("fileLogs"))
loggingMode = MEMAPLogging.FILES;
if (loggingST.equals("resultLogs"))
loggingMode = MEMAPLogging.RESULTS_ONLY;
OptHierarchy optHierarchy = optimizationHierarchy;
OptimizationCriteria optimizationCriteria = (jObject.get("optCriteria").getAsString().contentEquals("cost"))
? OptimizationCriteria.EUR
: OptimizationCriteria.CO2;

TopologyController top = new TopologyController(jObject.get("simulationName").getAsString(), optHierarchy, optimizer, optimizationCriteria,
ToolUsage.PLANNING, loggingMode);
String loggingST = jObject.get("loggingMode").getAsString();

// Attaching buildings
JsonArray buildingPathList = (JsonArray) jObject.get("descriptorFiles");
MEMAPLogging loggingMode = MEMAPLogging.ALL;
if (loggingST.equals("fileLogs"))
loggingMode = MEMAPLogging.FILES;
if (loggingST.equals("resultLogs"))
loggingMode = MEMAPLogging.RESULTS_ONLY;

for (JsonElement buildingPath : buildingPathList) {
JsonObject buildingPathJ = (JsonObject) buildingPath;
String path = buildingPathJ.get("path").getAsString();
TopologyController top = new TopologyController(jObject.get("simulationName").getAsString(), optHierarchy,
optimizer, optimizationCriteria, ToolUsage.PLANNING, loggingMode);

for (JsonElement json : buildings) {
BuildingController building = gson.fromJson(json, BuildingController.class);
top.attach(building.getName(), building);
}
// Create connections
for (Connection connection : connectionList) {
BuildingController sourceBuilding = top.managedBuildings.get(connection.sourceBuilding);
sourceBuilding.attach(connection);
}

try {
FileReader reader = new FileReader(path);
JsonParser jsonParser = new JsonParser();
JsonObject buildingConfig = (JsonObject) jsonParser.parse(reader);
return top;

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(BuildingController.class, new BuildingControllerDeserializer());
Gson gson = gsonBuilder.create();
}

BuildingController building = gson.fromJson(buildingConfig, BuildingController.class);
top.attach(building);
class ConnectionTypeAdapter implements JsonDeserializer<Connection> {

} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public Connection deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {

return top;
JsonObject obj = json.getAsJsonObject();

String sourceBuilding = obj.get("nameNodeA").getAsString();
String connectedBuilding = obj.get("nameNodeB").getAsString();
double pipeLengthInMeter = obj.get("length").getAsDouble();
double lossesPer100m = obj.get("losses").getAsDouble();

return new Connection(sourceBuilding, connectedBuilding, pipeLengthInMeter, lossesPer100m, 1.0);
}

}

class BuildingControllerDeserializer implements JsonDeserializer<BuildingController> {
Expand Down
Loading

0 comments on commit a3848cb

Please sign in to comment.