hydraflow 0.4.0__py3-none-any.whl → 0.4.2__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
hydraflow/context.py CHANGED
@@ -10,6 +10,7 @@ from pathlib import Path
10
10
  from typing import TYPE_CHECKING
11
11
 
12
12
  import mlflow
13
+ import mlflow.artifacts
13
14
  from hydra.core.hydra_config import HydraConfig
14
15
  from watchdog.events import FileModifiedEvent, PatternMatchingEventHandler
15
16
  from watchdog.observers import Observer
hydraflow/mlflow.py CHANGED
@@ -21,6 +21,7 @@ from typing import TYPE_CHECKING
21
21
 
22
22
  import joblib
23
23
  import mlflow
24
+ import mlflow.artifacts
24
25
  from hydra.core.hydra_config import HydraConfig
25
26
  from mlflow.entities import ViewType
26
27
  from mlflow.tracking.fluent import SEARCH_MAX_RESULTS_PANDAS, _get_experiment_id
hydraflow/param.py CHANGED
@@ -10,7 +10,12 @@ matching for list and tuple types respectively.
10
10
 
11
11
  from __future__ import annotations
12
12
 
13
- from typing import Any
13
+ from typing import TYPE_CHECKING, Any
14
+
15
+ from omegaconf import ListConfig, OmegaConf
16
+
17
+ if TYPE_CHECKING:
18
+ from mlflow.entities import Run
14
19
 
15
20
 
16
21
  def match(param: str, value: Any) -> bool:
@@ -25,7 +30,7 @@ def match(param: str, value: Any) -> bool:
25
30
  False otherwise.
26
31
 
