dataeval-flow 0.2.1__tar.gz → 0.2.3__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.
Files changed (114) hide show
  1. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/.gitignore +1 -0
  2. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/PKG-INFO +106 -28
  3. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/README.md +102 -22
  4. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/pyproject.toml +5 -12
  5. dataeval_flow-0.2.3/src/dataeval_flow/__main__.py +330 -0
  6. dataeval_flow-0.2.3/src/dataeval_flow/_env.py +74 -0
  7. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_logging.py +32 -15
  8. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_version.py +2 -2
  9. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/runner.py +100 -36
  10. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflow/__init__.py +35 -3
  11. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflow/orchestrator.py +55 -16
  12. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/coverage/workflow.py +17 -2
  13. dataeval_flow-0.2.1/src/dataeval_flow/__main__.py +0 -197
  14. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/LICENSE +0 -0
  15. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/__init__.py +0 -0
  16. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/__init__.py +0 -0
  17. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/__init__.py +0 -0
  18. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/_coerce.py +0 -0
  19. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/_discover.py +0 -0
  20. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/_execution.py +0 -0
  21. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/_introspect.py +0 -0
  22. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/_item.py +0 -0
  23. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/_registry.py +0 -0
  24. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/_state.py +0 -0
  25. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_model/_undo.py +0 -0
  26. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_panes/__init__.py +0 -0
  27. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_panes/_config_pane.py +0 -0
  28. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_panes/_result_pane.py +0 -0
  29. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_panes/_task_pane.py +0 -0
  30. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_panes/_widgets.py +0 -0
  31. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_screens/__init__.py +0 -0
  32. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_screens/_base.py +0 -0
  33. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_screens/_detail.py +0 -0
  34. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_screens/_model.py +0 -0
  35. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_screens/_params.py +0 -0
  36. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_screens/_pathpicker.py +0 -0
  37. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_screens/_section.py +0 -0
  38. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_screens/_settings.py +0 -0
  39. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_viewmodel/__init__.py +0 -0
  40. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_viewmodel/_builder_vm.py +0 -0
  41. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_viewmodel/_model_vm.py +0 -0
  42. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_viewmodel/_rendering.py +0 -0
  43. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_viewmodel/_result_vm.py +0 -0
  44. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/_viewmodel/_section_vm.py +0 -0
  45. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/app.py +0 -0
  46. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_app/cli.py +0 -0
  47. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/_encoding_cli.py +0 -0
  48. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/binning.py +0 -0
  49. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/cache.py +0 -0
  50. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/__init__.py +0 -0
  51. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/_loader.py +0 -0
  52. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/_merge.py +0 -0
  53. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/_models.py +0 -0
  54. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/_paths.py +0 -0
  55. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/schemas/__init__.py +0 -0
  56. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/schemas/_dataset.py +0 -0
  57. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/schemas/_extractor.py +0 -0
  58. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/schemas/_metadata.py +0 -0
  59. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/schemas/_preprocessor.py +0 -0
  60. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/schemas/_task.py +0 -0
  61. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/schemas/_view.py +0 -0
  62. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/config/schemas/_workflow.py +0 -0
  63. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/dataset.py +0 -0
  64. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/embeddings.py +0 -0
  65. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/metadata.py +0 -0
  66. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/policy.py +0 -0
  67. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/preprocessing.py +0 -0
  68. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/preprocessors.py +0 -0
  69. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/py.typed +0 -0
  70. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/view.py +0 -0
  71. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflow/_text_report.py +0 -0
  72. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflow/base.py +0 -0
  73. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/__init__.py +0 -0
  74. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/_common.py +0 -0
  75. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/_ontology.py +0 -0
  76. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/analysis/__init__.py +0 -0
  77. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/analysis/outputs.py +0 -0
  78. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/analysis/params.py +0 -0
  79. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/analysis/workflow.py +0 -0
  80. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/cleaning/__init__.py +0 -0
  81. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/cleaning/_internal.py +0 -0
  82. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/cleaning/outputs.py +0 -0
  83. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/cleaning/params.py +0 -0
  84. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/cleaning/report.py +0 -0
  85. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/cleaning/workflow.py +0 -0
  86. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/coverage/__init__.py +0 -0
  87. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/coverage/ontology.py +0 -0
  88. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/coverage/outputs.py +0 -0
  89. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/coverage/params.py +0 -0
  90. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/coverage/report.py +0 -0
  91. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/drift/__init__.py +0 -0
  92. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/drift/outputs.py +0 -0
  93. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/drift/params.py +0 -0
  94. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/drift/report.py +0 -0
  95. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/drift/workflow.py +0 -0
  96. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/ood/__init__.py +0 -0
  97. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/ood/outputs.py +0 -0
  98. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/ood/params.py +0 -0
  99. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/ood/report.py +0 -0
  100. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/ood/workflow.py +0 -0
  101. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/parameter_sweep/__init__.py +0 -0
  102. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/parameter_sweep/outputs.py +0 -0
  103. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/parameter_sweep/params.py +0 -0
  104. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/parameter_sweep/workflow.py +0 -0
  105. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/prioritization/__init__.py +0 -0
  106. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/prioritization/outputs.py +0 -0
  107. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/prioritization/params.py +0 -0
  108. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/prioritization/report.py +0 -0
  109. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/prioritization/workflow.py +0 -0
  110. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/splitting/__init__.py +0 -0
  111. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/splitting/outputs.py +0 -0
  112. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/splitting/params.py +0 -0
  113. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/splitting/report.py +0 -0
  114. {dataeval_flow-0.2.1 → dataeval_flow-0.2.3}/src/dataeval_flow/workflows/splitting/workflow.py +0 -0
@@ -1,5 +1,6 @@
1
1
  # Environment
2
2
  .env
3
+ .env.local
3
4
  .venv/
4
5
  __pycache__/
5
6
  *.pyc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: dataeval-flow
3
- Version: 0.2.1
3
+ Version: 0.2.3
4
4
  Summary: DataEval Workflows container for data evaluation
5
5
  Project-URL: Homepage, https://github.com/aria-ml/dataeval-flow
6
6
  Project-URL: Documentation, https://dataeval-flow.readthedocs.io/
@@ -19,7 +19,7 @@ Classifier: Topic :: Scientific/Engineering
19
19
  Classifier: Typing :: Typed
20
20
  Requires-Python: <3.15,>=3.10
21
21
  Requires-Dist: click>=8.0
22
- Requires-Dist: dataeval==1.1.0-rc6
22
+ Requires-Dist: dataeval>=1.1.1
23
23
  Requires-Dist: datamaite[ic,od]==0.4.1
24
24
  Requires-Dist: numpy>=1.24.2
25
25
  Requires-Dist: pydantic>=2.0
@@ -49,11 +49,9 @@ Requires-Dist: onnx>=1.15; extra == 'onnx-cu130'
49
49
  Requires-Dist: onnxruntime-gpu>=1.27; (python_version >= '3.11' and extra != 'onnx-cu126') and extra == 'onnx-cu130'
50
50
  Requires-Dist: onnxruntime>=1.20; (python_version == '3.10' and extra != 'onnx-cu126') and extra == 'onnx-cu130'
51
51
  Provides-Extra: ontology
52
- Requires-Dist: dataeval[ontology]==1.1.0-rc6; extra == 'ontology'
52
+ Requires-Dist: dataeval[ontology]>=1.1.1; extra == 'ontology'
53
53
  Provides-Extra: opencv
54
- Requires-Dist: opencv-python-headless>=4.8.0; extra == 'opencv'
55
- Provides-Extra: opencv-fips
56
- Requires-Dist: opencv-python-headless<4.13.0,>=4.8.0; extra == 'opencv-fips'
54
+ Requires-Dist: opencv-python-headless<4.13.0,>=4.8.0; extra == 'opencv'
57
55
  Description-Content-Type: text/markdown
58
56
 
59
57
  <!-- markdownlint-disable MD041 -->
@@ -192,7 +190,7 @@ docker pull harbor.jatic.net/aria/dataeval:cu126 # cpu / cu126 / cu130
192
190
  **Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
193
191
 
194
192
  ```bash
195
- docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu126
193
+ docker pull harbor.jatic.net/aria/dataeval:0.2.1-cu126
196
194
  ```
197
195
 
198
196
  **Verifying the signature** — every published image is signed with
