@mat3ra/wode 2025.10.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/.babelrc +17 -0
  2. package/LICENSE.md +15 -0
  3. package/README.md +164 -0
  4. package/assets/subworkflows/deepmd/deepmd.yml +31 -0
  5. package/assets/subworkflows/deepmd/espresso_cp_md.yml +16 -0
  6. package/assets/subworkflows/espresso/average_electrostatic_potential_find_minima.yml +27 -0
  7. package/assets/subworkflows/espresso/average_electrostatic_potential_via_band_structure.yml +67 -0
  8. package/assets/subworkflows/espresso/band_gap.yml +21 -0
  9. package/assets/subworkflows/espresso/band_gap_hse_dos.yml +30 -0
  10. package/assets/subworkflows/espresso/band_structure.yml +26 -0
  11. package/assets/subworkflows/espresso/band_structure_dos.yml +34 -0
  12. package/assets/subworkflows/espresso/band_structure_hse.yml +30 -0
  13. package/assets/subworkflows/espresso/band_structure_magn.yml +31 -0
  14. package/assets/subworkflows/espresso/band_structure_soc.yml +30 -0
  15. package/assets/subworkflows/espresso/dielectric_tensor.yml +35 -0
  16. package/assets/subworkflows/espresso/dos.yml +24 -0
  17. package/assets/subworkflows/espresso/electronic_density_mesh.yml +19 -0
  18. package/assets/subworkflows/espresso/esm.yml +14 -0
  19. package/assets/subworkflows/espresso/esm_relax.yml +14 -0
  20. package/assets/subworkflows/espresso/espresso_extract_kpoints.yml +16 -0
  21. package/assets/subworkflows/espresso/espresso_xml_get_qpt_irr.yml +12 -0
  22. package/assets/subworkflows/espresso/fixed_cell_relaxation.yml +16 -0
  23. package/assets/subworkflows/espresso/gw_band_structure_band_gap_full_frequency.yml +22 -0
  24. package/assets/subworkflows/espresso/gw_band_structure_band_gap_plasmon_pole.yml +22 -0
  25. package/assets/subworkflows/espresso/hubbard_u_hp.yml +21 -0
  26. package/assets/subworkflows/espresso/kpoint_convergence.yml +86 -0
  27. package/assets/subworkflows/espresso/neb.yml +16 -0
  28. package/assets/subworkflows/espresso/ph_init_qpoints.yml +14 -0
  29. package/assets/subworkflows/espresso/ph_single_irr_qpt.yml +14 -0
  30. package/assets/subworkflows/espresso/phonon_dispersions.yml +29 -0
  31. package/assets/subworkflows/espresso/phonon_dos.yml +29 -0
  32. package/assets/subworkflows/espresso/phonon_dos_dispersion.yml +34 -0
  33. package/assets/subworkflows/espresso/phonon_reduce.yml +29 -0
  34. package/assets/subworkflows/espresso/post_processor.yml +14 -0
  35. package/assets/subworkflows/espresso/pre_processor.yml +14 -0
  36. package/assets/subworkflows/espresso/pw_scf.yml +16 -0
  37. package/assets/subworkflows/espresso/recalculate_bands.yml +19 -0
  38. package/assets/subworkflows/espresso/surface_energy.yml +16 -0
  39. package/assets/subworkflows/espresso/total_energy.yml +16 -0
  40. package/assets/subworkflows/espresso/valence_band_offset_calc_from_previous_esp_vbm.yml +35 -0
  41. package/assets/subworkflows/espresso/variable_cell_relaxation.yml +18 -0
  42. package/assets/subworkflows/espresso/zero_point_energy.yml +19 -0
  43. package/assets/subworkflows/jupyterLab/jupyter_notebook.yml +17 -0
  44. package/assets/subworkflows/nwchem/total_energy.yml +16 -0
  45. package/assets/subworkflows/python/ml/classification_tail.yml +56 -0
  46. package/assets/subworkflows/python/ml/clustering_tail.yml +62 -0
  47. package/assets/subworkflows/python/ml/regression_tail.yml +56 -0
  48. package/assets/subworkflows/python/ml/train_head.yml +61 -0
  49. package/assets/subworkflows/python/python_script.yml +14 -0
  50. package/assets/subworkflows/shell/batch_espresso_pwscf.yml +14 -0
  51. package/assets/subworkflows/shell/hello_world.yml +14 -0
  52. package/assets/subworkflows/vasp/band_gap.yml +21 -0
  53. package/assets/subworkflows/vasp/band_structure.yml +21 -0
  54. package/assets/subworkflows/vasp/band_structure_dos.yml +23 -0
  55. package/assets/subworkflows/vasp/dos.yml +18 -0
  56. package/assets/subworkflows/vasp/fixed_cell_relaxation.yml +16 -0
  57. package/assets/subworkflows/vasp/initial_final_total_energies.yml +25 -0
  58. package/assets/subworkflows/vasp/kpoint_convergence.yml +89 -0
  59. package/assets/subworkflows/vasp/neb_subworkflow.yml +16 -0
  60. package/assets/subworkflows/vasp/prepare_images.yml +16 -0
  61. package/assets/subworkflows/vasp/recalculate_bands.yml +16 -0
  62. package/assets/subworkflows/vasp/surface_energy.yml +18 -0
  63. package/assets/subworkflows/vasp/total_energy.yml +16 -0
  64. package/assets/subworkflows/vasp/variable_cell_relaxation.yml +18 -0
  65. package/assets/subworkflows/vasp/zero_point_energy.yml +16 -0
  66. package/assets/workflows/deepmd/deepmd_md.yml +6 -0
  67. package/assets/workflows/espresso/band_gap.yml +4 -0
  68. package/assets/workflows/espresso/band_gap_dos_hse.yml +4 -0
  69. package/assets/workflows/espresso/band_structure.yml +4 -0
  70. package/assets/workflows/espresso/band_structure_dos.yml +4 -0
  71. package/assets/workflows/espresso/band_structure_hse.yml +14 -0
  72. package/assets/workflows/espresso/band_structure_magn.yml +7 -0
  73. package/assets/workflows/espresso/band_structure_soc.yml +7 -0
  74. package/assets/workflows/espresso/dielectric_tensor.yml +4 -0
  75. package/assets/workflows/espresso/dos.yml +4 -0
  76. package/assets/workflows/espresso/electronic_density_mesh.yml +4 -0
  77. package/assets/workflows/espresso/esm.yml +4 -0
  78. package/assets/workflows/espresso/esm_relax.yml +4 -0
  79. package/assets/workflows/espresso/fixed_cell_relaxation.yml +4 -0
  80. package/assets/workflows/espresso/gw_band_structure_band_gap_full_frequency.yml +4 -0
  81. package/assets/workflows/espresso/gw_band_structure_band_gap_plasmon_pole.yml +4 -0
  82. package/assets/workflows/espresso/hubbard_u_hp.yml +7 -0
  83. package/assets/workflows/espresso/kpoint_convergence.yml +4 -0
  84. package/assets/workflows/espresso/neb.yml +4 -0
  85. package/assets/workflows/espresso/phonon_dispersions.yml +4 -0
  86. package/assets/workflows/espresso/phonon_dos.yml +4 -0
  87. package/assets/workflows/espresso/phonon_dos_dispersion.yml +4 -0
  88. package/assets/workflows/espresso/phonon_map.yml +28 -0
  89. package/assets/workflows/espresso/recalculate_bands.yml +4 -0
  90. package/assets/workflows/espresso/surface_energy.yml +4 -0
  91. package/assets/workflows/espresso/total_energy.yml +4 -0
  92. package/assets/workflows/espresso/valence_band_offset.yml +171 -0
  93. package/assets/workflows/espresso/variable_cell_relaxation.yml +4 -0
  94. package/assets/workflows/espresso/zero_point_energy.yml +4 -0
  95. package/assets/workflows/jupyterLab/jupyter_notebook.yml +4 -0
  96. package/assets/workflows/nwchem/total_energy.yml +4 -0
  97. package/assets/workflows/python/ml/classification_workflow.yml +9 -0
  98. package/assets/workflows/python/ml/clustering_workflow.yml +9 -0
  99. package/assets/workflows/python/ml/regression_workflow.yml +9 -0
  100. package/assets/workflows/python/python_script.yml +4 -0
  101. package/assets/workflows/shell/batch_espresso_pwscf.yml +4 -0
  102. package/assets/workflows/shell/hello_world.yml +4 -0
  103. package/assets/workflows/vasp/band_gap.yml +4 -0
  104. package/assets/workflows/vasp/band_structure.yml +4 -0
  105. package/assets/workflows/vasp/band_structure_dos.yml +4 -0
  106. package/assets/workflows/vasp/dos.yml +4 -0
  107. package/assets/workflows/vasp/fixed_cell_relaxation.yml +4 -0
  108. package/assets/workflows/vasp/kpoint_convergence.yml +4 -0
  109. package/assets/workflows/vasp/neb.yml +8 -0
  110. package/assets/workflows/vasp/recalculate_bands.yml +4 -0
  111. package/assets/workflows/vasp/surface_energy.yml +4 -0
  112. package/assets/workflows/vasp/total_energy.yml +4 -0
  113. package/assets/workflows/vasp/variable_cell_relaxation.yml +4 -0
  114. package/assets/workflows/vasp/zero_point_energy.yml +4 -0
  115. package/build_workflows.js +65 -0
  116. package/dist/context/context.js +49 -0
  117. package/dist/context/mixins/ApplicationContextMixin.js +19 -0
  118. package/dist/context/mixins/JobContextMixin.js +39 -0
  119. package/dist/context/mixins/MaterialContextMixin.js +40 -0
  120. package/dist/context/mixins/MaterialsContextMixin.js +19 -0
  121. package/dist/context/mixins/MaterialsSetContextMixin.js +25 -0
  122. package/dist/context/mixins/MethodDataContextMixin.js +48 -0
  123. package/dist/context/mixins/WorkflowContextMixin.js +28 -0
  124. package/dist/context/providers/BoundaryConditionsFormDataProvider.js +86 -0
  125. package/dist/context/providers/CollinearMagnetizationContextProvider.js +113 -0
  126. package/dist/context/providers/HubbardContextProviderLegacy.js +81 -0
  127. package/dist/context/providers/HubbardJContextProvider.js +74 -0
  128. package/dist/context/providers/HubbardUContextProvider.js +77 -0
  129. package/dist/context/providers/HubbardVContextProvider.js +104 -0
  130. package/dist/context/providers/IonDynamicsContextProvider.js +62 -0
  131. package/dist/context/providers/MLSettingsContextProvider.js +52 -0
  132. package/dist/context/providers/MLTrainTestSplitContextProvider.js +48 -0
  133. package/dist/context/providers/NEBFormDataProvider.js +38 -0
  134. package/dist/context/providers/NonCollinearMagnetizationContextProvider.js +253 -0
  135. package/dist/context/providers/PlanewaveCutoffsContextProvider.js +67 -0
  136. package/dist/context/providers/PointsGridFormDataProvider.js +272 -0
  137. package/dist/context/providers/PointsPathFormDataProvider.js +155 -0
  138. package/dist/context/providers/by_application/ExecutableContextProvider.js +17 -0
  139. package/dist/context/providers/by_application/espresso/QENEBContextProvider.js +60 -0
  140. package/dist/context/providers/by_application/espresso/QEPWXContextProvider.js +149 -0
  141. package/dist/context/providers/by_application/nwchem/NWChemTotalEnergyContextProvider.js +84 -0
  142. package/dist/context/providers/by_application/vasp/VASPContextProvider.js +64 -0
  143. package/dist/context/providers/by_application/vasp/VASPNEBContextProvider.js +56 -0
  144. package/dist/context/providers/settings.js +37 -0
  145. package/dist/context/providers.js +199 -0
  146. package/dist/enums.js +65 -0
  147. package/dist/index.js +64 -0
  148. package/dist/patch.js +19 -0
  149. package/dist/subworkflows/convergence/factory.js +35 -0
  150. package/dist/subworkflows/convergence/non_uniform_kgrid.js +31 -0
  151. package/dist/subworkflows/convergence/parameter.js +70 -0
  152. package/dist/subworkflows/convergence/uniform_kgrid.js +26 -0
  153. package/dist/subworkflows/convergence.js +189 -0
  154. package/dist/subworkflows/create.js +285 -0
  155. package/dist/subworkflows/dynamic/espresso/getQpointIrrep.js +34 -0
  156. package/dist/subworkflows/dynamic/index.js +19 -0
  157. package/dist/subworkflows/dynamic/surfaceEnergy.js +67 -0
  158. package/dist/subworkflows/index.js +19 -0
  159. package/dist/subworkflows/subworkflow.js +279 -0
  160. package/dist/units/assertion.js +37 -0
  161. package/dist/units/assignment.js +42 -0
  162. package/dist/units/base.js +91 -0
  163. package/dist/units/builders/AssertionUnitConfigBuilder.js +34 -0
  164. package/dist/units/builders/AssignmentUnitConfigBuilder.js +41 -0
  165. package/dist/units/builders/ExecutionUnitConfigBuilder.js +67 -0
  166. package/dist/units/builders/IOUnitConfigBuilder.js +54 -0
  167. package/dist/units/builders/UnitConfigBuilder.js +79 -0
  168. package/dist/units/builders/index.js +18 -0
  169. package/dist/units/condition.js +52 -0
  170. package/dist/units/execution.js +222 -0
  171. package/dist/units/factory.js +53 -0
  172. package/dist/units/index.js +82 -0
  173. package/dist/units/io.js +148 -0
  174. package/dist/units/map.js +38 -0
  175. package/dist/units/processing.js +41 -0
  176. package/dist/units/reduce.js +24 -0
  177. package/dist/units/subworkflow.js +23 -0
  178. package/dist/utils.js +92 -0
  179. package/dist/workflows/create.js +312 -0
  180. package/dist/workflows/default.js +41 -0
  181. package/dist/workflows/index.js +108 -0
  182. package/dist/workflows/relaxation.js +37 -0
  183. package/dist/workflows/workflow.js +303 -0
  184. package/package.json +94 -0
  185. package/src/context/context.js +47 -0
  186. package/src/context/mixins/ApplicationContextMixin.js +19 -0
  187. package/src/context/mixins/JobContextMixin.js +36 -0
  188. package/src/context/mixins/MaterialContextMixin.js +41 -0
  189. package/src/context/mixins/MaterialsContextMixin.js +18 -0
  190. package/src/context/mixins/MaterialsSetContextMixin.js +24 -0
  191. package/src/context/mixins/MethodDataContextMixin.js +48 -0
  192. package/src/context/mixins/WorkflowContextMixin.js +25 -0
  193. package/src/context/providers/BoundaryConditionsFormDataProvider.js +80 -0
  194. package/src/context/providers/CollinearMagnetizationContextProvider.js +117 -0
  195. package/src/context/providers/HubbardContextProviderLegacy.js +75 -0
  196. package/src/context/providers/HubbardJContextProvider.js +73 -0
  197. package/src/context/providers/HubbardUContextProvider.js +100 -0
  198. package/src/context/providers/HubbardVContextProvider.js +111 -0
  199. package/src/context/providers/IonDynamicsContextProvider.js +56 -0
  200. package/src/context/providers/MLSettingsContextProvider.js +48 -0
  201. package/src/context/providers/MLTrainTestSplitContextProvider.js +45 -0
  202. package/src/context/providers/NEBFormDataProvider.js +32 -0
  203. package/src/context/providers/NonCollinearMagnetizationContextProvider.js +269 -0
  204. package/src/context/providers/PlanewaveCutoffsContextProvider.js +68 -0
  205. package/src/context/providers/PointsGridFormDataProvider.js +285 -0
  206. package/src/context/providers/PointsPathFormDataProvider.js +165 -0
  207. package/src/context/providers/by_application/ExecutableContextProvider.js +10 -0
  208. package/src/context/providers/by_application/espresso/QENEBContextProvider.js +56 -0
  209. package/src/context/providers/by_application/espresso/QEPWXContextProvider.js +166 -0
  210. package/src/context/providers/by_application/nwchem/NWChemTotalEnergyContextProvider.js +86 -0
  211. package/src/context/providers/by_application/vasp/VASPContextProvider.js +56 -0
  212. package/src/context/providers/by_application/vasp/VASPNEBContextProvider.js +46 -0
  213. package/src/context/providers/settings.js +38 -0
  214. package/src/context/providers.js +140 -0
  215. package/src/enums.js +65 -0
  216. package/src/index.js +17 -0
  217. package/src/patch.js +12 -0
  218. package/src/subworkflows/convergence/factory.js +14 -0
  219. package/src/subworkflows/convergence/non_uniform_kgrid.js +28 -0
  220. package/src/subworkflows/convergence/parameter.js +58 -0
  221. package/src/subworkflows/convergence/uniform_kgrid.js +22 -0
  222. package/src/subworkflows/convergence.js +196 -0
  223. package/src/subworkflows/create.js +201 -0
  224. package/src/subworkflows/dynamic/espresso/getQpointIrrep.js +35 -0
  225. package/src/subworkflows/dynamic/index.js +8 -0
  226. package/src/subworkflows/dynamic/surfaceEnergy.js +124 -0
  227. package/src/subworkflows/index.js +2 -0
  228. package/src/subworkflows/subworkflow.js +329 -0
  229. package/src/units/assertion.js +29 -0
  230. package/src/units/assignment.js +34 -0
  231. package/src/units/base.js +97 -0
  232. package/src/units/builders/AssertionUnitConfigBuilder.js +28 -0
  233. package/src/units/builders/AssignmentUnitConfigBuilder.js +36 -0
  234. package/src/units/builders/ExecutionUnitConfigBuilder.js +59 -0
  235. package/src/units/builders/IOUnitConfigBuilder.js +53 -0
  236. package/src/units/builders/UnitConfigBuilder.js +86 -0
  237. package/src/units/builders/index.js +15 -0
  238. package/src/units/condition.js +47 -0
  239. package/src/units/execution.js +263 -0
  240. package/src/units/factory.js +53 -0
  241. package/src/units/index.js +25 -0
  242. package/src/units/io.js +163 -0
  243. package/src/units/map.js +33 -0
  244. package/src/units/processing.js +39 -0
  245. package/src/units/reduce.js +17 -0
  246. package/src/units/subworkflow.js +15 -0
  247. package/src/utils.js +73 -0
  248. package/src/workflows/create.js +222 -0
  249. package/src/workflows/default.js +39 -0
  250. package/src/workflows/index.js +99 -0
  251. package/src/workflows/relaxation.js +41 -0
  252. package/src/workflows/workflow.js +351 -0
