From c9717a99f018a3f03644ccaf5e966208e56bf791 Mon Sep 17 00:00:00 2001 From: Pierre Yger Date: Wed, 18 Mar 2026 11:20:04 +0100 Subject: [PATCH 1/7] Adding the possibility to inject precomputed results in study --- src/spikeinterface/benchmark/benchmark_base.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/spikeinterface/benchmark/benchmark_base.py b/src/spikeinterface/benchmark/benchmark_base.py index a6e4932cb1..221194468e 100644 --- a/src/spikeinterface/benchmark/benchmark_base.py +++ b/src/spikeinterface/benchmark/benchmark_base.py @@ -292,7 +292,7 @@ def remove_cases(self, case_keys): self.remove_benchmark(key) (self.folder / "cases.pickle").write_bytes(pickle.dumps(self.cases)) - def run(self, case_keys=None, keep=True, verbose=False, **job_kwargs): + def run(self, case_keys=None, keep=True, verbose=False, precomputed_results=None, **job_kwargs): if case_keys is None: case_keys = list(self.cases.keys()) @@ -313,13 +313,21 @@ def run(self, case_keys=None, keep=True, verbose=False, **job_kwargs): if verbose: print("### Run benchmark", key, "###") t0 = time.perf_counter() - benchmark.run(**job_kwargs) + if key not in precomputed_results: + benchmark.run(**job_kwargs) + else: + for k, v in precomputed_results[key].items(): + benchmark.result[k] = v t1 = time.perf_counter() self.benchmarks[key] = benchmark bench_folder = self.folder / "results" / self.key_to_str(key) bench_folder.mkdir(exist_ok=True) benchmark.save_run(bench_folder) - benchmark.result["run_time"] = float(t1 - t0) + if key not in precomputed_results: + benchmark.result["run_time"] = float(t1 - t0) + elif "run_time" in precomputed_results[key]: + benchmark.result["run_time"] = precomputed_results[key]["run_time"] + benchmark.save_main(bench_folder) def set_colors(self, colors=None, map_name="tab10", levels_to_group_by=None): From 34bf82cb4a0e58752eec33cbda143cfb3a120629 Mon Sep 17 00:00:00 2001 From: Pierre Yger Date: Mon, 23 Mar 2026 11:51:51 +0100 Subject: [PATCH 2/7] Refactoring --- src/spikeinterface/benchmark/benchmark_base.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/spikeinterface/benchmark/benchmark_base.py b/src/spikeinterface/benchmark/benchmark_base.py index 221194468e..0f7d8a253f 100644 --- a/src/spikeinterface/benchmark/benchmark_base.py +++ b/src/spikeinterface/benchmark/benchmark_base.py @@ -292,6 +292,22 @@ def remove_cases(self, case_keys): self.remove_benchmark(key) (self.folder / "cases.pickle").write_bytes(pickle.dumps(self.cases)) + def set_precomputed_results(self, precomputed_results, verbose=False): + for key in precomputed_results.keys(): + assert key in self.cases, f"Key {key} in precomputed_results is not in cases" + benchmark = self.create_benchmark(key) + if verbose: + print("### Set benchmark", key, "###") + + for k, v in precomputed_results[key].items(): + benchmark.result[k] = v + + self.benchmarks[key] = benchmark + bench_folder = self.folder / "results" / self.key_to_str(key) + bench_folder.mkdir(exist_ok=True) + benchmark.save_run(bench_folder) + benchmark.save_main(bench_folder) + def run(self, case_keys=None, keep=True, verbose=False, precomputed_results=None, **job_kwargs): if case_keys is None: case_keys = list(self.cases.keys()) From b5c26a5280f34a9f749de7be608b165e7462dd0c Mon Sep 17 00:00:00 2001 From: Pierre Yger Date: Mon, 23 Mar 2026 11:53:01 +0100 Subject: [PATCH 3/7] Refactoring --- src/spikeinterface/benchmark/benchmark_base.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/spikeinterface/benchmark/benchmark_base.py b/src/spikeinterface/benchmark/benchmark_base.py index 0f7d8a253f..9b961eeb67 100644 --- a/src/spikeinterface/benchmark/benchmark_base.py +++ b/src/spikeinterface/benchmark/benchmark_base.py @@ -308,7 +308,7 @@ def set_precomputed_results(self, precomputed_results, verbose=False): benchmark.save_run(bench_folder) benchmark.save_main(bench_folder) - def run(self, case_keys=None, keep=True, verbose=False, precomputed_results=None, **job_kwargs): + def run(self, case_keys=None, keep=True, verbose=False, **job_kwargs): if case_keys is None: case_keys = list(self.cases.keys()) @@ -329,21 +329,13 @@ def run(self, case_keys=None, keep=True, verbose=False, precomputed_results=None if verbose: print("### Run benchmark", key, "###") t0 = time.perf_counter() - if key not in precomputed_results: - benchmark.run(**job_kwargs) - else: - for k, v in precomputed_results[key].items(): - benchmark.result[k] = v + benchmark.run(**job_kwargs) t1 = time.perf_counter() self.benchmarks[key] = benchmark bench_folder = self.folder / "results" / self.key_to_str(key) bench_folder.mkdir(exist_ok=True) benchmark.save_run(bench_folder) - if key not in precomputed_results: - benchmark.result["run_time"] = float(t1 - t0) - elif "run_time" in precomputed_results[key]: - benchmark.result["run_time"] = precomputed_results[key]["run_time"] - + benchmark.result["run_time"] = float(t1 - t0) benchmark.save_main(bench_folder) def set_colors(self, colors=None, map_name="tab10", levels_to_group_by=None): From 63f020c1fcad4cbdef66f3f911e3e36ef7bc89c6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 10:53:26 +0000 Subject: [PATCH 4/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spikeinterface/benchmark/benchmark_base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spikeinterface/benchmark/benchmark_base.py b/src/spikeinterface/benchmark/benchmark_base.py index 9b961eeb67..9c8d38be2b 100644 --- a/src/spikeinterface/benchmark/benchmark_base.py +++ b/src/spikeinterface/benchmark/benchmark_base.py @@ -298,10 +298,10 @@ def set_precomputed_results(self, precomputed_results, verbose=False): benchmark = self.create_benchmark(key) if verbose: print("### Set benchmark", key, "###") - + for k, v in precomputed_results[key].items(): benchmark.result[k] = v - + self.benchmarks[key] = benchmark bench_folder = self.folder / "results" / self.key_to_str(key) bench_folder.mkdir(exist_ok=True) From 7d274f43e9d4421546e4ed0f1c6943f54b4377f7 Mon Sep 17 00:00:00 2001 From: Pierre Yger Date: Wed, 25 Mar 2026 15:48:08 +0100 Subject: [PATCH 5/7] Docstrings --- src/spikeinterface/benchmark/benchmark_base.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/spikeinterface/benchmark/benchmark_base.py b/src/spikeinterface/benchmark/benchmark_base.py index 9c8d38be2b..2ffff0169c 100644 --- a/src/spikeinterface/benchmark/benchmark_base.py +++ b/src/spikeinterface/benchmark/benchmark_base.py @@ -293,6 +293,19 @@ def remove_cases(self, case_keys): (self.folder / "cases.pickle").write_bytes(pickle.dumps(self.cases)) def set_precomputed_results(self, precomputed_results, verbose=False): + """Set precomputed results for some cases. This is usefull when you want to compute results outside of the benchmark and + then set them in the benchmark. + + Parameters + ---------- + precomputed_results : dict + A dict with the same keys as cases and values are dict with the results to set for each case. + The keys of the inner dict must be the same as the keys of the benchmark result. + 'run_time' is a special key that will be set to 0.0 if not present in the precomputed results. + verbose : bool, default: False + Whether to print the keys of the precomputed results when setting them. + """ + for key in precomputed_results.keys(): assert key in self.cases, f"Key {key} in precomputed_results is not in cases" benchmark = self.create_benchmark(key) @@ -301,6 +314,10 @@ def set_precomputed_results(self, precomputed_results, verbose=False): for k, v in precomputed_results[key].items(): benchmark.result[k] = v + if 'run_time' not in benchmark.result: + benchmark.result['run_time'] = 0.0 + if verbose: + print(f"Warning: 'run_time' is not in the precomputed results for key {key}, setting it to 0.0") self.benchmarks[key] = benchmark bench_folder = self.folder / "results" / self.key_to_str(key) From 6127705be900761cf99da8f0d77f457a043c1967 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 14:48:45 +0000 Subject: [PATCH 6/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/spikeinterface/benchmark/benchmark_base.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/spikeinterface/benchmark/benchmark_base.py b/src/spikeinterface/benchmark/benchmark_base.py index 2ffff0169c..537952ec10 100644 --- a/src/spikeinterface/benchmark/benchmark_base.py +++ b/src/spikeinterface/benchmark/benchmark_base.py @@ -293,14 +293,14 @@ def remove_cases(self, case_keys): (self.folder / "cases.pickle").write_bytes(pickle.dumps(self.cases)) def set_precomputed_results(self, precomputed_results, verbose=False): - """Set precomputed results for some cases. This is usefull when you want to compute results outside of the benchmark and + """Set precomputed results for some cases. This is usefull when you want to compute results outside of the benchmark and then set them in the benchmark. - + Parameters ---------- precomputed_results : dict - A dict with the same keys as cases and values are dict with the results to set for each case. - The keys of the inner dict must be the same as the keys of the benchmark result. + A dict with the same keys as cases and values are dict with the results to set for each case. + The keys of the inner dict must be the same as the keys of the benchmark result. 'run_time' is a special key that will be set to 0.0 if not present in the precomputed results. verbose : bool, default: False Whether to print the keys of the precomputed results when setting them. @@ -314,8 +314,8 @@ def set_precomputed_results(self, precomputed_results, verbose=False): for k, v in precomputed_results[key].items(): benchmark.result[k] = v - if 'run_time' not in benchmark.result: - benchmark.result['run_time'] = 0.0 + if "run_time" not in benchmark.result: + benchmark.result["run_time"] = 0.0 if verbose: print(f"Warning: 'run_time' is not in the precomputed results for key {key}, setting it to 0.0") From d1b0f9295ba1ca089008fc61fe4f78c6dadd5f6e Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 26 Mar 2026 09:39:30 +0100 Subject: [PATCH 7/7] Apply suggestion from @alejoe91 --- src/spikeinterface/benchmark/benchmark_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spikeinterface/benchmark/benchmark_base.py b/src/spikeinterface/benchmark/benchmark_base.py index 537952ec10..d6a89dab22 100644 --- a/src/spikeinterface/benchmark/benchmark_base.py +++ b/src/spikeinterface/benchmark/benchmark_base.py @@ -293,7 +293,7 @@ def remove_cases(self, case_keys): (self.folder / "cases.pickle").write_bytes(pickle.dumps(self.cases)) def set_precomputed_results(self, precomputed_results, verbose=False): - """Set precomputed results for some cases. This is usefull when you want to compute results outside of the benchmark and + """Set precomputed results for some cases. This is useful when you want to compute results outside of the benchmark and then set them in the benchmark. Parameters