Source code for nodefinder.identify._run

# -*- coding: utf-8 -*-

# © 2017-2019, ETH Zurich, Institut für Theoretische Physik
# Author: Dominik Gresch <greschd@gmx.ch>
"""
Defines the function which runs the identify step.
"""

from fsc.export import export

from ..search.result import ControllerState
from ..search._controller import _DIST_CUTOFF_FACTOR

from .result import IdentificationResult, IdentificationResultContainer
from ._cluster import create_clusters
from ._dimension import calculate_dimension
from ._evaluate import evaluate_cluster
from ._logging import IDENTIFY_LOGGER


[docs]@export def run(result, feature_size=None, evaluate_line_method='ballistic'): """Identify the nodal clusters from a :func:`.search.run` result. Arguments --------- result : SearchResultContainer Result of the search step. feature_size : float, optional Distance between two nodal points at which they are considered distinct. Uses the ``feature_size`` used in the search step by default. """ if feature_size is None: feature_size = result.dist_cutoff * _DIST_CUTOFF_FACTOR if isinstance(result, ControllerState): result = result.result positions = [node.pos for node in result.nodes] coordinate_system = result.coordinate_system return run_from_positions( positions=positions, coordinate_system=coordinate_system, feature_size=feature_size, evaluate_line_method=evaluate_line_method, )
[docs]@export def run_from_positions( positions, *, coordinate_system, feature_size, evaluate_line_method='shortest_path' ): """Identify the nodal clusters from a list of positions. Arguments --------- positions : list(tuple(float)) The list of nodal positions. coordinate_system : CoordinateSystem Coordinate system used to calculate distances. feature_size : float Distance between two nodal points at which they are considered distinct. """ IDENTIFY_LOGGER.debug('Calculating clusters.') clusters = create_clusters( positions, coordinate_system=coordinate_system, feature_size=feature_size ) results = [] for graph in clusters: IDENTIFY_LOGGER.debug('Calculating cluster dimension.') dim = calculate_dimension( graph=graph, coordinate_system=coordinate_system, feature_size=feature_size ) IDENTIFY_LOGGER.debug( 'Evaluating result with dimension {}.'.format(dim) ) res = IdentificationResult( positions=list(graph.nodes), dimension=dim, shape=evaluate_cluster( graph=graph, dim=dim, coordinate_system=coordinate_system, feature_size=feature_size, evaluate_line_method=evaluate_line_method ) ) results.append(res) return IdentificationResultContainer( coordinate_system=coordinate_system, feature_size=feature_size, results=results )