diff --git a/pm4py/algo/conformance/declare/variants/classic.py b/pm4py/algo/conformance/declare/variants/classic.py index d74d5d98b..332d3c715 100644 --- a/pm4py/algo/conformance/declare/variants/classic.py +++ b/pm4py/algo/conformance/declare/variants/classic.py @@ -301,7 +301,7 @@ def apply_list(projected_log: List[List[str]], model: Dict[str, Dict[Any, Dict[s __check_non_coexistence(trace, model, ret, parameters) ret["no_dev_total"] = len(ret["deviations"]) - ret["dev_fitness"] = 1 - ret["no_dev_total"] / ret["no_constr_total"] + ret["dev_fitness"] = 1.0 - ret["no_dev_total"] / ret["no_constr_total"] if ret["no_constr_total"] > 0 else 1.0 ret["is_fit"] = ret["no_dev_total"] == 0 conf_cases.append(ret) diff --git a/pm4py/algo/discovery/declare/variants/classic.py b/pm4py/algo/discovery/declare/variants/classic.py index 6c25f7e2c..de82072a7 100644 --- a/pm4py/algo/discovery/declare/variants/classic.py +++ b/pm4py/algo/discovery/declare/variants/classic.py @@ -577,19 +577,20 @@ def get_rules_from_rules_df(rules_df, parameters: Optional[Dict[Any, Any]] = Non min_support_ratio = float(supp) / float(len(rules_df)) * auto_selection_multiplier min_confidence_ratio = float(len(col[col == 1])) / float(supp) * auto_selection_multiplier - for col_name in rules_df: - col = rules_df[col_name] - supp = len(col[col != 0]) + if rules_df is not None and len(rules_df) > 0: + for col_name in rules_df: + col = rules_df[col_name] + supp = len(col[col != 0]) - if supp > len(rules_df) * min_support_ratio: - conf = len(col[col == 1]) + if supp > len(rules_df) * min_support_ratio: + conf = len(col[col == 1]) - if conf > supp * min_confidence_ratio: - rule, key = __col_to_dict_rule(col_name) - if rule not in rules: - rules[rule] = {} + if conf > supp * min_confidence_ratio: + rule, key = __col_to_dict_rule(col_name) + if rule not in rules: + rules[rule] = {} - rules[rule][key] = {"support": supp, "confidence": conf} + rules[rule][key] = {"support": supp, "confidence": conf} return rules diff --git a/pm4py/algo/discovery/log_skeleton/variants/classic.py b/pm4py/algo/discovery/log_skeleton/variants/classic.py index dcaa298ac..0dbc3f690 100644 --- a/pm4py/algo/discovery/log_skeleton/variants/classic.py +++ b/pm4py/algo/discovery/log_skeleton/variants/classic.py @@ -108,7 +108,10 @@ def always_after(logs_traces, all_activs, noise_threshold=0): for k in rs: rs[k] = rs[k] * logs_traces[trace] ret0 += rs - ret = set(x for x, y in ret0.items() if y >= all_activs[x[0]] * (1.0 - noise_threshold)) + first_count = Counter() + for x, y in ret0.items(): + first_count[x[0]] += y + ret = set(x for x, y in ret0.items() if y >= first_count[x[0]] * (1.0 - noise_threshold)) return ret @@ -136,7 +139,10 @@ def always_before(logs_traces, all_activs, noise_threshold=0): for k in rs: rs[k] = rs[k] * logs_traces[trace] ret0 += rs - ret = set(x for x, y in ret0.items() if y >= all_activs[x[0]] * (1.0 - noise_threshold)) + first_count = Counter() + for x, y in ret0.items(): + first_count[x[0]] += y + ret = set(x for x, y in ret0.items() if y >= first_count[x[0]] * (1.0 - noise_threshold)) return ret diff --git a/pm4py/algo/transformation/log_to_trie/algorithm.py b/pm4py/algo/transformation/log_to_trie/algorithm.py index 8fd3ce64c..bdeab0520 100644 --- a/pm4py/algo/transformation/log_to_trie/algorithm.py +++ b/pm4py/algo/transformation/log_to_trie/algorithm.py @@ -51,11 +51,10 @@ def apply(log: Union[EventLog, pd.DataFrame], parameters: Optional[Dict[Union[st trie = c match = True break - if match: - continue - node = Trie(label=activity, parent=trie, depth=trie.depth + 1) - trie.children.append(node) - trie = node + if not match: + node = Trie(label=activity, parent=trie, depth=trie.depth + 1) + trie.children.append(node) + trie = node if i == len(variant) - 1: trie.final = True return root