@@ -215,17 +213,23 @@ commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu126`
215
213
 
216
214
  ## Requirements
217
215
 
218
- | Requirement | Version |
219
- | ------------- | --------------------- |
220
- | Docker | >= 20.10 |
221
- | NVIDIA GPU | Any (for GPU mode) |
222
- | NVIDIA Driver | >= 520 (for GPU mode) |
223
- | CUDA | 11.8.0 (for GPU mode) |
216
+ | Requirement | Version |
217
+ | ------------- | -------------------------------------------------------------- |
218
+ | Docker | >= 20.10 |
219
+ | NVIDIA GPU | Any (for GPU mode) |
220
+ | NVIDIA Driver | >= 525 for the `cu126` image; >= 580 for `cu130` (GPU mode) |
221
+ | CUDA | 12.6 (`cu126`) or 13.0 (`cu130`) bundled in the image |
222
+
223
+ The CUDA runtime libraries ship inside the image via PyTorch and `onnxruntime-gpu`, so
224
+ the host needs only the NVIDIA driver and the NVIDIA Container Toolkit — no host CUDA
225
+ install. The driver floors above are the CUDA major versions' minimums: any driver from
226
+ the 525 series up runs a CUDA 12.x image under minor-version compatibility, and CUDA 13.0
227
+ requires a 580-series or newer driver.
224
228
 
225
229
  ### Verify GPU Access
226
230
 
227
231
  ```bash
