Mentions légales du service

Skip to content
Snippets Groups Projects
connection.py 5 KiB
Newer Older
DEBREUVE Eric's avatar
DEBREUVE Eric committed
# Copyright CNRS/Inria/UNS
# Contributor(s): Eric Debreuve (since 2019), Morgane Nadal (2020)
DEBREUVE Eric's avatar
DEBREUVE Eric committed
#
# eric.debreuve@cnrs.fr
#
# This software is governed by the CeCILL  license under French law and
# abiding by the rules of distribution of free software.  You can  use,
# modify and/ or redistribute the software under the terms of the CeCILL
# license as circulated by CEA, CNRS and INRIA at the following URL
# "http://www.cecill.info".
#
# As a counterpart to the access to the source code and  rights to copy,
# modify and redistribute granted by the license, users are provided only
# with a limited warranty  and the software's author,  the holder of the
# economic rights,  and the successive licensors  have only  limited
# liability.
#
# In this respect, the user's attention is drawn to the risks associated
# with loading,  using,  modifying and/or developing or reproducing the
# software by the user in light of its specific status of free software,
# that may mean  that it is complicated to manipulate,  and  that  also
# therefore means  that it is reserved for developers  and  experienced
# professionals having in-depth computer knowledge. Users are therefore
# encouraged to load and test the software's suitability as regards their
# requirements in conditions enabling the security of their systems and/or
# data to be ensured and,  more generally, to use and operate it in the
# same conditions as regards security.
#
# The fact that you are presently reading this means that you have had
# knowledge of the CeCILL license and that you accept its terms.

import brick.processing.dijkstra_1_to_n as dk_
DEBREUVE Eric's avatar
DEBREUVE Eric committed
from brick.component.glial_cmp import glial_cmp_t
from brick.component.extension import extension_t
from brick.component.soma import soma_t
from brick.general.type import array_t, site_h, site_path_h

import itertools as it_
from typing import Callable, Sequence, Tuple
NADAL Morgane's avatar
NADAL Morgane committed
import matplotlib.pyplot as pl_
import skimage.graph as gr_


def CandidateConnections(
    somas: Sequence[soma_t],
    influence_map: array_t,
    dist_to_closest: array_t,
    extensions: Sequence[extension_t],
DEBREUVE Eric's avatar
DEBREUVE Eric committed
    max_straight_sq_dist: float = np_.inf,
) -> list:
    #
    candidate_conn_nfo = []  # conn=connection

    extensions = filter(lambda ext: ext.is_unconnected, extensions)
    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


DEBREUVE Eric's avatar
DEBREUVE Eric committed
def ShortestPathFromToN(
    point: site_h,
    costs: array_t,
    candidate_points_fct: Callable,
DEBREUVE Eric's avatar
DEBREUVE Eric committed
    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
NADAL Morgane's avatar
NADAL Morgane committed
    # pl_.imshow(costs[10,:,:])
    # pl_.show(block=True)
    # print("\npoint", point, "\ncandidates_soma_contour", candidate_points)

    path, length = dk_.DijkstraShortestPath(costs, point, candidate_points)
    # # Using skimage instead :
    # for idx, candidates in enumerate(candidate_points):
NADAL Morgane's avatar
NADAL Morgane committed
    #     routes, cost = gr_.route_through_array(costs, point, candidates, fully_connected=True, geometric=True)
    #     paths.append((routes, cost))
NADAL Morgane's avatar
NADAL Morgane committed
    # path = tuple(min(paths, key=lambda elm: elm[1]))[0]
    # print("\npath: ", path)
    #
    # elapsed_time = tm_.gmtime(tm_.time() - start_time)
    # print(f"\nElapsed Time={tm_.strftime('%Hh %Mm %Ss', elapsed_time)}")
    #
    # if len(path) != 0:
    #     length = len(path) - 2
    # else:
    #     length = 0

    costs[point] = np_.inf
    costs[candidate_indexing] = np_.inf

    return path, length
DEBREUVE Eric's avatar
DEBREUVE Eric committed


def ValidateConnection(
    glial_cmp: glial_cmp_t, extension: glial_cmp_t, end_point: tuple, dijkstra_path: site_path_h, costs: array_t
DEBREUVE Eric's avatar
DEBREUVE Eric committed
) -> None:
    #
    connection_path = tuple(zip(*dijkstra_path[1:-1]))
    if connection_path.__len__() == 0:
        connection_path = None

    glial_cmp.connection_path[extension.uid] = connection_path
    glial_cmp.extensions.append(extension)
    extension.BackReferenceSoma(glial_cmp)

    # Add the site of the connexion between the extension and the soma, for each soma and for ech extension
    if type(glial_cmp) is soma_t:  # restrain the verification to the soma <-> ext step
NADAL Morgane's avatar
NADAL Morgane committed
    # if isinstance(glial_cmp, soma_t):
NADAL Morgane's avatar
NADAL Morgane committed
        glial_cmp.ext_roots.append(end_point)
DEBREUVE Eric's avatar
DEBREUVE Eric committed
    # TODO: Ideally, these paths should be dilated + put this outside
    # but in ext-ext connections, there must not be dilation around the current ext
    # (current ext plays the role of a soma in soma-ext step)
    if connection_path is not None:
        costs[connection_path] = np_.inf