holobench 1.19.0__py2.py3-none-any.whl → 1.30.0__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.
Files changed (46) hide show
  1. bencher/__init__.py +12 -1
  2. bencher/bench_report.py +6 -109
  3. bencher/bench_runner.py +1 -1
  4. bencher/bencher.py +103 -57
  5. bencher/example/benchmark_data.py +0 -4
  6. bencher/example/example_composable_container.py +106 -0
  7. bencher/example/example_composable_container2.py +160 -0
  8. bencher/example/example_consts.py +39 -0
  9. bencher/example/example_custom_sweep2.py +42 -0
  10. bencher/example/example_dataframe.py +48 -0
  11. bencher/example/example_image.py +32 -17
  12. bencher/example/example_image1.py +81 -0
  13. bencher/example/example_levels2.py +37 -0
  14. bencher/example/example_simple_float.py +15 -25
  15. bencher/example/example_simple_float2d.py +29 -0
  16. bencher/example/example_strings.py +3 -2
  17. bencher/example/example_video.py +2 -11
  18. bencher/example/meta/example_meta.py +2 -2
  19. bencher/example/meta/example_meta_cat.py +2 -2
  20. bencher/example/meta/example_meta_float.py +1 -1
  21. bencher/example/meta/example_meta_levels.py +2 -2
  22. bencher/optuna_conversions.py +3 -2
  23. bencher/plotting/plt_cnt_cfg.py +1 -0
  24. bencher/results/bench_result.py +3 -1
  25. bencher/results/bench_result_base.py +58 -8
  26. bencher/results/composable_container/composable_container_base.py +25 -12
  27. bencher/results/composable_container/composable_container_dataframe.py +52 -0
  28. bencher/results/composable_container/composable_container_panel.py +17 -18
  29. bencher/results/composable_container/composable_container_video.py +163 -55
  30. bencher/results/dataset_result.py +227 -0
  31. bencher/results/holoview_result.py +15 -7
  32. bencher/results/optuna_result.py +4 -3
  33. bencher/results/panel_result.py +1 -1
  34. bencher/results/video_summary.py +104 -99
  35. bencher/utils.py +28 -2
  36. bencher/variables/__init__.py +0 -0
  37. bencher/variables/inputs.py +24 -1
  38. bencher/variables/parametrised_sweep.py +6 -4
  39. bencher/variables/results.py +29 -1
  40. bencher/variables/time.py +22 -0
  41. bencher/video_writer.py +20 -74
  42. {holobench-1.19.0.dist-info → holobench-1.30.0.dist-info}/METADATA +77 -35
  43. {holobench-1.19.0.dist-info → holobench-1.30.0.dist-info}/RECORD +46 -33
  44. {holobench-1.19.0.dist-info → holobench-1.30.0.dist-info}/WHEEL +1 -1
  45. holobench-1.30.0.dist-info/licenses/LICENSE +21 -0
  46. resource/bencher +0 -0
@@ -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
- def to_bench(self, run_cfg=None, report=None, name: str = None):
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)
@@ -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 = (ResultPath, ResultImage, ResultVideo, ResultContainer, ResultString, ResultReference)
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
- clip = moviepy.video.io.ImageSequenceClip.ImageSequenceClip(
29
- self.images, fps=30, with_mask=False, load_images=True
30
- )
31
- self.write_video_raw(clip)
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=14):
29
+ def create_label(label, width=None, height=16, color=(255, 255, 255)):
36
30
  if width is None:
37
- width = len(label) * 8
38
- new_img = Image.new("RGB", (width, height), (255, 255, 255))
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((width / 2.0, 0), label, (0, 0, 0), anchor="mt", font_size=12)
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(label, image.size[0], image.size[1] + padding)
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="libvpx",
52
+ codec="libx264",
109
53
  audio=False,
110
54
  bitrate="0",
111
55
  fps=fps,
112
- ffmpeg_params=["-crf", "34"],
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
1
+ Metadata-Version: 2.3
2
2
  Name: holobench
