Skip to content

Commit 80d8a1f

Browse files
Some optimization of grid graph creation and features
1 parent 4ab95d8 commit 80d8a1f

6 files changed

Lines changed: 283 additions & 39 deletions

File tree

development/graph/_grid_affinity_compatibility.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ def bioimage_cpp_local(affinities: np.ndarray, offsets: list[tuple[int, ...]]):
104104
import bioimage_cpp as bic
105105

106106
graph = bic.graph.grid_graph(affinities.shape[1:])
107+
return bioimage_cpp_local_on_graph(graph, affinities, offsets)
108+
109+
110+
def bioimage_cpp_local_on_graph(graph, affinities: np.ndarray, offsets: list[tuple[int, ...]]):
111+
import bioimage_cpp as bic
112+
107113
weights, valid_edges = bic.graph.grid_affinity_features(graph, affinities, offsets)
108114
if not np.all(valid_edges):
109115
raise AssertionError("local offsets did not cover all grid edges")
@@ -114,6 +120,12 @@ def bioimage_cpp_lifted(affinities: np.ndarray, offsets: list[tuple[int, ...]]):
114120
import bioimage_cpp as bic
115121

116122
graph = bic.graph.grid_graph(affinities.shape[1:])
123+
return bioimage_cpp_lifted_on_graph(graph, affinities, offsets)
124+
125+
126+
def bioimage_cpp_lifted_on_graph(graph, affinities: np.ndarray, offsets: list[tuple[int, ...]]):
127+
import bioimage_cpp as bic
128+
117129
local_weights, valid_edges, lifted_uvs, lifted_weights, _ = (
118130
bic.graph.grid_affinity_features_with_lifted(graph, affinities, offsets)
119131
)
@@ -126,6 +138,10 @@ def nifty_local(affinities: np.ndarray, offsets: list[tuple[int, ...]]):
126138
import nifty.graph as ng
127139

128140
graph = ng.undirectedGridGraph(list(affinities.shape[1:]))
141+
return nifty_local_on_graph(graph, affinities, offsets)
142+
143+
144+
def nifty_local_on_graph(graph, affinities: np.ndarray, offsets: list[tuple[int, ...]]):
129145
n_edges, uvs, weights = graph.affinitiesToEdgeMapWithOffsets(
130146
affinities,
131147
[list(offset) for offset in offsets],
@@ -137,6 +153,10 @@ def affogato_edges(affinities: np.ndarray, offsets: list[tuple[int, ...]]):
137153
from affogato.segmentation import MWSGridGraph
138154

139155
graph = MWSGridGraph(list(affinities.shape[1:]))
156+
return affogato_edges_on_graph(graph, affinities, offsets)
157+
158+
159+
def affogato_edges_on_graph(graph, affinities: np.ndarray, offsets: list[tuple[int, ...]]):
140160
uvs, weights = graph.compute_nh_and_weights(
141161
affinities,
142162
[list(offset) for offset in offsets],

development/graph/check_grid_affinity_edges.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,22 @@
55
from _grid_affinity_compatibility import (
66
add_common_arguments,
77
affogato_edges,
8+
affogato_edges_on_graph,
89
bioimage_cpp_local,
10+
bioimage_cpp_local_on_graph,
911
compare_edge_sets,
1012
load_problem,
1113
nifty_local,
14+
nifty_local_on_graph,
1215
prepare_2d_problem,
1316
prepare_3d_problem,
1417
print_timing,
1518
select_local_offsets,
1619
time_call,
1720
)
1821

22+
import numpy as np
23+
1924

2025
def run_check(args: argparse.Namespace) -> None:
2126
affinities, offsets = load_problem(args.data_prefix)
@@ -39,6 +44,27 @@ def run_check(args: argparse.Namespace) -> None:
3944
lambda: affogato_edges(affinities, offsets), args.repeats
4045
)
4146

47+
import bioimage_cpp as bic
48+
import nifty.graph as ng
49+
from affogato.segmentation import MWSGridGraph
50+
51+
bic_graph = bic.graph.grid_graph(affinities.shape[1:])
52+
bic_affinities = np.ascontiguousarray(affinities, dtype=np.float64)
53+
nifty_graph = ng.undirectedGridGraph(list(affinities.shape[1:]))
54+
affogato_graph = MWSGridGraph(list(affinities.shape[1:]))
55+
bic_feature_timings, _ = time_call(
56+
lambda: bioimage_cpp_local_on_graph(bic_graph, bic_affinities, offsets),
57+
args.repeats,
58+
)
59+
nifty_feature_timings, _ = time_call(
60+
lambda: nifty_local_on_graph(nifty_graph, affinities, offsets),
61+
args.repeats,
62+
)
63+
affogato_feature_timings, _ = time_call(
64+
lambda: affogato_edges_on_graph(affogato_graph, affinities, offsets),
65+
args.repeats,
66+
)
67+
4268
nifty_summary = compare_edge_sets(
4369
"nifty local", bic_uvs, bic_weights, nifty_uvs, nifty_weights
4470
)
@@ -56,8 +82,23 @@ def run_check(args: argparse.Namespace) -> None:
5682
f"affogato edges: {affogato_summary['number_of_edges']}, "
5783
f"max abs weight diff: {affogato_summary['max_abs_weight_diff']:.6g}"
5884
)
59-
print_timing("local edges", "bioimage-cpp", bic_timings, "nifty", nifty_timings)
60-
print_timing("local edges", "bioimage-cpp", bic_timings, "affogato", affogato_timings)
85+
print_timing("local edges total", "bioimage-cpp", bic_timings, "nifty", nifty_timings)
86+
print_timing("local edges total", "bioimage-cpp", bic_timings, "affogato", affogato_timings)
87+
print_timing(
88+
"local edges prebuilt",
89+
"bioimage-cpp",
90+
bic_feature_timings,
91+
"nifty",
92+
nifty_feature_timings,
93+
)
94+
print_timing(
95+
"local edges prebuilt",
96+
"bioimage-cpp",
97+
bic_feature_timings,
98+
"affogato",
99+
affogato_feature_timings,
100+
)
101+
print("prebuilt bioimage-cpp timing excludes float32 -> float64 conversion")
61102