228
- docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
232
+ docker run --rm --gpus all nvidia/cuda:12.6.3-base-ubuntu24.04 nvidia-smi
229
233
  ```
230
234
 
231
235
  ## Volume Mounts
@@ -289,7 +293,10 @@ precedence over them (see [Input Precedence](#input-precedence) below).
289
293
 
290
294
  No secret mounts or credentials are required — DataEval Flow uses no API keys,
291
295
  tokens, or passwords. (`DATAEVAL_FLOW_VERSION` and `DATAEVAL_NOX_UV_EXTRAS_OVERRIDE`
292
- are build-time only and are not read at run time.)
296
+ are build-time only and are not read at run time. `UV_EXTRAS_OVERRIDE` and
297
+ `CONTAINER_MODE` are baked into the image by the build and read at run time by the
298
+ entrypoint, purely to label the help text and decide whether to run the GPU check —
299
+ neither is meant to be set by the caller.)
293
300
 
294
301
  ## Input Precedence
295
302
 
@@ -344,12 +351,20 @@ Dataset and model paths in config files are resolved relative to the data root (
344
351
 
345
352
  ## Dataset Formats
346
353
 
347
- Currently supported dataset structures:
354
+ A `datasets` entry selects its loader with `format`:
355
+
356
+ | `format` | Structure | Split selection |
357
+ | -------------- | ------------------------------------------------------------- | ----------------------------------- |
358
+ | `huggingface` | HuggingFace arrow dataset or dataset dict | `split:` (omit for a single split) |
359
+ | `image_folder` | Directory of images, optionally one subdirectory per class | n/a |
360
+ | `coco` | COCO images plus a JSON annotation file | `annotations_file:` + `images_dir:` |
361
+ | `yolo` | Ultralytics root — `data.yaml` plus image/label trees | `split:` (omit to load every split) |
348
362
 
349
- | Format | Structure | Example |
350
- | --------------- | -------------------------------------------------- | --------------- |
351
- | **Dataset** | Single split, used directly | `cifar10_test/` |
352
- | **DatasetDict** | Multiple splits (dict), configured via config YAML | `cifar10_full/` |
363
+ Both single-split datasets and multi-split dataset dicts are supported. In-memory MAITE
364
+ and TorchVision datasets are also accepted programmatically via `DatasetProtocolConfig`,
365
+ which is not serializable and so cannot be named in a config file. See the
366
+ [Run workflows in containers](https://dataeval-flow.readthedocs.io/en/latest/how_to/containerized_workflows.html)
367
+ guide for the full field list of each format.
353
368
 
354
369
  ## CPU Fallback
355
370
 
@@ -366,13 +381,53 @@ docker run \
366
381
 
367
382
  ## CLI Modes
368
383
 
369
- DataEval Flow has three modes:
384
+ DataEval Flow has four modes:
385
+
386
+ | Command | Purpose |
387
+ | ------------------------- | ------------------------------------------------------------------- |
388
+ | `dataeval-flow [opts]` | Headless execution — for automation and CI/CD pipelines |
389
+ | `dataeval-flow app` | Interactive TUI dashboard — configure, execute, and view results |
390
+ | `dataeval-flow config` | Simple CLI config builder — create/edit configs without the TUI |
391
+ | `dataeval-flow encoding` | Write the metadata encoding descriptor a result was computed under |
392
+ | `dataeval-flow workflows` | List the available workflow types, or print one's parameter schema |
393
+
394
+ `dataeval-flow --version` reports the installed build — useful for pinning down
395
+ which image produced a result.
396
+
397
+ ### Headless execution
398
+
399
+ ```bash
400
+ # Every enabled task in the config
401
+ dataeval-flow --config params.yaml --data . --output ./results
402
+
403
+ # One task by name, whether or not the config marks it enabled
404
+ dataeval-flow --config params.yaml --task clean_my_data
405
+
406
+ # Several, in the order given
407
+ dataeval-flow --config params.yaml --task clean_my_data --task analyze_my_data
408
+
409
+ # Stop the pipeline when a finding breaches its health threshold
410
+ dataeval-flow --config params.yaml --output ./results --fail-on-warning
411
+ ```
412
+
413
+ **Exit codes:** `0` when every task succeeded, `1` when any task failed. Health
414
+ warnings are reported but are not fatal unless you pass `--fail-on-warning`, which
415
+ turns them into an exit code of `1` as well. Every run's `result.json` carries a
416
+ `health` block per task (`status`, `warnings`, `findings`) so a pipeline can gate
417
+ on findings without parsing the text report.
418
+
419
+ ### Workflow Discovery (`workflows`)
370
420
 
371
- | Command | Purpose |
372
- | ---------------------- | ---------------------------------------------------------------- |
373
- | `dataeval-flow [opts]` | Headless execution — for automation and CI/CD pipelines |
374
- | `dataeval-flow app` | Interactive TUI dashboard — configure, execute, and view results |
375
- | `dataeval-flow config` | Simple CLI config builder — create/edit configs without the TUI |
421
+ For images that ship without the TUI extra:
422
+
423
+ ```bash
424
+ # What can this build run?
425
+ dataeval-flow workflows
426
+ dataeval-flow workflows --json
427
+
428
+ # What does a given workflow type accept?
429
+ dataeval-flow workflows data-cleaning
430
+ ```
376
431
 
377
432
  ### Interactive TUI (`app`)
378
433
 
@@ -408,12 +463,35 @@ python -m dataeval_flow config --config /path/to/params.yaml
408
463
 
409
464
  Configs can be saved as YAML or JSON.
410
465
 
466
+ ### Encoding Descriptor (`encoding`)
467
+
468
+ Extract the metadata encoding descriptor from an archived `result.json` and write it
469
+ where it can be reviewed and committed, so a later dataset is cut the same way:
470
+
471
+ ```bash
472
+ python -m dataeval_flow encoding output/results/result.json -o policy/factor_bins.json
473
+ python -m dataeval_flow encoding output/results/result.json --task clean_my_data
474
+ ```
475
+
476
+ Reference the committed descriptor from a metadata policy's `encoding` field. A run with
477
+ `-o` already writes `results/encoding.json` beside its results; this command recovers one
478
+ from a result archived earlier. See
479
+ [Configure metadata binning](https://dataeval-flow.readthedocs.io/en/latest/how_to/configure_metadata_binning.html).
480
+
411
481
  ## Dependencies
412
482
 
483
+ Declared runtime dependencies:
484
+
413
485
  - `dataeval` - Core evaluation library
414
- - `datamaite` - MAITE protocol dataset loaders
415
- - `maite` - MAITE protocol library
486
+ - `datamaite` - MAITE protocol dataset loaders (which brings in `maite` itself)
416
487
  - `pydantic` - Structural typing and schema validation
488
+ - `click` - Interactive prompts for the simple CLI config builder
489
+ - `pyyaml` - YAML config parsing
490
+ - `numpy` - Array handling
491
+
492
+ PyTorch arrives transitively through `dataeval`. Optional extras (`onnx`, `opencv`,
493
+ `app`, `ontology`, and the CUDA variants) are listed under
494
+ [Running Without Container](#running-without-container).
417
495
 
418
496
  ## Troubleshooting
419
497
 
@@ -134,7 +134,7 @@ docker pull harbor.jatic.net/aria/dataeval:cu126 # cpu / cu126 / cu130
134
134
  **Pinned release channel** — immutable, version-tagged images cut from `v*` git tags. Use these for reproducible workloads.
135
135
 
136
136
  ```bash