27
32
  """
28
- if value in [None, True, False]:
33
+ if any(value is x for x in [None, True, False]):
29
34
  return param == str(value)
30
35
 
31
36
  if isinstance(value, list) and (m := _match_list(param, value)) is not None:
@@ -34,12 +39,12 @@ def match(param: str, value: Any) -> bool:
34
39
  if isinstance(value, tuple) and (m := _match_tuple(param, value)) is not None:
35
40
  return m
36
41
 
42
+ if isinstance(value, int | float):
43
+ return float(param) == value
44
+
37
45
  if isinstance(value, str):
38
46
  return param == value
39
47
 
40
- if isinstance(value, int | float):
41
- return type(value)(param) == value
42
-
43
48
  return param == str(value)
44
49
 
45
50
 
@@ -76,3 +81,82 @@ def _match_tuple(param: str, value: tuple) -> bool | None:
76
81
  return None
77
82
 
78
83
  return value[0] <= type(value[0])(param) <= value[1] # type: ignore
84
+
85
+
86
+ def to_value(param: str | None, type_: type) -> Any:
87
+ """Convert the parameter to the specified type.
88
+
89
+ Args:
90
+ param (str | None): The parameter to convert.
91
+ type_ (type): The type to convert to.
92
+
93
+ Returns:
94
+ The converted value.
95
+
96
+ """
97
+ if param is None or param == "None":
98
+ return None
99
+
100
+ if type_ is int:
101
+ return int(param)
102
+
103
+ if type_ is float:
104
+ return float(param)
105
+
106
+ if type_ is bool:
107
+ return param == "True"
108
+
109
+ if type_ is list or type_ is ListConfig:
110
+ return list(OmegaConf.create(param))
111
+
112
+ return param
113
+
114
+
115
+ def get_params(run: Run, *names: str | list[str]) -> tuple[str | None, ...]:
116
+ """Retrieve the values of specified parameters from the given run.
117
+
118
+ This function extracts the values of the parameters identified by the
119
+ provided names from the specified run. It can accept both individual
120
+ parameter names and lists of parameter names.
121
+
122
+ Args:
123
+ run (Run): The run object from which to extract parameter values.
124
+ *names (str | list[str]): The names of the parameters to retrieve.
125
+ This can be a single parameter name or multiple names provided
126
+ as separate arguments or as a list.
127
+
128
+ Returns:
129
+ tuple[str | None, ...]: A tuple containing the values of the specified
130
+ parameters in the order they were provided.
131
+
132
+ """
133
+ names_ = []
134
+ for name in names:
135
+ if isinstance(name, list):
136
+ names_.extend(name)
137
+ else:
138
+ names_.append(name)
139
+
140
+ params = run.data.params
141
+ return tuple(params.get(name) for name in names_)
142
+
143
+
144
+ def get_values(run: Run, names: list[str], types: list[type]) -> tuple[Any, ...]:
145
+ """Retrieve the values of specified parameters from the given run.
146
+
147
+ This function extracts the values of the parameters identified by the
148
+ provided names from the specified run.
149
+
150
+ Args:
151
+ run (Run): The run object from which to extract parameter values.
152
+ names (list[str]): The names of the parameters to retrieve.
153
+ types (list[type]): The types to convert to.
154
+
155
+ Returns:
156
+ tuple[Any, ...]: A tuple containing the values of the specified
157
+ parameters in the order they were provided.
158
+
159
+ """
160
+ params = get_params(run, names)
161
+ it = zip(params, types, strict=True)
162
+ return tuple(to_value(param, type_) for param, type_ in it)
@@ -27,6 +27,7 @@ from mlflow.entities import RunStatus
27
27
 
28
28
  import hydraflow.param
29
29
  from hydraflow.config import iter_params, select_config, select_overrides
30
+ from hydraflow.param import get_params, get_values
30
31
  from hydraflow.run_data import RunCollectionData
31
32
  from hydraflow.run_info import RunCollectionInfo
32
33
  from hydraflow.utils import load_config
@@ -132,25 +133,6 @@ class RunCollection:
132
133
 
133
134
  return self.__class__(self._runs[:n])
134
135
 
135
- def sort(
136
- self,
137
- key: Callable[[Run], Any] | None = None,
138
- *,
139
- reverse: bool = False,
140
- ) -> None:
141
- """Sort the runs in the collection.
142
-
143
- Sort the runs in the collection according to the provided key function
144
- and optional reverse flag.
145
-
146
- Args:
147
- key (Callable[[Run], Any] | None): A function that takes a run and returns
148
- a value to sort by.
149
- reverse (bool): If True, sort in descending order.
150
-
151
- """
152
- self._runs.sort(key=key or (lambda x: x.info.start_time), reverse=reverse)
153
-
154
136
  def one(self) -> Run:
155
137
  """Get the only `Run` instance in the collection.
156
138
 
@@ -599,6 +581,73 @@ class RunCollection:
599
581
 
600
582
  return {key: RunCollection(runs) for key, runs in grouped_runs.items()}
601
583
 
