Skip to content

Commit

Permalink
Merge branch 'master' into 169_duplicate_scenario
Browse files Browse the repository at this point in the history
  • Loading branch information
e-halinen authored Aug 17, 2023
2 parents 21b2ae7 + e05cded commit abc5c52
Show file tree
Hide file tree
Showing 16 changed files with 502 additions and 64 deletions.
84 changes: 75 additions & 9 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
"dependencies": {
"@electron/remote": "^2.0.8",
"babel-standalone": "^6.26.0",
"chart.js": "^4.3.0",
"dayjs": "^1.11.7",
"classnames": "^2.3.2",
"decompress": "^4.2.1",
"del": "^6.1.0",
"electron-dl": "^3.3.1",
Expand All @@ -29,6 +32,7 @@
"nugget": "^2.0.2",
"python-shell": "^3.0.1",
"react": "^18.1.0",
"react-chartjs-2": "^5.2.0",
"react-dom": "^18.1.0",
"uuid": "^9.0.0",
"vex-js": "^4.1.0"
Expand Down
6 changes: 6 additions & 0 deletions src/enums.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const SCENARIO_STATUS_STATE = {
STARTING: 'starting',
PREPARING: 'preparing',
RUNNING: 'running',
FINISHED: 'finished'
}
10 changes: 10 additions & 0 deletions src/renderer/components/App.css
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ hr {
.App__header {
display: flex;
align-items: center;
justify-content: flex-start;
height: 70px;
background-color: #007AC9;
background-image: url('pylvasdiagrammi_valkoinen.png'), url('hsl_logo_valkoinen.png');
Expand All @@ -110,3 +111,12 @@ hr {

.App__body {
}

.header-documentation-link {
margin-top: .4rem;
margin-left: 2rem;
}

.header-documentation-link:hover {
cursor: pointer;
}
3 changes: 2 additions & 1 deletion src/renderer/components/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import Store from 'electron-store';
import fs from "fs";

const homedir = require('os').homedir();
const {ipcRenderer} = require('electron');
const {ipcRenderer, shell} = require('electron');
const {execSync} = require('child_process');
const path = require('path');

Expand Down Expand Up @@ -180,6 +180,7 @@ const App = ({helmetUIVersion, versions, searchEMMEPython}) => {
<span className="App__header-title">Helmet 4.1</span>
&nbsp;
<span className="App__header-version">{`UI ${helmetUIVersion}`}</span>
<a className="header-documentation-link" target="_blank" onClick={() => shell.openExternal("https://hsldevcom.github.io/helmet-docs/")}> <DocumentationIcon/> </a>
</div>

{/* HELMET Project -specific content, including runtime- & per-scenario-settings */}
Expand Down
60 changes: 51 additions & 9 deletions src/renderer/components/HelmetProject/HelmetProject.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ const HelmetProject = ({
const [statusState, setStatusState] = useState(null);
const [statusLogfilePath, setStatusLogfilePath] = useState(null);
const [statusReadyScenariosLogfiles, setStatusReadyScenariosLogfiles] = useState([]); // [{name: .., logfile: ..}]
const [statusRunStartTime, setStatusRunStartTime] = useState(null); //Updated when receiving "starting" message
const [statusRunFinishTime, setStatusRunFinishTime] = useState(null); //Updated when receiving "finished" message
const [demandConvergenceArray, setDemandConvergenceArray] = useState([]); // Add convergence values to array every iteration

// Cost-Benefit Analysis (CBA) controls
const [cbaOptions, setCbaOptions] = useState({});
Expand Down Expand Up @@ -127,6 +130,13 @@ const HelmetProject = ({
use_fixed_transit_cost: false,
end_assignment_only: false,
iterations: 15,
overriddenProjectSettings: {
emmePythonPath: null,
helmetScriptsPath: null,
projectPath: null,
basedataPath: null,
resultsPath: null,
},
};
// Create the new scenario in "scenarios" array first
setScenarios(scenarios.concat(newScenario));
Expand Down Expand Up @@ -233,13 +243,14 @@ const HelmetProject = ({
ipcRenderer.send(
'message-from-ui-to-run-scenarios',
scenariosToRun.map((s) => {
// Run parameters per each run (enrich with global settings' paths to EMME python & HELMET model system)
// Run parameters per each run (enrich with global settings' paths to EMME python & HELMET model system

return {
...s,
emme_python_path: emmePythonPath,
helmet_scripts_path: helmetScriptsPath,
base_data_folder_path: basedataPath,
results_data_folder_path: resultsPath,
emme_python_path: s.overriddenProjectSettings.emmePythonPath !== null && s.overriddenProjectSettings.emmePythonPath !== emmePythonPath ? s.overriddenProjectSettings.emmePythonPath : emmePythonPath,
helmet_scripts_path: s.overriddenProjectSettings.helmetScriptsPath !== null && s.overriddenProjectSettings.helmetScriptsPath !== helmetScriptsPath ? s.overriddenProjectSettings.helmetScriptsPath : helmetScriptsPath,
base_data_folder_path: s.overriddenProjectSettings.basedataPath !== null && s.overriddenProjectSettings.basedataPath !== basedataPath ? s.overriddenProjectSettings.basedataPath : basedataPath,
results_data_folder_path: s.overriddenProjectSettings.resultsPath !== null && s.overriddenProjectSettings.resultsPath !== resultsPath ? s.overriddenProjectSettings.resultsPath : resultsPath,
log_level: 'DEBUG',
}
})
Expand Down Expand Up @@ -293,6 +304,11 @@ const HelmetProject = ({
});
};

const parseDemandConvergenceLogMessage = (message) => {
const stringMsgArray = message.split(' ');
return { iteration: stringMsgArray[stringMsgArray.length - 3], value: stringMsgArray[stringMsgArray.length - 1]};
};

// Electron IPC event listeners
const onLoggableEvent = (event, args) => {
setLogContents(previousLog => [...previousLog, args]);
Expand All @@ -304,11 +320,26 @@ const HelmetProject = ({
setStatusState(args.status['state']);
setStatusLogfilePath(args.status['log']);

if (args.status.state === 'finished') {
if (args.status.state === SCENARIO_STATUS_STATE.FINISHED) {
setStatusReadyScenariosLogfiles(statusReadyScenariosLogfiles.concat({
name: args.status.name,
logfile: args.status.log
logfile: args.status.log,
resultsPath: args.status.log.match(new RegExp('((?:[^/]*/)*)(.*)'))
}))
setStatusRunFinishTime(args.time);
}

if (args.status.state === SCENARIO_STATUS_STATE.STARTING) {
setStatusRunStartTime(args.time);
setStatusRunFinishTime(args.time);
setDemandConvergenceArray([]);
setStatusIterationsTotal(0);
}
}
if(args.level === 'INFO') {
if(args.message.includes('Demand model convergence in')) {
const currentDemandConvergenceValueAndIteration = parseDemandConvergenceLogMessage(args.message);
setDemandConvergenceArray(demandConvergenceArray => [...demandConvergenceArray, currentDemandConvergenceValueAndIteration ]);
}
}
};
Expand Down Expand Up @@ -356,10 +387,14 @@ const HelmetProject = ({
handleClickScenarioToActive={_handleClickScenarioToActive}
handleClickNewScenario={_handleClickNewScenario}
handleClickStartStop={_handleClickStartStop}
duplicateScenario={duplicateScenario}
statusIterationsTotal={statusIterationsTotal}
statusIterationsCompleted={statusIterationsCompleted}
statusReadyScenariosLogfiles={statusReadyScenariosLogfiles}
duplicateScenario={duplicateScenario}
statusRunStartTime={statusRunStartTime}
statusRunFinishTime={statusRunFinishTime}
statusState={statusState}
demandConvergenceArray={demandConvergenceArray}
/>
<CostBenefitAnalysis
resultsPath={resultsPath}
Expand Down Expand Up @@ -387,11 +422,18 @@ const HelmetProject = ({
updateScenario={_updateScenario}
closeScenario={() => setOpenScenarioID(null)}
existingOtherNames={scenarios.filter(s => s.id !== openScenarioID).map(s => s.name)}
inheritedGlobalProjectSettings={{
emmePythonPath,
helmetScriptsPath,
projectPath,
basedataPath,
resultsPath
}}
/>
:
""
}
</div>
</div>
)
};
};
Loading

0 comments on commit abc5c52

Please sign in to comment.