Source code for rpasdt.gui.toolbar.toolbar_items

from functools import partial
from typing import Dict, Tuple, Union

from PyQt5.QtWidgets import QApplication, QMenu, QStyle

from rpasdt.algorithm.taxonomies import (
    CentralityOptionEnum,
    CommunityOptionEnum,
    NetworkAnalysisOptionEnum,
    SourceDetectionAlgorithm,
)
from rpasdt.common.enums import StringChoiceEnum
from rpasdt.common.utils import format_label
from rpasdt.gui.utils import create_action


def _get_toolbar_choices(enum: StringChoiceEnum):
    return {
        f"{enum.__class__.__name__}_{enum.name}": (format_label(enum.value), enum.label)
        for enum in enum
    }


# TODO Link Prediction
ANALYSIS_HANDLER_PREFIX = "handler_analysis_"
CENTRALITY_OPTIONS = _get_toolbar_choices(CentralityOptionEnum)
COMMUNITY_OPTIONS = _get_toolbar_choices(CommunityOptionEnum)

NETWORK_OPTIONS = {
    "bridge": ("Bridges", "Generate all bridges in a graph."),
    "cycle": (
        "Simple cycles",
        "Find simple cycles (elementary circuits) of a directed graph.",
    ),
    "degree_assortativity": (
        "Degree assortativity",
        "Compute degree assortativity of graph.",
    ),
    "average_neighbor_degree": (
        "Average neighbor degree",
        "Returns the average degree of the neighborhood of each node.",
    ),
    "k_nearest_neighbors": (
        "K-nearest neighbors",
        "Compute the average degree connectivity of graph.",
    ),
    "average_clustering": (
        "Average clustering",
        "Compute the average clustering coefficient.",
    ),
}

NETWORK_OPTIONS = _get_toolbar_choices(NetworkAnalysisOptionEnum)


def _create_actions(
    definition_map: Union[Dict, Tuple],
    handler: "GraphController",
    method_prefix="handler",
    parent=None,
):
    return [
        create_action(
            title=title,
            tooltip=tooltip,
            handler=getattr(handler, f"{method_prefix}{method_name}", None),
            parent=parent,
        )
        for method_name, (title, tooltip) in definition_map.items()
    ]


def _create_menu(
    title: str, definition_map: Union[Dict, Tuple], handler, method_prefix, parent
):
    menu = QMenu(title, parent)
    menu.addActions(_create_actions(definition_map, handler, method_prefix, parent))
    menu.setTitle(title)
    return menu


[docs]def create_analysis_action(parent, handler): action = create_action( title="Analysis", tooltip="Network analysis tools", icon=QApplication.style().standardIcon(QStyle.SP_ComputerIcon), parent=parent, ) menu = QMenu("Analysis", parent=parent) action.setMenu(menu) # centralities menu.addMenu( _create_menu( title="Centrality analysis", definition_map=CENTRALITY_OPTIONS, handler=handler, method_prefix=ANALYSIS_HANDLER_PREFIX, parent=parent, ) ) menu.addSeparator() menu.addMenu( _create_menu( title="Community analysis", definition_map=COMMUNITY_OPTIONS, handler=handler, method_prefix=ANALYSIS_HANDLER_PREFIX, parent=parent, ) ) menu.addSeparator() menu.addMenu( _create_menu( title="Network analysis", definition_map=NETWORK_OPTIONS, handler=handler, method_prefix=ANALYSIS_HANDLER_PREFIX, parent=parent, ) ) menu.addSeparator() return action
[docs]def create_diffusion_action(parent, handler): action = create_action( title="Diffusion", tooltip="Simulate rumour diffusion in the network", icon=QApplication.style().standardIcon(QStyle.SP_MediaVolume), parent=parent, handler=handler.handler_create_diffusion, ) return action
[docs]def create_edit_diffusion_action(parent, handler): action = create_action( title="Edit diffusion", tooltip="Edit diffusion model parameters", icon=QApplication.style().standardIcon(QStyle.SP_MediaVolume), parent=parent, handler=handler.handler_edit_diffusion, ) return action
[docs]def create_source_detection_action(parent, handler): action = create_action( title="Source detection", tooltip="Source detection algorithms", icon=QApplication.style().standardIcon(QStyle.SP_DialogHelpButton), parent=parent, ) menu = QMenu("Source detection", parent=parent) action.setMenu(menu) for alg in SourceDetectionAlgorithm: title = " ".join(alg.value.split("_")).title() menu.addAction( create_action( title=title, tooltip=title, icon=QApplication.style().standardIcon(QStyle.SP_TrashIcon), parent=parent, handler=partial(handler.handler_configure_source_detection, alg), ) ) return action
[docs]def create_diffusion_plots_action(parent, controller): action = create_action( title="Plots", tooltip="Diffusion specific plots", icon=QApplication.style().standardIcon(QStyle.SP_DirIcon), parent=parent, ) menu = QMenu("Plots", parent=parent) action.setMenu(menu) plots = { "Trends": controller.handler_plot_diffusion_trend, "Prevalence": controller.handler_plot_diffusion_prevalence, } for title, handler in plots.items(): menu.addAction( create_action( title=title, tooltip=title, parent=parent, handler=handler, ) ) return action
[docs]def create_source_selection_action(parent, handler): action = create_action( title="Source selection", tooltip="Source selection", icon=QApplication.style().standardIcon(QStyle.SP_DialogNoButton), parent=parent, ) menu = QMenu("Source selection", parent=parent) action.setMenu(menu) # centralities menu.addAction( create_action( title="Clear", tooltip="Clear all sources", icon=QApplication.style().standardIcon(QStyle.SP_TrashIcon), parent=parent, handler=handler.handler_clear_sources, ) ) menu.addAction( create_action( title="Select", tooltip="Select sources automatically", icon=QApplication.style().standardIcon(QStyle.SP_DialogOkButton), parent=parent, handler=handler.handler_select_sources, ) ) return action
[docs]def create_diffusion_simulation_actions(parent, controller: "DiffusionGraphController"): return [ create_action( title="Clear", tooltip="Clear simulation", icon=QApplication.style().standardIcon(QStyle.SP_MediaStop), parent=parent, handler=controller.diffusion_clear_handler, ), create_action( title="Play", tooltip="Execute single iteration", icon=QApplication.style().standardIcon(QStyle.SP_MediaPlay), handler=controller.diffusion_execute_iteration_handler, parent=parent, ), create_action( title="Execute batch iterations", tooltip="Run simulation in batch mode", icon=QApplication.style().standardIcon(QStyle.SP_MediaSeekForward), handler=controller.diffusion_execute_iteration_bunch_handler, parent=parent, ), create_action( title="Execute simulation", tooltip="Perform the whole simulation process (All nodes infected)", icon=QApplication.style().standardIcon(QStyle.SP_MediaSkipForward), handler=controller.diffusion_execute_iteration_handler, parent=parent, ), ]
[docs]def create_edit_graph_config_action(parent, handler): return create_action( parent=parent, title="Edit graph config", tooltip="Edit graph config", handler=handler.handler_edit_graph_config, icon=QApplication.style().standardIcon(QStyle.SP_FileIcon), )
[docs]def create_export_experiment_action(parent, handler): return create_action( parent=parent, title="Export experiment", tooltip="Export experiment", handler=handler.handler_export_experiment, icon=QApplication.style().standardIcon(QStyle.SP_DriveFDIcon), )