Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import dijkstra_1_to_n as dk_
from extension import extension_t
from soma import soma_t
from type import array_t, site_h, site_path_h
import itertools as it_
from typing import Callable, Sequence, Tuple
import numpy as np_
def CandidateConnections(
somas: Sequence[soma_t],
influence_map: array_t,
dist_to_closest: array_t,
extensions: Sequence[extension_t],
max_straight_sq_dist: float = np_.inf,
) -> list:
#
candidate_conn_nfo = [] # conn=connection
for soma, extension in it_.product(somas, extensions):
new_candidates = extension.EndPointsForSoma(soma.uid, influence_map)
candidate_conn_nfo.extend(
(ep_idx, soma, extension, end_point)
for ep_idx, end_point in enumerate(new_candidates)
if dist_to_closest[end_point] <= max_straight_sq_dist
)
candidate_conn_nfo.sort(key=lambda elm: dist_to_closest[elm[3]])
return candidate_conn_nfo
def ShortestPathTo(
point: site_h,
costs: array_t,
candidate_points_fct: Callable,
max_straight_sq_dist: float = np_.inf,
) -> Tuple[site_path_h, float]:
#
candidate_points, candidate_indexing = candidate_points_fct(
point, max_straight_sq_dist
)
if candidate_points is None:
return (), np_.inf
costs[point] = 0.0
costs[candidate_indexing] = 0.0
path, length = dk_.DijkstraShortestPath(costs, point, candidate_points)
costs[point] = np_.inf
costs[candidate_indexing] = np_.inf
return path, length