From the post
from numbers import Real
def build_domain(min_d: Real, max_d: Real, N: int): return np.linspace(min_d, max_d, N)
def closest(fx, D: np.ndarray) -> int: return np.argmin(np.abs(fx-D))
def build_graph(min_d: Real, max_d: Real, N: int, fn: Callable[[Real], Real | list[Real] | np.ndarray]) -> nx.Graph:
D = build_domain(min_d, max_d, N)
G = nx.Graph()
for i, x in enumerate(D): G.add_node(i, x=x)
for i, x in enumerate(D):
if i == N-1: break
connected_to = fn(x)
if isinstance(connected_to, (list, np.ndarray)):
for y in connected_to:
if i == y: continue
G.add_edge(i, y)
elif isinstance(connected_to, Real)
if i == y: continue
G.add_edge(i, y)
return G
with this setting