62103

63104
def main() -> None:

development/graph/check_grid_affinity_lifted_edges.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
from _grid_affinity_compatibility import (
66
add_common_arguments,
77
affogato_edges,
8+
affogato_edges_on_graph,
89
bioimage_cpp_lifted,
10+
bioimage_cpp_lifted_on_graph,
911
compare_edge_sets,
1012
load_problem,
1113
prepare_2d_problem,
@@ -16,6 +18,8 @@
1618
time_call,
1719
)
1820

21+
import numpy as np
22+
1923

2024
def run_check(args: argparse.Namespace) -> None:
2125
affinities, offsets = load_problem(args.data_prefix)
@@ -35,6 +39,21 @@ def run_check(args: argparse.Namespace) -> None:
3539
affogato_timings, (affogato_uvs, affogato_weights) = time_call(
3640
lambda: affogato_edges(affinities, offsets), args.repeats
3741
)
42+
43+
import bioimage_cpp as bic
44+
from affogato.segmentation import MWSGridGraph
45+
46+
bic_graph = bic.graph.grid_graph(affinities.shape[1:])
47+
bic_affinities = np.ascontiguousarray(affinities, dtype=np.float64)
48+
affogato_graph = MWSGridGraph(list(affinities.shape[1:]))
49+
bic_feature_timings, _ = time_call(
50+
lambda: bioimage_cpp_lifted_on_graph(bic_graph, bic_affinities, offsets),
51+
args.repeats,
52+
)
53+
affogato_feature_timings, _ = time_call(
54+
lambda: affogato_edges_on_graph(affogato_graph, affinities, offsets),
55+
args.repeats,
56+
)
3857
affogato_local_uvs, affogato_local_weights, affogato_lifted_uvs, affogato_lifted_weights = (
3958
split_affogato_edges(affogato_uvs, affogato_weights, graph)
4059
)
@@ -64,7 +83,21 @@ def run_check(args: argparse.Namespace) -> None:
6483
f"lifted edges: {lifted_summary['number_of_edges']}, "
6584
f"max abs weight diff: {lifted_summary['max_abs_weight_diff']:.6g}"
6685
)
67-
print_timing("local+lifted edges", "bioimage-cpp", bic_timings, "affogato", affogato_timings)
86+
print_timing(
87+
"local+lifted edges total",
88+
"bioimage-cpp",
89+
bic_timings,
90+
"affogato",
91+
affogato_timings,
92+
)
93+
print_timing(
94+
"local+lifted edges prebuilt",
95+
"bioimage-cpp",
96+
bic_feature_timings,
97+
"affogato",
98+
affogato_feature_timings,
99+
)
100+
print("prebuilt bioimage-cpp timing excludes float32 -> float64 conversion")
68101

69102

70103
def main() -> None:

0 commit comments

Comments
 (0)