diff --git a/pom.xml b/pom.xml
index 4637a09..0901ae4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
edu.mit
spacenet
- 2.5.1459
+ 2.5.1460
spacenet
http://maven.apache.org
@@ -43,6 +43,21 @@
[8.0.16,)
compile
+
+ commons-cli
+ commons-cli
+ 1.5.0
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.17.2
+
+
+ com.google.code.gson
+ gson
+ 2.9.0
+
diff --git a/src/main/java/edu/mit/spacenet/SpaceNet.java b/src/main/java/edu/mit/spacenet/SpaceNet.java
index cd656a1..8b3587e 100644
--- a/src/main/java/edu/mit/spacenet/SpaceNet.java
+++ b/src/main/java/edu/mit/spacenet/SpaceNet.java
@@ -22,14 +22,34 @@
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Rectangle;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Scanner;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+
+import com.google.gson.Gson;
+
import edu.mit.spacenet.gui.SpaceNetFrame;
import edu.mit.spacenet.gui.SpaceNetSettings;
import edu.mit.spacenet.gui.SplashScreen;
+import edu.mit.spacenet.io.XStreamEngine;
+import edu.mit.spacenet.io.gson.AggregatedDemandsAnalysis;
+import edu.mit.spacenet.io.gson.RawDemandsAnalysis;
+import edu.mit.spacenet.scenario.Scenario;
+import edu.mit.spacenet.simulator.DemandSimulator;
/**
* This class is used to launch the SpaceNet application.
@@ -37,6 +57,16 @@
* @author Paul Grogan
*/
public class SpaceNet {
+ public static enum HeadlessMode {
+ DEMANDS_RAW("demands-raw"),
+ DEMANDS_AGGREGATED("demands-agg");
+
+ public final String label;
+
+ private HeadlessMode(String label) {
+ this.label = label;
+ }
+ }
/**
* Launches the SpaceNet application.
@@ -44,6 +74,131 @@ public class SpaceNet {
* @param args the args
*/
public static void main(String[] args) {
+ Options options = new Options();
+ Option headless = Option.builder("h")
+ .longOpt("headless")
+ .argName("mode")
+ .hasArg()
+ .desc("Headless execution mode. Alternatives: demand (demand simulator).")
+ .build();
+ options.addOption(headless);
+ Option input = Option.builder("i")
+ .longOpt("input")
+ .argName("file path")
+ .hasArg()
+ .desc("Input file path.")
+ .build();
+ options.addOption(input);
+ Option output = Option.builder("o")
+ .longOpt("output")
+ .argName("file path")
+ .hasArg()
+ .desc("Output file path.")
+ .build();
+ options.addOption(output);
+ Option confirm = Option.builder("y")
+ .longOpt("yes")
+ .hasArg(false)
+ .desc("Confirm overwrite output.")
+ .build();
+ options.addOption(confirm);
+
+ CommandLineParser parser = new DefaultParser();
+ HelpFormatter helper = new HelpFormatter();
+
+ try {
+ CommandLine line = parser.parse(options, args);
+ if(line.hasOption(headless)) {
+ String mode = line.getOptionValue(headless);
+
+ if(mode.equalsIgnoreCase(HeadlessMode.DEMANDS_RAW.label) || mode.equalsIgnoreCase(HeadlessMode.DEMANDS_AGGREGATED.label)) {
+ String scenarioFilePath = null;
+ if(line.hasOption(input)) {
+ scenarioFilePath = new File(line.getOptionValue(input)).getAbsolutePath();
+ } else {
+ System.err.println("Missing scenario file path.");
+ helper.printHelp("Usage:", options);
+ System.exit(0);
+ }
+ String outputFilePath = null;
+ if(line.hasOption(output)) {
+ outputFilePath = new File(line.getOptionValue(output)).getAbsolutePath();
+ } else {
+ System.err.println("Missing output file path.");
+ helper.printHelp("Usage:", options);
+ System.exit(0);
+ }
+
+ runDemandSimulator(scenarioFilePath, outputFilePath, line.hasOption(confirm), mode.equalsIgnoreCase(HeadlessMode.DEMANDS_RAW.label));
+ } else {
+ System.err.println("Unknown headless mode: " + mode);
+ System.exit(0);
+ }
+
+ } else {
+ String scenarioFilePath = null;
+ if(line.hasOption(input)) {
+ scenarioFilePath = new File(line.getOptionValue(input)).getAbsolutePath();
+ }
+ startGUI(scenarioFilePath);
+ }
+ } catch(ParseException ex) {
+ System.err.println("Parsing failed: " + ex.getMessage());
+ helper.printHelp("Usage:", options);
+ System.exit(0);
+ }
+ }
+
+ private static void runDemandSimulator(String scenarioFilePath, String outputFilePath, boolean isOverwriteConfirmed, boolean isRawDemands) {
+ Scenario scenario = null;
+ try {
+ scenario = XStreamEngine.openScenario(scenarioFilePath);
+ scenario.setFilePath(scenarioFilePath);
+ } catch(IOException ex) {
+ System.err.println("Failed to read scenario file: " + ex.getMessage());
+ System.exit(1);
+ }
+
+ DemandSimulator simulator = new DemandSimulator(scenario);
+ simulator.setDemandsSatisfied(false);
+ simulator.simulate();
+
+ File file = new File(outputFilePath);
+ if(file.exists() && !isOverwriteConfirmed) {
+ Scanner in = new Scanner(System.in);
+ String lastInput = "";
+ do {
+ System.out.println("Confirm to overwrite existing file " + outputFilePath + " (yes/no)");
+ lastInput = in.nextLine();
+ if(lastInput.equalsIgnoreCase("no") || lastInput.equalsIgnoreCase("n")) {
+ in.close();
+ return;
+ }
+ } while(!(lastInput.equalsIgnoreCase("yes") || lastInput.equalsIgnoreCase("y")));
+ in.close();
+ }
+
+ try {
+ BufferedWriter out = new BufferedWriter(new FileWriter(outputFilePath));
+ if(isRawDemands) {
+ new Gson().toJson(
+ RawDemandsAnalysis.createFrom(simulator),
+ out
+ );
+ } else {
+ new Gson().toJson(
+ AggregatedDemandsAnalysis.createFrom(simulator),
+ out
+ );
+ }
+ out.close();
+ } catch(IOException ex) {
+ System.err.println("Failed to output file: " + ex.getMessage());
+ System.exit(1);
+ }
+ }
+
+ private static void startGUI(String scenarioFilePath) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
@@ -88,6 +243,9 @@ protected Void doInBackground() {
SpaceNetFrame.getInstance().setBounds(virtualBounds.intersection(SpaceNetSettings.getInstance().getLastBounds()));
}
SpaceNetFrame.getInstance().setVisible(true);
+ if(scenarioFilePath != null) {
+ SpaceNetFrame.getInstance().openScenario(scenarioFilePath);
+ }
} catch(Exception ex) {
// display error message if one occurs... since this
// is inside a worker thread, the stack trace will
diff --git a/src/main/java/edu/mit/spacenet/gui/demand/DemandsTab.java b/src/main/java/edu/mit/spacenet/gui/demand/DemandsTab.java
index a325ad9..d0ee900 100644
--- a/src/main/java/edu/mit/spacenet/gui/demand/DemandsTab.java
+++ b/src/main/java/edu/mit/spacenet/gui/demand/DemandsTab.java
@@ -58,7 +58,7 @@
import edu.mit.spacenet.scenario.ItemDiscretization;
import edu.mit.spacenet.scenario.Scenario;
import edu.mit.spacenet.scenario.SupplyEdge;
-import edu.mit.spacenet.scenario.SupplyEdge.SupplyPoint;
+import edu.mit.spacenet.scenario.SupplyPoint;
import edu.mit.spacenet.simulator.DemandSimulator;
import edu.mit.spacenet.simulator.SimDemand;
@@ -615,10 +615,10 @@ private void writeFile() {
out.write(delimiter);
out.write("" + demand.getAmount());
} else if(referenceCombo.getSelectedItem()==NAME_OUTPUT) {
- out.write(supplyPoint.getNode().getName());
+ out.write("" + supplyPoint.getTime());
out.write(delimiter);
out.write(delimiter);
- out.write("" + supplyPoint.getTime());
+ out.write(supplyPoint.getNode().getName());
out.write(delimiter);
out.write(delimiter);
out.write(demand.getResource().getName());
diff --git a/src/main/java/edu/mit/spacenet/gui/demand/ScenarioFeasibilityTab.java b/src/main/java/edu/mit/spacenet/gui/demand/ScenarioFeasibilityTab.java
index 72a8249..f0a9a53 100644
--- a/src/main/java/edu/mit/spacenet/gui/demand/ScenarioFeasibilityTab.java
+++ b/src/main/java/edu/mit/spacenet/gui/demand/ScenarioFeasibilityTab.java
@@ -507,8 +507,8 @@ private JFreeChart buildTimeSeriesChart() {
estimatedDemands += demandsTab.getSimulator().getAggregatedNodeDemands().get(edge.getPoint()).getTotalMass();
if(optionsPanel.supplyEdgesModel.getSelectedObjects().contains(edge)) {
- rawCapacity += edge.getRawCapacity();
- remainingCapacity += edge.getCapacity();
+ rawCapacity += edge.getMaxCargoMass();
+ remainingCapacity += edge.getNetCargoMass();
if(optionsPanel.dataModel.getSelectedObjects().contains(ESTIMATED_DEMANDS))
estimatedDemandsSeries.addOrUpdate(hour, estimatedDemands);
@@ -552,8 +552,8 @@ private JFreeChart buildLineChart() {
estimatedDemands += demandsTab.getSimulator().getAggregatedNodeDemands().get(edge.getPoint()).getTotalMass();
if(optionsPanel.supplyEdgesModel.getSelectedObjects().contains(edge)) {
- rawCapacity += edge.getRawCapacity();
- remainingCapacity += edge.getCapacity();
+ rawCapacity += edge.getMaxCargoMass();
+ remainingCapacity += edge.getNetCargoMass();
if(optionsPanel.dataModel.getSelectedObjects().contains(ESTIMATED_DEMANDS)) {
dataset.addValue(estimatedDemands, ESTIMATED_DEMANDS, edge);
@@ -612,12 +612,12 @@ private JFreeChart buildBarChart() {
}
if(optionsPanel.dataModel.getSelectedObjects().contains(RAW_CAPACITY)
&& optionsPanel.supplyEdgesModel.getSelectedObjects().contains(edge)) {
- dataset.addValue(edge.getRawCapacity(), RAW_CAPACITY, edge);
+ dataset.addValue(edge.getMaxCargoMass(), RAW_CAPACITY, edge);
r.setSeriesPaint(dataset.getRowCount() - 1, Color.BLUE);
}
if(optionsPanel.dataModel.getSelectedObjects().contains(REMAINING_CAPACITY)
&& optionsPanel.supplyEdgesModel.getSelectedObjects().contains(edge)) {
- dataset.addValue(edge.getCapacity(), REMAINING_CAPACITY, edge);
+ dataset.addValue(edge.getNetCargoMass(), REMAINING_CAPACITY, edge);
r.setSeriesPaint(dataset.getRowCount() - 1, Color.GREEN);
}
}
diff --git a/src/main/java/edu/mit/spacenet/gui/demand/SupplyNetworkTab.java b/src/main/java/edu/mit/spacenet/gui/demand/SupplyNetworkTab.java
index 165b641..7943b00 100644
--- a/src/main/java/edu/mit/spacenet/gui/demand/SupplyNetworkTab.java
+++ b/src/main/java/edu/mit/spacenet/gui/demand/SupplyNetworkTab.java
@@ -70,7 +70,7 @@
import edu.mit.spacenet.gui.renderer.VisibilityTableCellHeaderRenderer;
import edu.mit.spacenet.scenario.Scenario;
import edu.mit.spacenet.scenario.SupplyEdge;
-import edu.mit.spacenet.scenario.SupplyEdge.SupplyPoint;
+import edu.mit.spacenet.scenario.SupplyPoint;
import edu.mit.spacenet.util.DateFunctions;
/**
@@ -503,11 +503,11 @@ private double getCapacity(SupplyEdge edge) {
capacity += carrier.getMaxCargoMass();
}
} else if(optionsPanel.transportDisplayCombo.getSelectedItem()==REMAINING_CAPACITY)
- capacity = edge.getCapacity();
+ capacity = edge.getNetCargoMass();
else if(optionsPanel.transportDisplayCombo.getSelectedItem()==DEMANDS)
capacity = -demandsTab.getSimulator().getAggregatedEdgeDemands().get(edge).getTotalMass();
else
- capacity = edge.getCapacity() - demandsTab.getSimulator().getAggregatedEdgeDemands().get(edge).getTotalMass();
+ capacity = edge.getNetCargoMass() - demandsTab.getSimulator().getAggregatedEdgeDemands().get(edge).getTotalMass();
return capacity;
}
diff --git a/src/main/java/edu/mit/spacenet/gui/manifest/AggregatedDemandsTable.java b/src/main/java/edu/mit/spacenet/gui/manifest/AggregatedDemandsTable.java
index f0f7eda..34a5cc1 100644
--- a/src/main/java/edu/mit/spacenet/gui/manifest/AggregatedDemandsTable.java
+++ b/src/main/java/edu/mit/spacenet/gui/manifest/AggregatedDemandsTable.java
@@ -29,7 +29,7 @@
import edu.mit.spacenet.domain.resource.Demand;
import edu.mit.spacenet.domain.resource.DemandSet;
import edu.mit.spacenet.scenario.Manifest;
-import edu.mit.spacenet.scenario.SupplyEdge.SupplyPoint;
+import edu.mit.spacenet.scenario.SupplyPoint;
/**
* A table for visualizing aggregated demands, and the portion of each demand
diff --git a/src/main/java/edu/mit/spacenet/gui/manifest/ContainerContentsTable.java b/src/main/java/edu/mit/spacenet/gui/manifest/ContainerContentsTable.java
index 95e3865..100b2cd 100644
--- a/src/main/java/edu/mit/spacenet/gui/manifest/ContainerContentsTable.java
+++ b/src/main/java/edu/mit/spacenet/gui/manifest/ContainerContentsTable.java
@@ -29,7 +29,7 @@
import edu.mit.spacenet.domain.element.I_ResourceContainer;
import edu.mit.spacenet.domain.resource.Demand;
import edu.mit.spacenet.scenario.Manifest;
-import edu.mit.spacenet.scenario.SupplyEdge.SupplyPoint;
+import edu.mit.spacenet.scenario.SupplyPoint;
/**
* A table for viewing the packed contents of a container.
diff --git a/src/main/java/edu/mit/spacenet/gui/manifest/ManifestTab.java b/src/main/java/edu/mit/spacenet/gui/manifest/ManifestTab.java
index 7ab7e28..1281bb3 100644
--- a/src/main/java/edu/mit/spacenet/gui/manifest/ManifestTab.java
+++ b/src/main/java/edu/mit/spacenet/gui/manifest/ManifestTab.java
@@ -56,7 +56,7 @@
import edu.mit.spacenet.scenario.Manifest;
import edu.mit.spacenet.scenario.Scenario;
import edu.mit.spacenet.scenario.SupplyEdge;
-import edu.mit.spacenet.scenario.SupplyEdge.SupplyPoint;
+import edu.mit.spacenet.scenario.SupplyPoint;
import edu.mit.spacenet.simulator.DemandSimulator;
import edu.mit.spacenet.util.GlobalParameters;
diff --git a/src/main/java/edu/mit/spacenet/gui/manifest/PackedDemandsTable.java b/src/main/java/edu/mit/spacenet/gui/manifest/PackedDemandsTable.java
index cf1e69e..09133d3 100644
--- a/src/main/java/edu/mit/spacenet/gui/manifest/PackedDemandsTable.java
+++ b/src/main/java/edu/mit/spacenet/gui/manifest/PackedDemandsTable.java
@@ -34,7 +34,7 @@
import edu.mit.spacenet.gui.renderer.ElementTableCellRenderer;
import edu.mit.spacenet.scenario.Manifest;
import edu.mit.spacenet.scenario.SupplyEdge;
-import edu.mit.spacenet.scenario.SupplyEdge.SupplyPoint;
+import edu.mit.spacenet.scenario.SupplyPoint;
/**
* The table used to view the available resource containers for demand packing.
diff --git a/src/main/java/edu/mit/spacenet/io/XStreamEngine.java b/src/main/java/edu/mit/spacenet/io/XStreamEngine.java
index 221b431..f29f5c4 100644
--- a/src/main/java/edu/mit/spacenet/io/XStreamEngine.java
+++ b/src/main/java/edu/mit/spacenet/io/XStreamEngine.java
@@ -51,16 +51,7 @@
*/
public class XStreamEngine {
- /**
- * Serializes and saves a scenario.
- *
- * @param scenario the scenario to save
- *
- * @throws FileNotFoundException the file not found exception
- * @throws IOException the i/o exception
- */
- public static void saveScenario(Scenario scenario)
- throws FileNotFoundException, IOException {
+ public static XStream getXStream() {
XStream xs = new XStream();
xs.addPermission(NoTypePermission.NONE);
xs.addPermission(NullPermission.NULL);
@@ -85,6 +76,34 @@ public static void saveScenario(Scenario scenario)
xs.alias("surfaceEdge", SurfaceEdge.class);
xs.alias("flightEdge", FlightEdge.class);
xs.alias("burn", Burn.class);
+ xs.alias("edu.mit.spacenet.domain.demand.Demand", Demand.class);
+ xs.alias("edu.mit.spacenet.domain.demand.DemandSet", DemandSet.class);
+ xs.alias("edu.mit.spacenet.domain.demand.model.SparingByMassDemandModel", SparingByMassDemandModel.class);
+ xs.alias("edu.mit.spacenet.domain.demand.model.RatedDemandModel", RatedDemandModel.class);
+ xs.alias("edu.mit.spacenet.domain.demand.model.TimedImpulseDemandModel", TimedImpulseDemandModel.class);
+ xs.alias("edu.mit.spacenet.domain.demand.State", State.class);
+ xs.alias("edu.mit.spacenet.domain.demand.PartApplication", PartApplication.class);
+ xs.alias("edu.mit.spacenet.scenario.data.Spreadsheet_2_5", Spreadsheet_2_5.class);
+ xs.alias("edu.mit.spacenet.scenario.data.DataSourceType", DataSourceType.class);
+ xs.alias("edu.mit.spacenet.scenario.data.ElementPreview", ElementPreview.class);
+
+ // skip loading manifest (breaking changes in data structure)
+ xs.omitField(Scenario.class, "manifest");
+
+ return xs;
+ }
+
+ /**
+ * Serializes and saves a scenario.
+ *
+ * @param scenario the scenario to save
+ *
+ * @throws FileNotFoundException the file not found exception
+ * @throws IOException the i/o exception
+ */
+ public static void saveScenario(Scenario scenario)
+ throws FileNotFoundException, IOException {
+ XStream xs = getXStream();
FileOutputStream fos = new FileOutputStream(scenario.getFilePath());
xs.toXML(scenario, fos);
@@ -103,33 +122,7 @@ public static void saveScenario(Scenario scenario)
*/
public static Scenario openScenario(String filePath)
throws FileNotFoundException, IOException {
- XStream xs = new XStream();
- xs.addPermission(NoTypePermission.NONE);
- xs.addPermission(NullPermission.NULL);
- xs.addPermission(PrimitiveTypePermission.PRIMITIVES);
- xs.allowTypesByWildcard(new String[] {
- "edu.mit.spacenet.**",
- "java.util.*"
- });
- xs.alias("scenario", Scenario.class);
- xs.alias("excel", Spreadsheet_2_5.class);
- xs.alias("surfaceNode", SurfaceNode.class);
- xs.alias("orbitalNode", OrbitalNode.class);
- xs.alias("lagrangeNode", LagrangeNode.class);
- xs.alias("spaceEdge", SpaceEdge.class);
- xs.alias("surfaceEdge", SurfaceEdge.class);
- xs.alias("flightEdge", FlightEdge.class);
- xs.alias("burn", Burn.class);
- xs.alias("edu.mit.spacenet.domain.demand.Demand", Demand.class);
- xs.alias("edu.mit.spacenet.domain.demand.DemandSet", DemandSet.class);
- xs.alias("edu.mit.spacenet.domain.demand.model.SparingByMassDemandModel", SparingByMassDemandModel.class);
- xs.alias("edu.mit.spacenet.domain.demand.model.RatedDemandModel", RatedDemandModel.class);
- xs.alias("edu.mit.spacenet.domain.demand.model.TimedImpulseDemandModel", TimedImpulseDemandModel.class);
- xs.alias("edu.mit.spacenet.domain.demand.State", State.class);
- xs.alias("edu.mit.spacenet.domain.demand.PartApplication", PartApplication.class);
- xs.alias("edu.mit.spacenet.scenario.data.Spreadsheet_2_5", Spreadsheet_2_5.class);
- xs.alias("edu.mit.spacenet.scenario.data.DataSourceType", DataSourceType.class);
- xs.alias("edu.mit.spacenet.scenario.data.ElementPreview", ElementPreview.class);
+ XStream xs = getXStream();
Scenario scenario = new Scenario();
FileInputStream fis = new FileInputStream(filePath);
diff --git a/src/main/java/edu/mit/spacenet/io/gson/AggregatedDemandsAnalysis.java b/src/main/java/edu/mit/spacenet/io/gson/AggregatedDemandsAnalysis.java
new file mode 100644
index 0000000..ea5d5be
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/AggregatedDemandsAnalysis.java
@@ -0,0 +1,16 @@
+package edu.mit.spacenet.io.gson;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AggregatedDemandsAnalysis {
+ public List nodes = new ArrayList();
+ public List edges = new ArrayList();
+
+ public static AggregatedDemandsAnalysis createFrom(edu.mit.spacenet.simulator.DemandSimulator sim) {
+ AggregatedDemandsAnalysis o = new AggregatedDemandsAnalysis();
+ o.nodes = NodeDemand.createFrom(sim.getAggregatedNodeDemands());
+ o.edges = EdgeDemand.createFrom(sim.getAggregatedEdgeDemands());
+ return o;
+ }
+}
diff --git a/src/main/java/edu/mit/spacenet/io/gson/Demand.java b/src/main/java/edu/mit/spacenet/io/gson/Demand.java
new file mode 100644
index 0000000..81f4262
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/Demand.java
@@ -0,0 +1,28 @@
+package edu.mit.spacenet.io.gson;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Demand {
+ public Resource resource;
+ public double amount;
+ public double mass;
+ public double volume;
+
+ public static Demand createFrom(edu.mit.spacenet.domain.resource.Demand demand) {
+ Demand d = new Demand();
+ d.resource = Resource.createFrom(demand.getResource());
+ d.amount = demand.getAmount();
+ d.mass = demand.getMass();
+ d.volume = demand.getVolume();
+ return d;
+ }
+
+ public static List createFrom(edu.mit.spacenet.domain.resource.DemandSet demands) {
+ List ds = new ArrayList();
+ for(edu.mit.spacenet.domain.resource.Demand d : demands) {
+ ds.add(Demand.createFrom(d));
+ }
+ return ds;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/mit/spacenet/io/gson/EdgeDemand.java b/src/main/java/edu/mit/spacenet/io/gson/EdgeDemand.java
new file mode 100644
index 0000000..71fe446
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/EdgeDemand.java
@@ -0,0 +1,41 @@
+package edu.mit.spacenet.io.gson;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class EdgeDemand {
+ public double startTime;
+ public double endTime;
+ public Location origin;
+ public Location destination;
+ public Location location;
+ public List demands = new ArrayList();
+ public double totalMass;
+ public double totalVolume;
+ public double maxCargoMass;
+ public double netCargoMass;
+ public double maxCargoVolume;
+ public double netCargoVolume;
+
+ public static List createFrom(Map demands) {
+ List ds = new ArrayList();
+ for(edu.mit.spacenet.scenario.SupplyEdge edge : demands.keySet()) {
+ EdgeDemand d = new EdgeDemand();
+ d.startTime = edge.getStartTime();
+ d.endTime = edge.getEndTime();
+ d.origin = Location.createFrom(edge.getEdge().getOrigin());
+ d.destination = Location.createFrom(edge.getEdge().getDestination());
+ d.location = Location.createFrom(edge.getEdge());
+ d.demands = Demand.createFrom(demands.get(edge));
+ d.totalMass = demands.get(edge).getTotalMass();
+ d.totalVolume = demands.get(edge).getTotalVolume();
+ d.maxCargoMass = edge.getMaxCargoMass();
+ d.netCargoMass = edge.getNetCargoMass();
+ d.maxCargoVolume = edge.getMaxCargoVolume();
+ d.netCargoVolume = edge.getNetCargoVolume();
+ ds.add(d);
+ }
+ return ds;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/mit/spacenet/io/gson/Element.java b/src/main/java/edu/mit/spacenet/io/gson/Element.java
new file mode 100644
index 0000000..17506b7
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/Element.java
@@ -0,0 +1,16 @@
+package edu.mit.spacenet.io.gson;
+
+public class Element {
+ public int id;
+ public String name;
+
+ public static Element createFrom(edu.mit.spacenet.domain.element.I_Element element) {
+ if(element == null) {
+ return null; // from mission-level demand model
+ }
+ Element e = new Element();
+ e.id = element.getUid();
+ e.name = element.getName();
+ return e;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/mit/spacenet/io/gson/Location.java b/src/main/java/edu/mit/spacenet/io/gson/Location.java
new file mode 100644
index 0000000..83e66e8
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/Location.java
@@ -0,0 +1,13 @@
+package edu.mit.spacenet.io.gson;
+
+public class Location {
+ public int id;
+ public String name;
+
+ public static Location createFrom(edu.mit.spacenet.domain.network.Location location) {
+ Location l = new Location();
+ l.id = location.getTid();
+ l.name = location.getName();
+ return l;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/mit/spacenet/io/gson/NodeDemand.java b/src/main/java/edu/mit/spacenet/io/gson/NodeDemand.java
new file mode 100644
index 0000000..c8c8adf
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/NodeDemand.java
@@ -0,0 +1,27 @@
+package edu.mit.spacenet.io.gson;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class NodeDemand {
+ public double time;
+ public Location location;
+ public List demands = new ArrayList();
+ public double totalMass;
+ public double totalVolume;
+
+ public static List createFrom(Map demands) {
+ List ds = new ArrayList();
+ for(edu.mit.spacenet.scenario.SupplyPoint point : demands.keySet()) {
+ NodeDemand d = new NodeDemand();
+ d.time = point.getTime();
+ d.location = Location.createFrom(point.getNode());
+ d.demands = Demand.createFrom(demands.get(point));
+ d.totalMass = demands.get(point).getTotalMass();
+ d.totalVolume = demands.get(point).getTotalVolume();
+ ds.add(d);
+ }
+ return ds;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/mit/spacenet/io/gson/RawDemand.java b/src/main/java/edu/mit/spacenet/io/gson/RawDemand.java
new file mode 100644
index 0000000..3ae12c1
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/RawDemand.java
@@ -0,0 +1,32 @@
+package edu.mit.spacenet.io.gson;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RawDemand {
+ public double time;
+ public Location location;
+ public Element element;
+ public List demands = new ArrayList();
+ public double totalMass;
+ public double totalVolume;
+
+ public static RawDemand createFrom(edu.mit.spacenet.simulator.SimDemand demands) {
+ RawDemand d = new RawDemand();
+ d.time = demands.getTime();
+ d.location = Location.createFrom(demands.getLocation());
+ d.element = Element.createFrom(demands.getElement());
+ d.demands = Demand.createFrom(demands.getDemands());
+ d.totalMass = demands.getDemands().getTotalMass();
+ d.totalVolume = demands.getDemands().getTotalVolume();
+ return d;
+ }
+
+ public static List createFrom(List demandList) {
+ List ds = new ArrayList();
+ for(edu.mit.spacenet.simulator.SimDemand demands : demandList) {
+ ds.add(RawDemand.createFrom(demands));
+ }
+ return ds;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/mit/spacenet/io/gson/RawDemandsAnalysis.java b/src/main/java/edu/mit/spacenet/io/gson/RawDemandsAnalysis.java
new file mode 100644
index 0000000..1080797
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/RawDemandsAnalysis.java
@@ -0,0 +1,14 @@
+package edu.mit.spacenet.io.gson;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RawDemandsAnalysis {
+ public List demands = new ArrayList();
+
+ public static RawDemandsAnalysis createFrom(edu.mit.spacenet.simulator.DemandSimulator sim) {
+ RawDemandsAnalysis o = new RawDemandsAnalysis();
+ o.demands = RawDemand.createFrom(sim.getUnsatisfiedDemands());
+ return o;
+ }
+}
diff --git a/src/main/java/edu/mit/spacenet/io/gson/Resource.java b/src/main/java/edu/mit/spacenet/io/gson/Resource.java
new file mode 100644
index 0000000..d97bd65
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/io/gson/Resource.java
@@ -0,0 +1,17 @@
+package edu.mit.spacenet.io.gson;
+
+public class Resource {
+ public int classOfSupply;
+ public String name;
+ public double unitMass;
+ public double unitVolume;
+
+ public static Resource createFrom(edu.mit.spacenet.domain.resource.I_Resource resource) {
+ Resource r = new Resource();
+ r.classOfSupply = resource.getClassOfSupply().getId();
+ r.name = resource.getName();
+ r.unitMass = resource.getUnitMass();
+ r.unitVolume = resource.getUnitVolume();
+ return r;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/mit/spacenet/scenario/Manifest.java b/src/main/java/edu/mit/spacenet/scenario/Manifest.java
index 63a844b..ca3d764 100644
--- a/src/main/java/edu/mit/spacenet/scenario/Manifest.java
+++ b/src/main/java/edu/mit/spacenet/scenario/Manifest.java
@@ -34,7 +34,6 @@
import edu.mit.spacenet.domain.network.node.SurfaceNode;
import edu.mit.spacenet.domain.resource.Demand;
import edu.mit.spacenet.domain.resource.DemandSet;
-import edu.mit.spacenet.scenario.SupplyEdge.SupplyPoint;
import edu.mit.spacenet.simulator.DemandSimulator;
import edu.mit.spacenet.simulator.event.ManifestEvent;
import edu.mit.spacenet.util.GlobalParameters;
diff --git a/src/main/java/edu/mit/spacenet/scenario/SupplyEdge.java b/src/main/java/edu/mit/spacenet/scenario/SupplyEdge.java
index 5b8a67c..ddddeb2 100644
--- a/src/main/java/edu/mit/spacenet/scenario/SupplyEdge.java
+++ b/src/main/java/edu/mit/spacenet/scenario/SupplyEdge.java
@@ -128,7 +128,7 @@ public double getEndTime() {
*
* @return the capacity (kilograms)
*/
- public double getCapacity() {
+ public double getNetCargoMass() {
double capacity = 0;
for(I_Carrier carrier : getCarriers()) {
capacity += carrier.getMaxCargoMass()-carrier.getCargoMass();
@@ -142,7 +142,7 @@ public double getCapacity() {
*
* @return the raw capacity (kilograms)
*/
- public double getRawCapacity() {
+ public double getMaxCargoMass() {
double capacity = 0;
for(I_Carrier carrier : getCarriers()) {
capacity += carrier.getMaxCargoMass();
@@ -150,6 +150,34 @@ public double getRawCapacity() {
return capacity;
}
+ /**
+ * Gets the capacity of the supply edge, measured by the excess cargo volume
+ * capacity of the carriers.
+ *
+ * @return the capacity (cubic meters)
+ */
+ public double getNetCargoVolume() {
+ double capacity = 0;
+ for(I_Carrier carrier : getCarriers()) {
+ capacity += carrier.getMaxCargoVolume()-carrier.getCargoVolume();
+ }
+ return capacity;
+ }
+
+ /**
+ * Gets the raw capacity of the supply edge, measured by the maximum cargo
+ * volume capacity of the carriers.
+ *
+ * @return the raw capacity (cubic meters)
+ */
+ public double getMaxCargoVolume() {
+ double capacity = 0;
+ for(I_Carrier carrier : getCarriers()) {
+ capacity += carrier.getMaxCargoVolume();
+ }
+ return capacity;
+ }
+
/**
* Gets the supply point being supplied by the supply edge.
*
@@ -181,6 +209,7 @@ public Set getAllCarriers() {
}
return allCarriers;
}
+
private void recursiveAddCarrier(Set allCarriers, I_Carrier carrier) {
allCarriers.add(carrier);
for(I_Element element : carrier.getContents()) {
@@ -189,62 +218,4 @@ private void recursiveAddCarrier(Set allCarriers, I_Carrier carrier)
}
}
}
-
- /**
- * A supply point is the point in time and space that is supplied by a
- * supply edge.
- *
- * @author Paul Grogan
- */
- public class SupplyPoint implements Comparable {
- private SupplyEdge edge;
-
- private SupplyPoint(SupplyEdge edge) {
- this.edge = edge;
- }
-
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
- public String toString() {
- DecimalFormat format = new DecimalFormat("0.0");
- return getNode() + " (" + format.format(getTime()) + ")";
- }
-
- /* (non-Javadoc)
- * @see java.lang.Comparable#compareTo(java.lang.Object)
- */
- public int compareTo(SupplyPoint point) {
- if(getTime()==point.getTime())
- return getNode().compareTo(point.getNode());
- return new Double(getTime()).compareTo(point.getTime())*-1;
- }
-
- /**
- * Gets the network node.
- *
- * @return the node
- */
- public Node getNode() {
- return edge.getDestination();
- }
-
- /**
- * Gets the simulation time of the supply point.
- *
- * @return the time
- */
- public double getTime() {
- return edge.getEndTime();
- }
-
- /**
- * Gets the associated supply edge.
- *
- * @return the supply edge
- */
- public SupplyEdge getEdge() {
- return edge;
- }
- }
}
diff --git a/src/main/java/edu/mit/spacenet/scenario/SupplyPoint.java b/src/main/java/edu/mit/spacenet/scenario/SupplyPoint.java
new file mode 100644
index 0000000..8d5fb16
--- /dev/null
+++ b/src/main/java/edu/mit/spacenet/scenario/SupplyPoint.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2010 MIT Strategic Engineering Research Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package edu.mit.spacenet.scenario;
+
+import java.text.DecimalFormat;
+
+import edu.mit.spacenet.domain.network.node.Node;
+
+/**
+ * A supply point is the point in time and space that is supplied by a
+ * supply edge.
+ *
+ * @author Paul Grogan
+ */
+public class SupplyPoint implements Comparable {
+ private SupplyEdge edge;
+
+ public SupplyPoint(SupplyEdge edge) {
+ this.edge = edge;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ DecimalFormat format = new DecimalFormat("0.0");
+ return getNode() + " (" + format.format(getTime()) + ")";
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(SupplyPoint point) {
+ if(getTime()==point.getTime())
+ return getNode().compareTo(point.getNode());
+ return new Double(getTime()).compareTo(point.getTime())*-1;
+ }
+
+ /**
+ * Gets the network node.
+ *
+ * @return the node
+ */
+ public Node getNode() {
+ return edge.getDestination();
+ }
+
+ /**
+ * Gets the simulation time of the supply point.
+ *
+ * @return the time
+ */
+ public double getTime() {
+ return edge.getEndTime();
+ }
+
+ /**
+ * Gets the associated supply edge.
+ *
+ * @return the supply edge
+ */
+ public SupplyEdge getEdge() {
+ return edge;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/edu/mit/spacenet/simulator/DemandSimulator.java b/src/main/java/edu/mit/spacenet/simulator/DemandSimulator.java
index 4fdd938..b26530b 100644
--- a/src/main/java/edu/mit/spacenet/simulator/DemandSimulator.java
+++ b/src/main/java/edu/mit/spacenet/simulator/DemandSimulator.java
@@ -40,7 +40,7 @@
import edu.mit.spacenet.scenario.RepairItem;
import edu.mit.spacenet.scenario.Scenario;
import edu.mit.spacenet.scenario.SupplyEdge;
-import edu.mit.spacenet.scenario.SupplyEdge.SupplyPoint;
+import edu.mit.spacenet.scenario.SupplyPoint;
import edu.mit.spacenet.simulator.event.I_Transport;
import edu.mit.spacenet.simulator.event.SurfaceTransport;
import edu.mit.spacenet.util.DateFunctions;