hydraflow 0.5.3__py3-none-any.whl → 0.5.4__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- hydraflow/config.py +0 -3
- hydraflow/context.py +0 -3
- hydraflow/mlflow.py +0 -4
- hydraflow/param.py +4 -5
- hydraflow/run_collection.py +24 -31
- hydraflow/run_data.py +0 -1
- hydraflow/utils.py +0 -5
- {hydraflow-0.5.3.dist-info → hydraflow-0.5.4.dist-info}/METADATA +1 -1
- hydraflow-0.5.4.dist-info/RECORD +14 -0
- hydraflow-0.5.3.dist-info/RECORD +0 -14
- {hydraflow-0.5.3.dist-info → hydraflow-0.5.4.dist-info}/WHEEL +0 -0
- {hydraflow-0.5.3.dist-info → hydraflow-0.5.4.dist-info}/licenses/LICENSE +0 -0
hydraflow/config.py
CHANGED
@@ -22,7 +22,6 @@ def collect_params(config: object) -> dict[str, Any]:
|
|
22
22
|
|
23
23
|
Returns:
|
24
24
|
dict[str, Any]: A dictionary of collected parameters.
|
25
|
-
|
26
25
|
"""
|
27
26
|
return dict(iter_params(config))
|
28
27
|
|
@@ -41,7 +40,6 @@ def iter_params(config: object, prefix: str = "") -> Iterator[tuple[str, Any]]:
|
|
41
40
|
|
42
41
|
Yields:
|
43
42
|
Key-value pairs representing the parameters in the configuration object.
|
44
|
-
|
45
43
|
"""
|
46
44
|
if config is None:
|
47
45
|
return
|
@@ -115,7 +113,6 @@ def select_config(config: object, names: list[str]) -> dict[str, Any]:
|
|
115
113
|
|
116
114
|
Returns:
|
117
115
|
DictConfig: A new configuration object containing only the selected parameters.
|
118
|
-
|
119
116
|
"""
|
120
117
|
if not isinstance(config, DictConfig):
|
121
118
|
config = OmegaConf.structured(config)
|
hydraflow/context.py
CHANGED
@@ -48,7 +48,6 @@ def log_run(
|
|
48
48
|
# Perform operations within the MLflow run context
|
49
49
|
pass
|
50
50
|
```
|
51
|
-
|
52
51
|
"""
|
53
52
|
if config:
|
54
53
|
log_params(config, synchronous=synchronous)
|
@@ -118,7 +117,6 @@ def start_run( # noqa: PLR0913
|
|
118
117
|
- `mlflow.start_run`: The MLflow function to start a run directly.
|
119
118
|
- `log_run`: A context manager to log parameters and manage the MLflow
|
120
119
|
run context.
|
121
|
-
|
122
120
|
"""
|
123
121
|
with (
|
124
122
|
mlflow.start_run(
|
@@ -169,7 +167,6 @@ def chdir_artifact(
|
|
169
167
|
Args:
|
170
168
|
run (Run): The run to get the artifact directory from.
|
171
169
|
artifact_path (str | None): The artifact path.
|
172
|
-
|
173
170
|
"""
|
174
171
|
curdir = Path.cwd()
|
175
172
|
path = mlflow.artifacts.download_artifacts(
|
hydraflow/mlflow.py
CHANGED
@@ -54,7 +54,6 @@ def set_experiment(
|
|
54
54
|
Returns:
|
55
55
|
Experiment: An instance of `mlflow.entities.Experiment` representing
|
56
56
|
the new active experiment.
|
57
|
-
|
58
57
|
"""
|
59
58
|
if uri is not None:
|
60
59
|
mlflow.set_tracking_uri(uri)
|
@@ -78,7 +77,6 @@ def log_params(config: object, *, synchronous: bool | None = None) -> None:
|
|
78
77
|
config (object): The configuration object to log the parameters from.
|
79
78
|
synchronous (bool | None): Whether to log the parameters synchronously.
|
80
79
|
Defaults to None.
|
81
|
-
|
82
80
|
"""
|
83
81
|
for key, value in iter_params(config):
|
84
82
|
mlflow.log_param(key, value, synchronous=synchronous)
|
@@ -135,7 +133,6 @@ def search_runs( # noqa: PLR0913
|
|
135
133
|
|
136
134
|
Returns:
|
137
135
|
A `RunCollection` object containing the search results.
|
138
|
-
|
139
136
|
"""
|
140
137
|
runs = mlflow.search_runs(
|
141
138
|
experiment_ids=experiment_ids,
|
@@ -180,7 +177,6 @@ def list_runs(
|
|
180
177
|
Returns:
|
181
178
|
RunCollection: A `RunCollection` instance containing the runs for the
|
182
179
|
specified experiments.
|
183
|
-
|
184
180
|
"""
|
185
181
|
rc = _list_runs(experiment_names, n_jobs)
|
186
182
|
if status is None:
|
hydraflow/param.py
CHANGED
@@ -18,7 +18,7 @@ if TYPE_CHECKING:
|
|
18
18
|
from mlflow.entities import Run
|
19
19
|
|
20
20
|
|
21
|
-
def match(param: str, value: Any) -> bool:
|
21
|
+
def match(param: str, value: Any) -> bool: # noqa: PLR0911
|
22
22
|
"""Check if the string matches the specified value.
|
23
23
|
|
24
24
|
Args:
|
@@ -28,8 +28,10 @@ def match(param: str, value: Any) -> bool:
|
|
28
28
|
Returns:
|
29
29
|
True if the parameter matches the specified value,
|
30
30
|
False otherwise.
|
31
|
-
|
32
31
|
"""
|
32
|
+
if callable(value):
|
33
|
+
return value(param)
|
34
|
+
|
33
35
|
if any(value is x for x in [None, True, False]):
|
34
36
|
return param == str(value)
|
35
37
|
|
@@ -92,7 +94,6 @@ def to_value(param: str | None, type_: type) -> Any:
|
|
92
94
|
|
93
95
|
Returns:
|
94
96
|
The converted value.
|
95
|
-
|
96
97
|
"""
|
97
98
|
if param is None or param == "None":
|
98
99
|
return None
|
@@ -128,7 +129,6 @@ def get_params(run: Run, *names: str | list[str]) -> tuple[str | None, ...]:
|
|
128
129
|
Returns:
|
129
130
|
tuple[str | None, ...]: A tuple containing the values of the specified
|
130
131
|
parameters in the order they were provided.
|
131
|
-
|
132
132
|
"""
|
133
133
|
names_ = []
|
134
134
|
for name in names:
|
@@ -155,7 +155,6 @@ def get_values(run: Run, names: list[str], types: list[type]) -> tuple[Any, ...]
|
|
155
155
|
Returns:
|
156
156
|
tuple[Any, ...]: A tuple containing the values of the specified
|
157
157
|
parameters in the order they were provided.
|
158
|
-
|
159
158
|
"""
|
160
159
|
params = get_params(run, names)
|
161
160
|
it = zip(params, types, strict=True)
|
hydraflow/run_collection.py
CHANGED
@@ -106,7 +106,6 @@ class RunCollection:
|
|
106
106
|
|
107
107
|
Returns:
|
108
108
|
A new `RunCollection` instance with the runs from both collections.
|
109
|
-
|
110
109
|
"""
|
111
110
|
return self.__class__(self._runs + other._runs)
|
112
111
|
|
@@ -119,7 +118,6 @@ class RunCollection:
|
|
119
118
|
Returns:
|
120
119
|
A new `RunCollection` instance with the runs that are in this collection
|
121
120
|
but not in the other.
|
122
|
-
|
123
121
|
"""
|
124
122
|
runs = [run for run in self._runs if run not in other._runs] # noqa: SLF001
|
125
123
|
return self.__class__(runs)
|
@@ -152,7 +150,6 @@ class RunCollection:
|
|
152
150
|
Returns:
|
153
151
|
A new `RunCollection` instance containing the first n runs if n is
|
154
152
|
positive, or the last n runs if n is negative.
|
155
|
-
|
156
153
|
"""
|
157
154
|
if n < 0:
|
158
155
|
return self.__class__(self._runs[n:])
|
@@ -167,7 +164,6 @@ class RunCollection:
|
|
167
164
|
|
168
165
|
Raises:
|
169
166
|
ValueError: If the collection does not contain exactly one run.
|
170
|
-
|
171
167
|
"""
|
172
168
|
if len(self._runs) != 1:
|
173
169
|
raise ValueError("The collection does not contain exactly one run.")
|
@@ -180,7 +176,6 @@ class RunCollection:
|
|
180
176
|
Returns:
|
181
177
|
The only `Run` instance in the collection, or None if the collection
|
182
178
|
does not contain exactly one run.
|
183
|
-
|
184
179
|
"""
|
185
180
|
return self._runs[0] if len(self._runs) == 1 else None
|
186
181
|
|
@@ -192,7 +187,6 @@ class RunCollection:
|
|
192
187
|
|
193
188
|
Raises:
|
194
189
|
ValueError: If the collection is empty.
|
195
|
-
|
196
190
|
"""
|
197
191
|
if not self._runs:
|
198
192
|
raise ValueError("The collection is empty.")
|
@@ -205,7 +199,6 @@ class RunCollection:
|
|
205
199
|
Returns:
|
206
200
|
The first `Run` instance in the collection, or None if the collection
|
207
201
|
is empty.
|
208
|
-
|
209
202
|
"""
|
210
203
|
return self._runs[0] if self._runs else None
|
211
204
|
|
@@ -217,7 +210,6 @@ class RunCollection:
|
|
217
210
|
|
218
211
|
Raises:
|
219
212
|
ValueError: If the collection is empty.
|
220
|
-
|
221
213
|
"""
|
222
214
|
if not self._runs:
|
223
215
|
raise ValueError("The collection is empty.")
|
@@ -230,11 +222,18 @@ class RunCollection:
|
|
230
222
|
Returns:
|
231
223
|
The last `Run` instance in the collection, or None if the collection
|
232
224
|
is empty.
|
233
|
-
|
234
225
|
"""
|
235
226
|
return self._runs[-1] if self._runs else None
|
236
227
|
|
237
|
-
def filter(
|
228
|
+
def filter(
|
229
|
+
self,
|
230
|
+
config: object | None = None,
|
231
|
+
*,
|
232
|
+
override: bool = False,
|
233
|
+
select: list[str] | None = None,
|
234
|
+
status: str | list[str] | int | list[int] | None = None,
|
235
|
+
**kwargs,
|
236
|
+
) -> RunCollection:
|
238
237
|
"""Filter the `Run` instances based on the provided configuration.
|
239
238
|
|
240
239
|
This method filters the runs in the collection according to the
|
@@ -254,13 +253,26 @@ class RunCollection:
|
|
254
253
|
config (object | None): The configuration object to filter the runs.
|
255
254
|
This can be any object that provides key-value pairs through
|
256
255
|
the `iter_params` function.
|
256
|
+
override (bool): If True, override the configuration object with the
|
257
|
+
provided key-value pairs.
|
258
|
+
select (list[str] | None): The list of parameters to select.
|
259
|
+
status (str | list[str] | int | list[int] | None): The status of the
|
260
|
+
runs to filter.
|
257
261
|
**kwargs: Additional key-value pairs to filter the runs.
|
258
262
|
|
259
263
|
Returns:
|
260
264
|
A new `RunCollection` object containing the filtered runs.
|
261
|
-
|
262
265
|
"""
|
263
|
-
return RunCollection(
|
266
|
+
return RunCollection(
|
267
|
+
filter_runs(
|
268
|
+
self._runs,
|
269
|
+
config,
|
270
|
+
override=override,
|
271
|
+
select=select,
|
272
|
+
status=status,
|
273
|
+
**kwargs,
|
274
|
+
),
|
275
|
+
)
|
264
276
|
|
265
277
|
def find(self, config: object | None = None, **kwargs) -> Run:
|
266
278
|
"""Find the first `Run` instance based on the provided configuration.
|
@@ -282,7 +294,6 @@ class RunCollection:
|
|
282
294
|
|
283
295
|
See Also:
|
284
296
|
`filter`: Perform the actual filtering logic.
|
285
|
-
|
286
297
|
"""
|
287
298
|
try:
|
288
299
|
return self.filter(config, **kwargs).first()
|
@@ -307,7 +318,6 @@ class RunCollection:
|
|
307
318
|
|
308
319
|
See Also:
|
309
320
|
`filter`: Perform the actual filtering logic.
|
310
|
-
|
311
321
|
"""
|
312
322
|
return self.filter(config, **kwargs).try_first()
|
313
323
|
|
@@ -331,7 +341,6 @@ class RunCollection:
|
|
331
341
|
|
332
342
|
See Also:
|
333
343
|
`filter`: Perform the actual filtering logic.
|
334
|
-
|
335
344
|
"""
|
336
345
|
try:
|
337
346
|
return self.filter(config, **kwargs).last()
|
@@ -356,7 +365,6 @@ class RunCollection:
|
|
356
365
|
|
357
366
|
See Also:
|
358
367
|
`filter`: Perform the actual filtering logic.
|
359
|
-
|
360
368
|
"""
|
361
369
|
return self.filter(config, **kwargs).try_last()
|
362
370
|
|
@@ -381,7 +389,6 @@ class RunCollection:
|
|
381
389
|
|
382
390
|
See Also:
|
383
391
|
`filter`: Perform the actual filtering logic.
|
384
|
-
|
385
392
|
"""
|
386
393
|
try:
|
387
394
|
return self.filter(config, **kwargs).one()
|
@@ -410,7 +417,6 @@ class RunCollection:
|
|
410
417
|
|
411
418
|
See Also:
|
412
419
|
`filter`: Perform the actual filtering logic.
|
413
|
-
|
414
420
|
"""
|
415
421
|
return self.filter(config, **kwargs).try_one()
|
416
422
|
|
@@ -423,7 +429,6 @@ class RunCollection:
|
|
423
429
|
|
424
430
|
Returns:
|
425
431
|
A list of unique parameter names.
|
426
|
-
|
427
432
|
"""
|
428
433
|
param_names = set()
|
429
434
|
|
@@ -448,7 +453,6 @@ class RunCollection:
|
|
448
453
|
Returns:
|
449
454
|
A dictionary where the keys are parameter names and the values are
|
450
455
|
lists of parameter values.
|
451
|
-
|
452
456
|
"""
|
453
457
|
params = {}
|
454
458
|
|
@@ -480,7 +484,6 @@ class RunCollection:
|
|
480
484
|
|
481
485
|
Yields:
|
482
486
|
Results obtained by applying the function to each run in the collection.
|
483
|
-
|
484
487
|
"""
|
485
488
|
return (func(run, *args, **kwargs) for run in self)
|
486
489
|
|
@@ -501,7 +504,6 @@ class RunCollection:
|
|
501
504
|
Yields:
|
502
505
|
Results obtained by applying the function to each run id in the
|
503
506
|
collection.
|
504
|
-
|
505
507
|
"""
|
506
508
|
return (func(run_id, *args, **kwargs) for run_id in self.info.run_id)
|
507
509
|
|
@@ -522,7 +524,6 @@ class RunCollection:
|
|
522
524
|
Yields:
|
523
525
|
Results obtained by applying the function to each run configuration
|
524
526
|
in the collection.
|
525
|
-
|
526
527
|
"""
|
527
528
|
return (func(load_config(run), *args, **kwargs) for run in self)
|
528
529
|
|
@@ -547,7 +548,6 @@ class RunCollection:
|
|
547
548
|
Yields:
|
548
549
|
Results obtained by applying the function to each artifact URI in the
|
549
550
|
collection.
|
550
|
-
|
551
551
|
"""
|
552
552
|
return (func(uri, *args, **kwargs) for uri in self.info.artifact_uri)
|
553
553
|
|
@@ -571,7 +571,6 @@ class RunCollection:
|
|
571
571
|
Yields:
|
572
572
|
Results obtained by applying the function to each artifact directory
|
573
573
|
in the collection.
|
574
|
-
|
575
574
|
"""
|
576
575
|
return (func(dir, *args, **kwargs) for dir in self.info.artifact_dir) # noqa: A001
|
577
576
|
|
@@ -595,7 +594,6 @@ class RunCollection:
|
|
595
594
|
dictionary where the keys are tuples of parameter values and the
|
596
595
|
values are `RunCollection` objects containing the runs that match
|
597
596
|
those parameter values.
|
598
|
-
|
599
597
|
"""
|
600
598
|
grouped_runs: dict[str | None | tuple[str | None, ...], list[Run]] = {}
|
601
599
|
is_list = isinstance(names, list)
|
@@ -622,7 +620,6 @@ class RunCollection:
|
|
622
620
|
key (Callable[[Run], Any] | None): A function that takes a run and returns
|
623
621
|
a value to sort by.
|
624
622
|
reverse (bool): If True, sort in descending order.
|
625
|
-
|
626
623
|
"""
|
627
624
|
self._runs.sort(key=key or (lambda x: x.info.start_time), reverse=reverse)
|
628
625
|
|
@@ -636,7 +633,6 @@ class RunCollection:
|
|
636
633
|
|
637
634
|
Returns:
|
638
635
|
A list of values for the specified parameters.
|
639
|
-
|
640
636
|
"""
|
641
637
|
is_list = isinstance(names, list)
|
642
638
|
|
@@ -668,7 +664,6 @@ class RunCollection:
|
|
668
664
|
This can be a single parameter name or multiple names provided
|
669
665
|
as separate arguments or as a list.
|
670
666
|
reverse (bool): If True, sort in descending order.
|
671
|
-
|
672
667
|
"""
|
673
668
|
values = self.values(names)
|
674
669
|
index = sorted(range(len(self)), key=lambda i: values[i], reverse=reverse)
|
@@ -726,7 +721,6 @@ def filter_runs(
|
|
726
721
|
|
727
722
|
Returns:
|
728
723
|
A list of runs that match the specified configuration and key-value pairs.
|
729
|
-
|
730
724
|
"""
|
731
725
|
if override:
|
732
726
|
config = select_overrides(config)
|
@@ -757,7 +751,6 @@ def filter_runs_by_status(
|
|
757
751
|
|
758
752
|
Returns:
|
759
753
|
A list of runs that match the specified status.
|
760
|
-
|
761
754
|
"""
|
762
755
|
if isinstance(status, str):
|
763
756
|
if status.startswith("!"):
|
hydraflow/run_data.py
CHANGED
hydraflow/utils.py
CHANGED
@@ -26,7 +26,6 @@ def get_artifact_dir(run: Run | None = None) -> Path:
|
|
26
26
|
|
27
27
|
Returns:
|
28
28
|
The local path to the directory where the artifacts are downloaded.
|
29
|
-
|
30
29
|
"""
|
31
30
|
uri = mlflow.get_artifact_uri() if run is None else run.info.artifact_uri
|
32
31
|
|
@@ -53,7 +52,6 @@ def get_artifact_path(run: Run | None, path: str) -> Path:
|
|
53
52
|
|
54
53
|
Returns:
|
55
54
|
The local path to the artifact.
|
56
|
-
|
57
55
|
"""
|
58
56
|
return get_artifact_dir(run) / path
|
59
57
|
|
@@ -76,7 +74,6 @@ def get_hydra_output_dir(run: Run | None = None) -> Path:
|
|
76
74
|
Raises:
|
77
75
|
FileNotFoundError: If the Hydra configuration file is not found
|
78
76
|
in the artifacts.
|
79
|
-
|
80
77
|
"""
|
81
78
|
if run is None:
|
82
79
|
hc = HydraConfig.get()
|
@@ -105,7 +102,6 @@ def load_config(run: Run) -> DictConfig:
|
|
105
102
|
Returns:
|
106
103
|
The loaded configuration as a DictConfig object. Returns an empty
|
107
104
|
DictConfig if the configuration file is not found.
|
108
|
-
|
109
105
|
"""
|
110
106
|
path = get_artifact_dir(run) / ".hydra/config.yaml"
|
111
107
|
return OmegaConf.load(path) # type: ignore
|
@@ -130,7 +126,6 @@ def load_overrides(run: Run) -> list[str]:
|
|
130
126
|
Returns:
|
131
127
|
The loaded overrides as a list of strings. Returns an empty list
|
132
128
|
if the overrides file is not found.
|
133
|
-
|
134
129
|
"""
|
135
130
|
path = get_artifact_dir(run) / ".hydra/overrides.yaml"
|
136
131
|
return [str(x) for x in OmegaConf.load(path)]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: hydraflow
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.4
|
4
4
|
Summary: Hydraflow integrates Hydra and MLflow to manage and track machine learning experiments.
|
5
5
|
Project-URL: Documentation, https://daizutabi.github.io/hydraflow/
|
6
6
|
Project-URL: Source, https://github.com/daizutabi/hydraflow
|
@@ -0,0 +1,14 @@
|
|
1
|
+
hydraflow/__init__.py,sha256=9XO9FD3uiTTPN6X6UAC9FtkJjEqUQZNqpoAmSrjUHfI,855
|
2
|
+
hydraflow/config.py,sha256=k6pwneDoC4mb7cVkafMfITn8QemICPnFbhIRGLsmF4w,4323
|
3
|
+
hydraflow/context.py,sha256=KukvVexCF32myBOryYMVhINknbAgPFcanmr4cT2EXog,5521
|
4
|
+
hydraflow/mlflow.py,sha256=TVp6O9rYNYcdqnlssstXQlI_P_N6inUG-F01X6uJNv4,8928
|
5
|
+
hydraflow/param.py,sha256=kuVlxEfgoKL35rNu49M-PkdNr41djK0YZ5IO7fHTSSU,4568
|
6
|
+
hydraflow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
+
hydraflow/run_collection.py,sha256=mMGpr6cAh9Bf2SeRsYNHySOQJNrWNMI7esDWzyMxnJg,27415
|
8
|
+
hydraflow/run_data.py,sha256=V_yhkBsJlDTkLbh1TShkvDxUQYUYTpXFahXJGfdmgro,1524
|
9
|
+
hydraflow/run_info.py,sha256=Jf5wrIjRLIV1-k-obHDqwKHa6j_ZonrY8od-rXlbtMo,1024
|
10
|
+
hydraflow/utils.py,sha256=ha-gSq3TkWWOlKmnDuyLNCuKNQdEG08CXRzKtb3C4mk,4344
|
11
|
+
hydraflow-0.5.4.dist-info/METADATA,sha256=ijJv5powqpMjZ1adDCWdLxRLeEaosmKF3gG74L25fCs,4700
|
12
|
+
hydraflow-0.5.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
13
|
+
hydraflow-0.5.4.dist-info/licenses/LICENSE,sha256=IGdDrBPqz1O0v_UwCW-NJlbX9Hy9b3uJ11t28y2srmY,1062
|
14
|
+
hydraflow-0.5.4.dist-info/RECORD,,
|
hydraflow-0.5.3.dist-info/RECORD
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
hydraflow/__init__.py,sha256=9XO9FD3uiTTPN6X6UAC9FtkJjEqUQZNqpoAmSrjUHfI,855
|
2
|
-
hydraflow/config.py,sha256=MNX9da5bPVDcjnpji7Cm9ndK6ura92pt361m4PRh6_E,4326
|
3
|
-
hydraflow/context.py,sha256=3g7OQXWcFvK6PVVbXpQg7Hr8nsJkF9pLFrXNi_3aV5A,5524
|
4
|
-
hydraflow/mlflow.py,sha256=h2S_A2wElr_1lAq0D1wkoEfdtDZpPuWFNRcO8mV_VrA,8932
|
5
|
-
hydraflow/param.py,sha256=c5sc6NwD6DKwZzVwprXzZD5FSi6qRgSHkc6TXBKQEdg,4502
|
6
|
-
hydraflow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
-
hydraflow/run_collection.py,sha256=zPrlKwLuzqePj57pXbgKWrE03S_kjxTaxY9trItf6Gc,26772
|
8
|
-
hydraflow/run_data.py,sha256=dpyyfnuH9mCtIZeigMo1iFQo9bafMdEL4i4uI2l0UqY,1525
|
9
|
-
hydraflow/run_info.py,sha256=Jf5wrIjRLIV1-k-obHDqwKHa6j_ZonrY8od-rXlbtMo,1024
|
10
|
-
hydraflow/utils.py,sha256=oXjcyfQBbPzJNTh3_CbZfl23zgJS-mbNM9GAWBwsn8c,4349
|
11
|
-
hydraflow-0.5.3.dist-info/METADATA,sha256=8grWqDq2SBXtVljA72NnKJPJjwaWmjOOXIvGSOP5kqM,4700
|
12
|
-
hydraflow-0.5.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
13
|
-
hydraflow-0.5.3.dist-info/licenses/LICENSE,sha256=IGdDrBPqz1O0v_UwCW-NJlbX9Hy9b3uJ11t28y2srmY,1062
|
14
|
-
hydraflow-0.5.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|