diff --git a/CHANGELOG.md b/CHANGELOG.md index 043fdea7943301af9cd5a414a220d043f1449ba8..da5593974850361203321e9ae8cc45acb015ba4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ sub-command. This will will turn the ScenarioChecker on or off for the command line. If the Checker detects an error the simulation will not be executed. +- `OutputFile`: Distinguish between indices (rows) and headers (columns), in code and with a new checkbox that when enables allow to write meta-data into output files. Furthermore, resolve naming conflicts (if they occur) in headers of output files (see #201). + ### Changed - Removed directory `Documentation/version-control` which contained the Git hooks. The Git hooks are not required anymore. Instead, added `git rev-parse HEAD` to file `VadereSimulator/pom.xml` to create `VadereSimulator/resources/current_commit_hash.txt` during each build via `mvn compile`. diff --git a/VadereGui/resources/messages.properties b/VadereGui/resources/messages.properties index 1196cdb7520ff5b2cdfaf2103ca55b0d1e9fd71a..b0e28edb2cbddbe925b38b842fae8a39f1a8d207 100644 --- a/VadereGui/resources/messages.properties +++ b/VadereGui/resources/messages.properties @@ -40,6 +40,7 @@ NewTestError.title=Error DataProcessingView.msgInvalidJson=Invalid json DataProcessingView.msgShowError=Show error message DataProcessingView.chbAddTimeStamp=Add timestamp to output folder +DataProcessingView.chbAddMetaData=Add meta data to output files DataProcessingView.btnAdd=Add DataProcessingView.btnDelete=Delete DataProcessingView.msgFileSelected=No output file selected. @@ -51,7 +52,7 @@ DataProcessingView.msgFileEmpty=File name can't be empty DataProcessingView.msgFileInUse=File name is already in use DataProcessingView.dialogInvalidFile.label=Invalid file name DataProcessingView.dialogOutputDataKeySelection.label=Data Key -DataProcessingView.dialogOutputHeaderSelection.label=Header +DataProcessingView.dialogOutputIndicesSelection.label=Index ProgressPanelDone.text=Done ProgressPanelWorking.text=Working... @@ -326,7 +327,7 @@ Tab.Model.insertModelNameSubMenu.title=Main models Tab.Pedestrians.title=Pedestrians Tab.Topography.title=Topography Tab.Event.title=Events -Tab.OutputProcessors.title=Data processing GUI +Tab.OutputProcessors.title=Data output Tab.TopographyCreator.title=Topography creator Tab.PostVisualization.title=Post-Visualization diff --git a/VadereGui/resources/messages_de_DE.properties b/VadereGui/resources/messages_de_DE.properties index c8c8a03bba6f65cc9a892497e280ee6dcc8d9178..275d84fb26ee3131391239963f97fed25095f330 100644 --- a/VadereGui/resources/messages_de_DE.properties +++ b/VadereGui/resources/messages_de_DE.properties @@ -39,6 +39,7 @@ NewTestError.title=Fehler. DataProcessingView.msgInvalidJson=Fehlerhaftes JSON DataProcessingView.msgShowError=Zeige Fehlermeldung DataProcessingView.chbAddTimeStamp=F\u00FCge Zeitstempel zu Ausgabeordner +DataProcessingView.chbAddMetaData=F\u00FCge Meta-Daten in Ausgabedateien DataProcessingView.btnAdd=Hinzuf\u00FCgen DataProcessingView.btnDelete=L\u00F6schen DataProcessingView.msgFileSelected=Keine Ausgabedatei ist ausgew\u00E4hlt @@ -50,7 +51,7 @@ DataProcessingView.msgFileEmpty=Datei darf nicht leer sein DataProcessingView.msgFileInUse=Dateiname bereits vorhanden DataProcessingView.dialogInvalidFile.label=Ung\u00FCltiger Dateiname DataProcessingView.dialogOutputDataKeySelection.label=Rubrik -DataProcessingView.dialogOutputHeaderSelection.label=Kopfzeile +DataProcessingView.dialogOutputIndicesSelection.label=index ProgressPanelDone.text=Fertig ProgressPanelWorking.text=Arbeite... @@ -319,7 +320,7 @@ Tab.Model.insertModelNameSubMenu.title=Hauptmodelle Tab.Pedestrians.title=Fu\u00dfg\u00e4nger Tab.Topography.title=Topographie Tab.Event.title=Events -Tab.OutputProcessors.title=Datenverarbeitung +Tab.OutputProcessors.title=Datenausgabe Tab.TopographyCreator.title=Topographie-Designer Tab.PostVisualization.title=Post-Visualisierung diff --git a/VadereGui/src/org/vadere/gui/projectview/view/DataProcessingView.java b/VadereGui/src/org/vadere/gui/projectview/view/DataProcessingView.java index ab7821fe40b2bf01ff5408c0ba37c3ea52d68de6..5df6f3f71873506be27bc9ba626c59b7c2fd3d16 100644 --- a/VadereGui/src/org/vadere/gui/projectview/view/DataProcessingView.java +++ b/VadereGui/src/org/vadere/gui/projectview/view/DataProcessingView.java @@ -184,6 +184,7 @@ class DataProcessingView extends JPanel implements IJsonView { private boolean isEditable; private JCheckBox isTimestampedCheckBox; + private JCheckBox isWriteMetaData; private JTable outputFilesTable; private DefaultTableModel outputFilesTableModel; private JTable dataProcessorsTable; @@ -219,10 +220,23 @@ class DataProcessingView extends JPanel implements IJsonView { currentScenario.getDataProcessingJsonManager().setTimestamped(isTimestampedCheckBox.isSelected()); } }); + isTimestampedCheckBox.setAlignmentX(Component.LEFT_ALIGNMENT); addEditableComponent(isTimestampedCheckBox); filesPanel.add(isTimestampedCheckBox); + isWriteMetaData = new JCheckBox(Messages.getString("DataProcessingView.chbAddMetaData")); + isWriteMetaData.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + currentScenario.getDataProcessingJsonManager().setWriteMetaData(isWriteMetaData.isSelected()); + } + }); + + isWriteMetaData.setAlignmentX(Component.LEFT_ALIGNMENT); + addEditableComponent(isWriteMetaData); + filesPanel.add(isWriteMetaData); + JButton addFileBtn = new JButton(new AbstractAction(Messages.getString("DataProcessingView.btnAdd")) { @Override public void actionPerformed(ActionEvent e) { @@ -357,6 +371,7 @@ class DataProcessingView extends JPanel implements IJsonView { selectedOutputFile = null; selectedDataProcessor = null; isTimestampedCheckBox.setSelected(scenario.getDataProcessingJsonManager().isTimestamped()); + isWriteMetaData.setSelected(scenario.getDataProcessingJsonManager().isWriteMetaData()); updateOutputFilesTable(); updateDataProcessorsTable(); updateDataProcessIdsInUse(); @@ -580,11 +595,14 @@ class DataProcessingView extends JPanel implements IJsonView { c.gridx = 0; c.gridy = 2; - panel.add(new JLabel(Messages.getString("DataProcessingView.dialogOutputHeaderSelection.label")+":"), c); + panel.add(new JLabel(Messages.getString("DataProcessingView.dialogOutputIndicesSelection.label")+":"), c); + // Only the indices are shown, not the entire header. > Entire header can be quite a lot of text (which may + // not fit in the GUI) + the processors (with the header information) are not inserted and removed on the fly, + // but only when the simulation is started. c.gridx = 1; c.gridy = 2; - panel.add(new JLabel(outputFile.getHeader()), c); + panel.add(new JLabel(outputFile.getIndicesLine()), c); c.gridx = 0; c.gridy = 3; diff --git a/VadereModelTests/TestOSM/scenarios/basic_2_density_discrete_ca.scenario b/VadereModelTests/TestOSM/scenarios/basic_2_density_discrete_ca.scenario index 41c7559c134a97329765b257247d502affcc6911..6ee2846e2ae05e5ed58356c56deab579d0f529d8 100644 --- a/VadereModelTests/TestOSM/scenarios/basic_2_density_discrete_ca.scenario +++ b/VadereModelTests/TestOSM/scenarios/basic_2_density_discrete_ca.scenario @@ -49,7 +49,8 @@ "pedestrianOverlapProcessorId" : 3 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", @@ -218,4 +219,4 @@ }, "eventInfos" : [ ] } -} \ No newline at end of file +} diff --git a/VadereModelTests/TestOSM/scenarios/basic_2_density_pso.scenario b/VadereModelTests/TestOSM/scenarios/basic_2_density_pso.scenario index 38637d7234b8c9e0f5deda6b2976a59dedbfedb9..24c91c84af530a35542c1fc2972bc4e7252bcb78 100644 --- a/VadereModelTests/TestOSM/scenarios/basic_2_density_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/basic_2_density_pso.scenario @@ -37,7 +37,8 @@ "pedestrianOverlapProcessorId" : 3 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/chicken_floorfield_displaced_ok.scenario b/VadereModelTests/TestOSM/scenarios/chicken_floorfield_displaced_ok.scenario index 03fd257ba8a1b430507b485b882e6d688dceacf0..f409661b820853f29adb1b090da122c606f6b1be 100644 --- a/VadereModelTests/TestOSM/scenarios/chicken_floorfield_displaced_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/chicken_floorfield_displaced_ok.scenario @@ -54,7 +54,8 @@ "pedestrianOverlapProcessorId" : 3 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/chicken_floorfield_ok.scenario b/VadereModelTests/TestOSM/scenarios/chicken_floorfield_ok.scenario index 81ae2fe70249f365b0b8209b0b0bdb60d1f5e723..20da356f55656100a103361fdbd70d354d16f324 100644 --- a/VadereModelTests/TestOSM/scenarios/chicken_floorfield_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/chicken_floorfield_ok.scenario @@ -64,7 +64,8 @@ "minimalWaitingTime" : 0.0 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/corner_waiting_time_processor_test.scenario b/VadereModelTests/TestOSM/scenarios/corner_waiting_time_processor_test.scenario index 3db0cd2153141eb016e24358f32e887582f247f9..f1755abaef43daa44026453d03d042db53839b42 100644 --- a/VadereModelTests/TestOSM/scenarios/corner_waiting_time_processor_test.scenario +++ b/VadereModelTests/TestOSM/scenarios/corner_waiting_time_processor_test.scenario @@ -64,7 +64,8 @@ "pedestrianOverlapProcessorId" : 6 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/narrow_passage_discrete_CA_fail.scenario b/VadereModelTests/TestOSM/scenarios/narrow_passage_discrete_CA_fail.scenario index 5efa3a754fc8098f12ee3ad11cd577f70a745735..2da7dc893a5d9de44ef94b75aea7dfdcfd87d5c8 100644 --- a/VadereModelTests/TestOSM/scenarios/narrow_passage_discrete_CA_fail.scenario +++ b/VadereModelTests/TestOSM/scenarios/narrow_passage_discrete_CA_fail.scenario @@ -40,7 +40,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/narrow_passage_nelder_mead_ok.scenario b/VadereModelTests/TestOSM/scenarios/narrow_passage_nelder_mead_ok.scenario index fe91004ca4402d8bf0639b58022568e6f860d731..4f26b4042d248f17b1186005e6ffd4f219131eae 100644 --- a/VadereModelTests/TestOSM/scenarios/narrow_passage_nelder_mead_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/narrow_passage_nelder_mead_ok.scenario @@ -56,7 +56,8 @@ "pedestrianOverlapProcessorId" : 6 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/narrow_passage_pso_ok.scenario b/VadereModelTests/TestOSM/scenarios/narrow_passage_pso_ok.scenario index b70607b67cf11705354d38ac02d9694c1016a5d1..b57fdfb378e9d2c898edcfdc33f7ac594e336aff 100644 --- a/VadereModelTests/TestOSM/scenarios/narrow_passage_pso_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/narrow_passage_pso_ok.scenario @@ -56,7 +56,8 @@ "pedestrianOverlapProcessorId" : 6 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/queueing_dynamic_floorfield_visual_check.scenario b/VadereModelTests/TestOSM/scenarios/queueing_dynamic_floorfield_visual_check.scenario index 2b14ad7593664e1c5644e36e7afd067d49aa487f..5d4427147b5aa0d7303b406ec95ea2b318875a54 100644 --- a/VadereModelTests/TestOSM/scenarios/queueing_dynamic_floorfield_visual_check.scenario +++ b/VadereModelTests/TestOSM/scenarios/queueing_dynamic_floorfield_visual_check.scenario @@ -32,7 +32,8 @@ "pedestrianOverlapProcessorId" : 3 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/regular_wall_discrete_ok.scenario b/VadereModelTests/TestOSM/scenarios/regular_wall_discrete_ok.scenario index 2ece5eb5d177e4600788020d3525e8d02fac103c..b2c0b7793b519635d693c38ca2b1869f1e1a0d9f 100644 --- a/VadereModelTests/TestOSM/scenarios/regular_wall_discrete_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/regular_wall_discrete_ok.scenario @@ -53,7 +53,8 @@ "pedestrianOverlapProcessorId" : 3 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/regular_wall_nelder_mead_ok.scenario b/VadereModelTests/TestOSM/scenarios/regular_wall_nelder_mead_ok.scenario index be3a87df836da65bdb54aef9e2227af7db97ecc1..9a4a7c74ab147429261c54e53eba28749d92d4a8 100644 --- a/VadereModelTests/TestOSM/scenarios/regular_wall_nelder_mead_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/regular_wall_nelder_mead_ok.scenario @@ -53,7 +53,8 @@ "pedestrianOverlapProcessorId" : 3 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/regular_wall_pso_ok.scenario b/VadereModelTests/TestOSM/scenarios/regular_wall_pso_ok.scenario index 3c533076451fe23e70be8508d94e2bb1e8d1dcbd..0fd4fcc009cda4b8395b908913e28915bcd0a52d 100644 --- a/VadereModelTests/TestOSM/scenarios/regular_wall_pso_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/regular_wall_pso_ok.scenario @@ -53,7 +53,8 @@ "pedestrianOverlapProcessorId" : 3 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_01_pathway_discrete_brute_force.scenario b/VadereModelTests/TestOSM/scenarios/rimea_01_pathway_discrete_brute_force.scenario index f1c9f06d4e7843593a03531c086b8ba65373934f..366592ef3398a8d97ea3c55349635786f58eed8e 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_01_pathway_discrete_brute_force.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_01_pathway_discrete_brute_force.scenario @@ -57,7 +57,8 @@ "pedestrianOverlapProcessorId" : 5 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_01_pathway_discrete_ca.scenario b/VadereModelTests/TestOSM/scenarios/rimea_01_pathway_discrete_ca.scenario index fd2b60679ad8166393908f376041795fd4e9e0f7..b68984d4d0041d269bafaeb80984675072904822 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_01_pathway_discrete_ca.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_01_pathway_discrete_ca.scenario @@ -57,7 +57,8 @@ "pedestrianOverlapProcessorId" : 5 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_025_d.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_025_d.scenario index e2f8bf46e5ca9bffb328d7e70728e317d3e5a641..7b32f92995778fc99f9ba46b432399a384989400 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_025_d.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_025_d.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_025_up.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_025_up.scenario index 15fdcc4f576b42e758349711b70e2b2bdb661a97..6ebbaec354e1e9fc7209b93c802ae58c77f196d5 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_025_up.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_025_up.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_d.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_d.scenario index 8b637233b7376bea2ddaa52d0b07d8ac53aba165..0bb96abb44e6e5f46fe0d832f3e523ff1fa3ca44 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_d.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_d.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_h.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_h.scenario index 265c94113f0dfcbb078ac771cd7417df97352933..6270743ddba97c8ab22fc909ab8c6727807e6ad9 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_h.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_h.scenario @@ -146,7 +146,8 @@ "pedestrianVelocityProcessorId" : 7 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_up.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_up.scenario index b50be41f02f86e31db7ca6b3c908fbd87b2f8754..4875a2416d727e0f9c63055867e428fdc4e0d0f9 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_up.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_050_up.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_d.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_d.scenario index 7e18d9e0b57f337fcc5ca654fdda86cc70e6899c..f4618cdd429192aff7ffdcc07762e4ad3ac1d4d1 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_d.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_d.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_h.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_h.scenario index b81f15656e8ecf07d719ae25306e7eeb0a27ff75..db9715c44df48b20174d5532a8007f0cca06d55d 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_h.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_h.scenario @@ -146,7 +146,8 @@ "pedestrianVelocityProcessorId" : 7 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_up.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_up.scenario index 205333f65d76c275a8e3db5935f739972679275e..55fde93bdf945bf7389e895214be26e1f9138174 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_up.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_075_up.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_d.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_d.scenario index 7ca52cc1a7d14e168d9c2b5db196913b0884d9ce..1ae8ab43077f8e322f2e3d73f5d6205c4ed29c26 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_d.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_d.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_h.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_h.scenario index 520ea3d3ede29cd347ef8a3167e9cffb66f66ab4..19dbf12645f42435a8104f31876560ca4a3d8fac 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_h.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_h.scenario @@ -146,7 +146,8 @@ "pedestrianVelocityProcessorId" : 7 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_up.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_up.scenario index f118c365cafa5173319c56bbf07bbf988e66b092..cdb94cf31ed593fa6c921947b1b703dc2e300fd6 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_up.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_100_up.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_d.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_d.scenario index 528318483ce6ef39f678c7dee157e779cb2139ab..8e691cde16b51da73b36c56c7570816026412876 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_d.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_d.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_h.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_h.scenario index 4ac83f3d97d462ea22992a0d4fe0514022f9c665..9552da118803cc7eb69f18e569e3c8c78b6bb202 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_h.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_h.scenario @@ -146,7 +146,8 @@ "pedestrianVelocityProcessorId" : 7 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_up.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_up.scenario index ff0947810897643a77f61848fd27123753ce3586..2221ef7d8e33ba8dc01e6faaeca6950e9c00c00c 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_up.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_125_up.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_470_h.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_470_h.scenario index 9c2ad32c340fbc38250bb2be1be3e5b36bb2dd62..892bb085323bd834dfd665613544a979c9322571 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_470_h.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_470_h.scenario @@ -146,7 +146,8 @@ "pedestrianVelocityProcessorId" : 7 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_550_up.scenario b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_550_up.scenario index 7f55bbe85f24fa38affd3a086114b06776da88a4..38f7a4c0c77973ede7260b41992459c01c591174 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_550_up.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_04_flow_osm1_550_up.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_05_react.scenario b/VadereModelTests/TestOSM/scenarios/rimea_05_react.scenario index 970f4acddbcead9f5de984dde5c9eb500eb521d0..c1b6cc8d0f7ce759af9194e3a88010ed07b4edcf 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_05_react.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_05_react.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_06_corner.scenario b/VadereModelTests/TestOSM/scenarios/rimea_06_corner.scenario index ec1bd8d2b53a754f40d64806edd327bf8e5ffb9f..39694777f058af072db37924236293c8a8ff7fa4 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_06_corner.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_06_corner.scenario @@ -74,7 +74,8 @@ "pedestrianOverlapProcessorId" : 6 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_discrete_ca.scenario b/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_discrete_ca.scenario index 9eff0379ff4468babcc5549fe4931f6868e2497b..b03a99b1358e4a0615ad0dd895217cf44eaf38f0 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_discrete_ca.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_discrete_ca.scenario @@ -57,7 +57,8 @@ "pedestrianOverlapProcessorId" : 5 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_nelder_mead.scenario b/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_nelder_mead.scenario index 69af6de989590c66552cd0d0c2c148fee827ea2d..675c3333d80dad0a06f436bb448468c43cd3508c 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_nelder_mead.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_nelder_mead.scenario @@ -57,7 +57,8 @@ "pedestrianOverlapProcessorId" : 5 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_pso.scenario b/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_pso.scenario index c9e38b6b8f0820f3ffd1e9021ebebaa8c43687ec..7c862104dbce3276f24f8588a9f0c1447c17c7a3 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_07_speeds_pso.scenario @@ -57,7 +57,8 @@ "pedestrianOverlapProcessorId" : 5 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_08_parameter_variation.scenario b/VadereModelTests/TestOSM/scenarios/rimea_08_parameter_variation.scenario index e77a17b94b540e8079e7b2df37e437e7e32594dc..114a249f7e6aefc5ac0888992d94c50fe4a68f3d 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_08_parameter_variation.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_08_parameter_variation.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_2_exits_nelder_mead.scenario b/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_2_exits_nelder_mead.scenario index 6afffdb08689bc932518ae1b0ba45bd8cdb455a9..2c4b61940be6c2dae456f46b91c4d121938596ea 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_2_exits_nelder_mead.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_2_exits_nelder_mead.scenario @@ -64,7 +64,8 @@ "pedestrianOverlapProcessorId" : 6 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_2_exits_pso.scenario b/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_2_exits_pso.scenario index bdc7bc4b30bafc77de19bdef3366cba1df1fc513..b6029cab1fefce856a066ff84eae333b7a17a5ed 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_2_exits_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_2_exits_pso.scenario @@ -64,7 +64,8 @@ "pedestrianOverlapProcessorId" : 6 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_4_exits_nelder_mead.scenario b/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_4_exits_nelder_mead.scenario index 2d9880082882d5c808393ec7b82c6df432bc39bc..a44fdac297d6d50f22bbf00fd10f60dc901b9dca 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_4_exits_nelder_mead.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_4_exits_nelder_mead.scenario @@ -64,7 +64,8 @@ "pedestrianOverlapProcessorId" : 6 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_4_exits_pso.scenario b/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_4_exits_pso.scenario index 2385636ccef90f8c9e9d8629b0791dfdc6a0147e..81cc603c13556b71d86327e76dc045ba4b8dfea8 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_4_exits_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_09_public_room_4_exits_pso.scenario @@ -64,7 +64,8 @@ "pedestrianOverlapProcessorId" : 6 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_10_pathfinding.scenario b/VadereModelTests/TestOSM/scenarios/rimea_10_pathfinding.scenario index 271a2950f9b27d0c50f31988fb5c72fa7bd96b94..1c2062ed418259a6733c6ab785a8c878dc845729 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_10_pathfinding.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_10_pathfinding.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 8 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_11_exit_selection_nelder_mead.scenario b/VadereModelTests/TestOSM/scenarios/rimea_11_exit_selection_nelder_mead.scenario index 49ada5c4bc2c6dcffb4106e092d55f94328ca9c5..1a81f04449aa28724a7803e9c9be388c114622bf 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_11_exit_selection_nelder_mead.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_11_exit_selection_nelder_mead.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_11_exit_selection_pso.scenario b/VadereModelTests/TestOSM/scenarios/rimea_11_exit_selection_pso.scenario index c35bbfc54d225f05ddea8345ac745968bb4053c2..0e8e093e6ac826f4ba0803740dadbf45171b2cd9 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_11_exit_selection_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_11_exit_selection_pso.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_12_evacuation_nelder_mead.scenario b/VadereModelTests/TestOSM/scenarios/rimea_12_evacuation_nelder_mead.scenario index 612844744abe296c269482f5e7d94afbd07472a6..c6d2a521c833f314f7dad89d0de53be958db65a7 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_12_evacuation_nelder_mead.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_12_evacuation_nelder_mead.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_12_evacuation_pso.scenario b/VadereModelTests/TestOSM/scenarios/rimea_12_evacuation_pso.scenario index f98038841de096e573c743fab724eac4963ef4b3..d842d9e22424eca0e42c9458137670409f143a25 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_12_evacuation_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_12_evacuation_pso.scenario @@ -22,7 +22,8 @@ "pedestrianOverlapProcessorId" : 1 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_long_nelder_mead.scenario b/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_long_nelder_mead.scenario index b9726d478733cd9d7b3e8d8c681a2c223c11e643..3d409aaa143ba788877d4c6721d833eff97e53c2 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_long_nelder_mead.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_long_nelder_mead.scenario @@ -29,7 +29,8 @@ "pedestrianOverlapProcessorId" : 2 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_long_pso.scenario b/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_long_pso.scenario index 9f66397853ffc99c61b9b0e107683ac46714e1b7..73ec8803245562f2ec5f675bbf7b6b15a041d0c5 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_long_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_long_pso.scenario @@ -29,7 +29,8 @@ "pedestrianOverlapProcessorId" : 2 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_nelder_mead.scenario b/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_nelder_mead.scenario index 54f9c6783d8e442667bb1293990b1c5c484f8fe2..719677a91cd869645009265b0a66224892d65b8a 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_nelder_mead.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_nelder_mead.scenario @@ -29,7 +29,8 @@ "pedestrianOverlapProcessorId" : 2 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_pso.scenario b/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_pso.scenario index dd2e50cec979b048cd571b46b907b8d965deb044..73b96fd3e7c9c454aea911d26cca43c055c1b30a 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_13_stairs_pso.scenario @@ -29,7 +29,8 @@ "pedestrianOverlapProcessorId" : 2 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_14_select_route_nelder_mead.scenario b/VadereModelTests/TestOSM/scenarios/rimea_14_select_route_nelder_mead.scenario index 2e8a903018d67c82fced086bb4083f726c9d2947..c2d83998a358aa6f1875294d5d4459ea170ba50f 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_14_select_route_nelder_mead.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_14_select_route_nelder_mead.scenario @@ -29,7 +29,8 @@ "pedestrianOverlapProcessorId" : 2 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/rimea_14_select_route_pso.scenario b/VadereModelTests/TestOSM/scenarios/rimea_14_select_route_pso.scenario index b211beee80c21c0fe40aa776e2a972f447c66728..fcebaca628d2c85006eaed9cb7b6c1de9067daa3 100644 --- a/VadereModelTests/TestOSM/scenarios/rimea_14_select_route_pso.scenario +++ b/VadereModelTests/TestOSM/scenarios/rimea_14_select_route_pso.scenario @@ -29,7 +29,8 @@ "pedestrianOverlapProcessorId" : 2 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/see_small_wall_nelder_mead_ok.scenario b/VadereModelTests/TestOSM/scenarios/see_small_wall_nelder_mead_ok.scenario index 496d8ce87e6581de445b55a0e06f84411f56feaf..1748d698761dd2d50dd8720ebbf5000d9861ed01 100644 --- a/VadereModelTests/TestOSM/scenarios/see_small_wall_nelder_mead_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/see_small_wall_nelder_mead_ok.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/see_small_wall_pso_fail.scenario b/VadereModelTests/TestOSM/scenarios/see_small_wall_pso_fail.scenario index 5efecd82a7c8d0c7f49130d69869d7548fe71227..5c58408af90df3b6aa4ac8c2169ca24d4f76c544 100644 --- a/VadereModelTests/TestOSM/scenarios/see_small_wall_pso_fail.scenario +++ b/VadereModelTests/TestOSM/scenarios/see_small_wall_pso_fail.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thick_wall_discrete_ok.scenario b/VadereModelTests/TestOSM/scenarios/thick_wall_discrete_ok.scenario index 20b09bdc9b7dbca3d89b7aaf2c4fdb6f5c31e35a..b407ae0f0d8845d20d1bdbbd2e3999d0fdf57884 100644 --- a/VadereModelTests/TestOSM/scenarios/thick_wall_discrete_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/thick_wall_discrete_ok.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thick_wall_nelder_mead_ok.scenario b/VadereModelTests/TestOSM/scenarios/thick_wall_nelder_mead_ok.scenario index b472aee734ffd3629e60e495a9a506205f4ba85c..6197f2169ffcf45d8baeaaca03dbc087839d5b9c 100644 --- a/VadereModelTests/TestOSM/scenarios/thick_wall_nelder_mead_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/thick_wall_nelder_mead_ok.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thick_wall_pso_ok.scenario b/VadereModelTests/TestOSM/scenarios/thick_wall_pso_ok.scenario index c2c8db6b5c2084980c52b09d9b46118146d9b185..023f5131e69cd2b4e7c9ecea0f4e8038c3499aba 100644 --- a/VadereModelTests/TestOSM/scenarios/thick_wall_pso_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/thick_wall_pso_ok.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_discrete_could_fail.scenario b/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_discrete_could_fail.scenario index 28db1deab99b8c26a32e98217d5175f6935162c5..e79d584dd997acafe0c1ae86dc2d82baa4db3465 100644 --- a/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_discrete_could_fail.scenario +++ b/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_discrete_could_fail.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_nelder_mead_ok.scenario b/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_nelder_mead_ok.scenario index 806647d197442368ecbf9afa87abfc24280309d2..09ae75ea1984c56e1dbaad7ccb31b433989c8c9b 100644 --- a/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_nelder_mead_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_nelder_mead_ok.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_pso_could_fail.scenario b/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_pso_could_fail.scenario index 620cf0cbc374fc0e0e086e970e38642ea165d994..4a009a3f24705b998ca49e3f5ffab65f048c7122 100644 --- a/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_pso_could_fail.scenario +++ b/VadereModelTests/TestOSM/scenarios/thin_wall_and_closer_source_pso_could_fail.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thin_wall_discrete_ok.scenario b/VadereModelTests/TestOSM/scenarios/thin_wall_discrete_ok.scenario index 78c26900a5ace798a93c193f7e585ae119266267..d915d6985f4344cae50742201be99189b735a992 100644 --- a/VadereModelTests/TestOSM/scenarios/thin_wall_discrete_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/thin_wall_discrete_ok.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thin_wall_nelder_mead_ok.scenario b/VadereModelTests/TestOSM/scenarios/thin_wall_nelder_mead_ok.scenario index b4aa6e9e288f6f19b961245f4aa763cd760db20e..aaef2b9c33e58805db948d5205816fc0a0b0bc7b 100644 --- a/VadereModelTests/TestOSM/scenarios/thin_wall_nelder_mead_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/thin_wall_nelder_mead_ok.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereModelTests/TestOSM/scenarios/thin_wall_pso_ok.scenario b/VadereModelTests/TestOSM/scenarios/thin_wall_pso_ok.scenario index 3fd98b61683c63cdaf6de1e7e2e929cc0afd8496..25c38f97c75643f334815ca3275e39a15c24c44b 100644 --- a/VadereModelTests/TestOSM/scenarios/thin_wall_pso_ok.scenario +++ b/VadereModelTests/TestOSM/scenarios/thin_wall_pso_ok.scenario @@ -60,7 +60,8 @@ "pedestrianOverlapProcessorId" : 4 } } ], - "isTimestamped" : true + "isTimestamped" : true, + "isWriteMetaData" : false }, "scenario" : { "mainModel" : "org.vadere.simulator.models.osm.OptimalStepsModel", diff --git a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java index f31dbec222cfabadab723f4676bac727debefa71..4fe3e942ada6bf9256f4cb5db1e643a6a53b7610 100644 --- a/VadereSimulator/src/org/vadere/simulator/control/Simulation.java +++ b/VadereSimulator/src/org/vadere/simulator/control/Simulation.java @@ -17,10 +17,7 @@ import org.vadere.simulator.projects.SimulationResult; import org.vadere.simulator.projects.dataprocessing.ProcessorManager; import org.vadere.state.attributes.AttributesSimulation; import org.vadere.state.attributes.scenario.AttributesAgent; -import org.vadere.state.events.json.EventInfo; -import org.vadere.state.events.types.ElapsedTimeEvent; import org.vadere.state.events.types.Event; -import org.vadere.state.events.types.EventTimeframe; import org.vadere.state.scenario.Pedestrian; import org.vadere.state.scenario.Source; import org.vadere.state.scenario.Target; @@ -44,8 +41,8 @@ public class Simulation { private final List passiveCallbacks; private List models; - private boolean runSimulation = false; - private boolean paused = false; + private boolean isRunSimulation = false; + private boolean isPaused = false; /** * current simulation time (seconds) */ @@ -74,7 +71,9 @@ public class Simulation { private final CognitionLayer cognitionLayer; public Simulation(MainModel mainModel, double startTimeInSec, final String name, ScenarioStore scenarioStore, - List passiveCallbacks, Random random, ProcessorManager processorManager, SimulationResult simulationResult) { + List passiveCallbacks, Random random, ProcessorManager processorManager, + SimulationResult simulationResult) { + this.name = name; this.mainModel = mainModel; this.scenarioStore = scenarioStore; @@ -152,7 +151,7 @@ public class Simulation { simulationState = initialSimulationState(); topographyController.preLoop(simTimeInSec); - runSimulation = true; + isRunSimulation = true; simTimeInSec = startTimeInSec; for (Model m : models) { @@ -198,15 +197,15 @@ public class Simulation { preLoop(); - while (runSimulation) { + while (isRunSimulation) { synchronized (this) { - while (paused) { + while (isPaused) { try { wait(); } catch (Exception e) { - paused = false; + isPaused = false; Thread.currentThread().interrupt(); - logger.warn("interrupt while paused."); + logger.warn("interrupt while isPaused."); } } } @@ -227,7 +226,6 @@ public class Simulation { processorManager.update(this.simulationState); } - for (PassiveCallback c : passiveCallbacks) { c.postUpdate(simTimeInSec); } @@ -235,17 +233,16 @@ public class Simulation { if (runTimeInSec + startTimeInSec > simTimeInSec + 1e-7) { simTimeInSec += Math.min(attributesSimulation.getSimTimeStepLength(), runTimeInSec + startTimeInSec - simTimeInSec); } else { - runSimulation = false; + isRunSimulation = false; } - //remove comment to fasten simulation for evacuation simulations //if (topography.getElements(Pedestrian.class).size() == 0){ - // runSimulation = false; + // isRunSimulation = false; //} if (Thread.interrupted()) { - runSimulation = false; + isRunSimulation = false; simulationResult.setState("Simulation interrupted"); logger.info("Simulation interrupted."); } @@ -282,9 +279,9 @@ public class Simulation { } private void updateCallbacks(double simTimeInSec) { - List events = eventController.getEventsForTime(simTimeInSec); + List events = eventController.getEventsForTime(simTimeInSec); - // TODO Why are target controllers readded in each simulation loop? + // TODO Why are target controllers readded in each simulation loop? this.targetControllers.clear(); for (Target target : this.topographyController.getTopography().getTargets()) { targetControllers.add(new TargetController(this.topographyController.getTopography(), target)); @@ -318,19 +315,19 @@ public class Simulation { } public synchronized void pause() { - paused = true; + isPaused = true; } public synchronized boolean isPaused() { - return paused; + return isPaused; } public synchronized boolean isRunning() { - return runSimulation && !isPaused(); + return isRunSimulation && !isPaused(); } public synchronized void resume() { - paused = false; + isPaused = false; notify(); } @@ -355,7 +352,7 @@ public class Simulation { try { Thread.sleep(waitTime); } catch (InterruptedException e) { - runSimulation = false; + isRunSimulation = false; logger.info("Simulation interrupted."); } } diff --git a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java b/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java index 6edd2d5362fa6cc207ffce83c788af6ae03ff719..b499e7e38400d1e9450c65871c80988ed959a793 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/ScenarioRun.java @@ -13,9 +13,7 @@ import java.util.Random; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; -import org.apache.log4j.MDC; import org.jetbrains.annotations.Nullable; -import org.lwjgl.system.CallbackI; import org.vadere.simulator.control.PassiveCallback; import org.vadere.simulator.control.Simulation; import org.vadere.simulator.models.MainModel; @@ -26,9 +24,9 @@ import org.vadere.util.io.IOUtils; /** * Manages single simulation runs. - * + * * @author Jakob Schöttl - * + * */ public class ScenarioRun implements Runnable { @@ -115,7 +113,9 @@ public class ScenarioRun implements Runnable { sealAllAttributes(); // Run simulation main loop from start time = 0 seconds - simulation = new Simulation(mainModel, 0, scenarioStore.getName(), scenarioStore, passiveCallbacks, random, processorManager, simulationResult); + simulation = new Simulation(mainModel, 0, + scenarioStore.getName(), scenarioStore, passiveCallbacks, random, + processorManager, simulationResult); } simulation.run(); simulationResult.setState("SimulationRun completed"); @@ -130,10 +130,10 @@ public class ScenarioRun implements Runnable { // MDC.remove("scenario.Name"); } } - + public void simulationFailed(Throwable e) { - e.printStackTrace(); - logger.error(e); + e.printStackTrace(); + logger.error(e); } protected void doAfterSimulation() { @@ -174,13 +174,23 @@ public class ScenarioRun implements Runnable { } public void pause() { - if (simulation != null) { // TODO throw an illegal state exception if simulation is not running + + if(! simulation.isRunning()){ + throw new IllegalStateException("Received trigger to pause the simulation, but it is not running!"); + } + + if (simulation != null) { simulation.pause(); } } public void resume() { - if (simulation != null) { // TODO throw an illegal state exception if simulation is not running + + if(simulation.isRunning()){ + throw new IllegalStateException("Received trigger to resume the simulation, but it is not paused!"); + } + + if (simulation != null) { simulation.resume(); } } @@ -189,7 +199,7 @@ public class ScenarioRun implements Runnable { try { // Create output directory Files.createDirectories(outputPath); - processorManager.setOutputPath(outputPath.toString()); + processorManager.setOutputFiles(outputPath.toString()); } catch (IOException ex) { throw new UncheckedIOException(ex); } @@ -200,6 +210,7 @@ public class ScenarioRun implements Runnable { return scenario.getName(); } + @Deprecated // Deprecated, because it is currently not used in code anymore public String readyToRunResponse() { // TODO [priority=medium] [task=check] add more conditions if (scenarioStore.getMainModel() == null) { return scenarioStore.getName() + ": no mainModel is set"; diff --git a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/DataProcessingJsonManager.java b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/DataProcessingJsonManager.java index 53f5d5eafa620b1de1368465620229fb0c6981c9..2ea76ecdbbf9470efef7aca64a471458eb56dccc 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/DataProcessingJsonManager.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/DataProcessingJsonManager.java @@ -47,6 +47,7 @@ public class DataProcessingJsonManager { private static final String PROCESSORID_KEY = "id"; private static final String ATTRIBUTESTYPE_KEY = "attributesType"; private static final String TIMESTAMP_KEY = "isTimestamped"; + private static final String WRITEMETA_KEY = "isWriteMetaData"; public static ObjectWriter writer; private static ObjectMapper mapper; @@ -60,11 +61,13 @@ public class DataProcessingJsonManager { private List> outputFiles; private List> dataProcessors; private boolean isTimestamped; + private boolean isWriteMetaData; public DataProcessingJsonManager() { this.outputFiles = new ArrayList<>(); this.dataProcessors = new ArrayList<>(); this.isTimestamped = true; + this.isWriteMetaData = false; this.outputFileFactory = OutputFileFactory.instance(); this.processorFactory = DataProcessorFactory.instance(); } @@ -145,6 +148,11 @@ public class DataProcessingJsonManager { manager.setTimestamped(timestampArrayNode.asBoolean()); } + JsonNode writeMetaData = node.get(WRITEMETA_KEY); + if (writeMetaData != null) { + manager.setWriteMetaData(writeMetaData.asBoolean()); + } + return manager; } @@ -233,10 +241,18 @@ public class DataProcessingJsonManager { return this.isTimestamped; } + public boolean isWriteMetaData(){ + return this.isWriteMetaData; + } + public void setTimestamped(boolean isTimestamped) { this.isTimestamped = isTimestamped; } + public void setWriteMetaData(boolean isWriteMetaData){ + this.isWriteMetaData = isWriteMetaData; + } + public String serialize() throws JsonProcessingException { return writer.writeValueAsString(serializeToNode()); } @@ -258,14 +274,22 @@ public class DataProcessingJsonManager { }); main.set(PROCESSORS_KEY, processorsArrayNode); - // part 3: timestamp + // part 3: timestamp + write meta data option main.put(TIMESTAMP_KEY, this.isTimestamped); + main.put(WRITEMETA_KEY, this.isWriteMetaData); return main; } public ProcessorManager createProcessorManager(MainModel mainModel) { + // this function is called when the simulation starts running + + for (OutputFile f : outputFiles) { + f.setWriteMetaData(isWriteMetaData()); // allow to write meta data + } + return new ProcessorManager(dataProcessors, outputFiles, mainModel); + } public int getMaxProcessorsId() { diff --git a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/ProcessorManager.java b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/ProcessorManager.java index 802ab57ef6c8c3262fd084f5899f2c562539e998..2b8e98430eb296e8ec41c50a1ab03c58ccc35b89 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/ProcessorManager.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/ProcessorManager.java @@ -24,7 +24,8 @@ public class ProcessorManager { private List> outputFiles; private SimulationResult simulationResult; - public ProcessorManager(List> dataProcessors, List> outputFiles, MainModel mainModel) { + public ProcessorManager(List> dataProcessors, + List> outputFiles, MainModel mainModel) { this.mainModel = mainModel; this.outputFiles = outputFiles; @@ -65,8 +66,12 @@ public class ProcessorManager { this.processorMap.values().forEach(proc -> proc.postLoopAddResultInfo(state, simulationResult)); } - public void setOutputPath(String directory) { - this.outputFiles.forEach(file -> file.setAbsoluteFileName(Paths.get(directory, String.format("%s", new File(file.getFileName()).getName())).toString())); + public void setOutputFiles(String directory) { + // for each file + this.outputFiles.forEach(file -> + file.setAbsoluteFileName( + Paths.get(directory, String.format("%s", + new File(file.getFileName()).getName())).toString())); } public void writeOutput() { @@ -87,4 +92,4 @@ public class ProcessorManager { public void sealAllAttributes() { processorMap.values().forEach(p -> p.sealAttributes()); } -} +} \ No newline at end of file diff --git a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/outputfile/OutputFile.java b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/outputfile/OutputFile.java index e8e3c10f200b1047f8657bc7fe85bf73db2f4376..877805c20420ad3b5fdcc8c865e720e6f5b5a196 100644 --- a/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/outputfile/OutputFile.java +++ b/VadereSimulator/src/org/vadere/simulator/projects/dataprocessing/outputfile/OutputFile.java @@ -1,3 +1,5 @@ + + package org.vadere.simulator.projects.dataprocessing.outputfile; import org.vadere.simulator.projects.dataprocessing.datakey.DataKey; @@ -29,7 +31,12 @@ import java.util.stream.Stream; */ public abstract class OutputFile> { - private String[] keyHeaders; + + + //Note: Only header information from data keys are written in this, therefore, these are the indices + // Each processor attached to this processor itself attaches also headers, but they are not listed in this + // attribute. + private String[] dataIndices; /** * The file name without the path to the file @@ -43,32 +50,40 @@ public abstract class OutputFile> { private List processorIds; private List> dataProcessors; + private boolean isAddedProcessors; + private boolean isWriteMetaData; private String separator; + private final static String nameConflictAdd = "-Proc?"; // the # is replaced with the processor id private VadereWriterFactory writerFactory; private VadereWriter writer; - protected OutputFile(final String... keyHeaders) { - this.keyHeaders = keyHeaders; + protected OutputFile(final String... dataIndices) { + this.dataIndices = dataIndices; + this.isAddedProcessors = false; // init method has to be called + this.isWriteMetaData = false; this.dataProcessors = new ArrayList<>(); this.writerFactory = VadereWriterFactory.getFileWriterFactory(); } public void setAbsoluteFileName(final String fileName) { - this.absoluteFileName = fileName; + this.absoluteFileName = fileName; } + public void setWriteMetaData(boolean isWriteMetaData){ + this.isWriteMetaData = isWriteMetaData; + } + public void setRelativeFileName(final String fileName) { this.fileName = fileName; - } public String getSeparator() { - return this.separator; + return this.separator; } public void setSeparator(final String separator) { - this.separator = separator; + this.separator = separator; } @SuppressWarnings("unchecked") @@ -78,17 +93,25 @@ public abstract class OutputFile> { Optional.ofNullable(processorMap.get(pid)) .ifPresent(p -> dataProcessors.add((DataProcessor) p)); }); + + this.isAddedProcessors = true; } public void write() { if (!isEmpty()) { try (VadereWriter out = writerFactory.create(absoluteFileName)) { - writer = out; - printHeader(out); + + this.writer = out; + + if(this.isWriteMetaData){ + printMetaData(); + } + + printHeader(); this.dataProcessors.stream().flatMap(p -> p.getKeys().stream()) .distinct().sorted() - .forEach(key -> printRow(out, key)); + .forEach(key -> printRow(key)); out.flush(); } catch (IOException e) { @@ -101,30 +124,108 @@ public abstract class OutputFile> { return this.dataProcessors.isEmpty(); } - private List getFieldHeaders() { - return composeLine(keyHeaders, p -> Arrays.stream(p.getHeaders())); + private void printMetaData(){ + // use '#' symbol for comment -- the Java-style comment '//' is not appropriate because it requires two + // characters + String md = "#IDXCOL=" + dataIndices.length + + ",DATACOL="+(getEntireHeader().size()-dataIndices.length)+","+ + "SEP=\'"+ this.separator+"\'"; + + //Make a list with one element to reuse 'writeLine' function + List line = new LinkedList<>(); + line.add(md); + + writeLine(this.writer, line); } - public void printHeader(VadereWriter out) { - writeLine(out, getFieldHeaders()); + private void printHeader() { + writeLine(this.writer, this.getEntireHeader()); } - public String getHeader() { - return String.join(this.separator, getFieldHeaders()); + private void printRow(final K key) { + // Info: 'key' are the indices values (such as timeStep=3), can be more than one + @SuppressWarnings("unchecked") + final List fields = composeLine(toStrings(key), p -> + Arrays.stream(p.toStrings(key))); + writeLine(this.writer, fields); } - private void printRow(final VadereWriter out, final K key) { - @SuppressWarnings("unchecked") final List fields = composeLine(toStrings(key), p -> Arrays.stream(p.toStrings(key))); - writeLine(out, fields); + private List getIndices(){ + return new LinkedList<>(Arrays.asList(dataIndices)); } - private List composeLine(String[] keyFieldArray, @SuppressWarnings("rawtypes") Function> valueFields) { - final List fields = new LinkedList<>(Arrays.asList(keyFieldArray)); + public List getEntireHeader() { + + if(! isAddedProcessors){ + throw new RuntimeException("Asking for headers, but processors were not " + + "initialized yet."); + } + + //"getHeaders" is called in class DataProcessor.java, the + return composeHeaderLine(); + } + + public String getHeaderLine() { + return String.join(this.separator, this.getEntireHeader()); + } + + public String getIndicesLine() { + return String.join(this.separator, this.getIndices()); + } + + private List headersWithNameMangling(){ + LinkedList headers = new LinkedList<>(); + boolean isNameMangle = false; // assume there is no nameing conflict + + mainloop: + for (DataProcessor l: dataProcessors) { + List list = Arrays.asList(l.getHeaders()); + + for(String el: list) { + if(headers.contains(el)){ + isNameMangle = true; // conflict found: stop collecting headers + break mainloop; + }else{ + headers.addLast(el); + } + } + } + + if(isNameMangle){ + headers.clear(); //start from new... + for (DataProcessor l: dataProcessors) { + List list = Arrays.asList(l.getHeaders()); + + for (String h: list) { + // ... but now add the processor id + headers.addLast(h + + nameConflictAdd.replace('?', (char) (l.getId()+'0'))); + } + } + } + return headers; + } + + private List composeHeaderLine(){ + final List allHeaders = new LinkedList<>(Arrays.asList(dataIndices)); + List procHeaders = this.headersWithNameMangling(); + + allHeaders.addAll(procHeaders); + + return allHeaders; + } + + private List composeLine(String[] keyFieldArray, + @SuppressWarnings("rawtypes") Function> valueFields){ + final List fields = new + LinkedList<>(Arrays.asList(keyFieldArray)); final List processorFields = dataProcessors.stream() .flatMap(valueFields) .collect(Collectors.toList()); + fields.addAll(processorFields); + return fields; } @@ -133,7 +234,7 @@ public abstract class OutputFile> { } /** - * Return the column headers as string or the empty array. + * Return the column indices as string or the empty array. */ public String[] toStrings(K key) { return new String[]{key.toString()}; @@ -160,9 +261,4 @@ public abstract class OutputFile> { public void setVadereWriterFactory(VadereWriterFactory writerFactory) { this.writerFactory = writerFactory; } - - public void addDataProcessor(DataProcessor p) { - dataProcessors.add(p); - processorIds.add(p.getId()); - } -} +} \ No newline at end of file diff --git a/VadereSimulator/testResources/data/basic_1_chicken_osm1.scenario b/VadereSimulator/testResources/data/basic_1_chicken_osm1.scenario index 0eef1203ab1b1bc934e65611ee7351c9143c9432..391eb31a5569e2e7f91f60b485dbec41be6b236f 100644 --- a/VadereSimulator/testResources/data/basic_1_chicken_osm1.scenario +++ b/VadereSimulator/testResources/data/basic_1_chicken_osm1.scenario @@ -7,11 +7,14 @@ "files" : [ { "type" : "org.vadere.simulator.projects.dataprocessing.outputfile.TimestepPedestrianIdOutputFile", "filename" : "out.txt", - "processors" : [ 1 ] + "processors" : [ 1, 2 ] } ], "processors" : [ { "type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianPositionProcessor", "id" : 1 + }, { + "type" : "org.vadere.simulator.projects.dataprocessing.processor.PedestrianPositionProcessor", + "id" : 2 } ], "isTimestamped" : true }, @@ -169,4 +172,4 @@ "attributesCar" : null } } -} \ No newline at end of file +} diff --git a/VadereSimulator/tests/org/vadere/simulator/dataprocessing/TestOutputFileAfterMultipleRuns.java b/VadereSimulator/tests/org/vadere/simulator/dataprocessing/TestOutputFile.java similarity index 67% rename from VadereSimulator/tests/org/vadere/simulator/dataprocessing/TestOutputFileAfterMultipleRuns.java rename to VadereSimulator/tests/org/vadere/simulator/dataprocessing/TestOutputFile.java index 219f84fc5fa9da7eeb187032660b790fb0bb9a90..9dda0b6e40c3ee22caef7540ce7429ae2ba10e53 100644 --- a/VadereSimulator/tests/org/vadere/simulator/dataprocessing/TestOutputFileAfterMultipleRuns.java +++ b/VadereSimulator/tests/org/vadere/simulator/dataprocessing/TestOutputFile.java @@ -1,6 +1,7 @@ package org.vadere.simulator.dataprocessing; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; import java.util.ArrayList; @@ -15,7 +16,7 @@ import org.vadere.simulator.projects.dataprocessing.outputfile.OutputFile; import org.vadere.simulator.projects.io.JsonConverter; import org.vadere.util.io.IOUtils; -public class TestOutputFileAfterMultipleRuns { +public class TestOutputFile { private Scenario testScenario; private MainModel mainModel; @@ -47,12 +48,31 @@ public class TestOutputFileAfterMultipleRuns { .createProcessorManager(mainModel); manager.initOutputFiles(); List> outputFiles = testScenario.getDataProcessingJsonManager().getOutputFiles(); - outputFiles.forEach(f -> headerAfterFirstRun.add(f.getHeader())); + outputFiles.forEach(f -> headerAfterFirstRun.add(f.getHeaderLine())); manager.initOutputFiles(); - outputFiles.forEach(f -> headerAfterSecondRun.add(f.getHeader())); + outputFiles.forEach(f -> headerAfterSecondRun.add(f.getHeaderLine())); assertEquals("Duplicated Processors in OutputFile after multiple Simulations", headerAfterFirstRun, headerAfterSecondRun); } + + @Test + public void testHandlingNameConflict(){ + ProcessorManager manager = testScenario.getDataProcessingJsonManager() + .createProcessorManager(mainModel); + manager.initOutputFiles(); + + List header = testScenario.getDataProcessingJsonManager().getOutputFiles().get(0).getEntireHeader(); + + //Note these fail if the name conflict is handled differently, for now hard coded. + assertTrue(header.contains("timeStep")); + assertTrue(header.contains("pedestrianId")); + assertTrue(header.contains("x-Proc1")); + assertTrue(header.contains("y-Proc1")); + assertTrue(header.contains("x-Proc2")); + assertTrue(header.contains("y-Proc2")); + } + + } diff --git a/VadereUtils/src/org/vadere/util/geometry/shapes/VPolygon.java b/VadereUtils/src/org/vadere/util/geometry/shapes/VPolygon.java index 8e299f4b48c75d339199644c6f779dd86294cf97..52240c641f436ee86b6d5c5f619e8eb620cac429 100644 --- a/VadereUtils/src/org/vadere/util/geometry/shapes/VPolygon.java +++ b/VadereUtils/src/org/vadere/util/geometry/shapes/VPolygon.java @@ -213,9 +213,9 @@ public class VPolygon extends Path2D.Double implements VShape { public boolean intersectsRectangleLine(final VRectangle rectangle) { return intersects(new VLine(rectangle.getMinX(), rectangle.getMinY(), rectangle.getMaxX(), rectangle.getMinY())) - || intersects(new VLine(rectangle.getMaxX(), rectangle.getMinY(), rectangle.getMaxX(), rectangle.getMaxY())) - || intersects(new VLine(rectangle.getMaxX(), rectangle.getMaxY(), rectangle.getMinX(), rectangle.getMaxY())) - || intersects(new VLine(rectangle.getMinX(), rectangle.getMaxY(), rectangle.getMinX(), rectangle.getMinY())); + || intersects(new VLine(rectangle.getMaxX(), rectangle.getMinY(), rectangle.getMaxX(), rectangle.getMaxY())) + || intersects(new VLine(rectangle.getMaxX(), rectangle.getMaxY(), rectangle.getMinX(), rectangle.getMaxY())) + || intersects(new VLine(rectangle.getMinX(), rectangle.getMaxY(), rectangle.getMinX(), rectangle.getMinY())); } public double getArea() {