holobench 1.34.0__tar.gz → 1.35.0__tar.gz
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.
- {holobench-1.34.0 → holobench-1.35.0}/PKG-INFO +1 -1
- {holobench-1.34.0 → holobench-1.35.0}/bencher/__init__.py +7 -3
- {holobench-1.34.0 → holobench-1.35.0}/bencher/bencher.py +4 -1
- holobench-1.35.0/bencher/example/inputs_0D/example_0D.py +34 -0
- holobench-1.35.0/bencher/example/inputs_1D/example_1D.py +53 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/plotting/plot_filter.py +16 -5
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/bench_result.py +3 -1
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/bench_result_base.py +18 -5
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/holoview_result.py +20 -8
- holobench-1.35.0/bencher/results/hvplot_result.py +54 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/variables/parametrised_sweep.py +6 -1
- {holobench-1.34.0 → holobench-1.35.0}/pyproject.toml +2 -2
- {holobench-1.34.0 → holobench-1.35.0}/.gitignore +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/LICENSE +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/README.md +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/bench_cfg.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/bench_plot_server.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/bench_report.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/bench_runner.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/caching.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/class_enum.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/__init__.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/benchmark_data.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_all.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_categorical.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_composable_container.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_composable_container2.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_consts.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_custom_sweep.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_custom_sweep2.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_dataframe.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_docs.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_filepath.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_float3D.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_float_cat.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_floats.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_floats2D.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_holosweep.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_holosweep_objects.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_holosweep_tap.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_image.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_image1.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_levels.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_levels2.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_pareto.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_publish.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_rerun.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_rerun2.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_sample_cache.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_sample_cache_context.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_simple.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_simple_bool.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_simple_cat.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_simple_float.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_simple_float2d.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_strings.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_time_event.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_video.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/example_workflow.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_bokeh_plotly.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_hover_ex.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_hvplot_explorer.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_interactive.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_streamnd.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_streams.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_template.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_updates.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_vector.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/meta/example_meta.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/meta/example_meta_cat.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/meta/example_meta_float.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/meta/example_meta_levels.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/optuna/example_optuna.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/shelved/example_float2D_scatter.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/shelved/example_float3D_cone.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/example/shelved/example_kwargs.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/flask_server.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/job.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/optuna_conversions.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/plotting/__init__.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/plotting/plt_cnt_cfg.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/__init__.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/composable_container/__init__.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/composable_container/composable_container_base.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/composable_container/composable_container_dataframe.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/composable_container/composable_container_panel.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/composable_container/composable_container_video.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/dataset_result.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/float_formatter.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/optuna_result.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/panel_result.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/plotly_result.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/video_result.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/results/video_summary.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/utils.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/utils_rerun.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/variables/__init__.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/variables/inputs.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/variables/results.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/variables/sweep_base.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/variables/time.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/video_writer.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/bencher/worker_job.py +0 -0
- {holobench-1.34.0 → holobench-1.35.0}/resource/bencher +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: holobench
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.35.0
|
4
4
|
Summary: A package for benchmarking the performance of arbitrary functions
|
5
5
|
Project-URL: Repository, https://github.com/dyson-ai/bencher
|
6
6
|
Project-URL: Home, https://github.com/dyson-ai/bencher
|
@@ -56,7 +56,13 @@ from .utils import (
|
|
56
56
|
publish_file,
|
57
57
|
github_content,
|
58
58
|
)
|
59
|
-
|
59
|
+
|
60
|
+
try:
|
61
|
+
from .utils_rerun import publish_and_view_rrd, rrd_to_pane, capture_rerun_window
|
62
|
+
from .flask_server import run_flask_in_thread
|
63
|
+
except ModuleNotFoundError as e:
|
64
|
+
pass
|
65
|
+
|
60
66
|
|
61
67
|
from .plotting.plot_filter import VarRange, PlotFilter
|
62
68
|
from .variables.parametrised_sweep import ParametrizedSweep
|
@@ -68,5 +74,3 @@ from .bench_report import BenchReport, GithubPagesCfg
|
|
68
74
|
from .job import Executors
|
69
75
|
from .video_writer import VideoWriter, add_image
|
70
76
|
from .class_enum import ClassEnum, ExampleEnum
|
71
|
-
|
72
|
-
from .flask_server import run_flask_in_thread
|
@@ -371,7 +371,7 @@ class Bench(BenchPlotServer):
|
|
371
371
|
title += "s"
|
372
372
|
title += ": " + ", ".join([f"{c[0].name}={c[1]}" for c in const_vars_in])
|
373
373
|
else:
|
374
|
-
|
374
|
+
title = " ".join([i.name for i in result_vars_in])
|
375
375
|
|
376
376
|
if run_cfg.level > 0:
|
377
377
|
inputs = []
|
@@ -871,6 +871,9 @@ class Bench(BenchPlotServer):
|
|
871
871
|
def get_result(self, index: int = -1) -> BenchResult:
|
872
872
|
return self.results[index]
|
873
873
|
|
874
|
+
def get_ds(self, index: int = -1) -> xr.Dataset:
|
875
|
+
return self.get_result(index).to_xarray()
|
876
|
+
|
874
877
|
def publish(self, remote_callback: Callable) -> str:
|
875
878
|
branch_name = f"{self.bench_name}_{self.run_cfg.run_tag}"
|
876
879
|
return self.report.publish(remote_callback, branch_name=branch_name)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
"""This file has some examples for how to perform basic benchmarking parameter sweeps"""
|
2
|
+
|
3
|
+
import bencher as bch
|
4
|
+
import random
|
5
|
+
|
6
|
+
|
7
|
+
class SimpleFloat0D(bch.ParametrizedSweep):
|
8
|
+
"""This class has 0 input dimensions and 1 output dimensions. It samples from a gaussian distribution"""
|
9
|
+
|
10
|
+
# This defines a variable that we want to plot
|
11
|
+
output = bch.ResultVar(units="ul", doc="a sample from a gaussian distribution")
|
12
|
+
|
13
|
+
def __call__(self, **kwargs) -> dict:
|
14
|
+
"""Generate a sample from a uniform distribution
|
15
|
+
|
16
|
+
Returns:
|
17
|
+
dict: a dictionary with all the result variables in the ParametrisedSweep class as named key value pairs.
|
18
|
+
"""
|
19
|
+
|
20
|
+
self.output = random.gauss(mu=0.0, sigma=1.0)
|
21
|
+
return super().__call__(**kwargs)
|
22
|
+
|
23
|
+
|
24
|
+
def example_0D(run_cfg: bch.BenchRunCfg = None, report: bch.BenchReport = None) -> bch.Bench:
|
25
|
+
"""This example shows how to sample a 1 dimensional float variable and plot the result of passing that parameter sweep to the benchmarking function"""
|
26
|
+
|
27
|
+
bench = SimpleFloat0D().to_bench(run_cfg, report)
|
28
|
+
bench.plot_sweep()
|
29
|
+
return bench
|
30
|
+
|
31
|
+
|
32
|
+
if __name__ == "__main__":
|
33
|
+
run_config = bch.BenchRunCfg(repeats=100)
|
34
|
+
example_0D(run_config).report.show()
|
@@ -0,0 +1,53 @@
|
|
1
|
+
"""This file has some examples for how to perform basic benchmarking parameter sweeps"""
|
2
|
+
|
3
|
+
import bencher as bch
|
4
|
+
|
5
|
+
|
6
|
+
class DataSource:
|
7
|
+
def __init__(self):
|
8
|
+
self.data = [
|
9
|
+
[0, 0, 0, 0],
|
10
|
+
[1, 1, 1, 1],
|
11
|
+
[1, 1, 1, 1],
|
12
|
+
[2, 1, 1, 0],
|
13
|
+
[2, 2, 0, 0],
|
14
|
+
[2, 2, 1, 1],
|
15
|
+
]
|
16
|
+
|
17
|
+
def call(self, index, repeat):
|
18
|
+
return self.data[index][repeat - 1]
|
19
|
+
|
20
|
+
|
21
|
+
class Example1D(bch.ParametrizedSweep):
|
22
|
+
index = bch.IntSweep(default=0, bounds=[0, 5], doc="Input angle", units="rad", samples=30)
|
23
|
+
output = bch.ResultVar(units="v", doc="sin of theta")
|
24
|
+
|
25
|
+
def __call__(self, **kwargs):
|
26
|
+
self.update_params_from_kwargs(**kwargs)
|
27
|
+
self.output = DataSource().call(self.index, kwargs["repeat"])
|
28
|
+
return super().__call__(**kwargs)
|
29
|
+
|
30
|
+
|
31
|
+
def example_1D_float_repeats(
|
32
|
+
run_cfg: bch.BenchRunCfg = None, report: bch.BenchReport = None
|
33
|
+
) -> bch.Bench:
|
34
|
+
"""This example shows how to sample a 1 dimensional float variable and plot the result of passing that parameter sweep to the benchmarking function"""
|
35
|
+
|
36
|
+
bench = Example1D().to_bench(run_cfg, report)
|
37
|
+
# bench.plot_sweep(pass_repeat=True,plot_callbacks=False)
|
38
|
+
|
39
|
+
# res = bench.get_result()
|
40
|
+
bench.run_cfg = bch.BenchRunCfg(repeats=4)
|
41
|
+
bench.plot_sweep(pass_repeat=True)
|
42
|
+
|
43
|
+
res = bench.get_result()
|
44
|
+
bench.report.append(res.to_auto())
|
45
|
+
bench.report.append(res.to_scatter())
|
46
|
+
bench.report.append(res.to_scatter_jitter(override=True))
|
47
|
+
|
48
|
+
# bench.report.append()
|
49
|
+
return bench
|
50
|
+
|
51
|
+
|
52
|
+
if __name__ == "__main__":
|
53
|
+
example_1D_float_repeats().report.show()
|
@@ -64,16 +64,24 @@ class PlotFilter:
|
|
64
64
|
repeats_range: VarRange = VarRange(1, None)
|
65
65
|
input_range: VarRange = VarRange(1, None)
|
66
66
|
|
67
|
-
def matches_result(
|
67
|
+
def matches_result(
|
68
|
+
self, plt_cnt_cfg: PltCntCfg, plot_name: str, override: bool = False
|
69
|
+
) -> PlotMatchesResult:
|
68
70
|
"""Checks if the result data signature matches the type of data the plot is able to display."""
|
69
|
-
return PlotMatchesResult(self, plt_cnt_cfg, plot_name)
|
71
|
+
return PlotMatchesResult(self, plt_cnt_cfg, plot_name, override)
|
70
72
|
|
71
73
|
|
72
74
|
# @dataclass
|
73
75
|
class PlotMatchesResult:
|
74
76
|
"""Stores information about which properties match the requirements of a particular plotter"""
|
75
77
|
|
76
|
-
def __init__(
|
78
|
+
def __init__(
|
79
|
+
self,
|
80
|
+
plot_filter: PlotFilter,
|
81
|
+
plt_cnt_cfg: PltCntCfg,
|
82
|
+
plot_name: str,
|
83
|
+
override: bool = False,
|
84
|
+
):
|
77
85
|
match_info = []
|
78
86
|
matches = []
|
79
87
|
|
@@ -92,8 +100,11 @@ class PlotMatchesResult:
|
|
92
100
|
matches.append(match)
|
93
101
|
if not match:
|
94
102
|
match_info.append(info)
|
95
|
-
|
96
|
-
|
103
|
+
if override:
|
104
|
+
match_info.append(f"override: {override}")
|
105
|
+
self.overall = True
|
106
|
+
else:
|
107
|
+
self.overall = all(matches)
|
97
108
|
|
98
109
|
match_info.insert(0, f"plot {plot_name} matches: {self.overall}")
|
99
110
|
self.matches_info = "\n".join(match_info).strip()
|
@@ -7,11 +7,12 @@ from bencher.results.video_summary import VideoSummaryResult
|
|
7
7
|
from bencher.results.panel_result import PanelResult
|
8
8
|
from bencher.results.plotly_result import PlotlyResult
|
9
9
|
from bencher.results.holoview_result import HoloviewResult
|
10
|
+
from bencher.results.hvplot_result import HvplotResult
|
10
11
|
from bencher.results.dataset_result import DataSetResult
|
11
12
|
from bencher.utils import listify
|
12
13
|
|
13
14
|
|
14
|
-
class BenchResult(PlotlyResult, HoloviewResult, VideoSummaryResult, DataSetResult):
|
15
|
+
class BenchResult(PlotlyResult, HoloviewResult, HvplotResult, VideoSummaryResult, DataSetResult): # noqa pylint: disable=too-many-ancestors
|
15
16
|
"""Contains the results of the benchmark and has methods to cast the results to various datatypes and graphical representations"""
|
16
17
|
|
17
18
|
def __init__(self, bench_cfg) -> None:
|
@@ -28,6 +29,7 @@ class BenchResult(PlotlyResult, HoloviewResult, VideoSummaryResult, DataSetResul
|
|
28
29
|
HoloviewResult.to_curve,
|
29
30
|
HoloviewResult.to_line,
|
30
31
|
HoloviewResult.to_heatmap,
|
32
|
+
HvplotResult.to_histogram,
|
31
33
|
PlotlyResult.to_volume,
|
32
34
|
# PanelResult.to_video,
|
33
35
|
PanelResult.to_panes,
|
@@ -21,7 +21,9 @@ from bencher.utils import listify
|
|
21
21
|
|
22
22
|
from bencher.variables.results import ResultReference, ResultDataSet
|
23
23
|
|
24
|
-
from bencher.results.composable_container.composable_container_panel import
|
24
|
+
from bencher.results.composable_container.composable_container_panel import (
|
25
|
+
ComposableContainerPanel,
|
26
|
+
)
|
25
27
|
|
26
28
|
# todo add plugins
|
27
29
|
# https://gist.github.com/dorneanu/cce1cd6711969d581873a88e0257e312
|
@@ -55,7 +57,10 @@ class BenchResultBase(OptunaResult):
|
|
55
57
|
return self.ds.count()
|
56
58
|
|
57
59
|
def to_hv_dataset(
|
58
|
-
self,
|
60
|
+
self,
|
61
|
+
reduce: ReduceType = ReduceType.AUTO,
|
62
|
+
result_var: ResultVar = None,
|
63
|
+
level: int = None,
|
59
64
|
) -> hv.Dataset:
|
60
65
|
"""Generate a holoviews dataset from the xarray dataset.
|
61
66
|
|
@@ -72,7 +77,10 @@ class BenchResultBase(OptunaResult):
|
|
72
77
|
return hv.Dataset(self.to_dataset(reduce, result_var, level))
|
73
78
|
|
74
79
|
def to_dataset(
|
75
|
-
self,
|
80
|
+
self,
|
81
|
+
reduce: ReduceType = ReduceType.AUTO,
|
82
|
+
result_var: ResultVar = None,
|
83
|
+
level: int = None,
|
76
84
|
) -> xr.Dataset:
|
77
85
|
"""Generate a summarised xarray dataset.
|
78
86
|
|
@@ -331,6 +339,7 @@ class BenchResultBase(OptunaResult):
|
|
331
339
|
result_var: ResultVar = None,
|
332
340
|
result_types=None,
|
333
341
|
pane_collection: pn.pane = None,
|
342
|
+
override=False,
|
334
343
|
**kwargs,
|
335
344
|
):
|
336
345
|
plot_filter = PlotFilter(
|
@@ -342,7 +351,9 @@ class BenchResultBase(OptunaResult):
|
|
342
351
|
repeats_range=repeats_range,
|
343
352
|
input_range=input_range,
|
344
353
|
)
|
345
|
-
matches_res = plot_filter.matches_result(
|
354
|
+
matches_res = plot_filter.matches_result(
|
355
|
+
self.plt_cnt_cfg, callable_name(plot_callback), override
|
356
|
+
)
|
346
357
|
if matches_res.overall:
|
347
358
|
return self.map_plot_panes(
|
348
359
|
plot_callback=plot_callback,
|
@@ -400,7 +411,9 @@ class BenchResultBase(OptunaResult):
|
|
400
411
|
dim_color = color_tuple_to_css(int_to_col(num_dims - 2, 0.05, 1.0))
|
401
412
|
|
402
413
|
outer_container = ComposableContainerPanel(
|
403
|
-
name=" vs ".join(dims),
|
414
|
+
name=" vs ".join(dims),
|
415
|
+
background_col=dim_color,
|
416
|
+
horizontal=not horizontal,
|
404
417
|
)
|
405
418
|
max_len = 0
|
406
419
|
for i in range(dataset.sizes[selected_dim]):
|
@@ -6,6 +6,7 @@ import holoviews as hv
|
|
6
6
|
from param import Parameter
|
7
7
|
from functools import partial
|
8
8
|
import hvplot.xarray # noqa pylint: disable=duplicate-code,unused-import
|
9
|
+
import hvplot.pandas # noqa pylint: disable=duplicate-code,unused-import
|
9
10
|
import xarray as xr
|
10
11
|
|
11
12
|
from bencher.utils import (
|
@@ -86,7 +87,9 @@ class HoloviewResult(PanelResult):
|
|
86
87
|
|
87
88
|
# return time_widget_args
|
88
89
|
|
89
|
-
def to_bar(
|
90
|
+
def to_bar(
|
91
|
+
self, result_var: Parameter = None, override: bool = False, **kwargs
|
92
|
+
) -> Optional[pn.panel]:
|
90
93
|
return self.filter(
|
91
94
|
self.to_bar_ds,
|
92
95
|
float_range=VarRange(0, 0),
|
@@ -97,6 +100,7 @@ class HoloviewResult(PanelResult):
|
|
97
100
|
target_dimension=2,
|
98
101
|
result_var=result_var,
|
99
102
|
result_types=(ResultVar),
|
103
|
+
override=override,
|
100
104
|
**kwargs,
|
101
105
|
)
|
102
106
|
|
@@ -541,17 +545,22 @@ class HoloviewResult(PanelResult):
|
|
541
545
|
def to_scatter_jitter(
|
542
546
|
self,
|
543
547
|
result_var: Parameter = None,
|
548
|
+
override: bool = False,
|
544
549
|
**kwargs, # pylint: disable=unused-argument
|
545
550
|
) -> List[hv.Scatter]:
|
546
|
-
return self.overlay_plots(
|
551
|
+
return self.overlay_plots(
|
552
|
+
partial(self.to_scatter_jitter_single, override=override, **kwargs)
|
553
|
+
)
|
547
554
|
|
548
|
-
def to_scatter_jitter_single(
|
555
|
+
def to_scatter_jitter_single(
|
556
|
+
self, result_var: Parameter, override: bool = True, **kwargs
|
557
|
+
) -> Optional[hv.Scatter]:
|
549
558
|
matches = PlotFilter(
|
550
559
|
float_range=VarRange(0, 0),
|
551
560
|
cat_range=VarRange(0, None),
|
552
561
|
repeats_range=VarRange(2, None),
|
553
562
|
input_range=VarRange(1, None),
|
554
|
-
).matches_result(self.plt_cnt_cfg, "to_scatter_jitter")
|
563
|
+
).matches_result(self.plt_cnt_cfg, "to_scatter_jitter", override)
|
555
564
|
if matches.overall:
|
556
565
|
ds = self.to_hv_dataset(ReduceType.NONE)
|
557
566
|
pt = (
|
@@ -640,9 +649,6 @@ class HoloviewResult(PanelResult):
|
|
640
649
|
|
641
650
|
return hv.DynamicMap(cb, kdims=kdims)
|
642
651
|
|
643
|
-
def to_explorer(self):
|
644
|
-
return self.to_xarray().hvplot.explorer()
|
645
|
-
|
646
652
|
def to_grid(self, inputs=None):
|
647
653
|
if inputs is None:
|
648
654
|
inputs = self.bench_cfg.inputs_as_str()
|
@@ -653,7 +659,13 @@ class HoloviewResult(PanelResult):
|
|
653
659
|
def to_table(self):
|
654
660
|
return self.to(hv.Table, ReduceType.SQUEEZE)
|
655
661
|
|
656
|
-
def
|
662
|
+
def to_tabulator(self, **kwargs):
|
663
|
+
"""Passes the data to the panel Tabulator type to display an interactive table
|
664
|
+
see https://panel.holoviz.org/reference/widgets/Tabulator.html for extra options
|
665
|
+
"""
|
666
|
+
return pn.widgets.Tabulator(self.to_pandas(), **kwargs)
|
667
|
+
|
668
|
+
def to_surface(self, result_var: Parameter = None, **kwargs) -> Optional[pn.pane.Pane]:
|
657
669
|
return self.filter(
|
658
670
|
self.to_surface_ds,
|
659
671
|
float_range=VarRange(2, None),
|
@@ -0,0 +1,54 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
from typing import Optional
|
3
|
+
import panel as pn
|
4
|
+
from param import Parameter
|
5
|
+
import hvplot.xarray # noqa pylint: disable=duplicate-code,unused-import
|
6
|
+
import hvplot.pandas # noqa pylint: disable=duplicate-code,unused-import
|
7
|
+
import xarray as xr
|
8
|
+
|
9
|
+
from bencher.results.panel_result import PanelResult
|
10
|
+
from bencher.results.bench_result_base import ReduceType
|
11
|
+
|
12
|
+
from bencher.plotting.plot_filter import VarRange
|
13
|
+
from bencher.variables.results import ResultVar
|
14
|
+
|
15
|
+
|
16
|
+
class HvplotResult(PanelResult):
|
17
|
+
def to_explorer(self) -> pn.pane.Pane:
|
18
|
+
"""Produces a hvplot explorer instance to explore the generated dataset
|
19
|
+
see: https://hvplot.holoviz.org/getting_started/explorer.html
|
20
|
+
|
21
|
+
Returns:
|
22
|
+
pn.pane.Pane: A dynamic pane for exploring a dataset
|
23
|
+
"""
|
24
|
+
|
25
|
+
if len(self.bench_cfg.input_vars) > 0:
|
26
|
+
return self.to_xarray().hvplot.explorer()
|
27
|
+
|
28
|
+
# For some reason hvplot doesn't like 1D datasets in xarray, so convert to pandas which it has no problem with
|
29
|
+
# TODO look into why this is, its probably due to how I am setting up the indexing in xarray.
|
30
|
+
return self.to_pandas().hvplot.explorer()
|
31
|
+
|
32
|
+
def to_histogram(self, result_var: Parameter = None, **kwargs) -> Optional[pn.pane.Pane]:
|
33
|
+
return self.filter(
|
34
|
+
self.to_histogram_ds,
|
35
|
+
float_range=VarRange(0, 0),
|
36
|
+
cat_range=VarRange(0, None),
|
37
|
+
input_range=VarRange(0, 0),
|
38
|
+
reduce=ReduceType.NONE,
|
39
|
+
target_dimension=2,
|
40
|
+
result_var=result_var,
|
41
|
+
result_types=(ResultVar),
|
42
|
+
**kwargs,
|
43
|
+
)
|
44
|
+
|
45
|
+
def to_histogram_ds(self, dataset: xr.Dataset, result_var: Parameter, **kwargs):
|
46
|
+
return dataset.hvplot(
|
47
|
+
kind="hist",
|
48
|
+
y=[result_var.name],
|
49
|
+
ylabel="count",
|
50
|
+
legend="bottom_right",
|
51
|
+
widget_location="bottom",
|
52
|
+
title=f"{result_var.name} vs Count",
|
53
|
+
**kwargs,
|
54
|
+
)
|
@@ -192,7 +192,12 @@ class ParametrizedSweep(Parameterized):
|
|
192
192
|
)
|
193
193
|
)
|
194
194
|
|
195
|
-
def __call__(self, **kwargs):
|
195
|
+
def __call__(self, **kwargs) -> dict:
|
196
|
+
"""This is the function that is called to record data samples in the benchmarking function. It should be overridden with your custom logic and then call the parent method "return super().__call__(**kwargs)"
|
197
|
+
|
198
|
+
Returns:
|
199
|
+
dict: a dictionary with all the result variables in the ParametrisedSweep class as named key value pairs.
|
200
|
+
"""
|
196
201
|
return self.get_results_values_as_dict()
|
197
202
|
|
198
203
|
def plot_hmap(self, **kwargs):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "holobench"
|
3
|
-
version = "1.
|
3
|
+
version = "1.35.0"
|
4
4
|
|
5
5
|
authors = [{ name = "Austin Gregg-Smith", email = "blooop@gmail.com" }]
|
6
6
|
description = "A package for benchmarking the performance of arbitrary functions"
|
@@ -97,7 +97,7 @@ coverage-report = "coverage report -m"
|
|
97
97
|
update-lock = "pixi update && git commit -a -m'update pixi.lock' || true"
|
98
98
|
push = "git push"
|
99
99
|
update-lock-push = { depends-on = ["update-lock", "push"] }
|
100
|
-
fix = { depends-on = ["update-lock", "format", "ruff-lint"] }
|
100
|
+
fix = { depends-on = ["update-lock", "format", "ruff-lint", "pre-commit"] }
|
101
101
|
fix-commit-push = { depends-on = ["fix", "commit-format", "update-lock-push"] }
|
102
102
|
ci-no-cover = { depends-on = ["style", "test"] }
|
103
103
|
ci = { depends-on = [
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{holobench-1.34.0 → holobench-1.35.0}/bencher/example/experimental/example_hvplot_explorer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|