holobench 1.19.0__py2.py3-none-any.whl → 1.30.1__py2.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/__init__.py +12 -1
- bencher/bench_report.py +6 -109
- bencher/bench_runner.py +1 -1
- bencher/bencher.py +103 -57
- bencher/example/benchmark_data.py +0 -4
- 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_sweep2.py +42 -0
- bencher/example/example_dataframe.py +48 -0
- bencher/example/example_image.py +32 -17
- bencher/example/example_image1.py +81 -0
- bencher/example/example_levels2.py +37 -0
- bencher/example/example_simple_float.py +15 -25
- bencher/example/example_simple_float2d.py +29 -0
- bencher/example/example_strings.py +3 -2
- bencher/example/example_video.py +2 -11
- bencher/example/meta/example_meta.py +2 -2
- bencher/example/meta/example_meta_cat.py +2 -2
- bencher/example/meta/example_meta_float.py +1 -1
- bencher/example/meta/example_meta_levels.py +2 -2
- bencher/optuna_conversions.py +3 -2
- bencher/plotting/plt_cnt_cfg.py +1 -0
- bencher/results/bench_result.py +3 -1
- bencher/results/bench_result_base.py +58 -8
- bencher/results/composable_container/composable_container_base.py +25 -12
- bencher/results/composable_container/composable_container_dataframe.py +52 -0
- bencher/results/composable_container/composable_container_panel.py +17 -18
- bencher/results/composable_container/composable_container_video.py +163 -55
- bencher/results/dataset_result.py +227 -0
- bencher/results/holoview_result.py +15 -7
- bencher/results/optuna_result.py +4 -3
- bencher/results/panel_result.py +1 -1
- bencher/results/video_summary.py +104 -99
- bencher/utils.py +28 -2
- bencher/variables/__init__.py +0 -0
- bencher/variables/inputs.py +24 -1
- bencher/variables/parametrised_sweep.py +6 -4
- bencher/variables/results.py +29 -1
- bencher/variables/time.py +22 -0
- bencher/video_writer.py +20 -74
- {holobench-1.19.0.dist-info → holobench-1.30.1.dist-info}/METADATA +77 -35
- {holobench-1.19.0.dist-info → holobench-1.30.1.dist-info}/RECORD +46 -33
- {holobench-1.19.0.dist-info → holobench-1.30.1.dist-info}/WHEEL +1 -1
- holobench-1.30.1.dist-info/licenses/LICENSE +21 -0
- resource/bencher +0 -0
bencher/variables/inputs.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
from enum import Enum
|
2
|
-
from typing import List, Any
|
2
|
+
from typing import List, Any, Dict
|
3
3
|
|
4
4
|
import numpy as np
|
5
5
|
from param import Integer, Number, Selector
|
@@ -174,6 +174,29 @@ def box(name, center, width):
|
|
174
174
|
return var
|
175
175
|
|
176
176
|
|
177
|
+
def p(
|
178
|
+
name: str, values: List[Any] = None, samples: int = None, max_level: int = None
|
179
|
+
) -> Dict[str, Any]:
|
180
|
+
"""
|
181
|
+
Create a parameter dictionary with optional values, samples, and max_level.
|
182
|
+
|
183
|
+
Args:
|
184
|
+
name (str): The name of the parameter.
|
185
|
+
values (List[Any], optional): A list of values for the parameter. Defaults to None.
|
186
|
+
samples (int, optional): The number of samples. Must be greater than 0 if provided. Defaults to None.
|
187
|
+
max_level (int, optional): The maximum level. Must be greater than 0 if provided. Defaults to None.
|
188
|
+
|
189
|
+
Returns:
|
190
|
+
Dict[str, Any]: A dictionary containing the parameter details.
|
191
|
+
"""
|
192
|
+
if max_level is not None and max_level <= 0:
|
193
|
+
raise ValueError("max_level must be greater than 0")
|
194
|
+
|
195
|
+
if samples is not None and samples <= 0:
|
196
|
+
raise ValueError("samples must be greater than 0")
|
197
|
+
return {"name": name, "values": values, "max_level": max_level, "samples": samples}
|
198
|
+
|
199
|
+
|
177
200
|
def with_level(arr: list, level) -> list:
|
178
201
|
return IntSweep(sample_values=arr).with_level(level).values()
|
179
202
|
# return tmp.with_sample_values(arr).with_level(level).values()
|
@@ -3,10 +3,11 @@ from typing import List, Tuple, Any
|
|
3
3
|
from param import Parameter, Parameterized
|
4
4
|
import holoviews as hv
|
5
5
|
import panel as pn
|
6
|
-
|
6
|
+
from copy import deepcopy
|
7
7
|
|
8
8
|
from bencher.utils import make_namedtuple, hash_sha1
|
9
9
|
from bencher.variables.results import ALL_RESULT_TYPES, ResultHmap
|
10
|
+
from bencher.bench_cfg import BenchRunCfg
|
10
11
|
|
11
12
|
|
12
13
|
class ParametrizedSweep(Parameterized):
|
@@ -126,7 +127,7 @@ class ParametrizedSweep(Parameterized):
|
|
126
127
|
inp = cls.get_inputs_only()
|
127
128
|
defaults = {}
|
128
129
|
for i in inp:
|
129
|
-
defaults[i.name] = i.default
|
130
|
+
defaults[i.name] = deepcopy(i.default)
|
130
131
|
|
131
132
|
for k, v in kwargs.items():
|
132
133
|
defaults[k] = v
|
@@ -191,13 +192,14 @@ class ParametrizedSweep(Parameterized):
|
|
191
192
|
)
|
192
193
|
)
|
193
194
|
|
194
|
-
def __call__(self):
|
195
|
+
def __call__(self, **kwargs):
|
195
196
|
return self.get_results_values_as_dict()
|
196
197
|
|
197
198
|
def plot_hmap(self, **kwargs):
|
198
199
|
return self.__call__(**kwargs)["hmap"]
|
199
200
|
|
200
|
-
|
201
|
+
# TODO Add type hints here and fix the circular imports
|
202
|
+
def to_bench(self, run_cfg: BenchRunCfg = None, report=None, name: str = None):
|
201
203
|
from bencher import Bench
|
202
204
|
|
203
205
|
assert isinstance(self, ParametrizedSweep)
|
bencher/variables/results.py
CHANGED
@@ -186,6 +186,25 @@ class ResultReference(param.Parameter):
|
|
186
186
|
return hash_sha1(self)
|
187
187
|
|
188
188
|
|
189
|
+
class ResultDataSet(param.Parameter):
|
190
|
+
__slots__ = ["units", "obj"]
|
191
|
+
|
192
|
+
def __init__(
|
193
|
+
self,
|
194
|
+
obj: Any = None,
|
195
|
+
default: Any = None,
|
196
|
+
units: str = "dataset",
|
197
|
+
**params,
|
198
|
+
):
|
199
|
+
super().__init__(default=default, **params)
|
200
|
+
self.units = units
|
201
|
+
self.obj = obj
|
202
|
+
|
203
|
+
def hash_persistent(self) -> str:
|
204
|
+
"""A hash function that avoids the PYTHONHASHSEED 'feature' which returns a different hash value each time the program is run"""
|
205
|
+
return hash_sha1(self)
|
206
|
+
|
207
|
+
|
189
208
|
class ResultVolume(param.Parameter):
|
190
209
|
__slots__ = ["units", "obj"]
|
191
210
|
|
@@ -199,7 +218,15 @@ class ResultVolume(param.Parameter):
|
|
199
218
|
return hash_sha1(self)
|
200
219
|
|
201
220
|
|
202
|
-
PANEL_TYPES = (
|
221
|
+
PANEL_TYPES = (
|
222
|
+
ResultPath,
|
223
|
+
ResultImage,
|
224
|
+
ResultVideo,
|
225
|
+
ResultContainer,
|
226
|
+
ResultString,
|
227
|
+
ResultReference,
|
228
|
+
ResultDataSet,
|
229
|
+
)
|
203
230
|
|
204
231
|
ALL_RESULT_TYPES = (
|
205
232
|
ResultVar,
|
@@ -210,5 +237,6 @@ ALL_RESULT_TYPES = (
|
|
210
237
|
ResultImage,
|
211
238
|
ResultString,
|
212
239
|
ResultContainer,
|
240
|
+
ResultDataSet,
|
213
241
|
ResultReference,
|
214
242
|
)
|
bencher/variables/time.py
CHANGED
@@ -9,6 +9,28 @@ from bencher.variables.sweep_base import SweepBase, shared_slots
|
|
9
9
|
class TimeBase(SweepBase, Selector):
|
10
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
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
|
+
|
12
34
|
__slots__ = shared_slots
|
13
35
|
|
14
36
|
def values(self) -> List[str]:
|
bencher/video_writer.py
CHANGED
@@ -4,13 +4,6 @@ from pathlib import Path
|
|
4
4
|
from .utils import gen_video_path, gen_image_path
|
5
5
|
|
6
6
|
import moviepy
|
7
|
-
from moviepy.editor import (
|
8
|
-
VideoFileClip,
|
9
|
-
ImageClip,
|
10
|
-
ImageSequenceClip,
|
11
|
-
clips_array,
|
12
|
-
concatenate_videoclips,
|
13
|
-
)
|
14
7
|
from PIL import Image, ImageDraw
|
15
8
|
|
16
9
|
|
@@ -25,97 +18,50 @@ class VideoWriter:
|
|
25
18
|
self.images.append(img)
|
26
19
|
|
27
20
|
def write(self) -> str:
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
if len(self.images) > 0:
|
22
|
+
clip = moviepy.video.io.ImageSequenceClip.ImageSequenceClip(
|
23
|
+
self.images, fps=30, with_mask=False, load_images=True
|
24
|
+
)
|
25
|
+
self.write_video_raw(clip)
|
32
26
|
return self.filename
|
33
27
|
|
34
28
|
@staticmethod
|
35
|
-
def create_label(label, width=None, height=
|
29
|
+
def create_label(label, width=None, height=16, color=(255, 255, 255)):
|
36
30
|
if width is None:
|
37
|
-
width = len(label) *
|
38
|
-
new_img = Image.new("RGB", (width, height),
|
31
|
+
width = len(label) * 10
|
32
|
+
new_img = Image.new("RGB", (width, height), color=color)
|
39
33
|
# ImageDraw.Draw(new_img).text((width/2, 0), label, (0, 0, 0),align="center",achor="ms")
|
40
|
-
ImageDraw.Draw(new_img).text(
|
34
|
+
ImageDraw.Draw(new_img).text(
|
35
|
+
(width / 2.0, 0), label, (0, 0, 0), anchor="mt", font_size=height
|
36
|
+
)
|
41
37
|
|
42
38
|
return new_img
|
43
39
|
|
44
40
|
@staticmethod
|
45
|
-
def label_image(path: Path, label, padding=20) -> Path:
|
41
|
+
def label_image(path: Path, label, padding=20, color=(255, 255, 255)) -> Path:
|
46
42
|
image = Image.open(path)
|
47
|
-
new_img = VideoWriter.create_label(
|
43
|
+
new_img = VideoWriter.create_label(
|
44
|
+
label, image.size[0], image.size[1] + padding, color=color
|
45
|
+
)
|
48
46
|
new_img.paste(image, (0, padding))
|
49
47
|
return new_img
|
50
48
|
|
51
|
-
def append_file(self, filepath, label=None):
|
52
|
-
if label is not None:
|
53
|
-
path = Path(filepath)
|
54
|
-
new_path = path.with_name(path.stem + "_labelled" + path.suffix).as_posix()
|
55
|
-
padding = 20
|
56
|
-
match path.suffix:
|
57
|
-
case ".png" | ".jpg":
|
58
|
-
image = Image.open(filepath)
|
59
|
-
new_img = self.create_label(label, image.size[0], image.size[1] + padding)
|
60
|
-
new_img.paste(image, (0, padding))
|
61
|
-
new_img.save(new_path)
|
62
|
-
self.image_files.append(new_path)
|
63
|
-
case ".webm":
|
64
|
-
import warnings
|
65
|
-
|
66
|
-
video_clip = VideoFileClip(filepath)
|
67
|
-
new_img = self.create_label(label, video_clip.w, padding)
|
68
|
-
|
69
|
-
# Convert PIL image to MoviePy clip
|
70
|
-
label_clip = ImageClip(np.array(new_img), duration=video_clip.duration)
|
71
|
-
|
72
|
-
labeled_video_clip = clips_array([[label_clip], [video_clip]])
|
73
|
-
|
74
|
-
# otherwise ffmpeg complains that the file is not getting read. We don't need the file just the size
|
75
|
-
with warnings.catch_warnings():
|
76
|
-
warnings.simplefilter(action="ignore")
|
77
|
-
labeled_video_clip.write_videofile(new_path, remove_temp=True, logger=None)
|
78
|
-
self.video_files.append(new_path)
|
79
|
-
else:
|
80
|
-
self.image_files.append(filepath)
|
81
|
-
|
82
|
-
def to_images_sequence(self, images, target_duration: float = 10.0, frame_time=None, **kwargs):
|
83
|
-
target_duration = kwargs.pop("target_duration", target_duration)
|
84
|
-
if isinstance(images, list) and len(images) > 0:
|
85
|
-
if frame_time is None:
|
86
|
-
fps = len(images) / target_duration
|
87
|
-
fps = max(fps, 1) # never slower that 1 seconds per frame
|
88
|
-
fps = min(fps, 30)
|
89
|
-
else:
|
90
|
-
fps = 1.0 / frame_time
|
91
|
-
return ImageSequenceClip(images, fps=fps, with_mask=False)
|
92
|
-
return None
|
93
|
-
|
94
|
-
def write_png(self, **kwargs):
|
95
|
-
clip = None
|
96
|
-
if len(self.image_files) > 0:
|
97
|
-
clip = self.to_images_sequence(self.image_files, **kwargs)
|
98
|
-
if len(self.video_files) > 0:
|
99
|
-
clip = concatenate_videoclips([VideoFileClip(f) for f in self.video_files])
|
100
|
-
if clip is not None:
|
101
|
-
clip.write_videofile(self.filename)
|
102
|
-
return self.filename
|
103
|
-
return None
|
104
|
-
|
105
49
|
def write_video_raw(self, video_clip: moviepy.video.VideoClip, fps: int = 30) -> str:
|
106
50
|
video_clip.write_videofile(
|
107
51
|
self.filename,
|
108
|
-
codec="
|
52
|
+
codec="libx264",
|
109
53
|
audio=False,
|
110
54
|
bitrate="0",
|
111
55
|
fps=fps,
|
112
|
-
ffmpeg_params=["-crf", "
|
56
|
+
ffmpeg_params=["-crf", "23"],
|
57
|
+
threads=8,
|
113
58
|
)
|
114
59
|
video_clip.close()
|
115
60
|
return self.filename
|
116
61
|
|
117
62
|
|
118
|
-
def add_image(np_array: np.ndarray, name: str = "img"):
|
63
|
+
def add_image(np_array: np.ndarray, name: str = "img") -> str:
|
64
|
+
"""Creates a file on disk from a numpy array and returns the created image path"""
|
119
65
|
filename = gen_image_path(name)
|
120
66
|
Image.fromarray(np_array).save(filename)
|
121
67
|
return filename
|
@@ -1,37 +1,39 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.3
|
2
2
|
Name: holobench
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.30.1
|
4
4
|
Summary: A package for benchmarking the performance of arbitrary functions
|
5
|
-
Author-email: Austin Gregg-Smith <blooop@gmail.com>
|
6
|
-
Description-Content-Type: text/markdown
|
7
|
-
Requires-Dist: holoviews>=1.15,<=1.18.3
|
8
|
-
Requires-Dist: numpy>=1.0,<=1.26.4
|
9
|
-
Requires-Dist: param>=1.13.0,<=2.1.0
|
10
|
-
Requires-Dist: hvplot>=0.8,<=0.10.0
|
11
|
-
Requires-Dist: matplotlib>=3.6.3,<=3.8.4
|
12
|
-
Requires-Dist: panel>=1.3.6,<=1.4.2
|
13
|
-
Requires-Dist: diskcache>=5.6,<=5.6.3
|
14
|
-
Requires-Dist: optuna>=3.2,<=3.6.1
|
15
|
-
Requires-Dist: xarray>=2023.7,<=2024.5.0
|
16
|
-
Requires-Dist: plotly>=5.15,<=5.22.0
|
17
|
-
Requires-Dist: sortedcontainers>=2.4,<=2.4
|
18
|
-
Requires-Dist: pandas>=2.0,<=2.2.2
|
19
|
-
Requires-Dist: strenum>=0.4.0,<=0.4.15
|
20
|
-
Requires-Dist: scikit-learn>=1.2,<=1.4.2
|
21
|
-
Requires-Dist: str2bool>=1.1,<=1.1
|
22
|
-
Requires-Dist: scoop>=0.7.0,<=0.7.2.0
|
23
|
-
Requires-Dist: moviepy>=1.0.3,<=1.0.3
|
24
|
-
Requires-Dist: black>=23,<=24.4.2 ; extra == "test"
|
25
|
-
Requires-Dist: pylint>=2.16,<=3.1.0 ; extra == "test"
|
26
|
-
Requires-Dist: pytest-cov>=4.1,<=5.0.0 ; extra == "test"
|
27
|
-
Requires-Dist: pytest>=7.4,<=8.2.0 ; extra == "test"
|
28
|
-
Requires-Dist: hypothesis>=6.82,<=6.101.0 ; extra == "test"
|
29
|
-
Requires-Dist: ruff>=0.0.280,<=0.4.4 ; extra == "test"
|
30
|
-
Requires-Dist: coverage>=7.2.7,<=7.5.1 ; extra == "test"
|
31
|
-
Project-URL: Documentation, https://bencher.readthedocs.io/en/latest/
|
32
|
-
Project-URL: Home, https://github.com/dyson-ai/bencher
|
33
5
|
Project-URL: Repository, https://github.com/dyson-ai/bencher
|
6
|
+
Project-URL: Home, https://github.com/dyson-ai/bencher
|
7
|
+
Project-URL: Documentation, https://bencher.readthedocs.io/en/latest/
|
8
|
+
Author-email: Austin Gregg-Smith <blooop@gmail.com>
|
9
|
+
License-Expression: MIT
|
10
|
+
License-File: LICENSE
|
11
|
+
Requires-Dist: diskcache<=5.6.3,>=5.6
|
12
|
+
Requires-Dist: holoviews<=1.19.1,>=1.15
|
13
|
+
Requires-Dist: hvplot<=0.11.1,>=0.8
|
14
|
+
Requires-Dist: matplotlib<=3.9.2,>=3.6.3
|
15
|
+
Requires-Dist: moviepy-fix-codec
|
16
|
+
Requires-Dist: numpy<=2.1.2,>=1.0
|
17
|
+
Requires-Dist: optuna<=4.0.0,>=3.2
|
18
|
+
Requires-Dist: pandas<=2.2.3,>=2.0
|
19
|
+
Requires-Dist: panel<=1.5.3,>=1.3.6
|
20
|
+
Requires-Dist: param<=2.1.1,>=1.13.0
|
21
|
+
Requires-Dist: plotly<=5.24.1,>=5.15
|
22
|
+
Requires-Dist: scikit-learn<=1.5.2,>=1.2
|
23
|
+
Requires-Dist: scoop<=0.7.2.0,>=0.7.0
|
24
|
+
Requires-Dist: sortedcontainers<=2.4,>=2.4
|
25
|
+
Requires-Dist: str2bool<=1.1,>=1.1
|
26
|
+
Requires-Dist: strenum<=0.4.15,>=0.4.0
|
27
|
+
Requires-Dist: xarray<=2024.10.0,>=2023.7
|
34
28
|
Provides-Extra: test
|
29
|
+
Requires-Dist: black<=24.10.0,>=23; extra == 'test'
|
30
|
+
Requires-Dist: coverage<=7.6.4,>=7.5.4; extra == 'test'
|
31
|
+
Requires-Dist: hypothesis<=6.116.0,>=6.104.2; extra == 'test'
|
32
|
+
Requires-Dist: pylint<=3.3.1,>=3.2.5; extra == 'test'
|
33
|
+
Requires-Dist: pytest-cov<=6.0.0,>=4.1; extra == 'test'
|
34
|
+
Requires-Dist: pytest<=8.3.3,>=7.4; extra == 'test'
|
35
|
+
Requires-Dist: ruff<=0.7.2,>=0.5.0; extra == 'test'
|
36
|
+
Description-Content-Type: text/markdown
|
35
37
|
|
36
38
|
# Bencher
|
37
39
|
|
@@ -43,10 +45,16 @@ Provides-Extra: test
|
|
43
45
|
[](https://GitHub.com/dyson-ai/bencher/issues/)
|
44
46
|
[](https://github.com/dyson-ai/bencher/pulls?q=is%3Amerged)
|
45
47
|
[](https://pypi.org/project/holobench/)
|
46
|
-
[](https://pypistats.org/packages/holobench)
|
47
49
|
[](https://opensource.org/license/mit/)
|
48
|
-
[](https://www.python.org/downloads/
|
50
|
+
[](https://www.python.org/downloads/)
|
51
|
+
[](https://pixi.sh)
|
52
|
+
|
53
|
+
## Install
|
49
54
|
|
55
|
+
```bash
|
56
|
+
pip install holobench
|
57
|
+
```
|
50
58
|
|
51
59
|
## Intro
|
52
60
|
|
@@ -77,9 +85,43 @@ Bencher is designed to work with stochastic pure functions with no side effects.
|
|
77
85
|
combine latest data with historical data
|
78
86
|
|
79
87
|
store the results using the input hash as a key
|
80
|
-
deduce the type of plot based on the input types
|
88
|
+
deduce the type of plot based on the input and output types
|
81
89
|
return data and plot
|
82
90
|
|
83
|
-
### Example Output
|
84
91
|
|
85
|
-
|
92
|
+
## Demo
|
93
|
+
|
94
|
+
if you have [pixi](https://github.com/prefix-dev/pixi/) installed you can run a demo example with:
|
95
|
+
|
96
|
+
```bash
|
97
|
+
pixi run demo
|
98
|
+
```
|
99
|
+
|
100
|
+
An example of the type of output bencher produces can be seen here:
|
101
|
+
|
102
|
+
https://dyson-ai.github.io/bencher/
|
103
|
+
|
104
|
+
|
105
|
+
## Examples
|
106
|
+
|
107
|
+
Most of the features that are supported are demonstrated in the examples folder.
|
108
|
+
|
109
|
+
Start with example_simple_float.py and explore other examples based on your data types:
|
110
|
+
- example_float.py: More complex float operations
|
111
|
+
- example_float2D.py: 2D float sweeps
|
112
|
+
- example_float3D.py: 3D float sweeps
|
113
|
+
- example_categorical.py: Sweeping categorical values (enums)
|
114
|
+
- example_strings.py: Sweeping categorical string values
|
115
|
+
- example_float_cat.py: Mixing float and categorical values
|
116
|
+
- example_image.py: Output images as part of the sweep
|
117
|
+
- example_video.py: Output videos as part of the sweep
|
118
|
+
- example_filepath.py: Output arbitrary files as part of the sweep
|
119
|
+
- and many others
|
120
|
+
|
121
|
+
|
122
|
+
## Documentation
|
123
|
+
|
124
|
+
API documentation can be found at https://bencher.readthedocs.io/en/latest/
|
125
|
+
|
126
|
+
More documentation is needed for the examples and general workflow.
|
127
|
+
|
@@ -1,21 +1,26 @@
|
|
1
|
-
bencher/__init__.py,sha256=
|
1
|
+
bencher/__init__.py,sha256=VtSU6Dq3XdjphKQJ9s3yZlA3el5B9kNGqsJMM-vyYx0,1580
|
2
2
|
bencher/bench_cfg.py,sha256=8rvJyeQXalZmYF8Lb-NKb9RFJs0w08k9ogcZSR1rhgs,18413
|
3
3
|
bencher/bench_plot_server.py,sha256=D00_SOrHa2IT8zAjwetoNL6tEiHSHvXnbea9iElCLVk,4195
|
4
|
-
bencher/bench_report.py,sha256=
|
5
|
-
bencher/bench_runner.py,sha256
|
6
|
-
bencher/bencher.py,sha256=
|
4
|
+
bencher/bench_report.py,sha256=95K4ubVGXyyGO40fsdFysgPmxrI6JbXpQKdMiahm7KI,6365
|
5
|
+
bencher/bench_runner.py,sha256=-SzAKd6QbPJ05KaW3vteFIkE-UtlFS55Ob9QeE5eRXw,6202
|
6
|
+
bencher/bencher.py,sha256=w_n8tPlUKT-jjjJKby028z7_iYsRKesSYAg4uUpxs1A,35324
|
7
7
|
bencher/caching.py,sha256=AusaNrzGGlj5m6zcwcqnTn55Mam2mQdF--oqelO806M,1627
|
8
8
|
bencher/class_enum.py,sha256=kYHW9qKkKcNdwaXizZL-fTptS_DUEGv4c88yCehk3gc,1492
|
9
9
|
bencher/job.py,sha256=swa0VwrZf41v7qNjreVDIYUU6r_dfuLipPZbg_w5x7c,6089
|
10
|
-
bencher/optuna_conversions.py,sha256=
|
11
|
-
bencher/utils.py,sha256=
|
12
|
-
bencher/video_writer.py,sha256=
|
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
13
|
bencher/worker_job.py,sha256=FREi0yWQACFmH86R1j-LH72tALEFkKhLDmmoGQY9Jh4,1571
|
14
14
|
bencher/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
|
-
bencher/example/benchmark_data.py,sha256=
|
15
|
+
bencher/example/benchmark_data.py,sha256=eRAB9ZhiDylWeqsh4g8lUYP3BV50QPUBmQ785scT590,6985
|
16
16
|
bencher/example/example_all.py,sha256=iiKV2poYWu4SUIQkpoX4qT1zTm574QfuNHpYww3meFA,1952
|
17
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
|
18
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_dataframe.py,sha256=gwpLBl0TBLkyMfKPtoIgAR4osqFFrBFPKzkDPS0pNio,1793
|
19
24
|
bencher/example/example_docs.py,sha256=aUi33O543JBPoOGlpHaY2eA74GR7cHH_6-hcC8xf3z0,1174
|
20
25
|
bencher/example/example_filepath.py,sha256=O3VO9rWAXB_1tagVSvxhiSMjcTkgZe2duw7W17ij7po,827
|
21
26
|
bencher/example/example_float3D.py,sha256=pwi3YlDad3NL4IrfMK2V5yV1CRpqfmUO-zUnGmVYxDs,3425
|
@@ -25,18 +30,21 @@ bencher/example/example_floats2D.py,sha256=D0kljoUCinMKCEW-Zg-cQ8sYu_yPCZqzKJ9tR
|
|
25
30
|
bencher/example/example_holosweep.py,sha256=lxH0Z_waInGIH5AtGQi4zwPAZRI_uN0DbsJhI9iSF7Q,3017
|
26
31
|
bencher/example/example_holosweep_objects.py,sha256=vHuAtkM1VrJelHOazn_SJfzxNywKyaMzN-DE8W7Ricc,3228
|
27
32
|
bencher/example/example_holosweep_tap.py,sha256=NYXofWGV9GaBN72Q3kKPT5lKJ-slYZH5VzTAavUu23w,4527
|
28
|
-
bencher/example/example_image.py,sha256=
|
33
|
+
bencher/example/example_image.py,sha256=lNIEVUFZJTriCVpZ9ARPn2Hs31usBt-YYTu-iKYrz3w,5547
|
34
|
+
bencher/example/example_image1.py,sha256=2WTzFZbql351UzCdKr49Ee-fl2Z9UXW_4Dd4mMSqveo,2682
|
29
35
|
bencher/example/example_levels.py,sha256=s-UfXXp8qj5U0Gx5KyMqj--nn1Ke0NtHVLSSJYIPaYY,6891
|
36
|
+
bencher/example/example_levels2.py,sha256=6n-ceglaHAbPAp2I-IiUsET8OVubXu8wNVoRBFJ_JSw,1116
|
30
37
|
bencher/example/example_pareto.py,sha256=yyAg8Vb-5sgsS6LkYKT7T5Evcfg69FlCqCakUippSmU,2687
|
31
38
|
bencher/example/example_sample_cache.py,sha256=7gf1BJ63VAgdqNuNXkbL9-jeTeC3kXA_PY9yG3ulTz0,4200
|
32
39
|
bencher/example/example_sample_cache_context.py,sha256=IAUBbL78QM20R8evaq7L8I-xPxFDFykF1Gk1y2Ru1W0,4063
|
33
40
|
bencher/example/example_simple.py,sha256=Nn2ixNx29jbgvwH2K5vDGhSFcqKLMNaP1occPxhHoU0,11703
|
34
41
|
bencher/example/example_simple_bool.py,sha256=GZ6pyj8FaQV9gNxaqAmX6c5XWtMvKosezAbSADEl0G0,1248
|
35
42
|
bencher/example/example_simple_cat.py,sha256=XsV_75Jk3phVPI4om3q0vn1POfREb3CGRm9Kq1tL-OA,1760
|
36
|
-
bencher/example/example_simple_float.py,sha256=
|
37
|
-
bencher/example/
|
43
|
+
bencher/example/example_simple_float.py,sha256=Mfp4QwqgZ6DWgdu3reNA0cDwOV5cjG1PTuhf-SEsEkY,930
|
44
|
+
bencher/example/example_simple_float2d.py,sha256=xsVOLO6AtMi9_fybpS_JZnhev5f11YuYWHrAOzJw2dI,1033
|
45
|
+
bencher/example/example_strings.py,sha256=vStjrvfezNz7115iRtuwy0i7Gbu6w8mu-oHNfKNLNog,1570
|
38
46
|
bencher/example/example_time_event.py,sha256=e6R-a6ZPe-ePiWoNvN3YuSQK-Y2HOGntsjCm_SPon28,2159
|
39
|
-
bencher/example/example_video.py,sha256=
|
47
|
+
bencher/example/example_video.py,sha256=ffeTAqDuriMXxJ1sYfA4r137D3BAii84uSef6K86QVI,3955
|
40
48
|
bencher/example/example_workflow.py,sha256=00QnUuViMfX_PqzqkXmg1wPX6yAq7IS7mCL_RFKwrMM,6806
|
41
49
|
bencher/example/experimental/example_bokeh_plotly.py,sha256=3jUKh8eKIAlpklKnp8UopIHhUDw1A0_5CwjeyTzbi7o,846
|
42
50
|
bencher/example/experimental/example_hover_ex.py,sha256=qszw4FkIfqQkVviPSpmUoFOoi6PGotGbsc7Ojyx8EtU,1052
|
@@ -47,36 +55,41 @@ bencher/example/experimental/example_streams.py,sha256=rrTmcmxDlirGoyTbJ4LT4fBIA
|
|
47
55
|
bencher/example/experimental/example_template.py,sha256=XdIVS9RtLdE5GNnerWiZMXvP7n17lzuc_YTLqJTwb6Q,1172
|
48
56
|
bencher/example/experimental/example_updates.py,sha256=rF4UgWY-CW6ohNtOpQklTuwbwVRvEM5j6edZOiMkspQ,1835
|
49
57
|
bencher/example/experimental/example_vector.py,sha256=3o_1dA4dc2HL6uIEvDAcvLPVJB8jgkq1QZ3BQIL-LEo,3118
|
50
|
-
bencher/example/meta/example_meta.py,sha256=
|
51
|
-
bencher/example/meta/example_meta_cat.py,sha256=
|
52
|
-
bencher/example/meta/example_meta_float.py,sha256=
|
53
|
-
bencher/example/meta/example_meta_levels.py,sha256=
|
58
|
+
bencher/example/meta/example_meta.py,sha256=l4TZuBjCUwzxm2lHJ5wqWWI2-Xv8LFVg3S0K0JmuX5U,5563
|
59
|
+
bencher/example/meta/example_meta_cat.py,sha256=FMBT0yMPJJo0pmUYVtlq64R6qn_EXEt74xYAsK6HQag,641
|
60
|
+
bencher/example/meta/example_meta_float.py,sha256=D71oiFqGauLvqTxv2BC4CJOwHIdpvq8FdCBVejwZ4Do,624
|
61
|
+
bencher/example/meta/example_meta_levels.py,sha256=MkVL8pAIogn8ObKdSn8BC_DKk6PSVvvPU7_KUCgP5vQ,1436
|
54
62
|
bencher/example/optuna/example_optuna.py,sha256=-RIuDrdPjfXz1c1hOAmWeJNdmGICiWnyJfAavRsiMuk,2370
|
55
63
|
bencher/example/shelved/example_float2D_scatter.py,sha256=z8ranMq8IcJ1yoVSFDncp3gw-yWG7X9lXLimXKpy5Ks,3372
|
56
64
|
bencher/example/shelved/example_float3D_cone.py,sha256=T3-IapccLYX3BM9sGDyOTLhZVEmzkeMsXzQMT5msnNQ,2966
|
57
65
|
bencher/example/shelved/example_kwargs.py,sha256=Bgxkd7qeHdySBE24amdP-VNFRRgK_enyzprlxBwY9Ko,2461
|
58
66
|
bencher/plotting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
59
67
|
bencher/plotting/plot_filter.py,sha256=Zff02hEcRffiqDEoXUHVZQJK5kW4HbMxe2GYCrxI8jg,4688
|
60
|
-
bencher/plotting/plt_cnt_cfg.py,sha256=
|
68
|
+
bencher/plotting/plt_cnt_cfg.py,sha256=RK6dot_Yb6uTBPDe7Z1UzCqCQgjgEFxANt5DCc4LLAI,3159
|
61
69
|
bencher/results/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
62
|
-
bencher/results/bench_result.py,sha256=
|
63
|
-
bencher/results/bench_result_base.py,sha256=
|
70
|
+
bencher/results/bench_result.py,sha256=IaJdWMNxHmbBkV8kAUj57LCHOiNjYJMvZpEPmI-yZy0,3612
|
71
|
+
bencher/results/bench_result_base.py,sha256=EsY5Di8KwDEn9Kbuc9fWF4FErwT7zyIdBYpE2n7y7Zc,20795
|
72
|
+
bencher/results/dataset_result.py,sha256=qXmFMrVAo_1qM6hhV4XpQqmCz9RiVkQo6ICYmbT-Kvk,8680
|
64
73
|
bencher/results/float_formatter.py,sha256=sX6HNCyaXdHDxC8ybVUHwCJ3qOKbPUkBOplVIHtKWjM,1746
|
65
|
-
bencher/results/holoview_result.py,sha256=
|
66
|
-
bencher/results/optuna_result.py,sha256=
|
67
|
-
bencher/results/panel_result.py,sha256=
|
74
|
+
bencher/results/holoview_result.py,sha256=DHzQaDOswsPln2XIJ9NF-OIw4HgJ41Sv9JrlIz_dVe0,28499
|
75
|
+
bencher/results/optuna_result.py,sha256=4igNYHBOP8aRIE44PYHcPTJEPXPodaUC2ZVmjysLnWM,13472
|
76
|
+
bencher/results/panel_result.py,sha256=lXOtfhWKSspf53Wgm94DTiVD3rliieHQW96sOdu5UYk,1336
|
68
77
|
bencher/results/plotly_result.py,sha256=wkgfL38qJp6RviekXBYpNPeU4HCf0nbtKDAhu5QZhUg,2132
|
69
78
|
bencher/results/video_result.py,sha256=E3fAxXctRVxiRyamadpKCMXanM5TTqw1tEYICS2LDLs,1146
|
70
|
-
bencher/results/video_summary.py,sha256=
|
79
|
+
bencher/results/video_summary.py,sha256=ECMVnm1L58n3KHrFuy4Cm9T6aUjsOL_YHm0ncLfW4IU,8343
|
71
80
|
bencher/results/composable_container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
72
|
-
bencher/results/composable_container/composable_container_base.py,sha256=
|
73
|
-
bencher/results/composable_container/
|
74
|
-
bencher/results/composable_container/
|
75
|
-
bencher/
|
76
|
-
bencher/variables/
|
77
|
-
bencher/variables/
|
81
|
+
bencher/results/composable_container/composable_container_base.py,sha256=n2EkcedMjF2IAPKyflo0WVsEDA0wrEhU7ijnX6pI078,2779
|
82
|
+
bencher/results/composable_container/composable_container_dataframe.py,sha256=ZbFaQSo4UsRxY8NUdJPjNFW3_kzlm8jtWuoLf8y_t8U,1789
|
83
|
+
bencher/results/composable_container/composable_container_panel.py,sha256=HrOoeGB0y0jGQcxcci_M82ftsvklLkJgo-4SjDBJCks,1232
|
84
|
+
bencher/results/composable_container/composable_container_video.py,sha256=EHY2TIQM5ualrh_or-wzyErPWm25CaYdSdMotqo5wCo,7104
|
85
|
+
bencher/variables/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
86
|
+
bencher/variables/inputs.py,sha256=tASPqEN7j_uaj8vfM1nFEpgV8QXrxTH3LfltIbV0Gp4,6725
|
87
|
+
bencher/variables/parametrised_sweep.py,sha256=1T8UMOO03A_98soU2COknIJUsDNGcmWULyL26dXJ6vI,7429
|
88
|
+
bencher/variables/results.py,sha256=Wq14e8rAj5mcK22325wcaeTMjgZ6JuduqceAHItHFY8,7750
|
78
89
|
bencher/variables/sweep_base.py,sha256=cOybffErb3_QUsCfiZa0mlVy9tGDueqiElZmc363apE,6258
|
79
|
-
bencher/variables/time.py,sha256=
|
80
|
-
|
81
|
-
holobench-1.
|
82
|
-
holobench-1.
|
90
|
+
bencher/variables/time.py,sha256=A1QPYM-z2p-04hKcHG80u8njiKQ-2R2IHcjo7iB92_A,3136
|
91
|
+
resource/bencher,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
92
|
+
holobench-1.30.1.dist-info/METADATA,sha256=x310XYiBn3weZ23e07PcWsxTxuNpCnoXlguTE2jrQAw,6366
|
93
|
+
holobench-1.30.1.dist-info/WHEEL,sha256=fl6v0VwpzfGBVsGtkAkhILUlJxROXbA3HvRL6Fe3140,105
|
94
|
+
holobench-1.30.1.dist-info/licenses/LICENSE,sha256=dSHXTdRY4Y7qGFMv63UksV700iff7iE-p7GGs6Sbnvo,1065
|
95
|
+
holobench-1.30.1.dist-info/RECORD,,
|
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2023 Dyson AI
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
resource/bencher
ADDED
File without changes
|