graph_physarum_transport — GRAPH flow op

• Data kinds: matrix × signal → table

• Call: import fullseye as fs; fs.ledger.graph_physarum_transport(lengths, supply, dt=0.1, max_iters=5000, tol=1e-06, gap_tol=1e-06) (implementation को सीधे call करना हो तो import physarum_search; physarum_search.graph_physarum_transport(lengths, supply, dt=0.1, max_iters=5000, tol=1e-06, gap_tol=1e-06), registry से लेना हो तो opsgraph.get("graph_physarum_transport"))

उपयोग

slime mould की tube dynamics से weighted graph पर L1 optimal transport (Beckmann problem)।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

lengths is a symmetric (n, n) matrix of tube lengths (0 = no tube, diagonal 0) and supply an (n,) vector that sums to 0: mass enters at the nodes with supply > 0 and leaves where it is < 0. The pressures solve the weighted Laplacian with this right-hand side (Kirchhoff), each tube carries Q_e = D_e (p_u - p_v) / L_e and adapts dD_e/dt = |Q_e| - D_e (explicit Euler, step dt). Bonifaci (2017) and Facca, Karrenbauer, Kolev and Mehlhorn (2020) prove that the flow converges to a minimiser of sum_e L_e |q_e| under flow conservation, i.e. to the 1-Wasserstein distance between supply+ and supply- in the graph metric (Facca, Cardin and Putti 2018 for the continuum). With one unit source and one sink this is graph_physarum_path.

Returns cost = sum_e L_e |Q_e| (the transport cost of the current flow: an upper bound on the distance), dual_bound = supply . p' with p' the pressure scaled to be 1-Lipschitz along every tube (Kantorovich–Rubinstein: a lower bound on the distance at any iteration, no external solver needed), gap = cost - dual_bound (0 at the optimum; it closes like tol / dt divided by the smallest non-zero flow, because the scaling is set by the tube whose conductance still lags its flow the most), conductance and flow ((n, n) matrices, flow antisymmetric; the net outflow of every node equals its supply), potential ((n,) pressures, 0 at one node per connected component), iters, converged (max |dD| fell below tol), gap_converged (the run stopped because gap <= gap_tol * cost: the cost is certified within gap_tol of the optimum; when several flows are optimal the conductances keep wandering while the pressures settle, so this is the stop that fires; the gap is checked every 10 iterations), history, cost_history and dual_history ((k, 2): iteration and lower bound at each check).

Raises ValueError: matrix not square / symmetric / finite / non-negative, self-loops, no edge; supply not an (n,) finite numeric vector, all zero, not summing to 0 (relative 1e-9) or unbalanced inside a connected component (mass with nowhere to go); dt outside (0, 1]; max_iters < 1; tol < 0; gap_tol < 0.

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_physarum_transport — py -3.11 examples/poc_physarum_transport.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

graph_edge_consensus · graph_core_persistence · tree_morphometry · tree_sholl · tree_run_length

इसी category के (flow)

graph_physarum_path · physarum_route · physarum_transport_image


*Provenance: physarum_search.py — GRAPH operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.