@@ -0,0 +1,303 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Workflow = void 0;
7
+ var _ide = require("@exabyte-io/ide.js");
8
+ var _mode = require("@exabyte-io/mode.js");
9
+ var _entity = require("@mat3ra/code/dist/js/entity");
10
+ var _workflow = _interopRequireDefault(require("@mat3ra/esse/dist/js/schema/workflow.json"));
11
+ var _utils = require("@mat3ra/utils");
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+ var _mixwith = require("mixwith");
14
+ var _underscore = _interopRequireDefault(require("underscore"));
15
+ var _underscore2 = _interopRequireDefault(require("underscore.string"));
16
+ var _enums = require("../enums");
17
+ var _subworkflow = require("../subworkflows/subworkflow");
18
+ var _units = require("../units");
19
+ var _factory = require("../units/factory");
20
+ var _utils2 = require("../utils");
21
+ var _default = _interopRequireDefault(require("./default"));
22
+ var _relaxation = require("./relaxation");
23
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
25
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
26
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* eslint-disable max-classes-per-file */
27
+ const {
28
+ MODEL_NAMES
29
+ } = _mode.tree;
30
+ class BaseWorkflow extends (0, _mixwith.mix)(_entity.NamedDefaultableRepetitionContextAndRenderInMemoryEntity).with(_ide.ComputedEntityMixin, _relaxation.RelaxationLogicMixin) {}
31
+ class Workflow extends BaseWorkflow {
32
+ constructor(config) {
33
+ if (!config._id) config._id = Workflow.generateWorkflowId(config.name);
34
+ super(config);
35
+ this._Subworkflow = _subworkflow.Subworkflow;
36
+ this._UnitFactory = _factory.UnitFactory;
37
+ this._Workflow = Workflow;
38
+ this._MapUnit = _units.MapUnit;
39
+ if (!config.skipInitialize) this.initialize();
40
+ }
41
+ initialize() {
42
+ const me = this;
43
+ this._subworkflows = this.prop("subworkflows").map(x => new me._Subworkflow(x));
44
+ this._units = this.prop("units").map(unit => me._UnitFactory.create(unit));
45
+ this._json.workflows = this._json.workflows || [];
46
+ this._workflows = this.prop("workflows").map(x => new me._Workflow(x));
47
+ }
48
+ static get defaultConfig() {
49
+ return _default.default;
50
+ }
51
+ static generateWorkflowId(...args) {
52
+ args[0] = `workflow-${args[0]}`;
53
+ if (this.usePredefinedIds) return _utils.Utils.uuid.getUUIDFromNamespace(...args);
54
+ return _utils.Utils.uuid.getUUID();
55
+ }
56
+ static fromSubworkflow(subworkflow, ClsConstructor = Workflow) {
57
+ const config = {
58
+ name: subworkflow.name,
59
+ subworkflows: [subworkflow.toJSON()],
60
+ units: (0, _utils2.setNextLinks)((0, _utils2.setUnitsHead)([subworkflow.getAsUnit().toJSON()])),
61
+ properties: subworkflow.properties
62
+ };
63
+ return new ClsConstructor(config);
64
+ }
65
+ static fromSubworkflows(name, ClsConstructor = Workflow, ...subworkflows) {
66
+ return new ClsConstructor(name, subworkflows, subworkflows.map(sw => sw.getAsUnit()));
67
+ }
68
+
69
+ /**
70
+ * @summary Adds subworkflow to current workflow.
71
+ * @param subworkflow {Subworkflow}
72
+ * @param head {Boolean}
73
+ */
74
+ addSubworkflow(subworkflow, head = false, index = -1) {
75
+ const subworkflowUnit = subworkflow.getAsUnit();
76
+ if (head) {
77
+ this.subworkflows.unshift(subworkflow);
78
+ this.addUnit(subworkflowUnit, head, index);
79
+ } else {
80
+ this.subworkflows.push(subworkflow);
81
+ this.addUnit(subworkflowUnit, head, index);
82
+ }
83
+ }
84
+ removeSubworkflow(id) {
85
+ const subworkflowUnit = this.units.find(u => u.id === id);
86
+ if (subworkflowUnit) this.removeUnit(subworkflowUnit.flowchartId);
87
+ }
88
+ subworkflowId(index) {
89
+ const sw = this.prop(`subworkflows[${index}]`);
90
+ return sw ? sw._id : null;
91
+ }
92
+ replaceSubworkflowAtIndex(index, newSubworkflow) {
93
+ this._subworkflows[index] = newSubworkflow;
94
+ this.setUnits((0, _utils2.setNextLinks)((0, _utils2.setUnitsHead)(this._units)));
95
+ }
96
+ get units() {
97
+ return this._units;
98
+ }
99
+ setUnits(arr) {
100
+ this._units = arr;
101
+ }
102
+
103
+ // returns a list of `app` Classes
104
+ get usedApplications() {
105
+ const swApplications = this.subworkflows.map(sw => sw.application);
106
+ const wfApplications = _lodash.default.flatten(this.workflows.map(w => w.usedApplications));
107
+ return _lodash.default.uniqBy(swApplications.concat(wfApplications), a => a.name);
108
+ }
109
+
110
+ // return application names
111
+ get usedApplicationNames() {
112
+ return this.usedApplications.map(a => a.name);
113
+ }
114
+ get usedApplicationVersions() {
115
+ return this.usedApplications.map(a => a.version);
116
+ }
117
+ get usedApplicationNamesWithVersions() {
118
+ return this.usedApplications.map(a => `${a.name} ${a.version}`);
119
+ }
120
+ get usedModels() {
121
+ return _lodash.default.uniq(this.subworkflows.map(sw => sw.model.type));
122
+ }
123
+ get humanReadableUsedModels() {
124
+ return this.usedModels.filter(m => m !== "unknown").map(m => MODEL_NAMES[m]);
125
+ }
126
+ toJSON(exclude = []) {
127
+ return _lodash.default.omit({
128
+ ...super.toJSON(),
129
+ units: this._units.map(x => x.toJSON()),
130
+ subworkflows: this._subworkflows.map(x => x.toJSON()),
131
+ workflows: this.workflows.map(x => x.toJSON()),
132
+ ...(this.compute ? {
133
+ compute: this.compute
134
+ } : {}) // {"compute": null } won't pass esse validation
135
+ }, exclude);
136
+ }
137
+ get isDefault() {
138
+ return this.prop("isDefault", false);
139
+ }
140
+ get isMultiMaterial() {
141
+ const fromSubworkflows = this.subworkflows.some(sw => sw.isMultiMaterial);
142
+ return this.prop("isMultiMaterial") || fromSubworkflows;
143
+ }
144
+ set isMultiMaterial(value) {
145
+ this.setProp("isMultiMaterial", value);
146
+ }
147
+ set isUsingDataset(value) {
148
+ this.setProp("isUsingDataset", value);
149
+ }
150
+ get isUsingDataset() {
151
+ return !!this.prop("isUsingDataset", false);
152
+ }
153
+ get properties() {
154
+ return _lodash.default.uniq(_lodash.default.flatten(this._subworkflows.map(x => x.properties)));
155
+ }
156
+ get humanReadableProperties() {
157
+ return this.properties.map(name => _underscore2.default.humanize(name));
158
+ }
159
+ get systemName() {
160
+ return _underscore2.default.slugify(`${this.usedApplicationNames.join(":")}-${this.name.toLowerCase()}`);
161
+ }
162
+ get defaultDescription() {
163
+ return `${this.usedModels.join(", ").toUpperCase()} workflow using ${this.usedApplicationNames.join(", ")}.`;
164
+ }
165
+ get exabyteId() {
166
+ return this.prop("exabyteId");
167
+ }
168
+ get hash() {
169
+ return this.prop("hash", "");
170
+ }
171
+ get isOutdated() {
172
+ return this.prop("isOutdated", false);
173
+ }
174
+ get history() {
175
+ return this.prop("history", []);
176
+ }
177
+ setMethodData(methodData) {
178
+ this.subworkflows.forEach(sw => {
179
+ const method = methodData.getMethodBySubworkflow(sw);
180
+ if (method) sw.model.setMethod(method);
181
+ });
182
+ this.workflows.forEach(wf => {
183
+ wf.subworkflows.forEach(sw => {
184
+ const method = methodData.getMethodBySubworkflow(sw);
185
+ if (method) sw.model.setMethod(method);
186
+ });
187
+ });
188
+ }
189
+
190
+ /**
191
+ * @param unit {Unit}
192
+ * @param head {Boolean}
193
+ * @param index {Number}
194
+ */
195
+ addUnit(unit, head = false, index = -1) {
196
+ const {
197
+ units
198
+ } = this;
199
+ if (units.length === 0) {
200
+ unit.head = true;
201
+ this.setUnits([unit]);
202
+ } else {
203
+ if (head) {
204
+ units.unshift(unit);
205
+ } else if (index >= 0) {
206
+ units.splice(index, 0, unit);
207
+ } else {
208
+ units.push(unit);
209
+ }
210
+ this.setUnits((0, _utils2.setNextLinks)((0, _utils2.setUnitsHead)(units)));
211
+ }
212
+ }
213
+ removeUnit(flowchartId) {
214
+ if (this.units.length < 2) return;
215
+ const unit = this.units.find(x => x.flowchartId === flowchartId);
216
+ const previousUnit = this.units.find(x => x.next === unit.flowchartId);
217
+ if (previousUnit) {
218
+ delete previousUnit.next;
219
+ }
220
+ this._subworkflows = this._subworkflows.filter(x => x.id !== unit.id);
221
+ this._units = (0, _utils2.setNextLinks)((0, _utils2.setUnitsHead)(this._units.filter(x => x.flowchartId !== flowchartId)));
222
+ }
223
+
224
+ /**
225
+ * @return Subworkflow[]
226
+ */
227
+ get subworkflows() {
228
+ return this._subworkflows;
229
+ }
230
+ get workflows() {
231
+ return this._workflows;
232
+ }
233
+
234
+ /*
235
+ * @param type {String|Object} Unit type, map or subworkflow
236
+ * @param head {Boolean}
237
+ * @param index {Number} Index at which the unit will be added. -1 by default (ignored).
238
+ */
239
+ addUnitType(type, head = false, index = -1) {
240
+ switch (type) {
241
+ case _enums.UNIT_TYPES.map:
242
+ // eslint-disable-next-line no-case-declarations
243
+ const workflowConfig = _default.default;
244
+ // eslint-disable-next-line no-case-declarations
245
+ const mapUnit = new this._MapUnit();
246
+ workflowConfig._id = this._Workflow.generateWorkflowId(workflowConfig.name);
247
+ this.prop("workflows").push(workflowConfig);
248
+ this._workflows = this.prop("workflows").map(x => new this._Workflow(x));
249
+ mapUnit.setWorkflowId(workflowConfig._id);
250
+ this.addUnit(mapUnit, head, index);
251
+ break;
252
+ case _enums.UNIT_TYPES.subworkflow:
253
+ this.addSubworkflow(this._Subworkflow.createDefault(), head, index);
254
+ break;
255
+ default:
256
+ console.log(`unit_type=${type} unrecognized, skipping.`);
257
+ }
258
+ }
259
+ addMapUnit(mapUnit, mapWorkflow) {
260
+ const mapWorkflowConfig = mapWorkflow.toJSON();
261
+ if (!mapWorkflowConfig._id) mapWorkflowConfig._id = this._Workflow.generateWorkflowId(mapWorkflowConfig.name);
262
+ mapUnit.setWorkflowId(mapWorkflowConfig._id);
263
+ this.addUnit(mapUnit);
264
+ this._json.workflows.push(mapWorkflowConfig);
265
+ const me = this;
266
+ this._workflows = this.prop("workflows").map(x => new me._Workflow(x));
267
+ }
268
+ findSubworkflowById(id) {
269
+ if (!id) return;
270
+ const workflows = this.workflows || [];
271
+ const subworkflows = this.subworkflows || [];
272
+ const subworkflow = subworkflows.find(sw => sw.id === id);
273
+ if (subworkflow) return subworkflow;
274
+ const workflow = workflows.find(w => w.findSubworkflowById(id));
275
+ if (workflow) return workflow.findSubworkflowById(id);
276
+ console.warn("attempted to find a non-existing subworkflow");
277
+ }
278
+ get allSubworkflows() {
279
+ const subworkflowsList = [];
280
+ this.subworkflows.forEach(sw => subworkflowsList.push(sw));
281
+ this.workflows.forEach(workflow => {
282
+ return Array.prototype.push.apply(subworkflowsList, workflow.allSubworkflows);
283
+ });
284
+ return subworkflowsList;
285
+ }
286
+
287
+ /**
288
+ * @summary Calculates hash of the workflow. Meaningful fields are units and subworkflows.
289
+ * units and subworkflows must be sorted topologically before hashing (already sorted).
290
+ */
291
+ calculateHash() {
292
+ const meaningfulFields = {
293
+ units: _underscore.default.map(this.units, u => u.calculateHash()).join(),
294
+ subworkflows: _underscore.default.map(this.subworkflows, sw => sw.calculateHash()).join(),
295
+ workflows: _underscore.default.map(this.workflows, w => w.calculateHash()).join()
296
+ };
297
+ return _utils.Utils.hash.calculateHashFromObject(meaningfulFields);
298
+ }
299
+ }
300
+ exports.Workflow = Workflow;
301
+ _defineProperty(Workflow, "getDefaultComputeConfig", _ide.getDefaultComputeConfig);
302
+ _defineProperty(Workflow, "jsonSchema", _workflow.default);
303
+ _defineProperty(Workflow, "usePredefinedIds", false);
package/package.json ADDED
@@ -0,0 +1,94 @@
1
+ {
2
+ "name": "@mat3ra/wode",
3
+ "version": "2025.10.1-0",
4
+ "description": "WOrkflow DEfinitions",
5
+ "scripts": {
6
+ "test": "nyc --reporter=text mocha --recursive --bail --require @babel/register/lib --require tests/setup.js tests",
7
+ "lint": "eslint src tests && prettier --write src tests",
8
+ "lint:fix": "eslint --fix --cache src tests && prettier --write src tests",
9
+ "transpile": "babel --out-dir dist src",
10
+ "postinstall": "npm run transpile",
11
+ "prettier": "prettier --check src tests",
12
+ "prepare": "husky install || exit 0"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/Exabyte-io/wode.git"
17
+ },
18
+ "main": "dist/index.js",
19
+ "files": [
20
+ "/assets",
21
+ "/dist",
22
+ "/src",
23
+ ".babelrc",
24
+ "build_workflows.js"
25
+ ],
26
+ "author": "Exabyte Inc.",
27
+ "bugs": {
28
+ "url": "https://github.com/Exabyte-io/wode/issues"
29
+ },
30
+ "license": "Apache-2.0",
31
+ "homepage": "https://github.com/Exabyte-io/wode",
32
+ "dependencies": {
33
+ "@babel/cli": "7.16.0",
34
+ "@babel/core": "7.16.0",
35
+ "@babel/eslint-parser": "7.16.3",
36
+ "@babel/plugin-proposal-class-properties": "7.16.0",
37
+ "@babel/preset-env": "7.16.4",
38
+ "@babel/preset-react": "7.16.7",
39
+ "@babel/register": "^7.16.0",
40
+ "@babel/runtime-corejs3": "7.16.8",
41
+ "@exabyte-io/periodic-table.js": "2022.6.8-0",
42
+ "crypto-js": "^4.2.0",
43
+ "js-yaml": "^4.1.0",
44
+ "lodash": "^4.17.21",
45
+ "mixwith": "^0.1.1",
46
+ "underscore": "^1.13.3",
47
+ "underscore.string": "^3.3.4",
48
+ "v20": "^0.1.0"
49
+ },
50
+ "devDependencies": {
51
+ "@exabyte-io/ade.js": "2025.9.20-0",
52
+ "@exabyte-io/eslint-config": "2025.5.13-0",
53
+ "@exabyte-io/ide.js": "2024.3.26-0",
54
+ "@exabyte-io/mode.js": "2024.4.28-0",
55
+ "@mat3ra/utils": "2025.9.20-0",
56
+ "@mat3ra/code": "2025.7.15-0",
57
+ "@mat3ra/esse": "2025.7.15-0",
58
+ "@mat3ra/made": "2025.7.15-0",
59
+ "@mat3ra/standata": "2025.10.1-0",
60
+ "chai": "^4.3.4",
61
+ "eslint": "7.32.0",
62
+ "eslint-config-airbnb": "19.0.2",
63
+ "eslint-config-prettier": "^8.5.0",
64
+ "eslint-import-resolver-exports": "^1.0.0-beta.2",
65
+ "eslint-plugin-import": "2.25.3",
66
+ "eslint-plugin-jsdoc": "37.1.0",
67
+ "eslint-plugin-jsx-a11y": "6.5.1",
68
+ "eslint-plugin-prettier": "^4.2.1",
69
+ "eslint-plugin-react": "7.30.0",
70
+ "eslint-plugin-simple-import-sort": "7.0.0",
71
+ "husky": "^7.0.4",
72
+ "lint-staged": "^12.1.2",
73
+ "mocha": "^9.1.3",
74
+ "nyc": "^15.1.0",
75
+ "prettier": "^2.7.1"
76
+ },
77
+ "peerDependencies": {
78
+ "@exabyte-io/ade.js": "*",
79
+ "@exabyte-io/ide.js": "*",
80
+ "@exabyte-io/mode.js": "*",
81
+ "@mat3ra/standata": "*",
82
+ "@mat3ra/utils": "*",
83
+ "@mat3ra/code": "*",
84
+ "@mat3ra/esse": "*",
85
+ "@mat3ra/made": "*"
86
+ },
87
+ "engines": {
88
+ "node": ">=20.0.0"
89
+ },
90
+ "lint-staged": {
91
+ "*.js": "eslint --cache --fix",
92
+ "*.{js,css}": "prettier --write"
93
+ }
94
+ }
@@ -0,0 +1,47 @@
1
+ import { BoundaryConditionsFormDataProvider } from "./providers/BoundaryConditionsFormDataProvider";
2
+ import QENEBContextProvider from "./providers/by_application/espresso/QENEBContextProvider";
3
+ import QEPWXContextProvider from "./providers/by_application/espresso/QEPWXContextProvider";
4
+ import NWChemTotalEnergyContextProvider from "./providers/by_application/nwchem/NWChemTotalEnergyContextProvider";
5
+ import VASPContextProvider from "./providers/by_application/vasp/VASPContextProvider";
6
+ import VASPNEBContextProvider from "./providers/by_application/vasp/VASPNEBContextProvider";
7
+ import { CollinearMagnetizationContextProvider } from "./providers/CollinearMagnetizationContextProvider";
8
+ import { HubbardContextProviderLegacy } from "./providers/HubbardContextProviderLegacy";
9
+ import { HubbardJContextProvider } from "./providers/HubbardJContextProvider";
10
+ import { HubbardUContextProvider } from "./providers/HubbardUContextProvider";
11
+ import { HubbardVContextProvider } from "./providers/HubbardVContextProvider";
12
+ import { IonDynamicsContextProvider } from "./providers/IonDynamicsContextProvider";
13
+ import { MLSettingsContextProvider } from "./providers/MLSettingsContextProvider";
14
+ import { MLTrainTestSplitContextProvider } from "./providers/MLTrainTestSplitContextProvider";
15
+ import { NEBFormDataProvider } from "./providers/NEBFormDataProvider";
16
+ import { NonCollinearMagnetizationContextProvider } from "./providers/NonCollinearMagnetizationContextProvider";
17
+ import { PlanewaveCutoffsContextProvider } from "./providers/PlanewaveCutoffsContextProvider";
18
+ import { PointsGridFormDataProvider } from "./providers/PointsGridFormDataProvider";
19
+ import {
20
+ ExplicitPointsPath2PIBAFormDataProvider,
21
+ ExplicitPointsPathFormDataProvider,
22
+ PointsPathFormDataProvider,
23
+ } from "./providers/PointsPathFormDataProvider";
24
+
25
+ export default {
26
+ BoundaryConditionsFormDataProvider,
27
+ MLSettingsContextProvider,
28
+ MLTrainTestSplitContextProvider,
29
+ NEBFormDataProvider,
30
+ PlanewaveCutoffsContextProvider,
31
+ PointsGridFormDataProvider,
32
+ PointsPathFormDataProvider,
33
+ ExplicitPointsPathFormDataProvider,
34
+ ExplicitPointsPath2PIBAFormDataProvider,
35
+ HubbardJContextProvider,
36
+ HubbardUContextProvider,
37
+ HubbardVContextProvider,
38
+ HubbardContextProviderLegacy,
39
+ IonDynamicsContextProvider,
40
+ CollinearMagnetizationContextProvider,
41
+ NonCollinearMagnetizationContextProvider,
42
+ VASPContextProvider,
43
+ VASPNEBContextProvider,
44
+ QEPWXContextProvider,
45
+ QENEBContextProvider,
46
+ NWChemTotalEnergyContextProvider,
47
+ };
@@ -0,0 +1,19 @@
1
+ import { globalSettings } from "../providers/settings";
2
+
3
+ export function applicationContextMixin(item) {
4
+ const properties = {
5
+ _application: undefined,
6
+
7
+ initApplicationContextMixin() {
8
+ this._application =
9
+ (this.config.context && this.config.context.application) ||
10
+ globalSettings.Application.createDefault();
11
+ },
12
+
13
+ get application() {
14
+ return this._application;
15
+ },
16
+ };
17
+
18
+ Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties));
19
+ }
@@ -0,0 +1,36 @@
1
+ const defaultJob = {
2
+ workflow: {
3
+ subworkflows: [],
4
+ units: [],
5
+ },
6
+ status: "pre-submission",
7
+ compute: {
8
+ queue: "D",
9
+ nodes: 1,
10
+ ppn: 1,
11
+ timeLimit: "3600",
12
+ },
13
+ _project: {
14
+ _id: "",
15
+ },
16
+ };
17
+
18
+ export function jobContextMixin(item) {
19
+ const properties = {
20
+ isEdited: false,
21
+
22
+ _job: defaultJob,
23
+
24
+ get job() {
25
+ return this._job;
26
+ },
27
+
28
+ initJobContextMixin() {
29
+ const { config } = this;
30
+ this._job = (config.context && config.context.job) || defaultJob;
31
+ this.isEdited = false; // we always get the `defaultData` (recalculated from scratch, not persistent)
32
+ },
33
+ };
34
+
35
+ Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties));
36
+ }
@@ -0,0 +1,41 @@
1
+ import { globalSettings } from "../providers/settings";
2
+
3
+ export function materialContextMixin(item) {
4
+ const properties = {
5
+ _material: undefined,
6
+
7
+ updateMaterialHash() {
8
+ if (this.isEditedIsSetToFalseOnMaterialUpdate) this.isEdited = false;
9
+ this.extraData = { materialHash: this.material.hash };
10
+ },
11
+
12
+ // Workaround: Material.createDefault() used to initiate workflow reducer and hence here too
13
+ // does not have an id. Here we catch when such material is used and avoid resetting isEdited
14
+ get isMaterialCreatedDefault() {
15
+ return !this.material.id;
16
+ },
17
+
18
+ get isMaterialUpdated() {
19
+ return Boolean(this.extraData && this.extraData.materialHash !== this.material.hash);
20
+ },
21
+
22
+ get material() {
23
+ if (!this._material) {
24
+ throw new Error("Material is not set");
25
+ }
26
+ return this._material;
27
+ },
28
+
29
+ initMaterialContextMixin() {
30
+ this._material = this.config.context && this.config.context.material;
31
+
32
+ if (!this._material) {
33
+ this._material = globalSettings.Material.createDefault();
34
+ }
35
+
36
+ this.updateMaterialHash();
37
+ },
38
+ };
39
+
40
+ Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties));
41
+ }
@@ -0,0 +1,18 @@
1
+ import { globalSettings } from "../providers/settings";
2
+
3
+ export function materialsContextMixin(item) {
4
+ const properties = {
5
+ get materials() {
6
+ return this._materials;
7
+ },
8
+ initMaterialsContextMixin() {
9
+ const materials = this.config.context?.materials;
10
+ this._materials =
11
+ materials && materials.length
12
+ ? materials
13
+ : [globalSettings.Material.createDefault()];
14
+ },
15
+ };
16
+
17
+ Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties));
18
+ }
@@ -0,0 +1,24 @@
1
+ import { compareEntitiesInOrderedSetForSorting } from "@mat3ra/code/dist/js/entity/set/ordered/utils";
2
+
3
+ export function materialsSetContextMixin(item) {
4
+ const properties = {
5
+ _materialsSet: undefined,
6
+
7
+ get materialsSet() {
8
+ return this._materialsSet;
9
+ },
10
+
11
+ initMaterialsSetContextMixin() {
12
+ this._materialsSet = this.config.context?.materialsSet;
13
+ },
14
+
15
+ sortMaterialsByIndexInSet(materials = []) {
16
+ // DO NOT SORT IN PLACE AS IT CHANGES THE ORDER IN `this.materials` AND HAS SIDE EFFECTS (MaterialViewer).
17
+ return materials.concat().sort((a, b) => {
18
+ return compareEntitiesInOrderedSetForSorting(a, b, this.materialsSet._id, false);
19
+ });
20
+ },
21
+ };
22
+
23
+ Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties));
24
+ }
@@ -0,0 +1,48 @@
1
+ import CryptoJS from "crypto-js";
2
+
3
+ export function methodDataContextMixin(item) {
4
+ const properties = {
5
+ _methodData: undefined,
6
+
7
+ isEdited: false,
8
+
9
+ methodDataHash: undefined,
10
+
11
+ extraData: undefined,
12
+
13
+ initMethodDataContextMixin() {
14
+ this._methodData = (this.config.context && this.config.context.methodData) || {};
15
+ this.isEdited = Boolean(this.config.isEdited);
16
+ },
17
+
18
+ /* @summary Replace the logic in constructor with this in order to enable passing `methodDataHash` between
19
+ * subsequent initializations of the derived class. Not used at present and kept for the record.
20
+ */
21
+ _initMethodDataHash() {
22
+ this.methodDataHash = CryptoJS.MD5(JSON.stringify(this.methodData)).toString();
23
+ this.extraData = { methodDataHash: this.methodDataHash };
24
+ if (!this._methodData) {
25
+ this._methodData = {};
26
+ this.isEdited = false;
27
+ // Commented out to reduce effect on performance. Uncomment for debugging purposes.
28
+ // TODO: remove on next refactoring or convert to log
29
+ // console.warn("MethodDataContextMixin: methodData is undefined or null");
30
+ } else if (this.isMethodDataUpdated) {
31
+ this.isEdited = false;
32
+ } else {
33
+ // eslint-disable-next-line no-undef
34
+ this.isEdited = config.isEdited;
35
+ }
36
+ },
37
+
38
+ get methodData() {
39
+ return this._methodData;
40
+ },
41
+
42
+ get isMethodDataUpdated() {
43
+ return Boolean(this.extraData && this.extraData.methodDataHash !== this.methodDataHash);
44
+ },
45
+ };
46
+
47
+ Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties));
48
+ }
@@ -0,0 +1,25 @@
1
+ const defaultWorkflow = {
2
+ subworkflows: [],
3
+ units: [],
4
+ hasRelaxation: false,
5
+ };
6
+
7
+ export function workflowContextMixin(item) {
8
+ const properties = {
9
+ isEdited: false,
10
+
11
+ _workflow: defaultWorkflow,
12
+
13
+ get workflow() {
14
+ return this._workflow;
15
+ },
16
+
17
+ initWorkflowContextMixin() {
18
+ const { config } = this; // as WorkflowConfig;
19
+ this._workflow = (config.context && config.context.workflow) || defaultWorkflow;
20
+ this.isEdited = false; // we always get the `defaultData` (recalculated from scratch, not persistent)
21
+ },
22
+ };
23
+
24
+ Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties));
25
+ }