Skip to content

Commit e915c53

Browse files
Add citations to doc strings
1 parent 809f171 commit e915c53

4 files changed

Lines changed: 66 additions & 0 deletions

File tree

src/bioimage_cpp/graph/lifted_multicut/__init__.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,13 @@ def optimize(self, objective: LiftedMulticutObjective) -> np.ndarray:
322322

323323

324324
class LiftedGreedyAdditiveMulticut(LiftedMulticutSolver):
325+
"""Greedy additive edge contraction (GAEC) lifted multicut solver.
326+
327+
Introduced in "An efficient fusion move algorithm for the minimum cost
328+
lifted multicut problem":
329+
https://hci.iwr.uni-heidelberg.de/sites/default/files/publications/files/1939997197/beier_16_efficient.pdf
330+
"""
331+
325332
def __init__(
326333
self,
327334
*,
@@ -362,6 +369,13 @@ def _build_cpp_sub_solver(self):
362369

363370

364371
class LiftedKernighanLinMulticut(LiftedMulticutSolver):
372+
"""Kernighan-Lin lifted multicut solver.
373+
374+
Introduced in "Efficient decomposition of image and mesh graphs by lifted
375+
multicuts":
376+
http://openaccess.thecvf.com/content_iccv_2015/papers/Keuper_Efficient_Decomposition_of_ICCV_2015_paper.pdf
377+
"""
378+
365379
def __init__(
366380
self,
367381
*,
@@ -411,6 +425,10 @@ def _build_cpp_sub_solver(self):
411425
class FusionMoveLiftedMulticut(LiftedMulticutSolver):
412426
"""Fusion-move lifted multicut solver.
413427
428+
Introduced in "An efficient fusion move algorithm for the minimum cost
429+
lifted multicut problem":
430+
https://hci.iwr.uni-heidelberg.de/sites/default/files/publications/files/1939997197/beier_16_efficient.pdf
431+
414432
Iteratively generates proposals via ``proposal_generator`` (which sees the
415433
*base* graph and base edge costs), fuses them with the current best
416434
labeling, and accepts improvements. Each fuse contracts the base graph by

src/bioimage_cpp/graph/multicut/__init__.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,12 @@ def optimize(self, objective: MulticutObjective) -> np.ndarray:
9494

9595

9696
class GreedyAdditiveMulticut(MulticutSolver):
97+
"""Greedy additive edge contraction (GAEC) multicut solver.
98+
99+
Introduced in "Fusion moves for correlation clustering":
100+
http://openaccess.thecvf.com/content_cvpr_2015/papers/Beier_Fusion_Moves_for_2015_CVPR_paper.pdf
101+
"""
102+
97103
def __init__(
98104
self,
99105
*,
@@ -133,6 +139,13 @@ def _build_cpp_sub_solver(self):
133139

134140

135141
class GreedyFixationMulticut(MulticutSolver):
142+
"""Greedy fixation multicut solver.
143+
144+
Introduced in "A Comparative Study of Local Search Algorithms for
145+
Correlation Clustering":
146+
https://link.springer.com/chapter/10.1007/978-3-319-66709-6_9
147+
"""
148+
136149
def __init__(self, *, weight_stop: float = 0.0, node_num_stop: float = -1.0):
137150
self.weight_stop = float(weight_stop)
138151
self.node_num_stop = float(node_num_stop)
@@ -155,6 +168,12 @@ def _build_cpp_sub_solver(self):
155168

156169

157170
class KernighanLinMulticut(MulticutSolver):
171+
"""Kernighan-Lin multicut solver.
172+
173+
Introduced in "An efficient heuristic procedure for partitioning graphs":
174+
http://xilinx.asia/_hdl/4/eda.ee.ucla.edu/EE201A-04Spring/kl.pdf
175+
"""
176+
158177
def __init__(
159178
self,
160179
*,
@@ -289,6 +308,9 @@ def _build_for_thread(self, graph, edge_costs, seed_offset):
289308
class FusionMoveMulticut(MulticutSolver):
290309
"""Fusion-move multicut solver.
291310
311+
Introduced in "Fusion moves for correlation clustering":
312+
http://openaccess.thecvf.com/content_cvpr_2015/papers/Beier_Fusion_Moves_for_2015_CVPR_paper.pdf
313+
292314
Iteratively generates proposals via ``proposal_generator``, fuses them
293315
with the current best labeling, and accepts improvements. The fuse step
294316
solves a contracted multicut subproblem with ``sub_solver``; if omitted,
@@ -396,6 +418,16 @@ def optimize(self, objective: MulticutObjective) -> np.ndarray:
396418

397419

398420
class MulticutDecomposer(MulticutSolver):
421+
"""Decomposition-based multicut solver.
422+
423+
Introduced in "Break and Conquer: Efficient Correlation Clustering for
424+
Image Segmentation":
425+
https://link.springer.com/chapter/10.1007/978-3-642-39140-8_9
426+
427+
Splits the multicut problem into connected components (based on positive
428+
edge costs) and solves each component independently with ``sub_solver``.
429+
"""
430+
399431
def __init__(
400432
self,
401433
sub_solver: MulticutSolver,

src/bioimage_cpp/graph/mutex_watershed.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ def mutex_watershed_clustering(
3939
) -> np.ndarray:
4040
"""Mutex watershed clustering on an undirected graph.
4141
42+
Introduced in "The Mutex Watershed and its Objective: Efficient,
43+
Parameter-Free Image Partitioning":
44+
https://arxiv.org/pdf/1904.12654.pdf
45+
4246
Attractive edges come from ``graph`` (one cost per edge in
4347
``edge_costs``); repulsive long-range edges are supplied separately as
4448
``mutex_uvs`` with weights ``mutex_costs``. All edges are jointly sorted
@@ -113,6 +117,10 @@ def semantic_mutex_watershed_clustering(
113117
) -> tuple[np.ndarray, np.ndarray]:
114118
"""Semantic mutex watershed clustering on an undirected graph.
115119
120+
Introduced in "The Semantic Mutex Watershed for Efficient Bottom-Up
121+
Semantic Instance Segmentation":
122+
https://arxiv.org/pdf/1912.12717.pdf
123+
116124
Extends :func:`mutex_watershed_clustering` with a third group of edges
117125
that attach semantic class labels to clusters. Two clusters carrying
118126
different semantic class labels are forbidden from merging; otherwise

src/bioimage_cpp/segmentation/mutex_watershed.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ def mutex_watershed(
3030
) -> np.ndarray:
3131
"""Run mutex watershed on a 2D or 3D image-derived grid graph.
3232
33+
Introduced in "The Mutex Watershed and its Objective: Efficient,
34+
Parameter-Free Image Partitioning":
35+
https://arxiv.org/pdf/1904.12654.pdf
36+
3337
Parameters
3438
----------
3539
affinities:
@@ -127,6 +131,10 @@ def semantic_mutex_watershed(
127131
) -> tuple[np.ndarray, np.ndarray]:
128132
"""Run semantic mutex watershed on a 2D or 3D image-derived grid graph.
129133
134+
Introduced in "The Semantic Mutex Watershed for Efficient Bottom-Up
135+
Semantic Instance Segmentation":
136+
https://arxiv.org/pdf/1912.12717.pdf
137+
130138
The affinity array stacks three groups of channels along axis 0:
131139
132140
1. ``[0, number_of_attractive_channels)`` — attractive grid edges.

0 commit comments

Comments
 (0)