3
- Version: 1.19.0
3
+ Version: 1.30.0
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.10.0,>=0.8
14
+ Requires-Dist: matplotlib<=3.9.2,>=3.6.3
15
+ Requires-Dist: moviepy-fix-codec
16
+ Requires-Dist: numpy<=2.1.0,>=1.0
17
+ Requires-Dist: optuna<=4.0.0,>=3.2
18
+ Requires-Dist: pandas<=2.2.2,>=2.0
19
+ Requires-Dist: panel<=1.4.5,>=1.3.6
20
+ Requires-Dist: param<=2.1.1,>=1.13.0
21
+ Requires-Dist: plotly<=5.24.0,>=5.15
22
+ Requires-Dist: scikit-learn<=1.5.1,>=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.7.0,>=2023.7
34
28
  Provides-Extra: test
29
+ Requires-Dist: black<=24.8.0,>=23; extra == 'test'
30
+ Requires-Dist: coverage<=7.6.1,>=7.5.4; extra == 'test'
31
+ Requires-Dist: hypothesis<=6.112.2,>=6.104.2; extra == 'test'
32
+ Requires-Dist: pylint<=3.3.1,>=3.2.5; extra == 'test'
33
+ Requires-Dist: pytest-cov<=5.0.0,>=4.1; extra == 'test'
34
+ Requires-Dist: pytest<=8.3.3,>=7.4; extra == 'test'
35
+ Requires-Dist: ruff<=0.6.8,>=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
  [![GitHub issues](https://img.shields.io/github/issues/dyson-ai/bencher.svg)](https://GitHub.com/dyson-ai/bencher/issues/)
44
46
  [![GitHub pull-requests merged](https://badgen.net/github/merged-prs/dyson-ai/bencher)](https://github.com/dyson-ai/bencher/pulls?q=is%3Amerged)
45
47
  [![PyPI](https://img.shields.io/pypi/v/holobench)](https://pypi.org/project/holobench/)
46
- [![GitHub release](https://img.shields.io/github/release/dyson-ai/bencher.svg)](https://GitHub.com/dyson-ai/bencher/releases/)
48
+ [![PyPI - Downloads](https://img.shields.io/pypi/dm/holobench)](https://pypistats.org/packages/holobench)
47
49
  [![License](https://img.shields.io/pypi/l/bencher)](https://opensource.org/license/mit/)
48
- [![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11-blue)](https://www.python.org/downloads/release/python-310/)
50
+ [![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12-blue)](https://www.python.org/downloads/)
51
+ [![Pixi Badge](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/prefix-dev/pixi/main/assets/badge/v0.json)](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
- https://dyson-ai.github.io/bencher/
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=G_ni2iqlgSxV9jCWRuJYr3eYi2vS7D8K989DVSBXnLY,1299
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=jh3T_q9KByZDeMPMf0KNJojZukxRzkfaYGeuWQU8MKM,10528
5
- bencher/bench_runner.py,sha256=F4DN1YSFXnUAGO17tJ6DZDyEu7QBgvTyqn8G_iCd36c,6165
6
- bencher/bencher.py,sha256=SmdjwFEdjNkPTVeoG6oXLRM8LOobZLVN90LSAsHCS5E,33299
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=DAa1DBXJ5EvTGiPyzuDTovQSjKVpMZ2sdwEXThlXJVU,5288
11
- bencher/utils.py,sha256=qdgcjzegdUG-PRZINOJOBAL960FrSshHOz90SZMkx8Q,5675
12
- bencher/video_writer.py,sha256=v0yXr7PV0rYWTWqVWBZkXFD3N_ExrZHHHkbEXcXK5bc,4512
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=D9yUg_KKtqqEkAiLceodDwsv6sh7xEFWZNp6P6Y3pj4,6989
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=c9CeSnw7Cn75pCetBUiGM_cDqbM3ArOr1xV_IPAOYMo,4667
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=X4vsH0F4fZAoO0EKB1xIzFMY0f0Wyk8LV2plPlSEsbI,1323
37
- bencher/example/example_strings.py,sha256=BdsEZgLT9mOxLkBKNHz2XpPwwe4SzNTdjnY1WVlOmNM,1570
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=2d7GPjBXxGmNpHTMHVGqV4j8EVk7Yz---GM6WVxJpfo,4156
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=oG8q5k9Ju1LFYCZQIru2OHeS-TYwGo4mUb9255NB4MM,5615
51
- bencher/example/meta/example_meta_cat.py,sha256=YKVUiZ7M1tFFYgUTVQZeOe-1bnmxOjLdWy3nmCoyEe0,693
52
- bencher/example/meta/example_meta_float.py,sha256=f3OcORsRUt9Bnd1M1hOjmgxulxcalwdQHSQ0Psx1rY8,650
53
- bencher/example/meta/example_meta_levels.py,sha256=O77D4gAGYf7uZo7-Kj2ZwyNmpnc4paoQXE_DQtKKWKo,1488
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=BkiAsgHm35Mqb5OsjULGVK0Q6pGZ0WSsJxxwSOrbaQs,3124
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=JoXfAQ2dkoVt2mBM0Hp5V0843CWcSCuBfR817VhLVx0,3491
63
- bencher/results/bench_result_base.py,sha256=pBz7CCzZwGV4qIOicb5JKoVqYyxWooFVuv-UvQ0Ojsw,18975
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=dFQL5-y0uqUQcA2fK8q5Wz_JYuEeJi1tyWJQzX2GTeo,28074
66
- bencher/results/optuna_result.py,sha256=jtsWJGdCS0L98EzxTxXU_AyarCL5CkXRLOVuSvs048M,13437
67
- bencher/results/panel_result.py,sha256=05mj90TnBC1_ADaHJoqIFSQAlbmF4gal0AkNk7aOXhE,1335
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=6Lt5UOf-oFCXc2tCVmJeLoP3CoQEexwVECobxYsOxTw,7852
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=RWcXTf__PvWXesCmY244NFXj7TJqVcle29o-4QgZdBQ,2383
73
- bencher/results/composable_container/composable_container_panel.py,sha256=A56-MaaaId_VBMFhvM7Jtfh8_3PeKNxlEnOKU49IsW8,1221
74
- bencher/results/composable_container/composable_container_video.py,sha256=GJnICoIpOo0wNQvSpIAb0daWOs7j8iE41h8l6yFkEdQ,2593
75
- bencher/variables/inputs.py,sha256=OYCnEIX_ASbpuMwCy6536RrvGibdpxZeA4bwJ-2fSUA,5753
76
- bencher/variables/parametrised_sweep.py,sha256=Q9kKGeXmaQ5-RlaH4BPseOqt0JOqQj6RHIPI5Ix7Qyc,7267
77
- bencher/variables/results.py,sha256=mjr34L27NFuXqUCI1GSO8srU8VFm8niTkaSZ1iPvvbY,7159
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=Up1VOTwoOi-HchRlCh-K1PRR8FvhZyNqLDUODa0erHA,2659
80
- holobench-1.19.0.dist-info/WHEEL,sha256=Sgu64hAMa6g5FdzHxXv9Xdse9yxpGGMeagVtPMWpJQY,99
81
- holobench-1.19.0.dist-info/METADATA,sha256=NB_1fkLU2UXWl5BkpdjYrcUJYGZ7noGO0b6u6Pp9FPE,5113
82
- holobench-1.19.0.dist-info/RECORD,,
90
+ bencher/variables/time.py,sha256=A1QPYM-z2p-04hKcHG80u8njiKQ-2R2IHcjo7iB92_A,3136
91
+ resource/bencher,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
+ holobench-1.30.0.dist-info/METADATA,sha256=VkQCIKt8Zb47-w0TQse1h2rDPoh517wql4n6KHGxG2s,6364
93
+ holobench-1.30.0.dist-info/WHEEL,sha256=fl6v0VwpzfGBVsGtkAkhILUlJxROXbA3HvRL6Fe3140,105
94
+ holobench-1.30.0.dist-info/licenses/LICENSE,sha256=dSHXTdRY4Y7qGFMv63UksV700iff7iE-p7GGs6Sbnvo,1065
95
+ holobench-1.30.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: flit 3.9.0
2
+ Generator: hatchling 1.25.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
@@ -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