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.
- bencher/example/__init__.py +0 -0
- bencher/example/benchmark_data.py +196 -0
- bencher/example/example_all.py +45 -0
- bencher/example/example_categorical.py +99 -0
- bencher/example/example_composable_container.py +106 -0
- bencher/example/example_composable_container2.py +160 -0
- bencher/example/example_consts.py +39 -0
- bencher/example/example_custom_sweep.py +59 -0
- bencher/example/example_custom_sweep2.py +42 -0
- bencher/example/example_docs.py +34 -0
- bencher/example/example_filepath.py +27 -0
- bencher/example/example_float3D.py +101 -0
- bencher/example/example_float_cat.py +99 -0
- bencher/example/example_floats.py +89 -0
- bencher/example/example_floats2D.py +93 -0
- bencher/example/example_holosweep.py +98 -0
- bencher/example/example_holosweep_objects.py +111 -0
- bencher/example/example_holosweep_tap.py +144 -0
- bencher/example/example_image.py +155 -0
- bencher/example/example_levels.py +181 -0
- bencher/example/example_levels2.py +37 -0
- bencher/example/example_pareto.py +53 -0
- bencher/example/example_sample_cache.py +85 -0
- bencher/example/example_sample_cache_context.py +116 -0
- bencher/example/example_simple.py +134 -0
- bencher/example/example_simple_bool.py +35 -0
- bencher/example/example_simple_cat.py +48 -0
- bencher/example/example_simple_float.py +28 -0
- bencher/example/example_simple_float2d.py +29 -0
- bencher/example/example_strings.py +47 -0
- bencher/example/example_time_event.py +63 -0
- bencher/example/example_video.py +118 -0
- bencher/example/example_workflow.py +189 -0
- bencher/example/experimental/example_bokeh_plotly.py +38 -0
- bencher/example/experimental/example_hover_ex.py +45 -0
- bencher/example/experimental/example_hvplot_explorer.py +39 -0
- bencher/example/experimental/example_interactive.py +75 -0
- bencher/example/experimental/example_streamnd.py +49 -0
- bencher/example/experimental/example_streams.py +36 -0
- bencher/example/experimental/example_template.py +40 -0
- bencher/example/experimental/example_updates.py +84 -0
- bencher/example/experimental/example_vector.py +84 -0
- bencher/example/meta/example_meta.py +171 -0
- bencher/example/meta/example_meta_cat.py +25 -0
- bencher/example/meta/example_meta_float.py +23 -0
- bencher/example/meta/example_meta_levels.py +26 -0
- bencher/example/optuna/example_optuna.py +78 -0
- bencher/example/shelved/example_float2D_scatter.py +109 -0
- bencher/example/shelved/example_float3D_cone.py +96 -0
- bencher/example/shelved/example_kwargs.py +63 -0
- bencher/plotting/__init__.py +0 -0
- bencher/plotting/plot_filter.py +110 -0
- bencher/plotting/plt_cnt_cfg.py +75 -0
- bencher/results/__init__.py +0 -0
- bencher/results/bench_result.py +94 -0
- bencher/results/bench_result_base.py +476 -0
- bencher/results/composable_container/__init__.py +0 -0
- bencher/results/composable_container/composable_container_base.py +73 -0
- bencher/results/composable_container/composable_container_panel.py +39 -0
- bencher/results/composable_container/composable_container_video.py +184 -0
- bencher/results/float_formatter.py +44 -0
- bencher/results/holoview_result.py +753 -0
- bencher/results/optuna_result.py +354 -0
- bencher/results/panel_result.py +41 -0
- bencher/results/plotly_result.py +65 -0
- bencher/results/video_result.py +38 -0
- bencher/results/video_summary.py +222 -0
- bencher/variables/__init__.py +0 -0
- bencher/variables/inputs.py +202 -0
- bencher/variables/parametrised_sweep.py +208 -0
- bencher/variables/results.py +214 -0
- bencher/variables/sweep_base.py +162 -0
- bencher/variables/time.py +92 -0
- holobench-1.26.3.data/data/share/ament_index/resource_index/packages/bencher +0 -0
- holobench-1.26.3.data/data/share/bencher/package.xml +33 -0
- {holobench-1.25.2.dist-info → holobench-1.26.3.dist-info}/METADATA +5 -5
- holobench-1.26.3.dist-info/RECORD +93 -0
- holobench-1.25.2.dist-info/RECORD +0 -18
- {holobench-1.25.2.dist-info → holobench-1.26.3.dist-info}/LICENSE +0 -0
- {holobench-1.25.2.dist-info → holobench-1.26.3.dist-info}/WHEEL +0 -0
- {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
|
File without changes
|
@@ -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.
|
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.
|
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.
|
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.
|
34
|
-
Requires-Dist: ruff <=0.4.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|