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;