137
- docker pull harbor.jatic.net/aria/dataeval:0.1.0-cu126
137
+ docker pull harbor.jatic.net/aria/dataeval:0.2.1-cu126
138
138
  ```
139
139
 
140
140
  **Verifying the signature** — every published image is signed with
@@ -157,17 +157,23 @@ commands above with the fully-qualified `harbor.jatic.net/aria/dataeval:cu126`
157
157
 
158
158
  ## Requirements
159
159
 
160
- | Requirement | Version |
161
- | ------------- | --------------------- |
162
- | Docker | >= 20.10 |
163
- | NVIDIA GPU | Any (for GPU mode) |
164
- | NVIDIA Driver | >= 520 (for GPU mode) |
165
- | CUDA | 11.8.0 (for GPU mode) |
160
+ | Requirement | Version |
161
+ | ------------- | -------------------------------------------------------------- |
162
+ | Docker | >= 20.10 |
163
+ | NVIDIA GPU | Any (for GPU mode) |
164
+ | NVIDIA Driver | >= 525 for the `cu126` image; >= 580 for `cu130` (GPU mode) |
165
+ | CUDA | 12.6 (`cu126`) or 13.0 (`cu130`) bundled in the image |
166
+
167
+ The CUDA runtime libraries ship inside the image via PyTorch and `onnxruntime-gpu`, so
168
+ the host needs only the NVIDIA driver and the NVIDIA Container Toolkit — no host CUDA
169
+ install. The driver floors above are the CUDA major versions' minimums: any driver from
170
+ the 525 series up runs a CUDA 12.x image under minor-version compatibility, and CUDA 13.0
171
+ requires a 580-series or newer driver.
166
172
 
167
173
  ### Verify GPU Access
168
174
 
169
175
  ```bash
