@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,222 @@
1
+ import { createSubworkflow } from "../subworkflows/create";
2
+ import { UnitFactory } from "../units";
3
+ import { defaultMapConfig } from "../units/map";
4
+ import { applyConfig, findUnit } from "../utils";
5
+ import { Workflow } from "./workflow";
6
+
7
+ /**
8
+ * @summary Helper for creating Map units for complex workflows
9
+ * @param config {Object} map unit configuration
10
+ * @param unitFactoryCls {*} class factory for map unit
11
+ * @returns {*} map unit
12
+ */
13
+ function createMapUnit({ config, unitFactoryCls = UnitFactory }) {
14
+ let { input: defaultInput } = defaultMapConfig;
15
+ if (config.input) {
16
+ defaultInput = { ...defaultInput, ...config.input };
17
+ }
18
+ const unit = unitFactoryCls.create({ ...defaultMapConfig, input: defaultInput });
19
+ return unit;
20
+ }
21
+
22
+ /**
23
+ * @summary Update subworkflow units with patch configuration defined in the workflow config
24
+ * @param subworkflowData {Object} subworkflow data
25
+ * @param unitConfigs {Array<Object>} array of patch configs for subworkflow units
26
+ * @returns subworkflowData {Object} subworkflowData with patches applied to units
27
+ */
28
+ function updateUnitConfigs({ subworkflowData, unitConfigs }) {
29
+ unitConfigs.forEach((config) => {
30
+ const { index, type, config: unitConfig } = config; // unitConfig should contain 'attributes' key
31
+ const unit = findUnit({ subworkflowData, index, type });
32
+ console.log(` patching ${type} unit ${index} of subworkflow ${subworkflowData.name}`);
33
+ unit.config = applyConfig({ obj: unit.config, config: unitConfig });
34
+ return null;
35
+ });
36
+ return subworkflowData;
37
+ }
38
+
39
+ /**
40
+ * @summary Use subworkflow.createSubworkflow to create a Subworkflow unit
41
+ * @param appName {String} application name
42
+ * @param unitData {*} object containing subworkflow configuration data
43
+ * @param workflowData {*} object containing all workflow configuration data
44
+ * @param swArgs {*} subworkflow classes
45
+ * @returns {*} subworkflow object
46
+ */
47
+ function createSubworkflowUnit({ appName, unitData, workflowData, ...swArgs }) {
48
+ const { name: unitName, unitConfigs, config } = unitData;
49
+ const { subworkflows } = workflowData;
50
+ const { [appName]: dataByApp } = subworkflows;
51
+ let { [unitName]: subworkflowData } = dataByApp;
52
+ subworkflowData.config = { ...subworkflowData.config, ...config };
53
+ if (unitConfigs) subworkflowData = updateUnitConfigs({ subworkflowData, unitConfigs });
54
+ return createSubworkflow({
55
+ subworkflowData,
56
+ ...swArgs,
57
+ });
58
+ }
59
+
60
+ /**
61
+ * @summary Create the first workflow object specified in a workflow configuration
62
+ * @param workflow {*|null} the workflow (if already initialized, no-op)
63
+ * @param unit {*} workflow unit object
64
+ * @param type {String} value in ["workflow", "subworkflow"]
65
+ * @param workflowCls {*} workflow class
66
+ * @returns {Workflow|*} workflow object
67
+ */
68
+ function createWorkflowHead({ workflow, unit, type, workflowCls }) {
69
+ if (workflow) return workflow;
70
+ let wf;
71
+ switch (type) {
72
+ case "workflow":
73
+ wf = unit;
74
+ break;
75
+ case "subworkflow":
76
+ wf = workflowCls.fromSubworkflow(unit);
77
+ break;
78
+ default:
79
+ throw new Error(`workflow type=${type} not understood.`);
80
+ }
81
+ return wf;
82
+ }
83
+
84
+ /**
85
+ * @summary Combine workflow units together
86
+ * @param workflow {*} the workflow object
87
+ * @param unit {*} workflow/subworkflow object
88
+ * @param config {*} additional configuration for e.g. map units
89
+ * @param type {String} value in ["workflow", "subworkflow"]
90
+ * @param unitFactoryCls {*} unit factory class for e.g. map units
91
+ * @returns {*} modified workflow
92
+ */
93
+ function composeWorkflow({ workflow, unit, config, type, unitFactoryCls }) {
94
+ /* eslint-disable no-case-declarations */
95
+ switch (type) {
96
+ case "workflow":
97
+ const { mapUnit: isMapUnit, ...mapUnitConfig } = config;
98
+ if (isMapUnit) {
99
+ const mapUnit = createMapUnit({ config: mapUnitConfig, unitFactoryCls });
100
+ workflow.addMapUnit(mapUnit, unit);
101
+ } else {
102
+ console.log("adding workflows directly to workflows is not supported.");
103
+ }
104
+ break;
105
+ case "subworkflow":
106
+ workflow.addSubworkflow(unit);
107
+ break;
108
+ default:
109
+ throw new Error(`workflow type=${type} not understood.`);
110
+ }
111
+ /* eslint-enable no-case-declarations */
112
+ return workflow;
113
+ }
114
+
115
+ /**
116
+ * @summary Convert a flattened array of workflow units to a properly constructed workflow
117
+ * @param wfUnits {Array} array of workflow units
118
+ * @param workflowCls {*} workflow class
119
+ * @param unitFactoryCls {*} unit factory class
120
+ * @returns {*} constructed workflow
121
+ */
122
+ function createFromWorkflowUnits({ wfUnits, workflowCls, unitFactoryCls }) {
123
+ let workflow, unit, config, type;
124
+ wfUnits.map((wfUnit) => {
125
+ ({ unit, config, type } = wfUnit);
126
+ if (!workflow) {
127
+ workflow = createWorkflowHead({
128
+ workflow,
129
+ unit,
130
+ type,
131
+ workflowCls,
132
+ });
133
+ } else {
134
+ workflow = composeWorkflow({
135
+ workflow,
136
+ unit,
137
+ config,
138
+ type,
139
+ unitFactoryCls,
140
+ });
141
+ }
142
+ return null;
143
+ });
144
+ return applyConfig({ obj: workflow, config });
145
+ }
146
+
147
+ /**
148
+ * @summary Creates a flattened array of workflow units from nested workflow/subworkflow
149
+ * configuration data comprising a simple or complex workflow
150
+ * @param appName
151
+ * @param units
152
+ * @param swArgs
153
+ * @returns {*[]}
154
+ */
155
+ function createWorkflowUnits({
156
+ appName,
157
+ workflowData,
158
+ workflowSubworkflowMapByApplication,
159
+ workflowCls,
160
+ ...swArgs
161
+ }) {
162
+ const wfUnits = [];
163
+ const { units } = workflowData;
164
+ let unit, config;
165
+ units.map((unitData) => {
166
+ const { type } = unitData;
167
+ switch (type) {
168
+ case "workflow":
169
+ ({ config } = unitData);
170
+ unit = createWorkflowUnits({
171
+ appName,
172
+ workflowData: unitData,
173
+ workflowSubworkflowMapByApplication,
174
+ workflowCls,
175
+ ...swArgs,
176
+ });
177
+ break;
178
+ case "subworkflow":
179
+ ({ config } = workflowData);
180
+ unit = createSubworkflowUnit({
181
+ appName,
182
+ unitData,
183
+ workflowData: workflowSubworkflowMapByApplication,
184
+ ...swArgs,
185
+ });
186
+ break;
187
+ default:
188
+ break;
189
+ }
190
+ wfUnits.push({ config, unit, type });
191
+ return null;
192
+ });
193
+ return createFromWorkflowUnits({
194
+ wfUnits,
195
+ workflowCls,
196
+ subworkflowCls: swArgs.subworkflowCls,
197
+ unitFactoryCls: swArgs.unitFactoryCls,
198
+ });
199
+ }
200
+
201
+ function createWorkflow({
202
+ appName,
203
+ workflowData,
204
+ workflowSubworkflowMapByApplication,
205
+ workflowCls = Workflow,
206
+ ...swArgs
207
+ }) {
208
+ const { name } = workflowData;
209
+ console.log(`wode: creating ${appName} workflow ${name}`);
210
+ const wf = createWorkflowUnits({
211
+ appName,
212
+ workflowData,
213
+ workflowSubworkflowMapByApplication,
214
+ workflowCls,
215
+ ...swArgs,
216
+ });
217
+ wf.setName(name);
218
+ wf.applicationName = appName;
219
+ return wf;
220
+ }
221
+
222
+ export { createWorkflow };
@@ -0,0 +1,39 @@
1
+ export default {
2
+ name: "New Workflow",
3
+ properties: [],
4
+ subworkflows: [
5
+ {
6
+ _id: "c6e9dbbee8929de01f4e76ee",
7
+ application: {
8
+ name: "espresso",
9
+ summary: "Quantum Espresso",
10
+ version: "6.3",
11
+ },
12
+ model: {
13
+ method: {
14
+ subtype: "us",
15
+ type: "pseudopotential",
16
+ },
17
+ subtype: "gga",
18
+ type: "dft",
19
+ },
20
+ name: "New Subworkflow",
21
+ properties: [],
22
+ units: [],
23
+ },
24
+ ],
25
+ workflows: [],
26
+ units: [
27
+ {
28
+ _id: "c6e9dbbee8929de01f4e76ee",
29
+ flowchartId: "da2c090ede4dc2fa6e66647f",
30
+ head: true,
31
+ monitors: [],
32
+ postProcessors: [],
33
+ preProcessors: [],
34
+ results: [],
35
+ type: "subworkflow",
36
+ name: "New Subworkflow",
37
+ },
38
+ ],
39
+ };
@@ -0,0 +1,99 @@
1
+ import { allApplications } from "@exabyte-io/ade.js";
2
+ import JSONSchemasInterface from "@mat3ra/esse/dist/js/esse/JSONSchemasInterface";
3
+ import schemas from "@mat3ra/esse/dist/js/schemas.json";
4
+ import { workflowSubforkflowMapByApplication } from "@mat3ra/standata";
5
+
6
+ // Import Template here to apply context provider patch
7
+ // eslint-disable-next-line no-unused-vars
8
+ import { Template } from "../patch";
9
+ import { createWorkflow } from "./create";
10
+ import { Workflow } from "./workflow";
11
+
12
+ // Running this to set schemas for validation, removing the redundant data from application-flavors tree: `flavors`
13
+ JSONSchemasInterface.setSchemas(schemas);
14
+
15
+ /*
16
+ Workflow construction follows these rules:
17
+ 1. Workflow is constructed as a collection of subworkflows defined in JSON
18
+ 2. A "units" key should contain at least one object referencing the workflow itself
19
+ 3. Additional workflows are added in order specified in the same "units" array
20
+ 4. map units are added along with their workflows according to data in "units"
21
+ 5. top-level subworkflows are added directly in the order also specified by "units"
22
+ */
23
+ function createWorkflows({
24
+ appName = null,
25
+ workflowCls = Workflow,
26
+ workflowSubworkflowMapByApplication = workflowSubforkflowMapByApplication,
27
+ ...swArgs
28
+ }) {
29
+ let apps = appName !== null ? [appName] : allApplications;
30
+ const allApplicationsFromWorkflowData = Object.keys(
31
+ workflowSubworkflowMapByApplication.workflows,
32
+ );
33
+ // output warning if allApplications and allApplicationsFromWorkflowData do not match
34
+ if (appName === null) {
35
+ if (apps.sort().join(",") !== allApplicationsFromWorkflowData.sort().join(",")) {
36
+ // eslint-disable-next-line no-console
37
+ console.warn(
38
+ `Warning: allApplications and allApplicationsFromWorkflowData do not match:
39
+ ${apps.sort().join(",")} !== ${allApplicationsFromWorkflowData.sort().join(",")}`,
40
+ );
41
+ console.warn("Using allApplicationsFromWorkflowData");
42
+ }
43
+ apps = allApplicationsFromWorkflowData;
44
+ }
45
+ const wfs = [];
46
+ const { workflows } = workflowSubworkflowMapByApplication;
47
+ apps.map((name) => {
48
+ const { [name]: dataByApp } = workflows;
49
+ Object.values(dataByApp).map((workflowDataForApp) => {
50
+ wfs.push(
51
+ createWorkflow({
52
+ appName: name,
53
+ workflowData: workflowDataForApp,
54
+ workflowSubworkflowMapByApplication,
55
+ workflowCls,
56
+ ...swArgs,
57
+ }),
58
+ );
59
+ return null;
60
+ });
61
+ return null;
62
+ });
63
+ return wfs;
64
+ }
65
+
66
+ /**
67
+ * @summary Create workflow configurations for all applications
68
+ * @param applications {Array<String>} array of application names
69
+ * @param workflowCls {*} workflow class to instantiate
70
+ * @param workflowSubworkflowMapByApplication {Object} object containing all workflow/subworkflow map by application
71
+ * @param swArgs {Object} other classes for instantiation
72
+ * @returns {Array<Object>} array of workflow configurations
73
+ */
74
+ function createWorkflowConfigs({
75
+ applications,
76
+ workflowCls = Workflow,
77
+ workflowSubworkflowMapByApplication,
78
+ ...swArgs
79
+ }) {
80
+ const configs = [];
81
+ applications.forEach((app) => {
82
+ const workflows = createWorkflows({
83
+ appName: app,
84
+ workflowCls,
85
+ workflowSubworkflowMapByApplication,
86
+ ...swArgs,
87
+ });
88
+ workflows.forEach((wf) => {
89
+ configs.push({
90
+ application: app,
91
+ name: wf.prop("name"),
92
+ config: wf.toJSON(),
93
+ });
94
+ });
95
+ });
96
+ return configs;
97
+ }
98
+
99
+ export { Workflow, createWorkflows, createWorkflowConfigs };
@@ -0,0 +1,41 @@
1
+ import { SubworkflowStandata } from "@mat3ra/standata";
2
+
3
+ export const RelaxationLogicMixin = (superclass) =>
4
+ class extends superclass {
5
+ get relaxationSubworkflow() {
6
+ const appName = this.subworkflows[0]?.application?.name;
7
+ if (!appName) return undefined;
8
+ const subworkflowStandata = new SubworkflowStandata();
9
+ const relaxationSubworkflow =
10
+ subworkflowStandata.getRelaxationSubworkflowByApplication(appName);
11
+ return new this._Subworkflow(relaxationSubworkflow);
12
+ }
13
+
14
+ isRelaxationSubworkflow(subworkflow) {
15
+ const { relaxationSubworkflow } = this;
16
+ return (
17
+ relaxationSubworkflow?.systemName !== undefined &&
18
+ relaxationSubworkflow.systemName === subworkflow.systemName
19
+ );
20
+ }
21
+
22
+ get hasRelaxation() {
23
+ return this.subworkflows.some((subworkflow) =>
24
+ this.isRelaxationSubworkflow(subworkflow),
25
+ );
26
+ }
27
+
28
+ toggleRelaxation() {
29
+ if (this.hasRelaxation) {
30
+ const relaxSubworkflow = this.subworkflows.find((sw) =>
31
+ this.isRelaxationSubworkflow(sw),
32
+ );
33
+ this.removeSubworkflow(relaxSubworkflow.id);
34
+ } else {
35
+ const vcRelax = this.relaxationSubworkflow;
36
+ if (vcRelax) {
37
+ this.addSubworkflow(vcRelax, true);
38
+ }
39
+ }
40
+ }
41
+ };