584
+ def sort(
585
+ self,
586
+ key: Callable[[Run], Any] | None = None,
587
+ *,
588
+ reverse: bool = False,
589
+ ) -> None:
590
+ """Sort the runs in the collection.
591
+
592
+ Sort the runs in the collection according to the provided key function
593
+ and optional reverse flag.
594
+
595
+ Args:
596
+ key (Callable[[Run], Any] | None): A function that takes a run and returns
597
+ a value to sort by.
598
+ reverse (bool): If True, sort in descending order.
599
+
600
+ """
601
+ self._runs.sort(key=key or (lambda x: x.info.start_time), reverse=reverse)
602
+
603
+ def values(self, names: str | list[str]) -> list[Any]:
604
+ """Get the values of specified parameters from the runs.
605
+
606
+ Args:
607
+ names (str | list[str]): The names of the parameters to get the values.
608
+ This can be a single parameter name or multiple names provided
609
+ as separate arguments or as a list.
610
+
611
+ Returns:
612
+ A list of values for the specified parameters.
613
+
614
+ """
615
+ is_list = isinstance(names, list)
616
+
617
+ if isinstance(names, str):
618
+ names = [names]
619
+
620
+ config = load_config(self.first())
621
+ types = [type(v) for v in select_config(config, names).values()]
622
+ values = [get_values(run, names, types) for run in self]
623
+
624
+ if is_list:
625
+ return values
626
+
627
+ return [v[0] for v in values]
628
+
629
+ def sort_by(
630
+ self,
631
+ names: str | list[str],
632
+ *,
633
+ reverse: bool = False,
634
+ ) -> RunCollection:
635
+ """Sort the runs in the collection by specified parameter names.
636
+
637
+ Sort the runs in the collection based on the values of the specified
638
+ parameters.
639
+
640
+ Args:
641
+ names (str | list[str]): The names of the parameters to sort by.
642
+ This can be a single parameter name or multiple names provided
643
+ as separate arguments or as a list.
644
+ reverse (bool): If True, sort in descending order.
645
+
646
+ """
647
+ values = self.values(names)
648
+ index = sorted(range(len(self)), key=lambda i: values[i], reverse=reverse)
649
+ return RunCollection([self[i] for i in index])
650
+
602
651
 
603
652
  def _param_matches(run: Run, key: str, value: Any) -> bool:
604
653
  params = run.data.params
@@ -703,31 +752,3 @@ def _to_lower(status: str | int) -> str:
703
752
  return status.lower()
704
753
 
705
754
  return RunStatus.to_string(status).lower()
706
-
707
-
708
- def get_params(run: Run, *names: str | list[str]) -> tuple[str | None, ...]:
709
- """Retrieve the values of specified parameters from the given run.
710
-
711
- This function extracts the values of the parameters identified by the
712
- provided names from the specified run. It can accept both individual
713
- parameter names and lists of parameter names.
714
-
715
- Args:
716
- run (Run): The run object from which to extract parameter values.
717
- *names (str | list[str]): The names of the parameters to retrieve.
718
- This can be a single parameter name or multiple names provided
719
- as separate arguments or as a list.
720
-
721
- Returns:
722
- tuple[str | None, ...]: A tuple containing the values of the specified
723
- parameters in the order they were provided.
724
-
725
- """
726
- names_ = []
727
- for name in names:
728
- if isinstance(name, list):
729
- names_.extend(name)
730
- else:
731
- names_.append(name)
732
-
733
- return tuple(run.data.params.get(name) for name in names_)
hydraflow/utils.py CHANGED
@@ -6,6 +6,7 @@ from pathlib import Path
6
6
  from typing import TYPE_CHECKING
7
7
 
8
8
  import mlflow
9
+ import mlflow.artifacts
9
10
  from hydra.core.hydra_config import HydraConfig
10
11
  from mlflow.entities import Run
11
12
  from mlflow.tracking import artifact_utils
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: hydraflow
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: Hydraflow integrates Hydra and MLflow to manage and track machine learning experiments.
5
5
  Project-URL: Documentation, https://github.com/daizutabi/hydraflow
6
6
  Project-URL: Source, https://github.com/daizutabi/hydraflow