170
- docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi
176
+ docker run --rm --gpus all nvidia/cuda:12.6.3-base-ubuntu24.04 nvidia-smi
171
177
  ```
172
178
 
173
179
  ## Volume Mounts
@@ -231,7 +237,10 @@ precedence over them (see [Input Precedence](#input-precedence) below).
231
237
 
232
238
  No secret mounts or credentials are required — DataEval Flow uses no API keys,
233
239
  tokens, or passwords. (`DATAEVAL_FLOW_VERSION` and `DATAEVAL_NOX_UV_EXTRAS_OVERRIDE`
234
- are build-time only and are not read at run time.)
240
+ are build-time only and are not read at run time. `UV_EXTRAS_OVERRIDE` and
241
+ `CONTAINER_MODE` are baked into the image by the build and read at run time by the
242
+ entrypoint, purely to label the help text and decide whether to run the GPU check —
243
+ neither is meant to be set by the caller.)
235
244
 
236
245
  ## Input Precedence
237
246
 
@@ -286,12 +295,20 @@ Dataset and model paths in config files are resolved relative to the data root (
286
295
 
287
296
  ## Dataset Formats
288
297
 
289
- Currently supported dataset structures:
298
+ A `datasets` entry selects its loader with `format`:
299
+
300
+ | `format` | Structure | Split selection |
301
+ | -------------- | ------------------------------------------------------------- | ----------------------------------- |
302
+ | `huggingface` | HuggingFace arrow dataset or dataset dict | `split:` (omit for a single split) |
303
+ | `image_folder` | Directory of images, optionally one subdirectory per class | n/a |
304
+ | `coco` | COCO images plus a JSON annotation file | `annotations_file:` + `images_dir:` |
305
+ | `yolo` | Ultralytics root — `data.yaml` plus image/label trees | `split:` (omit to load every split) |
290
306
 
291
- | Format | Structure | Example |
292
- | --------------- | -------------------------------------------------- | --------------- |
293
- | **Dataset** | Single split, used directly | `cifar10_test/` |
294
- | **DatasetDict** | Multiple splits (dict), configured via config YAML | `cifar10_full/` |
307
+ Both single-split datasets and multi-split dataset dicts are supported. In-memory MAITE
308
+ and TorchVision datasets are also accepted programmatically via `DatasetProtocolConfig`,
309
+ which is not serializable and so cannot be named in a config file. See the
310
+ [Run workflows in containers](https://dataeval-flow.readthedocs.io/en/latest/how_to/containerized_workflows.html)
311
+ guide for the full field list of each format.
295
312
 
296
313
  ## CPU Fallback
297
314
 
@@ -308,13 +325,53 @@ docker run \
308
325
 
309
326
  ## CLI Modes
310
327
 
311
- DataEval Flow has three modes:
328
+ DataEval Flow has four modes:
329
+
330
+ | Command | Purpose |
331
+ | ------------------------- | ------------------------------------------------------------------- |
332
+ | `dataeval-flow [opts]` | Headless execution — for automation and CI/CD pipelines |
333
+ | `dataeval-flow app` | Interactive TUI dashboard — configure, execute, and view results |
334
+ | `dataeval-flow config` | Simple CLI config builder — create/edit configs without the TUI |
335
+ | `dataeval-flow encoding` | Write the metadata encoding descriptor a result was computed under |
336
+ | `dataeval-flow workflows` | List the available workflow types, or print one's parameter schema |
337
+
338
+ `dataeval-flow --version` reports the installed build — useful for pinning down
339
+ which image produced a result.
340
+
341
+ ### Headless execution
342
+
343
+ ```bash
344
+ # Every enabled task in the config
345
+ dataeval-flow --config params.yaml --data . --output ./results
346
+
347
+ # One task by name, whether or not the config marks it enabled
348
+ dataeval-flow --config params.yaml --task clean_my_data
349
+
350
+ # Several, in the order given
351
+ dataeval-flow --config params.yaml --task clean_my_data --task analyze_my_data
352
+
353
+ # Stop the pipeline when a finding breaches its health threshold
354
+ dataeval-flow --config params.yaml --output ./results --fail-on-warning
355
+ ```
356
+
357
+ **Exit codes:** `0` when every task succeeded, `1` when any task failed. Health
358
+ warnings are reported but are not fatal unless you pass `--fail-on-warning`, which
359
+ turns them into an exit code of `1` as well. Every run's `result.json` carries a
360
+ `health` block per task (`status`, `warnings`, `findings`) so a pipeline can gate
361
+ on findings without parsing the text report.
362
+
363
+ ### Workflow Discovery (`workflows`)
312
364
 
313
- | Command | Purpose |
314
- | ---------------------- | ---------------------------------------------------------------- |
315
- | `dataeval-flow [opts]` | Headless execution — for automation and CI/CD pipelines |
316
- | `dataeval-flow app` | Interactive TUI dashboard — configure, execute, and view results |
317
- | `dataeval-flow config` | Simple CLI config builder — create/edit configs without the TUI |
365
+ For images that ship without the TUI extra:
366
+
367
+ ```bash
368
+ # What can this build run?
369
+ dataeval-flow workflows
370
+ dataeval-flow workflows --json
371
+
372
+ # What does a given workflow type accept?
373
+ dataeval-flow workflows data-cleaning
374
+ ```
318
375
 
319
376
  ### Interactive TUI (`app`)
320
377
 
@@ -350,12 +407,35 @@ python -m dataeval_flow config --config /path/to/params.yaml
350
407
 
351
408
  Configs can be saved as YAML or JSON.
352
409
 
410
+ ### Encoding Descriptor (`encoding`)
411
+
412
+ Extract the metadata encoding descriptor from an archived `result.json` and write it
413
+ where it can be reviewed and committed, so a later dataset is cut the same way:
414
+
415
+ ```bash
416
+ python -m dataeval_flow encoding output/results/result.json -o policy/factor_bins.json
417
+ python -m dataeval_flow encoding output/results/result.json --task clean_my_data
418
+ ```
419
+
420
+ Reference the committed descriptor from a metadata policy's `encoding` field. A run with
421
+ `-o` already writes `results/encoding.json` beside its results; this command recovers one
422
+ from a result archived earlier. See
423
+ [Configure metadata binning](https://dataeval-flow.readthedocs.io/en/latest/how_to/configure_metadata_binning.html).
424
+
353
425
  ## Dependencies
354
426
 
427
+ Declared runtime dependencies:
428
+
355
429
  - `dataeval` - Core evaluation library
356
- - `datamaite` - MAITE protocol dataset loaders
357
- - `maite` - MAITE protocol library
430
+ - `datamaite` - MAITE protocol dataset loaders (which brings in `maite` itself)
358
431
  - `pydantic` - Structural typing and schema validation
432
+ - `click` - Interactive prompts for the simple CLI config builder
433
+ - `pyyaml` - YAML config parsing
434
+ - `numpy` - Array handling
435
+
436
+ PyTorch arrives transitively through `dataeval`. Optional extras (`onnx`, `opencv`,
437
+ `app`, `ontology`, and the CUDA variants) are listed under
438
+ [Running Without Container](#running-without-container).
359
439
 
360
440
  ## Troubleshooting
361
441
 
@@ -19,7 +19,7 @@ classifiers = [
19
19
  ]
20
20
  dependencies = [
21
21
  "click>=8.0",
22
- "dataeval==1.1.0-rc6",
22
+ "dataeval>=1.1.1",
23
23
  "datamaite[ic,od]==0.4.1",
24
24
  "numpy>=1.24.2",
25
25
  "pydantic>=2.0",
@@ -51,10 +51,9 @@ onnx-cu130 = [
51
51
  "onnxruntime>=1.20; python_version == '3.10' and extra != 'onnx-cu126'", # CUDA 13.0 is not supported on Python 3.10
52
52
  "onnxruntime-gpu>=1.27; python_version >= '3.11' and extra != 'onnx-cu126'",
53
53
  ]
54
- opencv = ["opencv-python-headless>=4.8.0"]
55
- opencv-fips = ["opencv-python-headless>=4.8.0,<4.13.0"] # OpenCV 4.13 and higher are not FIPS compliant
54
+ opencv = ["opencv-python-headless>=4.8.0,<4.13.0"] # OpenCV 4.13 and higher are not FIPS compliant
56
55
  app = ["textual>=3.0"]
57
- ontology = ["dataeval[ontology]==1.1.0-rc6"]
56
+ ontology = ["dataeval[ontology]>=1.1.1"]
58
57
 
59
58
  [project.urls]
60
59
  Homepage = "https://github.com/aria-ml/dataeval-flow"
@@ -167,10 +166,6 @@ conflicts = [
167
166
  { extra = "onnx" },
168
167
  { extra = "onnx-cu126" },
169
168
  { extra = "onnx-cu130" },
170
- ],
171
- [
172
- { extra = "opencv" },
173
- { extra = "opencv-fips" },
174
169
  ]
175
170
  ]
176
171
 
@@ -216,8 +211,6 @@ torch = { version = ">=2.2.0", source = "pytorch-cpu", optional = true }
216
211
  torchvision = { version = ">=0.17.0", source = "pytorch-cpu", optional = true }
217
212
 
218
213
  [tool.pyproject2conda.dependencies]
219
- # Conda follows PEP versioning which deviates from PyPI semver
220
- dataeval = { skip = true, packages = "dataeval==1.1.0rc6" }
221
214
  datamaite = { pip = true }
222
215
 
223
216
  # --- Build System ---
@@ -334,7 +327,7 @@ ignore = [
334
327
  "C416",
335
328
  ]
336
329
  fixable = ["ALL"]
337
- per-file-ignores = { "tests/*" = ["ANN", "S101", "D", "SLF001", "ARG002", "PT019"], "docs/*" = ["D", "E402", "E501", "S101"], "verification/*" = ["ANN", "S101", "D", "SLF001", "ARG001", "ARG002", "PT011", "PT019"] }
330
+ per-file-ignores = { "tests/*" = ["ANN", "S101", "D", "SLF001", "ARG002", "PT019"], "docs/*" = ["D", "E402", "E501", "S101"], "verification/*" = ["ANN", "S101", "D", "SLF001", "ARG001", "ARG002", "PT011", "PT019"], "scripts/*" = ["C901", "D", "S"] }
338
331
 
339
332
  [tool.ruff.lint.pydocstyle]
340
333
  convention = "pep257"
@@ -349,5 +342,5 @@ indent-style = "space"
349
342
  # --- Codespell ---
350
343
 
351
344
  [tool.codespell]
352
- skip = "./*env*,./output,./htmlcov,./.nox,*.lock,./docs/source/notebooks/*,./docker/cosign.pub,./docker/Dockerfile.*,*.onnx"
345
+ skip = "./*env*,./output,./specs,./htmlcov,./.nox,*.lock,./docs/source/notebooks/*,./docker/cosign.pub,./docker/Dockerfile.*,*.onnx"
353
346
  ignore-words-list = ["statics"]