holobench 1.25.2__py3-none-any.whl → 1.26.3__py3-none-any.whl

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 (81) hide show
  1. bencher/example/__init__.py +0 -0
  2. bencher/example/benchmark_data.py +196 -0
  3. bencher/example/example_all.py +45 -0
  4. bencher/example/example_categorical.py +99 -0
  5. bencher/example/example_composable_container.py +106 -0
  6. bencher/example/example_composable_container2.py +160 -0
  7. bencher/example/example_consts.py +39 -0
  8. bencher/example/example_custom_sweep.py +59 -0
  9. bencher/example/example_custom_sweep2.py +42 -0
  10. bencher/example/example_docs.py +34 -0
  11. bencher/example/example_filepath.py +27 -0
  12. bencher/example/example_float3D.py +101 -0
  13. bencher/example/example_float_cat.py +99 -0
  14. bencher/example/example_floats.py +89 -0
  15. bencher/example/example_floats2D.py +93 -0
  16. bencher/example/example_holosweep.py +98 -0
  17. bencher/example/example_holosweep_objects.py +111 -0
  18. bencher/example/example_holosweep_tap.py +144 -0
  19. bencher/example/example_image.py +155 -0
  20. bencher/example/example_levels.py +181 -0
  21. bencher/example/example_levels2.py +37 -0
  22. bencher/example/example_pareto.py +53 -0
  23. bencher/example/example_sample_cache.py +85 -0
  24. bencher/example/example_sample_cache_context.py +116 -0
  25. bencher/example/example_simple.py +134 -0
  26. bencher/example/example_simple_bool.py +35 -0
  27. bencher/example/example_simple_cat.py +48 -0
  28. bencher/example/example_simple_float.py +28 -0
  29. bencher/example/example_simple_float2d.py +29 -0
  30. bencher/example/example_strings.py +47 -0
  31. bencher/example/example_time_event.py +63 -0
  32. bencher/example/example_video.py +118 -0
  33. bencher/example/example_workflow.py +189 -0
  34. bencher/example/experimental/example_bokeh_plotly.py +38 -0
  35. bencher/example/experimental/example_hover_ex.py +45 -0
  36. bencher/example/experimental/example_hvplot_explorer.py +39 -0
  37. bencher/example/experimental/example_interactive.py +75 -0
  38. bencher/example/experimental/example_streamnd.py +49 -0
  39. bencher/example/experimental/example_streams.py +36 -0
  40. bencher/example/experimental/example_template.py +40 -0
  41. bencher/example/experimental/example_updates.py +84 -0
  42. bencher/example/experimental/example_vector.py +84 -0
  43. bencher/example/meta/example_meta.py +171 -0
  44. bencher/example/meta/example_meta_cat.py +25 -0
  45. bencher/example/meta/example_meta_float.py +23 -0
  46. bencher/example/meta/example_meta_levels.py +26 -0
  47. bencher/example/optuna/example_optuna.py +78 -0
  48. bencher/example/shelved/example_float2D_scatter.py +109 -0
  49. bencher/example/shelved/example_float3D_cone.py +96 -0
  50. bencher/example/shelved/example_kwargs.py +63 -0
  51. bencher/plotting/__init__.py +0 -0
  52. bencher/plotting/plot_filter.py +110 -0
  53. bencher/plotting/plt_cnt_cfg.py +75 -0
  54. bencher/results/__init__.py +0 -0
  55. bencher/results/bench_result.py +94 -0
  56. bencher/results/bench_result_base.py +476 -0
  57. bencher/results/composable_container/__init__.py +0 -0
  58. bencher/results/composable_container/composable_container_base.py +73 -0
  59. bencher/results/composable_container/composable_container_panel.py +39 -0
  60. bencher/results/composable_container/composable_container_video.py +184 -0
  61. bencher/results/float_formatter.py +44 -0
  62. bencher/results/holoview_result.py +753 -0
  63. bencher/results/optuna_result.py +354 -0
  64. bencher/results/panel_result.py +41 -0
  65. bencher/results/plotly_result.py +65 -0
  66. bencher/results/video_result.py +38 -0
  67. bencher/results/video_summary.py +222 -0
  68. bencher/variables/__init__.py +0 -0
  69. bencher/variables/inputs.py +202 -0
  70. bencher/variables/parametrised_sweep.py +208 -0
  71. bencher/variables/results.py +214 -0
  72. bencher/variables/sweep_base.py +162 -0
  73. bencher/variables/time.py +92 -0
  74. holobench-1.26.3.data/data/share/ament_index/resource_index/packages/bencher +0 -0
  75. holobench-1.26.3.data/data/share/bencher/package.xml +33 -0
  76. {holobench-1.25.2.dist-info → holobench-1.26.3.dist-info}/METADATA +5 -5
  77. holobench-1.26.3.dist-info/RECORD +93 -0
  78. holobench-1.25.2.dist-info/RECORD +0 -18
  79. {holobench-1.25.2.dist-info → holobench-1.26.3.dist-info}/LICENSE +0 -0
  80. {holobench-1.25.2.dist-info → holobench-1.26.3.dist-info}/WHEEL +0 -0
  81. {holobench-1.25.2.dist-info → holobench-1.26.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,214 @@
1
+ from enum import auto
2
+ from typing import List, Callable, Any, Optional
3
+ from functools import partial
4
+ import panel as pn
5
+ import param
6
+ from param import Number
7
+ from strenum import StrEnum
8
+ import holoviews as hv
9
+ from bencher.utils import hash_sha1
10
+
11
+ # from bencher.variables.parametrised_sweep import ParametrizedSweep
12
+
13
+
14
+ class OptDir(StrEnum):
15
+ minimize = auto()
16
+ maximize = auto()
17
+ none = auto() # If none this var will not appear in pareto plots
18
+
19
+
20
+ class ResultVar(Number):
21
+ """A class to represent result variables and the desired optimisation direction"""
22
+
23
+ __slots__ = ["units", "direction"]
24
+
25
+ def __init__(self, units="ul", direction: OptDir = OptDir.minimize, **params):
26
+ Number.__init__(self, **params)
27
+ assert isinstance(units, str)
28
+ self.units = units
29
+ self.default = 0 # json is terrible and does not support nan values
30
+ self.direction = direction
31
+
32
+ def as_dim(self) -> hv.Dimension:
33
+ return hv.Dimension((self.name, self.name), unit=self.units)
34
+
35
+ def hash_persistent(self) -> str:
36
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
37
+ return hash_sha1((self.units, self.direction))
38
+
39
+
40
+ class ResultVec(param.List):
41
+ """A class to represent fixed size vector result variable"""
42
+
43
+ __slots__ = ["units", "direction", "size"]
44
+
45
+ def __init__(self, size, units="ul", direction: OptDir = OptDir.minimize, **params):
46
+ param.List.__init__(self, **params)
47
+ self.units = units
48
+ self.default = 0 # json is terrible and does not support nan values
49
+ self.direction = direction
50
+ self.size = size
51
+
52
+ def hash_persistent(self) -> str:
53
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
54
+ return hash_sha1((self.units, self.direction))
55
+
56
+ def index_name(self, idx: int) -> str:
57
+ """given the index of the vector, return the column name that
58
+
59
+ Args:
60
+ idx (int): index of the result vector
61
+
62
+ Returns:
63
+ str: column name of the vector for the xarray dataset
64
+ """
65
+
66
+ mapping = ["x", "y", "z"]
67
+ if idx < 3:
68
+ index = mapping[idx]
69
+ else:
70
+ index = idx
71
+ return f"{self.name}_{index}"
72
+
73
+ def index_names(self) -> List[str]:
74
+ """Returns a list of all the xarray column names for the result vector
75
+
76
+ Returns:
77
+ list[str]: column names
78
+ """
79
+ return [self.index_name(i) for i in range(self.size)]
80
+
81
+
82
+ class ResultHmap(param.Parameter):
83
+ """A class to represent a holomap return type"""
84
+
85
+ def hash_persistent(self) -> str:
86
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
87
+ return hash_sha1(self)
88
+
89
+
90
+ def curve(
91
+ x_vals: List[float],
92
+ y_vals: List[float],
93
+ x_name: str,
94
+ y_name: str,
95
+ label: Optional[str] = None,
96
+ **kwargs,
97
+ ) -> hv.Curve:
98
+ label = label or y_name
99
+ return hv.Curve(zip(x_vals, y_vals), kdims=[x_name], vdims=[y_name], label=label, **kwargs)
100
+
101
+
102
+ class ResultPath(param.Filename):
103
+ __slots__ = ["units"]
104
+
105
+ def __init__(self, default=None, units="path", **params):
106
+ super().__init__(default=default, check_exists=False, **params)
107
+ self.units = units
108
+
109
+ def hash_persistent(self) -> str:
110
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
111
+ return hash_sha1(self)
112
+
113
+ def to_container(self):
114
+ """Returns a partial function for creating a FileDownload widget with embedding enabled. This function is used to create a panel container to represent the ResultPath object"""
115
+ return partial(pn.widgets.FileDownload, embed=True)
116
+
117
+
118
+ class ResultVideo(param.Filename):
119
+ __slots__ = ["units"]
120
+
121
+ def __init__(self, default=None, units="path", **params):
122
+ super().__init__(default=default, check_exists=False, **params)
123
+ self.units = units
124
+
125
+ def hash_persistent(self) -> str:
126
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
127
+ return hash_sha1(self)
128
+
129
+
130
+ class ResultImage(param.Filename):
131
+ __slots__ = ["units"]
132
+
133
+ def __init__(self, default=None, units="path", **params):
134
+ super().__init__(default=default, check_exists=False, **params)
135
+ self.units = units
136
+
137
+ def hash_persistent(self) -> str:
138
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
139
+ return hash_sha1(self)
140
+
141
+
142
+ class ResultString(param.String):
143
+ __slots__ = ["units"]
144
+
145
+ def __init__(self, default=None, units="str", **params):
146
+ super().__init__(default=default, **params)
147
+ self.units = units
148
+
149
+ def hash_persistent(self) -> str:
150
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
151
+ return hash_sha1(self)
152
+
153
+
154
+ class ResultContainer(param.Parameter):
155
+ __slots__ = ["units"]
156
+
157
+ def __init__(self, default=None, units="container", **params):
158
+ super().__init__(default=default, **params)
159
+ self.units = units
160
+
161
+ def hash_persistent(self) -> str:
162
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
163
+ return hash_sha1(self)
164
+
165
+
166
+ class ResultReference(param.Parameter):
167
+ """Use this class to save arbitrary objects that are not picklable or native to panel. You can pass a container callback that takes the object and returns a panel pane to be displayed"""
168
+
169
+ __slots__ = ["units", "obj", "container"]
170
+
171
+ def __init__(
172
+ self,
173
+ obj: Any = None,
174
+ container: Callable[Any, pn.pane.panel] = None,
175
+ default: Any = None,
176
+ units: str = "container",
177
+ **params,
178
+ ):
179
+ super().__init__(default=default, **params)
180
+ self.units = units
181
+ self.obj = obj
182
+ self.container = container
183
+
184
+ def hash_persistent(self) -> str:
185
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
186
+ return hash_sha1(self)
187
+
188
+
189
+ class ResultVolume(param.Parameter):
190
+ __slots__ = ["units", "obj"]
191
+
192
+ def __init__(self, obj=None, default=None, units="container", **params):
193
+ super().__init__(default=default, **params)
194
+ self.units = units
195
+ self.obj = obj
196
+
197
+ def hash_persistent(self) -> str:
198
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
199
+ return hash_sha1(self)
200
+
201
+
202
+ PANEL_TYPES = (ResultPath, ResultImage, ResultVideo, ResultContainer, ResultString, ResultReference)
203
+
204
+ ALL_RESULT_TYPES = (
205
+ ResultVar,
206
+ ResultVec,
207
+ ResultHmap,
208
+ ResultPath,
209
+ ResultVideo,
210
+ ResultImage,
211
+ ResultString,
212
+ ResultContainer,
213
+ ResultReference,
214
+ )
@@ -0,0 +1,162 @@
1
+ from __future__ import annotations
2
+ from typing import List, Any, Tuple
3
+ from copy import deepcopy
4
+
5
+ import numpy as np
6
+ import param
7
+ from param import Parameterized
8
+ import holoviews as hv
9
+ import panel as pn
10
+ from bencher.utils import hash_sha1
11
+
12
+ # slots that are shared across all Sweep classes
13
+ # param and slots don't work easily with multiple inheritance so define here
14
+ shared_slots = ["units", "samples"]
15
+
16
+
17
+ def describe_variable(v: Parameterized, include_samples: bool, value=None) -> List[str]:
18
+ """Generate a string description of a variable
19
+
20
+ Args:
21
+ v (param.Parameterized): parameter to describe
22
+ debug (bool): Generate a reduced number of samples from the variable
23
+ include_samples (bool): Include a description of the samples
24
+
25
+ Returns:
26
+ str: String description of the variable
27
+ """
28
+ indent = " "
29
+ sampling_str = []
30
+ sampling_str.append(f"{v.name}:")
31
+ if include_samples:
32
+ # sampling_str.append(f"{indent}{v.sampling_str(debug)}")
33
+ sampling_str.append(f"{indent}number of samples: {len(v.values())}")
34
+ sampling_str.append(f"{indent}sample values: {[str(v) for v in v.values()]}")
35
+
36
+ if value is not None:
37
+ sampling_str.append(f"{indent}value: {value}")
38
+ if hasattr(v, "units"):
39
+ if v.units != "ul" and len(v.units) > 0:
40
+ sampling_str.append(f"{indent}units: [{v.units}]")
41
+ if v.doc is not None:
42
+ sampling_str.append(f"{indent}docs: {v.doc}")
43
+ for i in range(len(sampling_str)):
44
+ sampling_str[i] = f"{indent}{sampling_str[i]}"
45
+ return sampling_str
46
+
47
+
48
+ class SweepBase(param.Parameter):
49
+ # def __init__(self, **params):
50
+ # super().__init__(**params)
51
+ # self.units = ""
52
+ # slots = ["units", "samples"]
53
+ # __slots__ = shared_slots
54
+
55
+ def values(
56
+ self,
57
+ ) -> List[Any]:
58
+ """All sweep classes must implement this method. This generates sample values from based on the parameters bounds and sample number.
59
+
60
+ Returns:
61
+ List[Any]: A list of samples from the variable
62
+ """
63
+ raise NotImplementedError
64
+
65
+ def hash_persistent(self) -> str:
66
+ """A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
67
+ return hash_sha1((self.units, self.samples)) # pylint: disable=no-member
68
+
69
+ def sampling_str(self) -> str:
70
+ """Generate a string representation of the of the sampling procedure"""
71
+
72
+ samples = self.values()
73
+ object_str = ",".join([str(i) for i in samples])
74
+ return f"Taking {len(samples)} samples from {self.name} with values: [{object_str}]"
75
+
76
+ def as_slider(self) -> pn.widgets.slider.DiscreteSlider:
77
+ """given a sweep variable (self), return the range of values as a panel slider
78
+
79
+ Args:
80
+ debug (bool, optional): pass to the sweepvar to produce a full set of varaibles, or when debug=True, a reduces number of sweep vars. Defaults to False.
81
+
82
+ Returns:
83
+ pn.widgets.slider.DiscreteSlider: A panel slider with the values() of the sweep variable
84
+ """
85
+ return pn.widgets.slider.DiscreteSlider(name=self.name, options=list(self.values()))
86
+
87
+ def as_dim(self, compute_values=False) -> hv.Dimension:
88
+ """Takes a sweep variable and turns it into a holoview dimension
89
+
90
+ Returns:
91
+ hv.Dimension:
92
+ """
93
+ name_tuple = (self.name, self.name)
94
+
95
+ params = {}
96
+ if hasattr(self, "bounds") and self.bounds is not None:
97
+ if compute_values:
98
+ params["values"] = self.values()
99
+ # params["range"] = tuple(self.bounds)
100
+ else:
101
+ params["range"] = tuple(self.bounds)
102
+ params["default"] = self.default
103
+
104
+ else:
105
+ params["values"] = self.values()
106
+ params["default"] = self.default
107
+
108
+ if hasattr(self, "step"):
109
+ params["step"] = getattr(self, "step")
110
+
111
+ # TODO investigate why this stopped working after a holoviews update
112
+ # if hasattr(self, "units"):
113
+ # params["unit"] = getattr(self, "units")
114
+
115
+ return hv.Dimension(name_tuple, **params)
116
+
117
+ def indices_to_samples(self, desires_num_samples, sample_values):
118
+ indices = [
119
+ int(i) for i in np.linspace(0, len(sample_values) - 1, desires_num_samples, dtype=int)
120
+ ]
121
+
122
+ if len(indices) > len(sample_values):
123
+ return sample_values
124
+
125
+ return [sample_values[i] for i in indices]
126
+
127
+ def with_samples(self, samples: int) -> SweepBase:
128
+ output = deepcopy(self)
129
+ # TODO set up class properly. Slightly complicated due to slots
130
+ output.samples = samples # pylint: disable = attribute-defined-outside-init
131
+ if hasattr(output, "step"):
132
+ # hack TODO fix this
133
+ output.step = None # pylint: disable = attribute-defined-outside-init
134
+ return output
135
+
136
+ def with_sample_values(self, sample_values: list) -> SweepBase:
137
+ output = deepcopy(self)
138
+ # TODO set up class properly. Slightly complicated due to slots
139
+ try:
140
+ output.sample_values = sample_values # pylint: disable = attribute-defined-outside-init
141
+ except AttributeError:
142
+ output.objects = sample_values # pylint: disable = attribute-defined-outside-init
143
+ output.samples = len(sample_values) # pylint: disable = attribute-defined-outside-init
144
+ return output
145
+
146
+ def with_const(self, const_value: Any) -> Tuple[SweepBase, Any]:
147
+ """Create a new instance of SweepBase with a constant value.
148
+
149
+ Args:
150
+ const_value (Any): The constant value to be associated with the new instance.
151
+
152
+ Returns:
153
+ Tuple[SweepBase, Any]: A tuple containing the new instance of SweepBase and the constant value.
154
+ """
155
+ return (deepcopy(self), const_value)
156
+
157
+ def with_level(self, level: int = 1, max_level: int = 12) -> SweepBase:
158
+ assert level >= 1
159
+ # TODO work out if the order can be returned in level order always
160
+ samples = [0, 1, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049]
161
+ out = self.with_sample_values(self.with_samples(samples[min(max_level, level)]).values())
162
+ return out
@@ -0,0 +1,92 @@
1
+ from datetime import datetime
2
+ from typing import List
3
+
4
+ from pandas import Timestamp
5
+ from param import Selector
6
+ from bencher.variables.sweep_base import SweepBase, shared_slots
7
+
8
+
9
+ class TimeBase(SweepBase, Selector):
10
+ """A class to capture a time snapshot of benchmark values. Time is reprented as a continous value i.e a datetime which is converted into a np.datetime64. To represent time as a discrete value use the TimeEvent class. The distinction is because holoview and plotly code makes different assumptions about discrete vs continous variables"""
11
+
12
+ def __init__(
13
+ self,
14
+ objects=None,
15
+ default=None,
16
+ instantiate=False,
17
+ compute_default_fn=None,
18
+ check_on_set=None,
19
+ allow_None=None,
20
+ empty_default=False,
21
+ **params,
22
+ ):
23
+ super().__init__(
24
+ objects,
25
+ default,
26
+ instantiate,
27
+ compute_default_fn,
28
+ check_on_set,
29
+ allow_None,
30
+ empty_default,
31
+ **params,
32
+ )
33
+
34
+ __slots__ = shared_slots
35
+
36
+ def values(self) -> List[str]:
37
+ """return all the values for a parameter sweep. If debug is true return a reduced list"""
38
+ # print(self.sampling_str(debug))
39
+ return self.objects
40
+
41
+
42
+ class TimeSnapshot(TimeBase):
43
+ """A class to capture a time snapshot of benchmark values. Time is reprented as a continous value i.e a datetime which is converted into a np.datetime64. To represent time as a discrete value use the TimeEvent class. The distinction is because holoview and plotly code makes different assumptions about discrete vs continous variables"""
44
+
45
+ __slots__ = shared_slots
46
+
47
+ def __init__(
48
+ self,
49
+ datetime_src: datetime | str,
50
+ units: str = "time",
51
+ samples: int = None,
52
+ **params,
53
+ ):
54
+ if isinstance(datetime_src, str):
55
+ TimeBase.__init__(self, [datetime_src], instantiate=True, **params)
56
+ else:
57
+ TimeBase.__init__(
58
+ self,
59
+ objects=[Timestamp(datetime_src)],
60
+ instantiate=True,
61
+ **params,
62
+ )
63
+ self.units = units
64
+ if samples is None:
65
+ self.samples = len(self.objects)
66
+ else:
67
+ self.samples = samples
68
+
69
+
70
+ class TimeEvent(TimeBase):
71
+ """A class to represent a discrete event in time where the data was captured i.e a series of pull requests. Here time is discrete and can't be interpolated, to represent time as a continous value use the TimeSnapshot class. The distinction is because holoview and plotly code makes different assumptions about discrete vs continous variables"""
72
+
73
+ __slots__ = shared_slots
74
+
75
+ def __init__(
76
+ self,
77
+ time_event: str,
78
+ units: str = "event",
79
+ samples: int = None,
80
+ **params,
81
+ ):
82
+ TimeBase.__init__(
83
+ self,
84
+ objects=[time_event],
85
+ instantiate=True,
86
+ **params,
87
+ )
88
+ self.units = units
89
+ if samples is None:
90
+ self.samples = len(self.objects)
91
+ else:
92
+ self.samples = samples
@@ -0,0 +1,33 @@
1
+ <?xml version="1.0"?>
2
+ <package format="3">
3
+ <name>bencher</name>
4
+ <version>0.1.0</version>
5
+ <description>A package for benchmarking the performance of arbitrary functions</description>
6
+ <maintainer email="austin.gregg-smith@dyson.com">Austin Gregg-Smith</maintainer>
7
+ <license>MIT</license>
8
+
9
+ <depend>python3-diskcache</depend>
10
+
11
+ <depend>python3-pandas</depend>
12
+ <depend>python3-seaborn</depend>
13
+ <depend>python3-matplotlib</depend>
14
+ <depend>python3-numpy</depend>
15
+ <depend>python3-pytest</depend>
16
+ <depend>python3-hypothesis</depend>
17
+ <depend>xarray</depend>
18
+ <depend>python3-zarr</depend>
19
+ <depend>python3-param</depend>
20
+ <depend>python3-panel</depend>
21
+ <depend>python3-hvplot</depend>
22
+ <depend>python3-optuna</depend>
23
+ <depend>python3-plotly</depend>
24
+
25
+ <!-- TO REMOVE WHEN WE UPGRADE TO PYTHON 3.11, This is in the standard library for python>=3.11 -->
26
+ <depend>strenum</depend>
27
+
28
+ <test_depend>python3-pytest-cov</test_depend>
29
+
30
+ <export>
31
+ <build_type>ament_python</build_type>
32
+ </export>
33
+ </package>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: holobench
3
- Version: 1.25.2
3
+ Version: 1.26.3
4
4
  Summary: A package for benchmarking the performance of arbitrary functions
5
5
  Author-email: Austin Gregg-Smith <blooop@gmail.com>
6
6
  Project-URL: Repository, https://github.com/dyson-ai/bencher
@@ -8,7 +8,7 @@ Project-URL: Home, https://github.com/dyson-ai/bencher
8
8
  Project-URL: Documentation, https://bencher.readthedocs.io/en/latest/
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
- Requires-Dist: holoviews <=1.18.3,>=1.15
11
+ Requires-Dist: holoviews <=1.19.0,>=1.15
12
12
  Requires-Dist: numpy <=1.26.4,>=1.0
13
13
  Requires-Dist: param <=2.1.0,>=1.13.0
14
14
  Requires-Dist: hvplot <=0.10.0,>=0.8
@@ -16,7 +16,7 @@ Requires-Dist: matplotlib <=3.9.0,>=3.6.3
16
16
  Requires-Dist: panel <=1.4.4,>=1.3.6
17
17
  Requires-Dist: diskcache <=5.6.3,>=5.6
18
18
  Requires-Dist: optuna <=3.6.1,>=3.2
19
- Requires-Dist: xarray <=2024.5.0,>=2023.7
19
+ Requires-Dist: xarray <=2024.6.0,>=2023.7
20
20
  Requires-Dist: plotly <=5.22.0,>=5.15
21
21
  Requires-Dist: sortedcontainers <=2.4,>=2.4
22
22
  Requires-Dist: pandas <=2.2.2,>=2.0
@@ -30,8 +30,8 @@ Requires-Dist: black <=24.4.2,>=23 ; extra == 'test'
30
30
  Requires-Dist: pylint <=3.2.3,>=2.17.7 ; extra == 'test'
31
31
  Requires-Dist: pytest-cov <=5.0.0,>=4.1 ; extra == 'test'
32
32
  Requires-Dist: pytest <=8.2.2,>=7.4 ; extra == 'test'
33
- Requires-Dist: hypothesis <=6.103.1,>=6.82 ; extra == 'test'
34
- Requires-Dist: ruff <=0.4.8,>=0.0.280 ; extra == 'test'
33
+ Requires-Dist: hypothesis <=6.103.2,>=6.82 ; extra == 'test'
34
+ Requires-Dist: ruff <=0.4.9,>=0.0.280 ; extra == 'test'
35
35
  Requires-Dist: coverage <=7.5.3,>=7.2.7 ; extra == 'test'
36
36
 
37
37
  # Bencher
@@ -0,0 +1,93 @@
1
+ bencher/__init__.py,sha256=gywyMfCkWiguR86HWU63s06Ts9coSY_CK2ro2V7RIbI,1561
2
+ bencher/bench_cfg.py,sha256=8rvJyeQXalZmYF8Lb-NKb9RFJs0w08k9ogcZSR1rhgs,18413
3
+ bencher/bench_plot_server.py,sha256=D00_SOrHa2IT8zAjwetoNL6tEiHSHvXnbea9iElCLVk,4195
4
+ bencher/bench_report.py,sha256=jh3T_q9KByZDeMPMf0KNJojZukxRzkfaYGeuWQU8MKM,10528
5
+ bencher/bench_runner.py,sha256=-SzAKd6QbPJ05KaW3vteFIkE-UtlFS55Ob9QeE5eRXw,6202
6
+ bencher/bencher.py,sha256=-7XaSZWVzaXHQcKlHqPiUwsrKzYlPKBrimh9ahp8vsI,34642
7
+ bencher/caching.py,sha256=AusaNrzGGlj5m6zcwcqnTn55Mam2mQdF--oqelO806M,1627
8
+ bencher/class_enum.py,sha256=kYHW9qKkKcNdwaXizZL-fTptS_DUEGv4c88yCehk3gc,1492
9
+ bencher/job.py,sha256=swa0VwrZf41v7qNjreVDIYUU6r_dfuLipPZbg_w5x7c,6089
10
+ bencher/optuna_conversions.py,sha256=an-LfPsQXyyvhIZnG8Wl1RQVYMvJj7WOi3YNqoUnuxQ,5356
11
+ bencher/utils.py,sha256=9KAThtIG8jNd0nd4Wft8miNM_yHWmZUkIBfJh19pzgI,6480
12
+ bencher/video_writer.py,sha256=B-V1tALd3oPDytaAsl8I6qUztDQlFbkp9gSYco-ah44,2175
13
+ bencher/worker_job.py,sha256=FREi0yWQACFmH86R1j-LH72tALEFkKhLDmmoGQY9Jh4,1571
14
+ bencher/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ bencher/example/benchmark_data.py,sha256=eRAB9ZhiDylWeqsh4g8lUYP3BV50QPUBmQ785scT590,6985
16
+ bencher/example/example_all.py,sha256=iiKV2poYWu4SUIQkpoX4qT1zTm574QfuNHpYww3meFA,1952
17
+ bencher/example/example_categorical.py,sha256=3BeOQN58nCGx6xzB0YvkgaBFInzJ5L3XsIYKfKOs0gM,3684
18
+ bencher/example/example_composable_container.py,sha256=uW4USZOWLJ1KDG1HuferblAqvTLYCVzZDpVAGUYU2rM,3756
19
+ bencher/example/example_composable_container2.py,sha256=rHjT9ZCWZbvex8ORnWc0hFekWGIA_MoTjUNPHMquQ3E,5666
20
+ bencher/example/example_consts.py,sha256=upKkrMNYUCS38IA4duuyJHERwdZIMB4FA60Gytu_BzU,1475
21
+ bencher/example/example_custom_sweep.py,sha256=-y8mYuXYD91j8kcCEe9c6Gx6g1dK-bvHM9sbXqHL2gA,1916
22
+ bencher/example/example_custom_sweep2.py,sha256=zvfasrN5R89IynGWeGQW_W-01A4lCkoBzoh-thxPQ14,1224
23
+ bencher/example/example_docs.py,sha256=aUi33O543JBPoOGlpHaY2eA74GR7cHH_6-hcC8xf3z0,1174
24
+ bencher/example/example_filepath.py,sha256=O3VO9rWAXB_1tagVSvxhiSMjcTkgZe2duw7W17ij7po,827
25
+ bencher/example/example_float3D.py,sha256=pwi3YlDad3NL4IrfMK2V5yV1CRpqfmUO-zUnGmVYxDs,3425
26
+ bencher/example/example_float_cat.py,sha256=nQDBWYRVZrJW5ABIizqcD6mXswHWSdEDzM-FeYFqYqY,3821
27
+ bencher/example/example_floats.py,sha256=HcQgfwldTVeFBmBTMtZ0yRy17ZJ4cfJeI_t8TxY2iOI,4269
28
+ bencher/example/example_floats2D.py,sha256=D0kljoUCinMKCEW-Zg-cQ8sYu_yPCZqzKJ9tRtt-Ono,3697
29
+ bencher/example/example_holosweep.py,sha256=lxH0Z_waInGIH5AtGQi4zwPAZRI_uN0DbsJhI9iSF7Q,3017
30
+ bencher/example/example_holosweep_objects.py,sha256=vHuAtkM1VrJelHOazn_SJfzxNywKyaMzN-DE8W7Ricc,3228
31
+ bencher/example/example_holosweep_tap.py,sha256=NYXofWGV9GaBN72Q3kKPT5lKJ-slYZH5VzTAavUu23w,4527
32
+ bencher/example/example_image.py,sha256=17u0exNKFN9BIvSfdhVuQd9JsKUrIi0rZe6gXEVFNZ8,5547
33
+ bencher/example/example_levels.py,sha256=s-UfXXp8qj5U0Gx5KyMqj--nn1Ke0NtHVLSSJYIPaYY,6891
34
+ bencher/example/example_levels2.py,sha256=6n-ceglaHAbPAp2I-IiUsET8OVubXu8wNVoRBFJ_JSw,1116
35
+ bencher/example/example_pareto.py,sha256=yyAg8Vb-5sgsS6LkYKT7T5Evcfg69FlCqCakUippSmU,2687
36
+ bencher/example/example_sample_cache.py,sha256=7gf1BJ63VAgdqNuNXkbL9-jeTeC3kXA_PY9yG3ulTz0,4200
37
+ bencher/example/example_sample_cache_context.py,sha256=IAUBbL78QM20R8evaq7L8I-xPxFDFykF1Gk1y2Ru1W0,4063
38
+ bencher/example/example_simple.py,sha256=Nn2ixNx29jbgvwH2K5vDGhSFcqKLMNaP1occPxhHoU0,11703
39
+ bencher/example/example_simple_bool.py,sha256=GZ6pyj8FaQV9gNxaqAmX6c5XWtMvKosezAbSADEl0G0,1248
40
+ bencher/example/example_simple_cat.py,sha256=XsV_75Jk3phVPI4om3q0vn1POfREb3CGRm9Kq1tL-OA,1760
41
+ bencher/example/example_simple_float.py,sha256=Mfp4QwqgZ6DWgdu3reNA0cDwOV5cjG1PTuhf-SEsEkY,930
42
+ bencher/example/example_simple_float2d.py,sha256=xsVOLO6AtMi9_fybpS_JZnhev5f11YuYWHrAOzJw2dI,1033
43
+ bencher/example/example_strings.py,sha256=vStjrvfezNz7115iRtuwy0i7Gbu6w8mu-oHNfKNLNog,1570
44
+ bencher/example/example_time_event.py,sha256=e6R-a6ZPe-ePiWoNvN3YuSQK-Y2HOGntsjCm_SPon28,2159
45
+ bencher/example/example_video.py,sha256=ffeTAqDuriMXxJ1sYfA4r137D3BAii84uSef6K86QVI,3955
46
+ bencher/example/example_workflow.py,sha256=00QnUuViMfX_PqzqkXmg1wPX6yAq7IS7mCL_RFKwrMM,6806
47
+ bencher/example/experimental/example_bokeh_plotly.py,sha256=3jUKh8eKIAlpklKnp8UopIHhUDw1A0_5CwjeyTzbi7o,846
48
+ bencher/example/experimental/example_hover_ex.py,sha256=qszw4FkIfqQkVviPSpmUoFOoi6PGotGbsc7Ojyx8EtU,1052
49
+ bencher/example/experimental/example_hvplot_explorer.py,sha256=B9u-kh6D_8J0wAtkYu2w8kML8eL3DkOZg0p91n_nBT4,1815
50
+ bencher/example/experimental/example_interactive.py,sha256=MM1A2EVsKTy95RERTNnld0tUmZmCy8N41_jGm2wlG7U,2619
51
+ bencher/example/experimental/example_streamnd.py,sha256=LqkTtdY4NhnP5dEB1Ifv7RQ5Vq4dLkp5E3aWnWuzniA,1414
52
+ bencher/example/experimental/example_streams.py,sha256=rrTmcmxDlirGoyTbJ4LT4fBIAc1k28qjnjy5JxGKyhg,1030
53
+ bencher/example/experimental/example_template.py,sha256=XdIVS9RtLdE5GNnerWiZMXvP7n17lzuc_YTLqJTwb6Q,1172
54
+ bencher/example/experimental/example_updates.py,sha256=rF4UgWY-CW6ohNtOpQklTuwbwVRvEM5j6edZOiMkspQ,1835
55
+ bencher/example/experimental/example_vector.py,sha256=3o_1dA4dc2HL6uIEvDAcvLPVJB8jgkq1QZ3BQIL-LEo,3118
56
+ bencher/example/meta/example_meta.py,sha256=l4TZuBjCUwzxm2lHJ5wqWWI2-Xv8LFVg3S0K0JmuX5U,5563
57
+ bencher/example/meta/example_meta_cat.py,sha256=FMBT0yMPJJo0pmUYVtlq64R6qn_EXEt74xYAsK6HQag,641
58
+ bencher/example/meta/example_meta_float.py,sha256=D71oiFqGauLvqTxv2BC4CJOwHIdpvq8FdCBVejwZ4Do,624
59
+ bencher/example/meta/example_meta_levels.py,sha256=MkVL8pAIogn8ObKdSn8BC_DKk6PSVvvPU7_KUCgP5vQ,1436
60
+ bencher/example/optuna/example_optuna.py,sha256=-RIuDrdPjfXz1c1hOAmWeJNdmGICiWnyJfAavRsiMuk,2370
61
+ bencher/example/shelved/example_float2D_scatter.py,sha256=z8ranMq8IcJ1yoVSFDncp3gw-yWG7X9lXLimXKpy5Ks,3372
62
+ bencher/example/shelved/example_float3D_cone.py,sha256=T3-IapccLYX3BM9sGDyOTLhZVEmzkeMsXzQMT5msnNQ,2966
63
+ bencher/example/shelved/example_kwargs.py,sha256=Bgxkd7qeHdySBE24amdP-VNFRRgK_enyzprlxBwY9Ko,2461
64
+ bencher/plotting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
+ bencher/plotting/plot_filter.py,sha256=Zff02hEcRffiqDEoXUHVZQJK5kW4HbMxe2GYCrxI8jg,4688
66
+ bencher/plotting/plt_cnt_cfg.py,sha256=RK6dot_Yb6uTBPDe7Z1UzCqCQgjgEFxANt5DCc4LLAI,3159
67
+ bencher/results/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
+ bencher/results/bench_result.py,sha256=JoXfAQ2dkoVt2mBM0Hp5V0843CWcSCuBfR817VhLVx0,3491
69
+ bencher/results/bench_result_base.py,sha256=eQsw1CzaL2X3sX8uTqdLruijW0e6NkJjfJuaz1xJH-w,19024
70
+ bencher/results/float_formatter.py,sha256=sX6HNCyaXdHDxC8ybVUHwCJ3qOKbPUkBOplVIHtKWjM,1746
71
+ bencher/results/holoview_result.py,sha256=DHzQaDOswsPln2XIJ9NF-OIw4HgJ41Sv9JrlIz_dVe0,28499
72
+ bencher/results/optuna_result.py,sha256=jtsWJGdCS0L98EzxTxXU_AyarCL5CkXRLOVuSvs048M,13437
73
+ bencher/results/panel_result.py,sha256=lXOtfhWKSspf53Wgm94DTiVD3rliieHQW96sOdu5UYk,1336
74
+ bencher/results/plotly_result.py,sha256=wkgfL38qJp6RviekXBYpNPeU4HCf0nbtKDAhu5QZhUg,2132
75
+ bencher/results/video_result.py,sha256=E3fAxXctRVxiRyamadpKCMXanM5TTqw1tEYICS2LDLs,1146
76
+ bencher/results/video_summary.py,sha256=ECMVnm1L58n3KHrFuy4Cm9T6aUjsOL_YHm0ncLfW4IU,8343
77
+ bencher/results/composable_container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
+ bencher/results/composable_container/composable_container_base.py,sha256=MPmfig7mwmpo156N98FR83bExLyoJbUM7C9VmdBE-VY,2781
79
+ bencher/results/composable_container/composable_container_panel.py,sha256=HrOoeGB0y0jGQcxcci_M82ftsvklLkJgo-4SjDBJCks,1232
80
+ bencher/results/composable_container/composable_container_video.py,sha256=EHY2TIQM5ualrh_or-wzyErPWm25CaYdSdMotqo5wCo,7104
81
+ bencher/variables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
+ bencher/variables/inputs.py,sha256=tASPqEN7j_uaj8vfM1nFEpgV8QXrxTH3LfltIbV0Gp4,6725
83
+ bencher/variables/parametrised_sweep.py,sha256=ZhLkuniIq2t_WPFi2kpuYRMZBEmqTpLpto3xDQ-iCpg,7277
84
+ bencher/variables/results.py,sha256=mjr34L27NFuXqUCI1GSO8srU8VFm8niTkaSZ1iPvvbY,7159
85
+ bencher/variables/sweep_base.py,sha256=cOybffErb3_QUsCfiZa0mlVy9tGDueqiElZmc363apE,6258
86
+ bencher/variables/time.py,sha256=A1QPYM-z2p-04hKcHG80u8njiKQ-2R2IHcjo7iB92_A,3136
87
+ holobench-1.26.3.data/data/share/ament_index/resource_index/packages/bencher,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
+ holobench-1.26.3.data/data/share/bencher/package.xml,sha256=HxWM9qIEiLbE60tG0aKsS7q3UaSKDyCMD4-1nYw8vOs,1045
89
+ holobench-1.26.3.dist-info/LICENSE,sha256=dSHXTdRY4Y7qGFMv63UksV700iff7iE-p7GGs6Sbnvo,1065
90
+ holobench-1.26.3.dist-info/METADATA,sha256=QjnUcDSF8-UoMYqFlJ6CGbv2lDE3f2HQAyh4NSzU5rw,5617
91
+ holobench-1.26.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
92
+ holobench-1.26.3.dist-info/top_level.txt,sha256=rkP5-F_W08mOD-25ZPkt0HJsHxedb2EiRcRA7IP6Ceg,8
93
+ holobench-1.26.3.dist-info/RECORD,,
@@ -1,18 +0,0 @@
1
- bencher/__init__.py,sha256=gywyMfCkWiguR86HWU63s06Ts9coSY_CK2ro2V7RIbI,1561
2
- bencher/bench_cfg.py,sha256=8rvJyeQXalZmYF8Lb-NKb9RFJs0w08k9ogcZSR1rhgs,18413
3
- bencher/bench_plot_server.py,sha256=D00_SOrHa2IT8zAjwetoNL6tEiHSHvXnbea9iElCLVk,4195
4
- bencher/bench_report.py,sha256=jh3T_q9KByZDeMPMf0KNJojZukxRzkfaYGeuWQU8MKM,10528
5
- bencher/bench_runner.py,sha256=-SzAKd6QbPJ05KaW3vteFIkE-UtlFS55Ob9QeE5eRXw,6202
6
- bencher/bencher.py,sha256=-7XaSZWVzaXHQcKlHqPiUwsrKzYlPKBrimh9ahp8vsI,34642
7
- bencher/caching.py,sha256=AusaNrzGGlj5m6zcwcqnTn55Mam2mQdF--oqelO806M,1627
8
- bencher/class_enum.py,sha256=kYHW9qKkKcNdwaXizZL-fTptS_DUEGv4c88yCehk3gc,1492
9
- bencher/job.py,sha256=swa0VwrZf41v7qNjreVDIYUU6r_dfuLipPZbg_w5x7c,6089
10
- bencher/optuna_conversions.py,sha256=an-LfPsQXyyvhIZnG8Wl1RQVYMvJj7WOi3YNqoUnuxQ,5356
11
- bencher/utils.py,sha256=9KAThtIG8jNd0nd4Wft8miNM_yHWmZUkIBfJh19pzgI,6480
12
- bencher/video_writer.py,sha256=B-V1tALd3oPDytaAsl8I6qUztDQlFbkp9gSYco-ah44,2175
13
- bencher/worker_job.py,sha256=FREi0yWQACFmH86R1j-LH72tALEFkKhLDmmoGQY9Jh4,1571
14
- holobench-1.25.2.dist-info/LICENSE,sha256=dSHXTdRY4Y7qGFMv63UksV700iff7iE-p7GGs6Sbnvo,1065
15
- holobench-1.25.2.dist-info/METADATA,sha256=Tq6Q-IbUGYSVrbSDe212fY27PWyfxrkhbBVNI4_2UCI,5617
16
- holobench-1.25.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
17
- holobench-1.25.2.dist-info/top_level.txt,sha256=rkP5-F_W08mOD-25ZPkt0HJsHxedb2EiRcRA7IP6Ceg,8
18
- holobench-1.25.2.dist-info/RECORD,,