matensemble 0.3.0__tar.gz → 0.3.4__tar.gz
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.
- {matensemble-0.3.0 → matensemble-0.3.4}/PKG-INFO +10 -4
- {matensemble-0.3.0 → matensemble-0.3.4}/README.md +9 -3
- {matensemble-0.3.0 → matensemble-0.3.4}/pyproject.toml +1 -1
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/TODO.md +15 -4
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/pipeline.py +74 -5
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/strategy.py +7 -9
- {matensemble-0.3.0 → matensemble-0.3.4}/LICENSE +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/.python-version +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/README.md +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/__init__.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/chore.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dash/assets/index-1X2cLUgt.js +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dash/assets/index-DRkGfWlx.css +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dash/index.html +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dash/vite.svg +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/__init__.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/driver.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/ensemble.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/__init__.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/bispectrum_calculator.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/compute_diffraction.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/compute_order_from_pairs.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/compute_twist.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/correlations.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/ovito_calculators.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/task_lib/AnalysisSubprocess.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/task_lib/AnalysysDescriptor.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/task_lib/MDSubprocess.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/task_lib/__init__.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/task_lib/analysis_registry.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/utils/__init__.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/utils/lammps_init.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/utils/preprocessors.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/utils/stat.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/utils/stress_rotate_z_theta.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/fluxlet.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/logger.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/manager.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/model.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/redis/__init__.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/redis/service.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/redis/test.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/runtime_worker.py +0 -0
- {matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: matensemble
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: An adaptive and highly asynchronous ensemble simulation workflow manager MatEnsemble (https://github.com/Q-CAD/MatEnsemble) built jointly on top of the hierarchical graph based scheduler FLUX and concurrent-futures infrastructure of python
|
|
5
5
|
Author: Soumendu Bagchi, Kaleb Duchesneau
|
|
6
6
|
Author-email: Soumendu Bagchi <soumendubagchi@gmail.com>, Kaleb Duchesneau <kalebduchesneau@gmail.com>
|
|
@@ -53,17 +53,23 @@ An optional in-tree **dynopro** stack supports streaming dynamics and on-the-fly
|
|
|
53
53
|
</p>
|
|
54
54
|
|
|
55
55
|
|
|
56
|
+
## Installation
|
|
57
|
+
|
|
56
58
|
OCI images are published to GitHub Container Registry
|
|
57
59
|
|
|
58
60
|
`ghcr.io/freddude2004/matensemble:baseline-vX.Y.Z`
|
|
59
61
|
|
|
60
62
|
See the [container packages](https://github.com/FredDude2004/MatEnsemble/pkgs/container/matensemble) and the [Quick start](https://matensemble.readthedocs.io/en/latest/quickstart.html) in the docs for Apptainer/Singularity and site-specific notes.
|
|
61
63
|
|
|
62
|
-
###
|
|
64
|
+
### Anaconda
|
|
65
|
+
|
|
66
|
+
You can build a Conda environment with MatEnsemble and dependencies installed using the environment.yaml file.
|
|
63
67
|
|
|
64
|
-
|
|
68
|
+
```bash
|
|
69
|
+
conda env create -f environment.yaml
|
|
70
|
+
```
|
|
65
71
|
|
|
66
|
-
##
|
|
72
|
+
## Example
|
|
67
73
|
|
|
68
74
|
```python
|
|
69
75
|
from matensemble.pipeline import Pipeline
|
|
@@ -30,17 +30,23 @@ An optional in-tree **dynopro** stack supports streaming dynamics and on-the-fly
|
|
|
30
30
|
</p>
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
## Installation
|
|
34
|
+
|
|
33
35
|
OCI images are published to GitHub Container Registry
|
|
34
36
|
|
|
35
37
|
`ghcr.io/freddude2004/matensemble:baseline-vX.Y.Z`
|
|
36
38
|
|
|
37
39
|
See the [container packages](https://github.com/FredDude2004/MatEnsemble/pkgs/container/matensemble) and the [Quick start](https://matensemble.readthedocs.io/en/latest/quickstart.html) in the docs for Apptainer/Singularity and site-specific notes.
|
|
38
40
|
|
|
39
|
-
###
|
|
41
|
+
### Anaconda
|
|
42
|
+
|
|
43
|
+
You can build a Conda environment with MatEnsemble and dependencies installed using the environment.yaml file.
|
|
40
44
|
|
|
41
|
-
|
|
45
|
+
```bash
|
|
46
|
+
conda env create -f environment.yaml
|
|
47
|
+
```
|
|
42
48
|
|
|
43
|
-
##
|
|
49
|
+
## Example
|
|
44
50
|
|
|
45
51
|
```python
|
|
46
52
|
from matensemble.pipeline import Pipeline
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matensemble"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.4"
|
|
4
4
|
description = "An adaptive and highly asynchronous ensemble simulation workflow manager MatEnsemble (https://github.com/Q-CAD/MatEnsemble) built jointly on top of the hierarchical graph based scheduler FLUX and concurrent-futures infrastructure of python"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license-files = ["LICENSE"]
|
|
@@ -171,6 +171,17 @@
|
|
|
171
171
|
- [x] Convert Scaffold into PowerPoint Presentation
|
|
172
172
|
- [x] Email coordinator about length of presentation and audience
|
|
173
173
|
|
|
174
|
+
# === May 29, 2026 ===
|
|
175
|
+
- [x] Fix the strategy error
|
|
176
|
+
- [x] Make sure conda env is working
|
|
177
|
+
- [ ] Make sure all containers are working and stable
|
|
178
|
+
* Frontier
|
|
179
|
+
* Perlmutter
|
|
180
|
+
* Pathfinder
|
|
181
|
+
* Linux
|
|
182
|
+
- [ ] Update tutorials for all systems
|
|
183
|
+
- [ ] Make all figures for JOSS paper and explain all of them
|
|
184
|
+
|
|
174
185
|
## === AFTER EVERYTHING ABOVE IS DONE AND STABLE ===
|
|
175
186
|
|
|
176
187
|
## --- Model Context Protocol ---
|
|
@@ -197,12 +208,12 @@
|
|
|
197
208
|
|
|
198
209
|
## --- Create first draft for JOSS ---
|
|
199
210
|
- [ ] Read some example papers
|
|
200
|
-
- [
|
|
201
|
-
- [
|
|
211
|
+
- [x] Create draft and show Dr. Bagchi
|
|
212
|
+
- [x] Polish the repository to be ready for review
|
|
202
213
|
- [ ] Make sure that the tests work
|
|
203
214
|
- [ ] Make sure that the example workflows work correctly
|
|
204
|
-
- [ ] Make sure that they can easily test the code
|
|
205
|
-
- [
|
|
215
|
+
- [ ] Make sure that they can easily test the code
|
|
216
|
+
- [x] Create a conda package that they can easily test the code without having
|
|
206
217
|
to compile flux and flux-sched themselves
|
|
207
218
|
|
|
208
219
|
## --- Reading List ---
|
|
@@ -133,7 +133,7 @@ class Pipeline:
|
|
|
133
133
|
the module will use to find the *pickled* python object containing all
|
|
134
134
|
of the data on the chore, and it will use it to import the function and
|
|
135
135
|
call it with its respective arguments. The result will then be stored
|
|
136
|
-
in the
|
|
136
|
+
in the chores respective directory.
|
|
137
137
|
|
|
138
138
|
Parameters
|
|
139
139
|
----------
|
|
@@ -228,7 +228,79 @@ class Pipeline:
|
|
|
228
228
|
|
|
229
229
|
return decorator
|
|
230
230
|
|
|
231
|
-
#
|
|
231
|
+
# WARNING: This is deprecated and only here for compatibility
|
|
232
|
+
def add_user_strat(self, chore_name: str, bolo_list: list[str]):
|
|
233
|
+
self._strategy_spec = {"name": chore_name, "bolo_list": bolo_list}
|
|
234
|
+
|
|
235
|
+
def strategy(
|
|
236
|
+
self,
|
|
237
|
+
bolo_list: list[str],
|
|
238
|
+
name: str | None = None,
|
|
239
|
+
num_tasks: int = 1,
|
|
240
|
+
cores_per_task: int = 1,
|
|
241
|
+
gpus_per_task: int = 0,
|
|
242
|
+
mpi: bool = False,
|
|
243
|
+
env: dict[str, str] | None = None,
|
|
244
|
+
inherit_env: bool = True,
|
|
245
|
+
):
|
|
246
|
+
"""
|
|
247
|
+
The strategy function creates a strategy, which is essentially a
|
|
248
|
+
callback function to another chore. But the callback function is itself
|
|
249
|
+
a chore. This function is expected to return an :obj:`ChoreSpec` which
|
|
250
|
+
will then dynamically spawn a new chore into the queue based on the
|
|
251
|
+
specification that is returned.
|
|
252
|
+
|
|
253
|
+
Parameters
|
|
254
|
+
----------
|
|
255
|
+
bolo_list : list[str]
|
|
256
|
+
The names of the chores that you want this to callback on
|
|
257
|
+
name : str, optional
|
|
258
|
+
The name that will be assigned to the chore_id, defaults to the
|
|
259
|
+
name of the function.
|
|
260
|
+
num_tasks : int, optional
|
|
261
|
+
The number of tasks that will be launched with flux, defaults to 1
|
|
262
|
+
cores_per_task : int, optional
|
|
263
|
+
The number of CPU cores that are required to submit the chore,
|
|
264
|
+
defaults to 1
|
|
265
|
+
gpus_per_task : int, optional
|
|
266
|
+
The number of GPUs that are required to submit the chore, defaults
|
|
267
|
+
to 0
|
|
268
|
+
mpi : bool, optional
|
|
269
|
+
When True, sets Flux shell option ``mpi=pmi2`` on the chorespec
|
|
270
|
+
(default False).
|
|
271
|
+
env : dict[str, str], optional
|
|
272
|
+
Extra environment variables for the task. For Python chores,
|
|
273
|
+
``PYTHONPATH`` is merged to include the workflow parent directory.
|
|
274
|
+
inherit_env : bool
|
|
275
|
+
If True (default), the Flux jobspec starts from the submitting
|
|
276
|
+
process environment and applies ``env`` overrides.
|
|
277
|
+
|
|
278
|
+
Returns
|
|
279
|
+
-------
|
|
280
|
+
Callable
|
|
281
|
+
A dummy function that just prints a warning to the stdout. The
|
|
282
|
+
actual function is stored in the registry
|
|
283
|
+
"""
|
|
284
|
+
|
|
285
|
+
def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
|
|
286
|
+
for chore in bolo_list:
|
|
287
|
+
if chore not in self._registry:
|
|
288
|
+
raise Exception(
|
|
289
|
+
f"Error: The chore '{chore}' was not found in the registry"
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
registry_key = name or str(func.__qualname__)
|
|
293
|
+
self._registry[registry_key] = func
|
|
294
|
+
|
|
295
|
+
def disabled_wrapper(*args: Any, **kwargs: Any) -> None:
|
|
296
|
+
raise RuntimeError(
|
|
297
|
+
f"Do not call '{registry_key}' directly. "
|
|
298
|
+
"This strategy is managed internally by the workflow engine."
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
return disabled_wrapper
|
|
302
|
+
|
|
303
|
+
return decorator
|
|
232
304
|
|
|
233
305
|
def exec(
|
|
234
306
|
self,
|
|
@@ -532,9 +604,6 @@ class Pipeline:
|
|
|
532
604
|
self._finished = True
|
|
533
605
|
return self._collect_results()
|
|
534
606
|
|
|
535
|
-
def add_user_strat(self, chore_name: str, bolo_list: list[str]):
|
|
536
|
-
self._strategy_spec = {"name": chore_name, "bolo_list": bolo_list}
|
|
537
|
-
|
|
538
607
|
def graph(self) -> nx.DiGraph:
|
|
539
608
|
return self._create_graph()
|
|
540
609
|
|
|
@@ -224,9 +224,6 @@ class NonAdaptiveStrategy(FutureProcessingStrategy):
|
|
|
224
224
|
return
|
|
225
225
|
|
|
226
226
|
|
|
227
|
-
# TODO: Make the strategy look through the bolo list and spawn a new chore with the output of another
|
|
228
|
-
# and then make sure that the chore that is acting as a processing strat is a on the bolo list
|
|
229
|
-
# and if that is done then you need to get the results and spawn a new chore from the ChoreSpec
|
|
230
227
|
class UserStrategy(FutureProcessingStrategy):
|
|
231
228
|
def __init__(self, manager, pipeline, processing_chore, bolo_list) -> None:
|
|
232
229
|
super().__init__(manager)
|
|
@@ -314,12 +311,13 @@ class UserStrategy(FutureProcessingStrategy):
|
|
|
314
311
|
# untrusted paths or third-party producers.
|
|
315
312
|
with (chore.workdir / "result.pickle").open("rb") as f:
|
|
316
313
|
chore_spec = pickle.load(f)
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
314
|
+
if chore_spec:
|
|
315
|
+
new_chore, new_out = self.pipeline._spawn_chore_from_spec(
|
|
316
|
+
chore_spec
|
|
317
|
+
)
|
|
318
|
+
self.pipeline._admit_spawned_chore(
|
|
319
|
+
new_chore, new_out, self.manager
|
|
320
|
+
)
|
|
323
321
|
except Exception as e:
|
|
324
322
|
self.manager._logger.exception(
|
|
325
323
|
f"FAILED TO SPAWN CHORE: chore={self.proc_chore} | due the following Exception ->\n{e}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/compute_twist.py
RENAMED
|
File without changes
|
{matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/correlations.py
RENAMED
|
File without changes
|
{matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/postprocessors/ovito_calculators.py
RENAMED
|
File without changes
|
{matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/task_lib/AnalysisSubprocess.py
RENAMED
|
File without changes
|
{matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/task_lib/AnalysysDescriptor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/task_lib/analysis_registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{matensemble-0.3.0 → matensemble-0.3.4}/src/matensemble/dynopro/utils/stress_rotate_z_theta.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|