diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 474c53e..33f254f 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -29,6 +29,7 @@ jobs: uses: ./actions/yaml/lint with: python-version: 3.8 + targets: ./assets run-js-tests: runs-on: ubuntu-latest diff --git a/assets/subworkflows/vasp/band_gap.yml b/assets/subworkflows/vasp/band_gap.yml index 422fb7e..72c7ee2 100644 --- a/assets/subworkflows/vasp/band_gap.yml +++ b/assets/subworkflows/vasp/band_gap.yml @@ -1,10 +1,13 @@ application: name: vasp version: 5.3.5 -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Band Gap units: - config: diff --git a/assets/subworkflows/vasp/band_structure.yml b/assets/subworkflows/vasp/band_structure.yml index 28d5cdb..2d7af4e 100644 --- a/assets/subworkflows/vasp/band_structure.yml +++ b/assets/subworkflows/vasp/band_structure.yml @@ -1,10 +1,13 @@ application: name: vasp version: 5.3.5 -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Band Structure units: - config: diff --git a/assets/subworkflows/vasp/band_structure_dos.yml b/assets/subworkflows/vasp/band_structure_dos.yml index 055ef6d..b95c581 100644 --- a/assets/subworkflows/vasp/band_structure_dos.yml +++ b/assets/subworkflows/vasp/band_structure_dos.yml @@ -1,10 +1,13 @@ application: name: vasp version: 5.3.5 -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Band Structure + Density of States units: - config: diff --git a/assets/subworkflows/vasp/dos.yml b/assets/subworkflows/vasp/dos.yml index 474ba7f..92eccb7 100644 --- a/assets/subworkflows/vasp/dos.yml +++ b/assets/subworkflows/vasp/dos.yml @@ -1,10 +1,13 @@ application: name: vasp version: 5.3.5 -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Density of States units: - config: diff --git a/assets/subworkflows/vasp/fixed_cell_relaxation.yml b/assets/subworkflows/vasp/fixed_cell_relaxation.yml index d701e79..cd780f0 100644 --- a/assets/subworkflows/vasp/fixed_cell_relaxation.yml +++ b/assets/subworkflows/vasp/fixed_cell_relaxation.yml @@ -1,10 +1,13 @@ application: name: vasp version: 5.3.5 -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Fixed-cell Relaxation units: - config: diff --git a/assets/subworkflows/vasp/initial_final_total_energies.yml b/assets/subworkflows/vasp/initial_final_total_energies.yml index aa6a75f..f51825a 100644 --- a/assets/subworkflows/vasp/initial_final_total_energies.yml +++ b/assets/subworkflows/vasp/initial_final_total_energies.yml @@ -5,10 +5,13 @@ config: isMultiMaterial: true functions: setDefaultCompute: null -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Initial/Final Total Energies units: - config: diff --git a/assets/subworkflows/vasp/neb_subworkflow.yml b/assets/subworkflows/vasp/neb_subworkflow.yml index e175b29..acc872a 100644 --- a/assets/subworkflows/vasp/neb_subworkflow.yml +++ b/assets/subworkflows/vasp/neb_subworkflow.yml @@ -3,10 +3,13 @@ application: version: 5.3.5 config: isMultiMaterial: true -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Nudged Elastic Band (NEB) units: - config: diff --git a/assets/subworkflows/vasp/recalculate_bands.yml b/assets/subworkflows/vasp/recalculate_bands.yml index 53b3b21..7ca1d8d 100644 --- a/assets/subworkflows/vasp/recalculate_bands.yml +++ b/assets/subworkflows/vasp/recalculate_bands.yml @@ -1,10 +1,13 @@ application: name: vasp version: 5.3.5 -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Recalculate Bands units: - config: diff --git a/assets/subworkflows/vasp/surface_energy.yml b/assets/subworkflows/vasp/surface_energy.yml index d281ab3..3987e60 100644 --- a/assets/subworkflows/vasp/surface_energy.yml +++ b/assets/subworkflows/vasp/surface_energy.yml @@ -3,10 +3,13 @@ application: version: 5.3.5 dynamicSubworkflow: name: surfaceEnergy -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Surface Energy units: - config: diff --git a/assets/subworkflows/vasp/total_energy.yml b/assets/subworkflows/vasp/total_energy.yml index df1ec33..964444f 100644 --- a/assets/subworkflows/vasp/total_energy.yml +++ b/assets/subworkflows/vasp/total_energy.yml @@ -1,10 +1,13 @@ application: name: vasp version: 5.3.5 -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Total Energy units: - config: diff --git a/assets/subworkflows/vasp/variable_cell_relaxation.yml b/assets/subworkflows/vasp/variable_cell_relaxation.yml index ad9cf94..bfbb992 100644 --- a/assets/subworkflows/vasp/variable_cell_relaxation.yml +++ b/assets/subworkflows/vasp/variable_cell_relaxation.yml @@ -3,10 +3,13 @@ application: version: 5.3.5 config: systemName: vasp-variable-cell-relaxation -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Variable-cell Relaxation units: - config: diff --git a/assets/subworkflows/vasp/zero_point_energy.yml b/assets/subworkflows/vasp/zero_point_energy.yml index 678885a..cc2d000 100644 --- a/assets/subworkflows/vasp/zero_point_energy.yml +++ b/assets/subworkflows/vasp/zero_point_energy.yml @@ -1,10 +1,13 @@ application: name: vasp version: 5.3.5 -method: - name: PseudopotentialMethod model: name: DFTModel +method: + name: PseudopotentialMethod + config: + type: pseudopotential + subtype: paw name: Zero Point Energy units: - config: diff --git a/package-lock.json b/package-lock.json index 4611845..5224e92 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1465,9 +1465,8 @@ } }, "@exabyte-io/mode.js": { - "version": "2023.9.19-0", - "resolved": "https://registry.npmjs.org/@exabyte-io/mode.js/-/mode.js-2023.9.19-0.tgz", - "integrity": "sha512-MPgDjIr865j+fy3FDC2H2Pjhsz6uXlHk40f9iaveB5iNG/I1bOQHuBrbR2zk4n5r3owLdLnvIaQpVnDR9ulsCA==", + "version": "git+https://github.com/Exabyte-io/mode.js.git#8b3e5c5c9836a334a36ba7001ab06e5640eb7010", + "from": "git+https://github.com/Exabyte-io/mode.js.git#8b3e5c5c9836a334a36ba7001ab06e5640eb7010", "dev": true, "requires": { "@babel/cli": "7.16.0", @@ -1480,10 +1479,7 @@ "@babel/runtime-corejs3": "7.16.8", "ajv": "4.1.7", "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "mixwith": "^0.1.1", - "underscore": "^1.13.3", - "underscore.string": "^3.3.4" + "lodash": "^4.17.21" }, "dependencies": { "ajv": { @@ -1534,6 +1530,27 @@ } } }, + "@exabyte-io/prode.js": { + "version": "git+https://github.com/Exabyte-io/prode.js.git#6b2e55c442ae5faa990e1db2d89bec4061188cd8", + "from": "git+https://github.com/Exabyte-io/prode.js.git#6b2e55c442ae5faa990e1db2d89bec4061188cd8", + "dev": true, + "requires": { + "@babel/cli": "7.16.0", + "@babel/core": "7.16.0", + "@babel/eslint-parser": "7.16.3", + "@babel/plugin-proposal-class-properties": "7.16.0", + "@babel/preset-env": "7.16.4", + "@babel/preset-react": "7.16.7", + "@babel/register": "^7.16.0", + "@babel/runtime-corejs3": "7.16.8", + "lodash": "^4.17.21", + "mathjs": "^3.9.0", + "mixwith": "^0.1.1", + "moment": "^2.17.1", + "underscore": "^1.13.3", + "underscore.string": "^3.3.4" + } + }, "@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", diff --git a/package.json b/package.json index 727c8a8..f991e0c 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,8 @@ "@exabyte-io/eslint-config": "^2022.11.17-0", "@exabyte-io/ide.js": "2022.7.28-1", "@exabyte-io/made.js": "2023.3.8-0", - "@exabyte-io/mode.js": "2023.9.19-0", + "@exabyte-io/mode.js": "git+https://github.com/Exabyte-io/mode.js.git#8b3e5c5c9836a334a36ba7001ab06e5640eb7010", + "@exabyte-io/prode.js": "git+https://github.com/Exabyte-io/prode.js.git#6b2e55c442ae5faa990e1db2d89bec4061188cd8", "chai": "^4.3.4", "eslint": "7.32.0", "eslint-config-airbnb": "19.0.2", diff --git a/src/subworkflows/subworkflow.js b/src/subworkflows/subworkflow.js index 2784d5b..55df7d2 100644 --- a/src/subworkflows/subworkflow.js +++ b/src/subworkflows/subworkflow.js @@ -31,14 +31,15 @@ export class Subworkflow extends BaseSubworkflow { this._Application = Application; this._ModelFactory = ModelFactory; this._UnitFactory = UnitFactory; - this.initialize(); + this.initialize(config.extraConfig); } - initialize() { + initialize(extraConfig) { this._application = new this._Application(this.prop("application")); this._model = this._ModelFactory.create({ ...this.prop("model"), application: this.prop("application"), + extraConfig: { ...extraConfig, application: this.prop("application") }, }); this._units = setNextLinks(setUnitsHead(this.prop("units", [])), this.id).map((cfg) => this._UnitFactory.create( @@ -103,7 +104,12 @@ export class Subworkflow extends BaseSubworkflow { return this._application; } - setApplication(application) { + /** + * Set application and update dependencies. + * @param {Application} application - Application instance + * @param {Object} extraConfig - Object containing dependencies to construct method data. + */ + setApplication(application, extraConfig) { // TODO: adjust the logic above to take into account whether units need re-rendering after version change etc. // reset units if application name changes const previousApplicationName = this.application.name; @@ -124,6 +130,10 @@ export class Subworkflow extends BaseSubworkflow { this.setModel( this._ModelFactory.createFromApplication({ application: this.prop("application"), + extraConfig: { + ...extraConfig, + application: this.prop("application"), + }, }), ); } @@ -285,6 +295,13 @@ export class Subworkflow extends BaseSubworkflow { return this.model.method.data; } + initializeMethodData(extraConfig) { + const method = this.model?.method; + if (!method) return; + const cfg = { ...extraConfig, application: this.application, model: this.model }; + method.initializeData(cfg); + } + /** * @summary Calculates hash of the subworkflow. Meaningful fields are units, app and model. * units must be sorted topologically before hashing (already sorted). diff --git a/src/workflows/workflow.js b/src/workflows/workflow.js index 5ffaa40..66e5198 100644 --- a/src/workflows/workflow.js +++ b/src/workflows/workflow.js @@ -33,7 +33,7 @@ export class Workflow extends BaseWorkflow { this._UnitFactory = UnitFactory; this._Workflow = Workflow; this._MapUnit = MapUnit; - if (!config.skipInitialize) this.initialize(); + if (!config.skipInitialize) this.initialize(config.extraConfig); } // TODO: figure out how to avoid circular dependency on import in the platform webapp and re-enable or remove @@ -44,12 +44,16 @@ export class Workflow extends BaseWorkflow { // } // } - initialize() { + initialize(extraConfig) { const me = this; - this._subworkflows = this.prop("subworkflows").map((x) => new me._Subworkflow(x)); + this._subworkflows = this.prop("subworkflows").map( + (x) => new me._Subworkflow({ ...x, extraConfig }), + ); this._units = this.prop("units").map((unit) => me._UnitFactory.create(unit)); this._json.workflows = this._json.workflows || []; - this._workflows = this.prop("workflows").map((x) => new me._Workflow(x)); + this._workflows = this.prop("workflows").map( + (x) => new me._Workflow({ ...x, extraConfig }), + ); } static get defaultConfig() { @@ -347,4 +351,10 @@ export class Workflow extends BaseWorkflow { }; return calculateHashFromObject(meaningfulFields); } + + initializeMethodData(extraConfig) { + if (!extraConfig) return; + this.subworkflows.map((sw) => sw.initializeMethodData(extraConfig)); + this.workflows.map((wf) => wf.initializeMethodData(extraConfig)); + } }