@@ -0,0 +1,16 @@
1
+ hydraflow/__init__.py,sha256=VbrHKs2Cg93QJ8K9WHYxkXmzOpb8o9ugiwV-mXDT0JE,908
2
+ hydraflow/asyncio.py,sha256=-i1C8KAmNDImrjHnk92Csaa1mpjdK8Vp4ZVaQV-l94s,6634
3
+ hydraflow/config.py,sha256=MNX9da5bPVDcjnpji7Cm9ndK6ura92pt361m4PRh6_E,4326
4
+ hydraflow/context.py,sha256=a6bHmiY16hZ1wvzVzoa7eGDBFjz0GX0iuZNG0EW0wkE,8764
5
+ hydraflow/mlflow.py,sha256=kWVK_Xw2hkRnTg33jSP3VW13UZF6_hBGhN52mPmLgvk,8753
6
+ hydraflow/param.py,sha256=c5sc6NwD6DKwZzVwprXzZD5FSi6qRgSHkc6TXBKQEdg,4502
7
+ hydraflow/progress.py,sha256=zvKX1HCN8_xDOsgYOEcLLhkhdPdep-U8vHrc0XZ-6SQ,6163
8
+ hydraflow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ hydraflow/run_collection.py,sha256=zO7OARn0QOGeK3FQH8GnuuDKCnYFqn1fbsKnOuGCa9M,25938
10
+ hydraflow/run_data.py,sha256=qeFX1iRvNAorXA9QQIjzr0o2_82TI44eZKp7llKG8GI,1549
11
+ hydraflow/run_info.py,sha256=sMXOo20ClaRIommMEzuAbO_OrcXx7M1Yt4FMV7spxz0,998
12
+ hydraflow/utils.py,sha256=Xq78F2iOkgi9JnCYfX1reQw_Y9K6o8oNYBDEwrf18cI,3552
13
+ hydraflow-0.4.2.dist-info/METADATA,sha256=YFnNdasT6OaEKeQy8Uw7AH3uZ5ecjbDjvXSsclhvoJc,3840
14
+ hydraflow-0.4.2.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
15
+ hydraflow-0.4.2.dist-info/licenses/LICENSE,sha256=IGdDrBPqz1O0v_UwCW-NJlbX9Hy9b3uJ11t28y2srmY,1062
16
+ hydraflow-0.4.2.dist-info/RECORD,,
@@ -1,16 +0,0 @@
1
- hydraflow/__init__.py,sha256=VbrHKs2Cg93QJ8K9WHYxkXmzOpb8o9ugiwV-mXDT0JE,908
2
- hydraflow/asyncio.py,sha256=-i1C8KAmNDImrjHnk92Csaa1mpjdK8Vp4ZVaQV-l94s,6634
3
- hydraflow/config.py,sha256=MNX9da5bPVDcjnpji7Cm9ndK6ura92pt361m4PRh6_E,4326
4
- hydraflow/context.py,sha256=p1UYHvSCPrp10cBn9TUI9mXMv0h_I0Eou24Wp1rZZ0k,8740
5
- hydraflow/mlflow.py,sha256=JELqXFCJ9MsEJaQWT5dyleTFk8BHL7cQwW_gzhkPoIg,8729
6
- hydraflow/param.py,sha256=CO-6PRlnHo-7hlY_P6j_cGlC7vPY6t-Rr7p3OqeqDyU,1995
7
- hydraflow/progress.py,sha256=zvKX1HCN8_xDOsgYOEcLLhkhdPdep-U8vHrc0XZ-6SQ,6163
8
- hydraflow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- hydraflow/run_collection.py,sha256=-PEN8vO4beQkxhEQH9xh0_TzEIO34-eulwRt7WidrIA,25295
10
- hydraflow/run_data.py,sha256=qeFX1iRvNAorXA9QQIjzr0o2_82TI44eZKp7llKG8GI,1549
11
- hydraflow/run_info.py,sha256=sMXOo20ClaRIommMEzuAbO_OrcXx7M1Yt4FMV7spxz0,998
12
- hydraflow/utils.py,sha256=gNI0Ln2VBHfMBzNB9SNxJfjCLf14irYt0EBeeMXMeyk,3528
13
- hydraflow-0.4.0.dist-info/METADATA,sha256=w0gsff6RLwx4l8_Qlw-1SOu0dY4ySPCq2psm0THmvcY,3840
14
- hydraflow-0.4.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
15
- hydraflow-0.4.0.dist-info/licenses/LICENSE,sha256=IGdDrBPqz1O0v_UwCW-NJlbX9Hy9b3uJ11t28y2srmY,1062
16
- hydraflow-0.4.0.dist-info/RECORD,,