Skip to content
Snippets Groups Projects
Commit 87d8aa02 authored by Allen, Bruce (CIV)'s avatar Allen, Bruce (CIV)
Browse files

add filter event algorithm

parent 93041fa5
No related branches found
No related tags found
No related merge requests found
File moved
from PySide6.QtCore import QObject, Slot
def _check_threshold(num_matches, equality, threshold):
if equality == ">=":
return num_matches >= threshold
if equality == ">":
return num_matches > threshold
if equality == "<=":
return num_matches <= threshold
if equality == "<":
return num_matches > threshold
if equality == "==":
return num_matches == threshold
if equality == "!=":
return num_matches != threshold
raise RuntimeError("bad")
def _has_relationship(gry_trace, from_event, to_event, equality, threshold):
# find potential nodes
from_node_indexes = set()
to_node_indexes = set()
for node in gry_trace["nodes"]:
if node["label"] == from_event:
from_node_indexes.add(node["id"])
if node["label"] == to_event:
to_node_indexes.add(node["id"])
# find matches
num_matches = 0
for edge in gry_trace["edges"]:
if edge["from_id"] in from_node_indexes \
and edge["from_id"] in from_node_indexes:
num_matches += 1
# check against threshold
return _check_threshold(num_matches, equality, threshold)
def _has_recurrence(gry_trace, event, equality, threshold):
# find number of matches
num_matches = 0
for node in gry_trace["nodes"]:
if node["label"] == event:
num_matches += 1
# check against threshold
return _check_threshold(num_matches, equality, threshold)
def _regenerate_trace_set(graphs, relationship_list, recurrence_list):
matching_indexes = set()
# relationship indexes
for from_event, to_event, equality, threshold in relationship_list:
for i, graph in enumerate(graphs):
if "trace" in graph.gry_graph:
gry_trace = graph.gry_graph["trace"]
if _has_relationship(gry_trace, from_event,
to_event, equality, threshold):
matching_indexes.add(i)
# recurrence indexes
for event, equality, threshold in recurrence_list:
for i, graph in enumerate(graphs):
if "trace" in graph.gry_graph:
gry_trace = gry_graph["trace"]
if _has_recurrence(gry_trace, event, equality, threshold):
matching_indexes.add(i)
# cache value
return matching_indexes
class FilterEventCnditions(QObject):
"""Provides a list of events that match coditions. The list is
cached unless the search changes or new graphs are loaded.
"""
def __init__(self, graphs_manager):
super().__init__()
graphs_manager.signal_graphs_loaded.connect(self._reset_list)
self._trace_set_is_valid = False
self._relationship_list = None
self._recurrence_list = None
self._trace_list = list()
@Slot()
def _reset_list(self):
self._trace_set_is_valid = False
def trace_set(self, relationship_list, recurrence_list):
if not self._trace_set_is_valid \
or relationship_list != self._relationship_list \
or recurrence_list != self._recurrence_list:
# regenerate
self.trace_set = _regenerate_trace_set(
self.graphs_manager.graphs,
self.relationship_list, self.recurrence_list)
return self._trace_list
......@@ -10,7 +10,7 @@ from PySide6.QtWidgets import QCheckBox, QPushButton
from PySide6.QtWidgets import QSizePolicy
from mp_style import mp_menu_button
from graph_list_table_model import SORT_TYPES, TRACE_INDEX_COLUMN
from graph_similarity import removable_traces
from filter_duplicate_traces import removable_traces
import resources_rc
class GraphListSortAndFilter(QObject):
......@@ -87,6 +87,23 @@ class GraphListSortAndFilter(QObject):
self.action_filter_mark.setCheckable(True)
self.action_filter_mark.triggered.connect(self._filter)
# define filter event conditions
self.action_define_event_conditions = QAction(
"Define filter event conditions...")
self.action_define_event_conditions.setStatusTip(
"Define event conditions for finding specific traces")
self.action_define_event_conditions.triggered.connect(
self._show_filter_event_dialog)
# filter on event conditions
self.action_filter_event_conditions = QAction(
"Filter on event conditions")
self.action_filter_event_conditions.setStatusTip(
"Filter out traces that do not match "
"the defined event conditions")
self.action_filter_event_conditions.setCheckable(True)
#zz self.action_filter_event_conditions.triggered.connect(zz)
# filter action drop duplicates
self.action_filter_drop_duplicates = QAction("Hide identical traces")
self.action_filter_drop_duplicates.setStatusTip(
......@@ -94,19 +111,13 @@ class GraphListSortAndFilter(QObject):
self.action_filter_drop_duplicates.setCheckable(True)
self.action_filter_drop_duplicates.triggered.connect(self._filter)
# filter action keep selected events
self.action_filter_keep_selected_event_traces = QAction(
"Find selected events...")
self.action_filter_keep_selected_event_traces.setStatusTip(
"Only show traces that match the event filter")
self.action_filter_keep_selected_event_traces.triggered.connect(
self._show_filter_event_dialog)
# filter menu
self.filter_menu = QMenu()
self.filter_menu.addAction(self.action_filter_mark)
self.filter_menu.addAction(
self.action_filter_keep_selected_event_traces)
self.filter_menu.addSeparator()
self.filter_menu.addAction(self.action_define_event_conditions)
self.filter_menu.addAction(self.action_filter_event_conditions)
self.filter_menu.addSeparator()
self.user_error_filter_menu = QMenu("&User errors")
self.filter_menu.addMenu(self.user_error_filter_menu)
self.user_error_filter_menu.addAction(
......
from PySide6.QtGui import QTextDocument
from version_file import VERSION
from graph_similarity import duplicates
from filter_duplicate_traces import duplicates
def _add_metadata(graphs_manager, lines):
lines.append("MP Gryphon %s"%VERSION)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment