├── .github └── workflows │ └── codeql-analysis.yml ├── .gitignore ├── CHANGELOG.md ├── Dockerfile ├── LICENSE ├── MANIFEST.in ├── README.md ├── docs ├── .buildinfo ├── .nojekyll ├── HOWTO.txt ├── LICENSE_HEADER_GITHUB.txt ├── Makefile ├── README.md ├── header_script.py ├── make.bat └── source │ ├── .gitignore │ ├── _static │ └── css │ │ └── custom.css │ ├── api.rst │ ├── conf.py │ ├── examples.rst │ ├── getting_started.rst │ ├── index.rst │ ├── install.rst │ ├── modules.rst │ ├── pm4py-logo.png │ └── release_notes.rst ├── examples ├── CHECK_MISSING.py ├── activities_to_alphabet.py ├── activity_position.py ├── align_approx_pt.py ├── align_decomposition_ex_paper.py ├── align_decomposition_example.py ├── alignment_discounted_a_star.py ├── alignment_test.py ├── all_optimal_alignments.py ├── antialignments_and_precision.py ├── backwards_token_replay.py ├── batch_detection.py ├── bpmn_from_pt_conversion.py ├── bpmn_import_and_to_petri_net.py ├── bpmn_js_visualization.py ├── bpmn_merging.py ├── case_overlap_stat.py ├── consecutive_act_case_grouping_filter.py ├── corr_mining.py ├── cost_based_dfg.py ├── cycle_time.py ├── data_petri_nets.py ├── dataframe_prefix_and_fea_extraction.py ├── dec_treplay_imdf.py ├── decisiontree_align_example.py ├── decisiontree_trivial_example.py ├── declare_simple.py ├── df_to_log_postpro.py ├── dfg_align_log.py ├── dfg_filt_act_paths_perc.py ├── dfg_min_ex_log.py ├── dfg_min_ex_pandas.py ├── dfg_playout.py ├── diagn_add_dataframe.py ├── discovery_data_petri_net.py ├── dotted_chart.py ├── emd_evaluation.py ├── enrich_log_with_align.py ├── ev_to_obj_types_graph.py ├── events_distribution.py ├── example_check_fitness.py ├── examples_conf.py ├── execute_everything.py ├── extended_marking_equation.py ├── feature_extraction.py ├── feature_extraction_case_loc.py ├── feature_extraction_ocel.py ├── features_locally_linear_embedding.py ├── footprints_petri_net.py ├── footprints_tree_conf.py ├── graphs_visualization.py ├── heu_miner_test.py ├── heuminer_plusplus.py ├── hybrid_ilp_miner.py ├── im_example.py ├── inductive_miner.py ├── inductive_miner_dfg.py ├── inductive_miner_dfg_lc.py ├── inductive_miner_variants.py ├── inhibitor_reset_arcs.py ├── interval_events_overlap.py ├── kneighb_regression.py ├── label_replacement.py ├── label_splitting.py ├── link_analysis_vbfa.py ├── llm │ ├── 01_1_protected_group_identification.py │ ├── 01_2_protected_group_query.py │ ├── 02_group_fairness_factors.py │ ├── 03_case_procedural.py │ ├── 04_hypothesis_generation.py │ ├── PET │ │ ├── doc-1.1 │ │ ├── doc-1.2 │ │ ├── doc-1.3 │ │ ├── doc-1.4 │ │ ├── doc-10.1 │ │ ├── doc-10.10 │ │ ├── doc-10.11 │ │ ├── doc-10.12 │ │ ├── doc-10.13 │ │ ├── doc-10.14 │ │ ├── doc-10.2 │ │ ├── doc-10.3 │ │ ├── doc-10.4 │ │ ├── doc-10.5 │ │ ├── doc-10.6 │ │ ├── doc-10.7 │ │ ├── doc-10.8 │ │ ├── doc-10.9 │ │ ├── doc-2.1 │ │ ├── doc-2.2 │ │ ├── doc-3.1 │ │ ├── doc-3.2 │ │ ├── doc-3.3 │ │ ├── doc-3.5 │ │ ├── doc-3.6 │ │ ├── doc-3.7 │ │ ├── doc-3.8 │ │ ├── doc-4.1 │ │ ├── doc-5.1 │ │ ├── doc-5.2 │ │ ├── doc-5.3 │ │ ├── doc-5.4 │ │ ├── doc-6.1 │ │ ├── doc-6.2 │ │ ├── doc-6.3 │ │ ├── doc-6.4 │ │ ├── doc-7.1 │ │ ├── doc-8.1 │ │ ├── doc-8.2 │ │ ├── doc-8.3 │ │ ├── doc-9.1 │ │ ├── doc-9.2 │ │ ├── doc-9.3 │ │ ├── doc-9.4 │ │ └── doc-9.5 │ ├── abstractions │ │ ├── log_to_acti_summary.py │ │ ├── log_to_top_resources.py │ │ └── log_to_var_paths.py │ └── openai_stt_tss.py ├── log_projection_dfg_variant.py ├── log_skeleton.py ├── log_skeleton_manual_constraints.py ├── log_to_fit_precise_pn.py ├── log_to_int_tree_open_paths.py ├── logs_alignment.py ├── logs_petri_visual_comparison.py ├── lstm_predict_next_activity.py ├── lstm_predict_remaining_time.py ├── manual_log_generation.py ├── memory_profilation_alignments.py ├── memory_profilation_iterparse.py ├── merging_case_relations.py ├── ml_insert_case_arrival_finish.py ├── ml_insert_waiting_service_time.py ├── ml_log_to_target_vectory.py ├── ml_outcome_enriched.py ├── model_to_model_sim.py ├── monte_carlo_example.py ├── montecarlo_dfg.py ├── montecarlo_petri_net.py ├── multialignments.py ├── murata_reduction.py ├── neo4j_ocel.py ├── network_analysis.py ├── nx_ocel_to_graphviz.py ├── nx_traditional_to_graphviz.py ├── object_centric_petri_net_discovery.py ├── ocdfg_discovery.py ├── ocel20_import_export.py ├── ocel_clustering.py ├── ocel_enrichment.py ├── ocel_filter_cc.py ├── ocel_merge_duplicates.py ├── ocel_occm_example.py ├── ocel_saw_net_disc.py ├── ocel_streaming.py ├── ocel_to_nx.py ├── ocel_validation.py ├── ocpn_manual_construction.py ├── orgmining_local_diagn.py ├── perf_spectrum_visualization.py ├── performance_dfg_simulation.py ├── petri_manual_generation.py ├── pn_to_pt.py ├── powl_discovery.py ├── powl_parsing.py ├── pripel_anonymization.py ├── process_tree_frequency_annotation.py ├── process_tree_reduction.py ├── queue_check_exponential.py ├── queue_check_max_conc_exec.py ├── read_write_ocel.py ├── resource_profiles_log.py ├── resource_profiles_pandas.py ├── revised_playout.py ├── rework.py ├── roles_detection.py ├── saw_net_ocel_multi.py ├── saw_net_ocel_single.py ├── segments_retrieval_filtering.py ├── simplified_interface.py ├── sna_log.py ├── stochastic_petri_playout.py ├── streaming_conformance_footprints.py ├── streaming_conformance_tbr.py ├── streaming_conformance_temporal_profile.py ├── streaming_csv_reader_event_stream.py ├── streaming_declare.py ├── streaming_discovery_dfg.py ├── streaming_live_to_static_stream.py ├── streaming_xes_reader_event_stream.py ├── streaming_xes_reader_trace_stream.py ├── temporal_features.py ├── temporal_profile_dataframe.py ├── temporal_profile_log.py ├── test_evaluation.py ├── timeline_dfg.py ├── timestamp_case_grouping_filter.py ├── timestamp_granularity.py ├── timestamp_interleavings.py ├── token_replay_alpha.py ├── token_replay_imdf.py ├── trace_attrib_hierarch_cluster.py ├── trace_clustering.py ├── trans_system_stochastic_vis.py ├── transform_db_to_ocel.py ├── transform_db_to_ocel_2.py ├── transform_db_to_xes.py ├── transient_dfg.py ├── transient_petri_net.py ├── transition_system_test.py ├── tree_manual_generation.py ├── tree_playout.py ├── trie.py ├── validation_ocel20_relational.py ├── validation_ocel20_xml.py ├── variants_paths_duration.py ├── visualization_align_table.py ├── visualization_processtree.py ├── windows_key_mouse_logger.py ├── woflan.py └── workalendar_example.py ├── notebooks ├── .gitignore ├── 1_event_data.ipynb ├── 2_event_data_filtering.ipynb ├── 3_process_discovery.ipynb ├── 4_conformance_checking.ipynb ├── 5_advanced_examples.ipynb ├── data │ ├── receipt.xes │ ├── running_example.csv │ ├── running_example.xes │ └── running_example_broken.csv └── img │ └── bpmn_running_example.png ├── pm4py ├── __init__.py ├── algo │ ├── __init__.py │ ├── analysis │ │ ├── __init__.py │ │ ├── extended_marking_equation │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── marking_equation │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── woflan │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── graphs │ │ │ │ ├── __init__.py │ │ │ │ ├── minimal_coverability_graph │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── minimal_coverability_graph.py │ │ │ │ ├── reachability_graph │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── reachability_graph.py │ │ │ │ ├── restricted_coverability_graph │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── restricted_coverability_graph.py │ │ │ │ └── utility.py │ │ │ ├── not_well_handled_pairs │ │ │ │ ├── __init__.py │ │ │ │ └── not_well_handled_pairs.py │ │ │ └── place_invariants │ │ │ │ ├── __init__.py │ │ │ │ ├── place_invariants.py │ │ │ │ ├── s_component.py │ │ │ │ ├── uniform_invariant.py │ │ │ │ └── utility.py │ │ └── workflow_net │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ └── petri_net.py │ ├── anonymization │ │ ├── __init__.py │ │ ├── pripel │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── util │ │ │ │ ├── AttributeAnonymizer.py │ │ │ │ ├── TraceMatcher.py │ │ │ │ ├── __init__.py │ │ │ │ └── trace_levenshtein.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── pripel.py │ │ └── trace_variant_query │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── util │ │ │ ├── __init__.py │ │ │ ├── behavioralAppropriateness.py │ │ │ ├── exp_mech.py │ │ │ └── util.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── laplace.py │ │ │ └── sacofa.py │ ├── clustering │ │ ├── __init__.py │ │ ├── profiles │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── sklearn_profiles.py │ │ └── trace_attribute_driven │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── dfg │ │ │ ├── __init__.py │ │ │ └── dfg_dist.py │ │ │ ├── leven_dist │ │ │ ├── __init__.py │ │ │ └── leven_dist_calc.py │ │ │ ├── linkage_method │ │ │ ├── __init__.py │ │ │ └── linkage_avg.py │ │ │ ├── merge_log │ │ │ ├── __init__.py │ │ │ └── merge_log.py │ │ │ ├── util │ │ │ ├── __init__.py │ │ │ ├── evaluation.py │ │ │ └── filter_subsets.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── act_dist_calc.py │ │ │ ├── logslice_dist.py │ │ │ ├── sim_calc.py │ │ │ └── suc_dist_calc.py │ ├── comparison │ │ ├── __init__.py │ │ └── petrinet │ │ │ ├── __init__.py │ │ │ └── element_usage_comparison.py │ ├── conformance │ │ ├── __init__.py │ │ ├── alignments │ │ │ ├── __init__.py │ │ │ ├── decomposed │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── recompos_maximal.py │ │ │ ├── dfg │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── classic.py │ │ │ ├── edit_distance │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── edit_distance.py │ │ │ ├── petri_net │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ ├── utils │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── log_enrichment.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── dijkstra_less_memory.py │ │ │ │ │ ├── dijkstra_no_heuristics.py │ │ │ │ │ ├── discounted_a_star.py │ │ │ │ │ ├── generator_dijkstra_less_memory.py │ │ │ │ │ ├── generator_dijkstra_no_heuristics.py │ │ │ │ │ └── state_equation_a_star.py │ │ │ └── process_tree │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ ├── util │ │ │ │ ├── __init__.py │ │ │ │ ├── search_graph_pt_frequency_annotation.py │ │ │ │ └── search_graph_pt_replay_semantics.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── approximated │ │ │ │ ├── __init__.py │ │ │ │ ├── calculate_a_sa_ea_sets.py │ │ │ │ ├── matrix_lp.py │ │ │ │ ├── original.py │ │ │ │ └── utilities.py │ │ │ │ ├── dynamic_programming.py │ │ │ │ ├── milp.py │ │ │ │ └── search_graph_pt.py │ │ ├── antialignments │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── discounted_a_star.py │ │ ├── declare │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── footprints │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── util │ │ │ │ ├── __init__.py │ │ │ │ ├── evaluation.py │ │ │ │ └── tree_visualization.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── log_extensive.py │ │ │ │ ├── log_model.py │ │ │ │ └── trace_extensive.py │ │ ├── log_skeleton │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── multialignments │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── discounted_a_star.py │ │ ├── temporal_profile │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── dataframe.py │ │ │ │ └── log.py │ │ └── tokenreplay │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── diagnostics │ │ │ ├── __init__.py │ │ │ ├── duration_diagnostics.py │ │ │ └── root_cause_analysis.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── backwards.py │ │ │ └── token_replay.py │ ├── connectors │ │ ├── __init__.py │ │ ├── algorithm.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ └── mail.py │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── camunda_workflow.py │ │ │ ├── chrome_history.py │ │ │ ├── firefox_history.py │ │ │ ├── github_repo.py │ │ │ ├── outlook_calendar.py │ │ │ ├── outlook_mail_extractor.py │ │ │ ├── sap_accounting.py │ │ │ ├── sap_o2c.py │ │ │ └── windows_events.py │ ├── decision_mining │ │ ├── __init__.py │ │ └── algorithm.py │ ├── discovery │ │ ├── __init__.py │ │ ├── alpha │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── data_structures │ │ │ │ ├── __init__.py │ │ │ │ └── alpha_classic_abstraction.py │ │ │ ├── utils │ │ │ │ ├── __init__.py │ │ │ │ └── endpoints.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── classic.py │ │ │ │ └── plus.py │ │ ├── batches │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── utils │ │ │ │ ├── __init__.py │ │ │ │ └── detection.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── log.py │ │ │ │ └── pandas.py │ │ ├── causal │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── alpha.py │ │ │ │ └── heuristic.py │ │ ├── correlation_mining │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── util.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── classic.py │ │ │ │ ├── classic_split.py │ │ │ │ └── trace_based.py │ │ ├── declare │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── templates.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── dfg │ │ │ ├── __init__.py │ │ │ ├── adapters │ │ │ │ ├── __init__.py │ │ │ │ └── pandas │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── df_statistics.py │ │ │ │ │ └── freq_triples.py │ │ │ ├── algorithm.py │ │ │ ├── replacement.py │ │ │ ├── utils │ │ │ │ ├── __init__.py │ │ │ │ └── dfg_utils.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── case_attributes.py │ │ │ │ ├── clean.py │ │ │ │ ├── clean_polars.py │ │ │ │ ├── clean_time.py │ │ │ │ ├── freq_triples.py │ │ │ │ ├── native.py │ │ │ │ └── performance.py │ │ ├── footprints │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── dfg │ │ │ │ ├── __init__.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── dfg.py │ │ │ ├── log │ │ │ │ ├── __init__.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── entire_dataframe.py │ │ │ │ │ ├── entire_event_log.py │ │ │ │ │ └── trace_by_trace.py │ │ │ ├── petri │ │ │ │ ├── __init__.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── reach_graph.py │ │ │ ├── powl │ │ │ │ ├── __init__.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── bottomup.py │ │ │ └── tree │ │ │ │ ├── __init__.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── bottomup.py │ │ ├── heuristics │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── classic.py │ │ │ │ └── plusplus.py │ │ ├── ilp │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── inductive │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── base_case │ │ │ │ ├── __init__.py │ │ │ │ ├── abc.py │ │ │ │ ├── empty_log.py │ │ │ │ ├── factory.py │ │ │ │ └── single_activity.py │ │ │ ├── cuts │ │ │ │ ├── __init__.py │ │ │ │ ├── abc.py │ │ │ │ ├── concurrency.py │ │ │ │ ├── factory.py │ │ │ │ ├── loop.py │ │ │ │ ├── sequence.py │ │ │ │ ├── utils.py │ │ │ │ └── xor.py │ │ │ ├── dtypes │ │ │ │ ├── __init__.py │ │ │ │ ├── im_dfg.py │ │ │ │ └── im_ds.py │ │ │ ├── fall_through │ │ │ │ ├── __init__.py │ │ │ │ ├── abc.py │ │ │ │ ├── activity_concurrent.py │ │ │ │ ├── activity_once_per_trace.py │ │ │ │ ├── empty_traces.py │ │ │ │ ├── factory.py │ │ │ │ ├── flower.py │ │ │ │ ├── strict_tau_loop.py │ │ │ │ └── tau_loop.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── abc.py │ │ │ │ ├── im.py │ │ │ │ ├── imd.py │ │ │ │ ├── imf.py │ │ │ │ └── instances.py │ │ ├── log_skeleton │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── trace_skel.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── minimum_self_distance │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── utils.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── log.py │ │ │ │ └── pandas.py │ │ ├── ocel │ │ │ ├── __init__.py │ │ │ ├── interleavings │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ ├── utils │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── merge_dataframe_rel_cases.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── timestamp_interleavings.py │ │ │ ├── link_analysis │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── classic.py │ │ │ ├── ocdfg │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── classic.py │ │ │ ├── ocpn │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── classic.py │ │ │ │ │ └── wo_annotation.py │ │ │ └── saw_nets │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── performance_spectrum │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── dataframe.py │ │ │ │ ├── dataframe_disconnected.py │ │ │ │ ├── log.py │ │ │ │ └── log_disconnected.py │ │ ├── powl │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── inductive │ │ │ │ ├── __init__.py │ │ │ │ ├── base_case │ │ │ │ ├── __init__.py │ │ │ │ ├── abc.py │ │ │ │ ├── empty_log.py │ │ │ │ ├── factory.py │ │ │ │ └── single_activity.py │ │ │ │ ├── cuts │ │ │ │ ├── __init__.py │ │ │ │ ├── concurrency.py │ │ │ │ ├── factory.py │ │ │ │ ├── loop.py │ │ │ │ ├── sequence.py │ │ │ │ └── xor.py │ │ │ │ ├── fall_through │ │ │ │ ├── __init__.py │ │ │ │ ├── activity_concurrent.py │ │ │ │ ├── activity_once_per_trace.py │ │ │ │ ├── empty_traces.py │ │ │ │ ├── factory.py │ │ │ │ ├── flower.py │ │ │ │ ├── strict_tau_loop.py │ │ │ │ └── tau_loop.py │ │ │ │ ├── utils │ │ │ │ ├── __init__.py │ │ │ │ └── filtering.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── brute_force │ │ │ │ ├── __init__.py │ │ │ │ ├── bf_partial_order_cut.py │ │ │ │ └── factory.py │ │ │ │ ├── dynamic_clustering │ │ │ │ ├── __init__.py │ │ │ │ ├── dynamic_clustering_partial_order_cut.py │ │ │ │ └── factory.py │ │ │ │ ├── dynamic_clustering_frequency │ │ │ │ ├── __init__.py │ │ │ │ ├── dynamic_clustering_frequency_partial_order_cut.py │ │ │ │ └── factory.py │ │ │ │ ├── im_brute_force.py │ │ │ │ ├── im_dynamic_clustering.py │ │ │ │ ├── im_dynamic_clustering_frequencies.py │ │ │ │ ├── im_maximal.py │ │ │ │ ├── im_tree.py │ │ │ │ ├── maximal │ │ │ │ ├── __init__.py │ │ │ │ ├── factory.py │ │ │ │ └── maximal_partial_order_cut.py │ │ │ │ └── powl_discovery_varaints.py │ │ ├── temporal_profile │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── dataframe.py │ │ │ │ └── log.py │ │ └── transition_system │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ └── view_based.py │ ├── evaluation │ │ ├── __init__.py │ │ ├── algorithm.py │ │ ├── earth_mover_distance │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── pyemd.py │ │ ├── generalization │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── token_based.py │ │ ├── precision │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── dfg │ │ │ │ ├── __init__.py │ │ │ │ └── algorithm.py │ │ │ ├── utils.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── align_etconformance.py │ │ │ │ └── etconformance_token.py │ │ ├── replay_fitness │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── alignment_based.py │ │ │ │ └── token_replay.py │ │ └── simplicity │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── arc_degree.py │ │ │ ├── extended_cardoso.py │ │ │ └── extended_cyclomatic.py │ ├── filtering │ │ ├── __init__.py │ │ ├── common │ │ │ ├── __init__.py │ │ │ ├── attributes │ │ │ │ ├── __init__.py │ │ │ │ └── attributes_common.py │ │ │ ├── end_activities │ │ │ │ ├── __init__.py │ │ │ │ └── end_activities_common.py │ │ │ ├── filtering_constants.py │ │ │ ├── start_activities │ │ │ │ ├── __init__.py │ │ │ │ └── start_activities_common.py │ │ │ ├── timestamp │ │ │ │ ├── __init__.py │ │ │ │ └── timestamp_common.py │ │ │ └── traces │ │ │ │ ├── __init__.py │ │ │ │ └── infix_to_regex.py │ │ ├── dfg │ │ │ ├── __init__.py │ │ │ └── dfg_filtering.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ ├── attr_value_repetition │ │ │ │ ├── __init__.py │ │ │ │ └── filter.py │ │ │ ├── attributes │ │ │ │ ├── __init__.py │ │ │ │ └── attributes_filter.py │ │ │ ├── between │ │ │ │ ├── __init__.py │ │ │ │ └── between_filter.py │ │ │ ├── cases │ │ │ │ ├── __init__.py │ │ │ │ └── case_filter.py │ │ │ ├── end_activities │ │ │ │ ├── __init__.py │ │ │ │ └── end_activities_filter.py │ │ │ ├── ltl │ │ │ │ ├── __init__.py │ │ │ │ └── ltl_checker.py │ │ │ ├── paths │ │ │ │ ├── __init__.py │ │ │ │ └── paths_filter.py │ │ │ ├── prefixes │ │ │ │ ├── __init__.py │ │ │ │ └── prefix_filter.py │ │ │ ├── rework │ │ │ │ ├── __init__.py │ │ │ │ └── rework_filter.py │ │ │ ├── start_activities │ │ │ │ ├── __init__.py │ │ │ │ └── start_activities_filter.py │ │ │ ├── suffixes │ │ │ │ ├── __init__.py │ │ │ │ └── suffix_filter.py │ │ │ ├── timestamp │ │ │ │ ├── __init__.py │ │ │ │ └── timestamp_filter.py │ │ │ ├── traces │ │ │ │ ├── __init__.py │ │ │ │ └── trace_filter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── variants_filter.py │ │ ├── ocel │ │ │ ├── __init__.py │ │ │ ├── activity_type_matching.py │ │ │ ├── event_attributes.py │ │ │ ├── object_attributes.py │ │ │ ├── objects_ot_count.py │ │ │ └── ot_endpoints.py │ │ └── pandas │ │ │ ├── __init__.py │ │ │ ├── activity_split │ │ │ ├── __init__.py │ │ │ └── activity_split_filter.py │ │ │ ├── attr_value_repetition │ │ │ ├── __init__.py │ │ │ └── filter.py │ │ │ ├── attributes │ │ │ ├── __init__.py │ │ │ └── attributes_filter.py │ │ │ ├── between │ │ │ ├── __init__.py │ │ │ └── between_filter.py │ │ │ ├── cases │ │ │ ├── __init__.py │ │ │ └── case_filter.py │ │ │ ├── consecutive_act_case_grouping │ │ │ ├── __init__.py │ │ │ └── consecutive_act_case_grouping_filter.py │ │ │ ├── end_activities │ │ │ ├── __init__.py │ │ │ └── end_activities_filter.py │ │ │ ├── ends_with │ │ │ ├── __init__.py │ │ │ └── ends_with_filter.py │ │ │ ├── ltl │ │ │ ├── __init__.py │ │ │ └── ltl_checker.py │ │ │ ├── paths │ │ │ ├── __init__.py │ │ │ └── paths_filter.py │ │ │ ├── pd_filtering_constants.py │ │ │ ├── prefixes │ │ │ ├── __init__.py │ │ │ └── prefix_filter.py │ │ │ ├── rework │ │ │ ├── __init__.py │ │ │ └── rework_filter.py │ │ │ ├── start_activities │ │ │ ├── __init__.py │ │ │ └── start_activities_filter.py │ │ │ ├── starts_with │ │ │ ├── __init__.py │ │ │ └── starts_with_filter.py │ │ │ ├── suffixes │ │ │ ├── __init__.py │ │ │ └── suffix_filter.py │ │ │ ├── timestamp │ │ │ ├── __init__.py │ │ │ └── timestamp_filter.py │ │ │ ├── timestamp_case_grouping │ │ │ ├── __init__.py │ │ │ └── timestamp_case_grouping_filter.py │ │ │ ├── traces │ │ │ ├── __init__.py │ │ │ └── trace_filter.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ └── variants_filter.py │ ├── label_splitting │ │ ├── __init__.py │ │ ├── algorithm.py │ │ └── variants │ │ │ ├── __init__.py │ │ │ └── contextual.py │ ├── merging │ │ ├── __init__.py │ │ └── case_relations │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ └── pandas.py │ ├── organizational_mining │ │ ├── __init__.py │ │ ├── local_diagnostics │ │ │ ├── __init__.py │ │ │ └── algorithm.py │ │ ├── network_analysis │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── dataframe.py │ │ ├── resource_profiles │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── log.py │ │ │ │ └── pandas.py │ │ ├── roles │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── common │ │ │ │ ├── __init__.py │ │ │ │ └── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── log.py │ │ │ │ └── pandas.py │ │ ├── sna │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── util.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── log │ │ │ │ ├── __init__.py │ │ │ │ ├── handover.py │ │ │ │ ├── jointactivities.py │ │ │ │ ├── subcontracting.py │ │ │ │ └── working_together.py │ │ │ │ └── pandas │ │ │ │ ├── __init__.py │ │ │ │ ├── handover.py │ │ │ │ ├── jointactivities.py │ │ │ │ ├── subcontracting.py │ │ │ │ └── working_together.py │ │ └── util.py │ ├── querying │ │ ├── __init__.py │ │ └── llm │ │ │ ├── __init__.py │ │ │ ├── abstractions │ │ │ ├── __init__.py │ │ │ ├── case_to_descr.py │ │ │ ├── declare_to_descr.py │ │ │ ├── log_to_cols_descr.py │ │ │ ├── log_to_dfg_descr.py │ │ │ ├── log_to_fea_descr.py │ │ │ ├── log_to_variants_descr.py │ │ │ ├── logske_to_descr.py │ │ │ ├── net_to_descr.py │ │ │ ├── ocel_fea_descr.py │ │ │ ├── ocel_ocdfg_descr.py │ │ │ ├── stream_to_descr.py │ │ │ └── tempprofile_to_descr.py │ │ │ ├── connectors │ │ │ ├── __init__.py │ │ │ ├── anthropic.py │ │ │ ├── google.py │ │ │ └── openai.py │ │ │ ├── injection │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── db_knowledge │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── pandas_duckdb.py │ │ │ │ │ └── sqlite3_traditional.py │ │ │ └── pm_knowledge │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── ocel20.py │ │ │ │ └── traditional.py │ │ │ └── utils │ │ │ ├── __init__.py │ │ │ └── sql_utils.py │ ├── reduction │ │ ├── __init__.py │ │ └── process_tree │ │ │ ├── __init__.py │ │ │ ├── reducer.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ └── tree_tr_based.py │ ├── simulation │ │ ├── __init__.py │ │ ├── montecarlo │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── utils │ │ │ │ ├── __init__.py │ │ │ │ └── replay.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── petri_semaph_fifo.py │ │ ├── playout │ │ │ ├── __init__.py │ │ │ ├── declare │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── classic.py │ │ │ ├── dfg │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── classic.py │ │ │ │ │ └── performance.py │ │ │ ├── petri_net │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── basic_playout.py │ │ │ │ │ ├── extensive.py │ │ │ │ │ └── stochastic_playout.py │ │ │ └── process_tree │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── basic_playout.py │ │ │ │ ├── extensive.py │ │ │ │ └── topbottom.py │ │ └── tree_generator │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── basic.py │ │ │ └── ptandloggenerator.py │ └── transformation │ │ ├── __init__.py │ │ ├── log_to_features │ │ ├── __init__.py │ │ ├── algorithm.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ └── locally_linear_embedding.py │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── event_based.py │ │ │ ├── temporal.py │ │ │ └── trace_based.py │ │ ├── log_to_interval_tree │ │ ├── __init__.py │ │ ├── algorithm.py │ │ └── variants │ │ │ ├── __init__.py │ │ │ └── open_paths.py │ │ ├── log_to_target │ │ ├── __init__.py │ │ ├── algorithm.py │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── next_activity.py │ │ │ ├── next_time.py │ │ │ └── remaining_time.py │ │ ├── log_to_trie │ │ ├── __init__.py │ │ └── algorithm.py │ │ └── ocel │ │ ├── __init__.py │ │ ├── description │ │ ├── __init__.py │ │ ├── algorithm.py │ │ └── variants │ │ │ ├── __init__.py │ │ │ └── variant1.py │ │ ├── features │ │ ├── __init__.py │ │ ├── events │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── event_activity.py │ │ │ ├── event_end_ot.py │ │ │ ├── event_num_attributes.py │ │ │ ├── event_num_rel_objs.py │ │ │ ├── event_num_rel_objs_type.py │ │ │ ├── event_start_ot.py │ │ │ ├── event_str_attributes.py │ │ │ ├── event_timestamp.py │ │ │ ├── new_interactions.py │ │ │ └── related_objects_features.py │ │ ├── events_objects │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── prefix_features.py │ │ └── objects │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ ├── obj_con_in_graph_features.py │ │ │ ├── object_cobirth_graph.py │ │ │ ├── object_codeath_graph.py │ │ │ ├── object_degree_centrality.py │ │ │ ├── object_general_descendants_graph.py │ │ │ ├── object_general_inheritance_graph.py │ │ │ ├── object_general_interaction_graph.py │ │ │ ├── object_lifecycle_activities.py │ │ │ ├── object_lifecycle_duration.py │ │ │ ├── object_lifecycle_length.py │ │ │ ├── object_lifecycle_paths.py │ │ │ ├── object_lifecycle_unq_act.py │ │ │ ├── object_num_attributes.py │ │ │ ├── object_str_attributes.py │ │ │ ├── object_work_in_progress.py │ │ │ ├── objects_interaction_graph_ot.py │ │ │ ├── related_activities_features.py │ │ │ └── related_events_features.py │ │ ├── graphs │ │ ├── __init__.py │ │ ├── object_cobirth_graph.py │ │ ├── object_codeath_graph.py │ │ ├── object_descendants_graph.py │ │ ├── object_inheritance_graph.py │ │ ├── object_interaction_graph.py │ │ └── ocel20_computation.py │ │ └── split_ocel │ │ ├── __init__.py │ │ ├── algorithm.py │ │ └── variants │ │ ├── __init__.py │ │ ├── ancestors_descendants.py │ │ └── connected_components.py ├── analysis.py ├── cli.py ├── conformance.py ├── connectors.py ├── convert.py ├── discovery.py ├── filtering.py ├── hof.py ├── llm.py ├── meta.py ├── ml.py ├── objects │ ├── __init__.py │ ├── bpmn │ │ ├── __init__.py │ │ ├── exporter │ │ │ ├── __init__.py │ │ │ ├── exporter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── etree.py │ │ ├── importer │ │ │ ├── __init__.py │ │ │ ├── importer.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── lxml.py │ │ ├── layout │ │ │ ├── __init__.py │ │ │ ├── layouter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── graphviz.py │ │ │ │ └── graphviz_new.py │ │ ├── obj.py │ │ ├── semantics.py │ │ └── util │ │ │ ├── __init__.py │ │ │ ├── bpmn_utils.py │ │ │ ├── label_replacing.py │ │ │ ├── reduction.py │ │ │ └── sorting.py │ ├── conversion │ │ ├── __init__.py │ │ ├── bpmn │ │ │ ├── __init__.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── to_petri_net.py │ │ ├── dfg │ │ │ ├── __init__.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── to_petri_net_activity_defines_place.py │ │ │ │ └── to_petri_net_invisibles_no_duplicates.py │ │ ├── heuristics_net │ │ │ ├── __init__.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── to_petri_net.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ ├── constants.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── df_to_event_log_1v.py │ │ │ │ ├── df_to_event_log_nv.py │ │ │ │ ├── to_data_frame.py │ │ │ │ ├── to_event_log.py │ │ │ │ ├── to_event_stream.py │ │ │ │ └── to_nx.py │ │ ├── ocel │ │ │ ├── __init__.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── ocel_features_to_nx.py │ │ │ │ └── ocel_to_nx.py │ │ ├── powl │ │ │ ├── __init__.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── to_petri_net.py │ │ │ │ └── to_process_tree.py │ │ ├── process_tree │ │ │ ├── __init__.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── to_bpmn.py │ │ │ │ ├── to_petri_net.py │ │ │ │ ├── to_petri_net_transition_bordered.py │ │ │ │ └── to_powl.py │ │ ├── trie │ │ │ ├── __init__.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── to_petri_net.py │ │ └── wf_net │ │ │ ├── __init__.py │ │ │ ├── converter.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── to_bpmn.py │ │ │ ├── to_powl.py │ │ │ └── to_process_tree.py │ ├── dfg │ │ ├── __init__.py │ │ ├── exporter │ │ │ ├── __init__.py │ │ │ ├── exporter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── filtering │ │ │ ├── __init__.py │ │ │ └── dfg_filtering.py │ │ ├── importer │ │ │ ├── __init__.py │ │ │ ├── importer.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── obj.py │ │ ├── retrieval │ │ │ ├── __init__.py │ │ │ ├── log.py │ │ │ └── pandas.py │ │ ├── util.py │ │ └── utils │ │ │ ├── __init__.py │ │ │ └── dfg_utils.py │ ├── heuristics_net │ │ ├── __init__.py │ │ ├── defaults.py │ │ ├── edge.py │ │ ├── node.py │ │ └── obj.py │ ├── log │ │ ├── __init__.py │ │ ├── exporter │ │ │ ├── __init__.py │ │ │ └── xes │ │ │ │ ├── __init__.py │ │ │ │ ├── exporter.py │ │ │ │ ├── util │ │ │ │ ├── __init__.py │ │ │ │ └── compression.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── etree_xes_exp.py │ │ │ │ └── line_by_line.py │ │ ├── importer │ │ │ ├── __init__.py │ │ │ └── xes │ │ │ │ ├── __init__.py │ │ │ │ ├── importer.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── chunk_regex.py │ │ │ │ ├── iterparse.py │ │ │ │ ├── iterparse_20.py │ │ │ │ ├── iterparse_mem_compressed.py │ │ │ │ ├── line_by_line.py │ │ │ │ └── rustxes.py │ │ ├── obj.py │ │ └── util │ │ │ ├── __init__.py │ │ │ ├── activities_to_alphabet.py │ │ │ ├── artificial.py │ │ │ ├── basic_filter.py │ │ │ ├── dataframe_utils.py │ │ │ ├── filtering_utils.py │ │ │ ├── get_class_representation.py │ │ │ ├── get_log_encoded.py │ │ │ ├── get_prefixes.py │ │ │ ├── index_attribute.py │ │ │ ├── insert_classifier.py │ │ │ ├── interval_lifecycle.py │ │ │ ├── log.py │ │ │ ├── log_regex.py │ │ │ ├── move_attrs_to_trace.py │ │ │ ├── pandas_log_wrapper.py │ │ │ ├── pandas_numpy_variants.py │ │ │ ├── sampling.py │ │ │ ├── sorting.py │ │ │ ├── split_train_test.py │ │ │ └── xes.py │ ├── ocel │ │ ├── __init__.py │ │ ├── constants.py │ │ ├── exporter │ │ │ ├── __init__.py │ │ │ ├── csv │ │ │ │ ├── __init__.py │ │ │ │ ├── exporter.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── pandas.py │ │ │ ├── jsonocel │ │ │ │ ├── __init__.py │ │ │ │ ├── exporter.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── classic.py │ │ │ │ │ ├── ocel20.py │ │ │ │ │ └── ocel20_standard.py │ │ │ ├── sqlite │ │ │ │ ├── __init__.py │ │ │ │ ├── exporter.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── ocel20.py │ │ │ │ │ └── pandas_exporter.py │ │ │ ├── util │ │ │ │ ├── __init__.py │ │ │ │ └── clean_dataframes.py │ │ │ └── xmlocel │ │ │ │ ├── __init__.py │ │ │ │ ├── exporter.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── classic.py │ │ │ │ └── ocel20.py │ │ ├── importer │ │ │ ├── __init__.py │ │ │ ├── csv │ │ │ │ ├── __init__.py │ │ │ │ ├── importer.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── pandas.py │ │ │ ├── jsonocel │ │ │ │ ├── __init__.py │ │ │ │ ├── importer.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── classic.py │ │ │ │ │ ├── ocel20_rustxes.py │ │ │ │ │ └── ocel20_standard.py │ │ │ ├── sqlite │ │ │ │ ├── __init__.py │ │ │ │ ├── importer.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── ocel20.py │ │ │ │ │ └── pandas_importer.py │ │ │ └── xmlocel │ │ │ │ ├── __init__.py │ │ │ │ ├── importer.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── classic.py │ │ │ │ ├── ocel20.py │ │ │ │ └── ocel20_rustxes.py │ │ ├── obj.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ ├── attributes_names.py │ │ │ ├── attributes_per_type.py │ │ │ ├── convergence_divergence_diagnostics.py │ │ │ ├── e2o_qualification.py │ │ │ ├── ev_att_to_obj_type.py │ │ │ ├── event_prefix_suffix_per_obj.py │ │ │ ├── events_per_object_type.py │ │ │ ├── events_per_type_per_activity.py │ │ │ ├── explode.py │ │ │ ├── extended_table.py │ │ │ ├── filtering_utils.py │ │ │ ├── flattening.py │ │ │ ├── log_ocel.py │ │ │ ├── names_stripping.py │ │ │ ├── objects_per_type_per_activity.py │ │ │ ├── ocel_consistency.py │ │ │ ├── ocel_iterator.py │ │ │ ├── ocel_to_dict_types_rel.py │ │ │ ├── ocel_type_renaming.py │ │ │ ├── parent_children_ref.py │ │ │ ├── related_events.py │ │ │ ├── related_objects.py │ │ │ ├── rename_objs_ot_tim_lex.py │ │ │ └── sampling.py │ │ └── validation │ │ │ ├── __init__.py │ │ │ ├── jsonocel.py │ │ │ ├── ocel20_rel_validation.py │ │ │ └── xmlocel.py │ ├── org │ │ ├── __init__.py │ │ ├── roles │ │ │ ├── __init__.py │ │ │ └── obj.py │ │ └── sna │ │ │ ├── __init__.py │ │ │ └── obj.py │ ├── petri_net │ │ ├── __init__.py │ │ ├── data_petri_nets │ │ │ ├── __init__.py │ │ │ ├── data_marking.py │ │ │ └── semantics.py │ │ ├── exporter │ │ │ ├── __init__.py │ │ │ ├── exporter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── pnml.py │ │ ├── importer │ │ │ ├── __init__.py │ │ │ ├── importer.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── pnml.py │ │ ├── inhibitor_reset │ │ │ ├── __init__.py │ │ │ └── semantics.py │ │ ├── obj.py │ │ ├── properties.py │ │ ├── saw_net │ │ │ ├── __init__.py │ │ │ ├── convert.py │ │ │ ├── obj.py │ │ │ └── semantics.py │ │ ├── sem_interface.py │ │ ├── semantics.py │ │ ├── stochastic │ │ │ ├── __init__.py │ │ │ ├── obj.py │ │ │ └── semantics.py │ │ └── utils │ │ │ ├── __init__.py │ │ │ ├── align_utils.py │ │ │ ├── check_soundness.py │ │ │ ├── consumption_matrix.py │ │ │ ├── decomposition.py │ │ │ ├── embed_stochastic_map.py │ │ │ ├── embeddings_similarity.py │ │ │ ├── explore_path.py │ │ │ ├── final_marking.py │ │ │ ├── incidence_matrix.py │ │ │ ├── initial_marking.py │ │ │ ├── label_replacing.py │ │ │ ├── murata.py │ │ │ ├── networkx_graph.py │ │ │ ├── obj_marking.py │ │ │ ├── performance_map.py │ │ │ ├── petri_utils.py │ │ │ ├── projection.py │ │ │ ├── reachability_graph.py │ │ │ ├── reduction.py │ │ │ └── synchronous_product.py │ ├── powl │ │ ├── BinaryRelation.py │ │ ├── __init__.py │ │ ├── constants.py │ │ ├── obj.py │ │ ├── parser.py │ │ └── utils │ │ │ ├── __init__.py │ │ │ └── label_replacing.py │ ├── process_tree │ │ ├── __init__.py │ │ ├── exporter │ │ │ ├── __init__.py │ │ │ ├── exporter.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── ptml.py │ │ ├── importer │ │ │ ├── __init__.py │ │ │ ├── importer.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── ptml.py │ │ ├── obj.py │ │ ├── semantics.py │ │ ├── state.py │ │ └── utils │ │ │ ├── __init__.py │ │ │ ├── bottomup.py │ │ │ ├── generic.py │ │ │ ├── label_replacing.py │ │ │ ├── regex.py │ │ │ └── struct_similarity.py │ ├── random_variables │ │ ├── __init__.py │ │ ├── basic_structure.py │ │ ├── constant0 │ │ │ ├── __init__.py │ │ │ └── random_variable.py │ │ ├── deterministic │ │ │ ├── __init__.py │ │ │ └── random_variable.py │ │ ├── exponential │ │ │ ├── __init__.py │ │ │ └── random_variable.py │ │ ├── gamma │ │ │ ├── __init__.py │ │ │ └── random_variable.py │ │ ├── lognormal │ │ │ ├── __init__.py │ │ │ └── random_variable.py │ │ ├── normal │ │ │ ├── __init__.py │ │ │ └── random_variable.py │ │ ├── random_variable.py │ │ └── uniform │ │ │ ├── __init__.py │ │ │ └── random_variable.py │ ├── stochastic_petri │ │ ├── __init__.py │ │ ├── ctmc.py │ │ ├── tangible_reachability.py │ │ └── utils.py │ ├── transition_system │ │ ├── __init__.py │ │ ├── constants.py │ │ ├── obj.py │ │ └── utils.py │ └── trie │ │ ├── __init__.py │ │ └── obj.py ├── ocel.py ├── org.py ├── privacy.py ├── read.py ├── sim.py ├── statistics │ ├── __init__.py │ ├── attributes │ │ ├── __init__.py │ │ ├── common │ │ │ ├── __init__.py │ │ │ └── get.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ ├── get.py │ │ │ └── select.py │ │ └── pandas │ │ │ ├── __init__.py │ │ │ └── get.py │ ├── concurrent_activities │ │ ├── __init__.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ └── get.py │ │ └── pandas │ │ │ ├── __init__.py │ │ │ └── get.py │ ├── end_activities │ │ ├── __init__.py │ │ ├── common │ │ │ ├── __init__.py │ │ │ └── get.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ └── get.py │ │ └── pandas │ │ │ ├── __init__.py │ │ │ └── get.py │ ├── eventually_follows │ │ ├── __init__.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ └── get.py │ │ ├── pandas │ │ │ ├── __init__.py │ │ │ └── get.py │ │ └── uvcl │ │ │ ├── __init__.py │ │ │ └── get.py │ ├── ocel │ │ ├── __init__.py │ │ ├── act_ot_dependent.py │ │ ├── act_utils.py │ │ ├── edge_metrics.py │ │ ├── objects_ot_count.py │ │ └── ot_activities.py │ ├── overlap │ │ ├── __init__.py │ │ ├── cases │ │ │ ├── __init__.py │ │ │ ├── log │ │ │ │ ├── __init__.py │ │ │ │ └── get.py │ │ │ └── pandas │ │ │ │ ├── __init__.py │ │ │ │ └── get.py │ │ ├── interval_events │ │ │ ├── __init__.py │ │ │ ├── log │ │ │ │ ├── __init__.py │ │ │ │ └── get.py │ │ │ └── pandas │ │ │ │ ├── __init__.py │ │ │ │ └── get.py │ │ └── utils │ │ │ ├── __init__.py │ │ │ └── compute.py │ ├── passed_time │ │ ├── __init__.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── post.py │ │ │ │ ├── pre.py │ │ │ │ └── prepost.py │ │ └── pandas │ │ │ ├── __init__.py │ │ │ ├── algorithm.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── post.py │ │ │ ├── pre.py │ │ │ └── prepost.py │ ├── rework │ │ ├── __init__.py │ │ ├── cases │ │ │ ├── __init__.py │ │ │ ├── log │ │ │ │ ├── __init__.py │ │ │ │ └── get.py │ │ │ └── pandas │ │ │ │ ├── __init__.py │ │ │ │ └── get.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ └── get.py │ │ └── pandas │ │ │ ├── __init__.py │ │ │ └── get.py │ ├── service_time │ │ ├── __init__.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ └── get.py │ │ └── pandas │ │ │ ├── __init__.py │ │ │ └── get.py │ ├── sojourn_time │ │ └── __init__.py │ ├── start_activities │ │ ├── __init__.py │ │ ├── common │ │ │ ├── __init__.py │ │ │ └── get.py │ │ ├── log │ │ │ ├── __init__.py │ │ │ └── get.py │ │ └── pandas │ │ │ ├── __init__.py │ │ │ └── get.py │ ├── traces │ │ ├── __init__.py │ │ ├── cycle_time │ │ │ ├── __init__.py │ │ │ ├── log │ │ │ │ ├── __init__.py │ │ │ │ └── get.py │ │ │ ├── pandas │ │ │ │ ├── __init__.py │ │ │ │ └── get.py │ │ │ └── util │ │ │ │ ├── __init__.py │ │ │ │ └── compute.py │ │ └── generic │ │ │ ├── __init__.py │ │ │ ├── common │ │ │ ├── __init__.py │ │ │ └── case_duration.py │ │ │ ├── log │ │ │ ├── __init__.py │ │ │ ├── case_arrival.py │ │ │ └── case_statistics.py │ │ │ └── pandas │ │ │ ├── __init__.py │ │ │ ├── case_arrival.py │ │ │ └── case_statistics.py │ ├── util │ │ ├── __init__.py │ │ └── times_bipartite_matching.py │ └── variants │ │ ├── __init__.py │ │ ├── log │ │ ├── __init__.py │ │ └── get.py │ │ └── pandas │ │ ├── __init__.py │ │ └── get.py ├── stats.py ├── streaming │ ├── __init__.py │ ├── algo │ │ ├── __init__.py │ │ ├── conformance │ │ │ ├── __init__.py │ │ │ ├── declare │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── automata.py │ │ │ ├── footprints │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── classic.py │ │ │ ├── tbr │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── classic.py │ │ │ └── temporal │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── classic.py │ │ ├── discovery │ │ │ ├── __init__.py │ │ │ └── dfg │ │ │ │ ├── __init__.py │ │ │ │ ├── algorithm.py │ │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── frequency.py │ │ └── interface.py │ ├── connectors │ │ ├── __init__.py │ │ └── windows │ │ │ ├── __init__.py │ │ │ └── click_key_logger.py │ ├── conversion │ │ ├── __init__.py │ │ ├── from_pandas.py │ │ └── ocel_flatts_distributor.py │ ├── importer │ │ ├── __init__.py │ │ ├── csv │ │ │ ├── __init__.py │ │ │ ├── importer.py │ │ │ └── variants │ │ │ │ ├── __init__.py │ │ │ │ └── csv_event_stream.py │ │ └── xes │ │ │ ├── __init__.py │ │ │ ├── importer.py │ │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── xes_event_stream.py │ │ │ └── xes_trace_stream.py │ ├── stream │ │ ├── __init__.py │ │ ├── live_event_stream.py │ │ └── live_trace_stream.py │ └── util │ │ ├── __init__.py │ │ ├── dictio │ │ ├── __init__.py │ │ ├── generator.py │ │ └── versions │ │ │ ├── __init__.py │ │ │ ├── classic.py │ │ │ ├── redis.py │ │ │ └── thread_safe.py │ │ ├── event_stream_printer.py │ │ ├── live_to_static_stream.py │ │ └── trace_stream_printer.py ├── util │ ├── __init__.py │ ├── business_hours.py │ ├── colors.py │ ├── compression │ │ ├── __init__.py │ │ ├── dtypes.py │ │ └── util.py │ ├── constants.py │ ├── dt_parsing │ │ ├── __init__.py │ │ ├── parser.py │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── cs8601.py │ │ │ ├── dummy.py │ │ │ └── strpfromiso.py │ ├── exec_utils.py │ ├── hie_utils.py │ ├── labels_similarity.py │ ├── lp │ │ ├── __init__.py │ │ ├── solver.py │ │ ├── util │ │ │ └── __init__.py │ │ └── variants │ │ │ ├── __init__.py │ │ │ ├── cvxopt_solver.py │ │ │ ├── cvxopt_solver_custom_align.py │ │ │ ├── cvxopt_solver_custom_align_ilp.py │ │ │ ├── pulp_solver.py │ │ │ └── scipy_solver.py │ ├── ml_utils.py │ ├── nx_utils.py │ ├── pandas_utils.py │ ├── points_subset.py │ ├── regex.py │ ├── string_distance.py │ ├── typing.py │ ├── variants_util.py │ ├── vis_utils.py │ └── xes_constants.py ├── utils.py ├── vis.py ├── visualization │ ├── __init__.py │ ├── align_table │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ └── classic.py │ │ └── visualizer.py │ ├── bpmn │ │ ├── __init__.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ └── dagrejs_base.html │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── classic.py │ │ │ └── dagrejs.py │ │ └── visualizer.py │ ├── common │ │ ├── __init__.py │ │ ├── dot_util.py │ │ ├── gview.py │ │ ├── html.py │ │ ├── save.py │ │ ├── svg_pos_parser.py │ │ ├── utils.py │ │ └── visualizer.py │ ├── decisiontree │ │ ├── __init__.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ └── dt_to_string.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ └── classic.py │ │ └── visualizer.py │ ├── dfg │ │ ├── __init__.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ └── dfg_gviz.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── cost.py │ │ │ ├── frequency.py │ │ │ ├── performance.py │ │ │ └── timeline.py │ │ └── visualizer.py │ ├── dotted_chart │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ └── classic.py │ │ └── visualizer.py │ ├── footprints │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── comparison.py │ │ │ ├── comparison_symmetric.py │ │ │ └── single.py │ │ └── visualizer.py │ ├── graphs │ │ ├── __init__.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ └── common.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── attributes.py │ │ │ ├── barplot.py │ │ │ ├── cases.py │ │ │ └── dates.py │ │ └── visualizer.py │ ├── heuristics_net │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ └── pydotplus_vis.py │ │ └── visualizer.py │ ├── network_analysis │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── frequency.py │ │ │ └── performance.py │ │ └── visualizer.py │ ├── networkx │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ └── digraph.py │ │ └── visualizer.py │ ├── ocel │ │ ├── __init__.py │ │ ├── eve_to_obj_types │ │ │ ├── __init__.py │ │ │ ├── variants │ │ │ │ ├── __init__.py │ │ │ │ └── graphviz.py │ │ │ └── visualizer.py │ │ ├── interleavings │ │ │ ├── __init__.py │ │ │ ├── variants │ │ │ │ ├── __init__.py │ │ │ │ └── graphviz.py │ │ │ └── visualizer.py │ │ ├── object_graph │ │ │ ├── __init__.py │ │ │ ├── variants │ │ │ │ ├── __init__.py │ │ │ │ └── graphviz.py │ │ │ └── visualizer.py │ │ ├── ocdfg │ │ │ ├── __init__.py │ │ │ ├── util │ │ │ │ ├── __init__.py │ │ │ │ └── elkjs_ocdfg.html │ │ │ ├── variants │ │ │ │ ├── __init__.py │ │ │ │ ├── classic.py │ │ │ │ └── elkjs.py │ │ │ └── visualizer.py │ │ └── ocpn │ │ │ ├── __init__.py │ │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── brachmann.py │ │ │ └── wo_decoration.py │ │ │ └── visualizer.py │ ├── performance_spectrum │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ └── neato.py │ │ └── visualizer.py │ ├── petri_net │ │ ├── __init__.py │ │ ├── common │ │ │ ├── __init__.py │ │ │ └── visualize.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ ├── alignments_decoration.py │ │ │ ├── performance_map.py │ │ │ └── vis_trans_shortest_paths.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── alignments.py │ │ │ ├── greedy_decoration_frequency.py │ │ │ ├── greedy_decoration_performance.py │ │ │ ├── token_decoration_frequency.py │ │ │ ├── token_decoration_performance.py │ │ │ └── wo_decoration.py │ │ └── visualizer.py │ ├── powl │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── basic.py │ │ │ ├── icons │ │ │ │ ├── __init__.py │ │ │ │ ├── end.svg │ │ │ │ ├── gate.svg │ │ │ │ ├── loop-tag.svg │ │ │ │ ├── loop.svg │ │ │ │ ├── play.svg │ │ │ │ ├── skip-loop-tag.svg │ │ │ │ ├── skip-tag.svg │ │ │ │ └── xor.svg │ │ │ └── net.py │ │ └── visualizer.py │ ├── process_tree │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── frequency_annotation.py │ │ │ ├── symbolic.py │ │ │ └── wo_decoration.py │ │ └── visualizer.py │ ├── sna │ │ ├── __init__.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── networkx.py │ │ │ └── pyvis.py │ │ └── visualizer.py │ ├── transition_system │ │ ├── __init__.py │ │ ├── util │ │ │ ├── __init__.py │ │ │ └── visualize_graphviz.py │ │ ├── variants │ │ │ ├── __init__.py │ │ │ ├── trans_frequency.py │ │ │ └── view_based.py │ │ └── visualizer.py │ └── trie │ │ ├── __init__.py │ │ ├── variants │ │ ├── __init__.py │ │ └── classic.py │ │ └── visualizer.py └── write.py ├── requirements.txt ├── requirements_complete.txt ├── requirements_stable.txt ├── safety_checks ├── 20220111 ├── 20220125 ├── 20220325 ├── 20220401 ├── 20220410 ├── 20220512 ├── 20220528 ├── 20220603 ├── 20220610 ├── 20220622 ├── 20220712 ├── 20220729 ├── 20220805 ├── 20220819 ├── 20220901 ├── 20221106 ├── 20221110 ├── 20221125 ├── 20221202 ├── 20221209 ├── 20221223 ├── 20230109 ├── 20230119 ├── 20230130 ├── 20230211 ├── 20230305 ├── 20230311 ├── 20230323 ├── 20230328 ├── 20230403 ├── 20230412 ├── 20230505 ├── 20230616 ├── 20230630 ├── 20230714 ├── 20230728 ├── 20230825 ├── 20230828 ├── 20230830 ├── 20230922 ├── 20231005 ├── 20231012 ├── 20231115 ├── 20231120 ├── 20231214 ├── 20231810 ├── 20240129 ├── 20240222 ├── 20240301 ├── 20240304 ├── 20240314 ├── 20240322 ├── 20240327 ├── 20240417 ├── 20240701 ├── 20240716 ├── 20240725 ├── 20241109 ├── 20250110 ├── 20250306 ├── 20250314 ├── 20250406 ├── 20250506 └── 20270524 ├── setup.py ├── tests ├── README.txt ├── __init__.py ├── algorithm_test.py ├── alignment_test.py ├── alpha_test.py ├── bpmn_tests.py ├── compressed_input_data │ ├── 01_running-example.xes.gz │ ├── 02_teleclaims.xes.gz │ ├── 03_repairExample.xes.gz │ ├── 04_reviewing.xes.gz │ ├── 05_bpic2017.xes.gz │ ├── 06_bpic2013_closed.xes.gz │ ├── 07_bpic2013_incidents.xes.gz │ ├── 08_receipt.xes.gz │ ├── 09_a32f0n00.xes.gz │ ├── 10_orders.xes.gz │ ├── 11_tickets.xes.gz │ ├── 12_roadtraffic_1t_per_variant.xes.gz │ ├── 13_SEPSIS_1t_per_variant.xes.gz │ ├── 14_Billing_1t_per_variant.xes.gz │ ├── 15_bpic2020_permit_log_1t_per_variant.xes.gz │ ├── 16_bpic2019_1t_per_variant.xes.gz │ ├── 17_bpic2012_1t_per_variant.xes.gz │ ├── 18_bpic2017_application_1t_per_variant.xes.gz │ ├── 19_roadtraffic_1t_per_variant.xes.gz │ ├── DISCLAIMER │ └── models │ │ ├── activity_classifier │ │ ├── 01_running-example-im.ptml │ │ ├── 01_running-example-imf.ptml │ │ ├── 05_bpic2017-im.ptml │ │ ├── 05_bpic2017-imf.ptml │ │ ├── 06_bpic2013_closed-im.ptml │ │ ├── 06_bpic2013_closed-imf.ptml │ │ ├── 07_bpic2013_incidents-im.ptml │ │ ├── 07_bpic2013_incidents-imf.ptml │ │ ├── 08_receipt-im.ptml │ │ ├── 08_receipt-imf.ptml │ │ ├── 09_a32f0n00-im.ptml │ │ ├── 09_a32f0n00-imf.ptml │ │ ├── 10_orders-im.ptml │ │ ├── 10_orders-imf.ptml │ │ ├── 11_tickets-im.ptml │ │ ├── 11_tickets-imf.ptml │ │ ├── 12_roadtraffic_1t_per_variant-im.ptml │ │ ├── 12_roadtraffic_1t_per_variant-imf.ptml │ │ ├── 13_SEPSIS_1t_per_variant-im.ptml │ │ ├── 13_SEPSIS_1t_per_variant-imf.ptml │ │ ├── 14_Billing_1t_per_variant-im.ptml │ │ ├── 14_Billing_1t_per_variant-imf.ptml │ │ ├── 15_bpic2020_permit_log_1t_per_variant-im.ptml │ │ ├── 15_bpic2020_permit_log_1t_per_variant-imf.ptml │ │ ├── 16_bpic2019_1t_per_variant-im.ptml │ │ ├── 16_bpic2019_1t_per_variant-imf.ptml │ │ ├── 18_bpic2017_application_1t_per_variant-im.ptml │ │ ├── 18_bpic2017_application_1t_per_variant-imf.ptml │ │ ├── 19_roadtraffic_1t_per_variant-im.ptml │ │ └── 19_roadtraffic_1t_per_variant-imf.ptml │ │ └── activity_lifecycle_classifier │ │ ├── 02_teleclaims-im.ptml │ │ ├── 02_teleclaims-imf.ptml │ │ ├── 03_repairExample-im.ptml │ │ ├── 03_repairExample-imf.ptml │ │ ├── 04_reviewing-im.ptml │ │ ├── 04_reviewing-imf.ptml │ │ ├── 17_bpic2012_1t_per_variant-im.ptml │ │ └── 17_bpic2012_1t_per_variant-imf.ptml ├── constants.py ├── csv_impexp_test.py ├── dec_tree_test.py ├── dfg_tests.py ├── diagn_df_conf_checking.py ├── doc_tests.py ├── etc_tests.py ├── evaluation_tests.py ├── execute_tests.py ├── filtering_log_test.py ├── filtering_pandas_test.py ├── graphs_forming.py ├── heuminer_test.py ├── imp_everything.py ├── imp_exp_from_string.py ├── inductive_test.py ├── inductive_tree_test.py ├── input_data │ ├── a32f0n00.bpmn │ ├── bpic2012.xes.gz │ ├── correlation_mining.csv │ ├── data_petri_net.pnml │ ├── db │ │ ├── Chinook_Sqlite.sqlite │ │ ├── MIT_LICENSE_Chinook.md │ │ ├── MIT_LICENSE_SQLite.md │ │ └── northwind.sqlite │ ├── ex1.pnml │ ├── ex2.pnml │ ├── fairness │ │ ├── hiring_log_high.xes.gz │ │ ├── hospital_log_high.xes.gz │ │ ├── lending_log_high.xes.gz │ │ └── renting_log_high.xes.gz │ ├── helpdesk.xes.gz │ ├── interleavings │ │ ├── case_relations.csv │ │ ├── receipt_even.csv │ │ └── receipt_odd.csv │ ├── interval_event_log.csv │ ├── interval_event_log.xes │ ├── more_models │ │ ├── SampleNet.pnml │ │ ├── SimpleParallel.bpmn │ │ ├── Subprocess1.bpmn │ │ ├── Subprocess3.bpmn │ │ ├── ch7_CreditAppSimulation.bpmn │ │ ├── ch7_InsuranceClaimsSimulationNormalSeason.bpmn │ │ └── simple_model.bpmn │ ├── ocel │ │ ├── VBFA.zip │ │ ├── example_log.csv │ │ ├── example_log.jsonocel │ │ ├── example_log.sqlite │ │ ├── example_log.xmlocel │ │ ├── example_log_2.csv │ │ ├── newocel.csv │ │ ├── newocel.jsonocel │ │ ├── newocel.sqlite │ │ ├── ocel2-validation.xsd │ │ ├── ocel20_example.jsonocel │ │ ├── ocel20_example.sqlite │ │ ├── ocel20_example.xmlocel │ │ ├── ocel_order_simulated.csv │ │ ├── recruiting-red.jsonocel │ │ ├── schema.json │ │ ├── schema.xml │ │ ├── schema_ocel2.json │ │ └── validation │ │ │ ├── schema.json │ │ │ └── schema.xml │ ├── partial order example 3.xes │ ├── partial order example.xes │ ├── receipt.bpmn │ ├── receipt.csv │ ├── receipt.parquet │ ├── receipt.xes │ ├── receipt_one_variant.pnml │ ├── reviewing.csv │ ├── reviewing.xes │ ├── roadtraffic.parquet │ ├── roadtraffic.pnml │ ├── roadtraffic100traces.csv │ ├── roadtraffic100traces.xes │ ├── roadtraffic50traces.xes │ ├── running-example-transformed.csv │ ├── running-example.bpmn │ ├── running-example.csv │ ├── running-example.dfg │ ├── running-example.parquet │ ├── running-example.pnml │ ├── running-example.ptml │ ├── running-example.xes │ ├── stochastic_running_example.pnml │ ├── synthetic_logs │ │ ├── a12 │ │ │ ├── a12.pnml │ │ │ ├── a12.ptml │ │ │ ├── a12f0n00.xes.gz │ │ │ ├── a12f0n05.xes.gz │ │ │ ├── a12f0n10.xes.gz │ │ │ ├── a12f0n20.xes.gz │ │ │ └── a12f0n50.xes.gz │ │ ├── a22 │ │ │ ├── a22.pnml │ │ │ ├── a22.ptml │ │ │ ├── a22f0n00.xes.gz │ │ │ ├── a22f0n05.xes.gz │ │ │ ├── a22f0n10.xes.gz │ │ │ ├── a22f0n20.xes.gz │ │ │ └── a22f0n50.xes.gz │ │ ├── a32 │ │ │ ├── a32.pnml │ │ │ ├── a32.ptml │ │ │ ├── a32f0n00.xes.gz │ │ │ ├── a32f0n05.xes.gz │ │ │ ├── a32f0n10.xes.gz │ │ │ ├── a32f0n20.xes.gz │ │ │ └── a32f0n50.xes.gz │ │ └── a42 │ │ │ ├── a42.pnml │ │ │ ├── a42.ptml │ │ │ ├── a42f0n00.xes.gz │ │ │ ├── a42f0n05.xes.gz │ │ │ ├── a42f0n10.xes.gz │ │ │ ├── a42f0n20.xes.gz │ │ │ └── a42f0n50.xes.gz │ ├── tree_ex_with_loops.ptml │ ├── tree_ex_wo_loops.ptml │ └── xes_20.xes ├── llm_test.py ├── main_fac_test.py ├── ocel_discovery_test.py ├── ocel_filtering_test.py ├── other_tests.py ├── passed_time.py ├── petri_imp_exp_test.py ├── pm_extr_test │ ├── bas_inductive_test.py │ ├── bpmn_heu_massive_test.py │ ├── bpmn_pt_massive_test.py │ ├── bpmn_pt_net_massive_test.py │ ├── extraction_test.py │ └── report.txt ├── role_detection.py ├── simplified_interface.py ├── simplified_interface_2.py ├── simulation_test.py ├── sna_test.py ├── statistics_df_test.py ├── statistics_log_test.py ├── test_cli.py ├── test_output_data │ └── README.txt ├── trans_syst_tests.py ├── woflan_tests.py ├── xes_impexp_test.py ├── xes_importer_tests │ ├── attributeEventSwapped.xes │ ├── attributeTraceSwapped.xes │ ├── attributeValuesSwapped.xes │ ├── booleanCorrectValue.xes │ ├── booleanIncorrectValue.xes │ ├── classifierAttributeSwapped.xes │ ├── classifierCorrectAttributes.xes │ ├── classifierEmptyKeys.xes │ ├── classifierEventCorrectAttributes.xes │ ├── classifierEventSwapped.xes │ ├── classifierIncorrectKey.xes │ ├── classifierIncorrectScope.xes │ ├── classifierNoAttributes.xes │ ├── classifierTooManyAttributes.xes │ ├── classifierTraceCorrectAttributes.xes │ ├── classifierTraceSwapped.xes │ ├── dateCorrectValue.xes │ ├── dateIncorrectValue.xes │ ├── dateNoTZD.xes │ ├── elementIncorrect.xes │ ├── eventCorrectAttributes.xes │ ├── eventIdenticalAttributes.xes │ ├── eventIncorrectType.xes │ ├── eventTooManyAttributes.xes │ ├── extensionAttributeSwapped.xes │ ├── extensionClassifierSwapped.xes │ ├── extensionCorrectAttributes.xes │ ├── extensionEventSwapped.xes │ ├── extensionGlobalSwapped.xes │ ├── extensionIncorrectKey.xes │ ├── extensionNoAttributes.xes │ ├── extensionNotDeclared.xes │ ├── extensionStandard.xes │ ├── extensionTooManyAttributes.xes │ ├── extensionTraceSwapped.xes │ ├── globalAttributeSwapped.xes │ ├── globalClassifierSwapped.xes │ ├── globalEventStringCorrectAttributes.xes │ ├── globalEventSwapped.xes │ ├── globalIncorrectScope.xes │ ├── globalNoAttributes.xes │ ├── globalStringCorrectAttributes.xes │ ├── globalStringNoAttributes.xes │ ├── globalStringTooManyAttributes.xes │ ├── globalTooManyAttributes.xes │ ├── globalTraceStringCorrectAttributes.xes │ ├── globalTraceSwapped.xes │ ├── idCorrectValue.xes │ ├── idIncorrectValue.xes │ ├── intCorrectValue.xes │ ├── intIncorrectValue.xes │ ├── listEmptyValues.xes │ ├── listNoValues.xes │ ├── listTwoValues.xes │ ├── logCorrectAttributes.xes │ ├── logNoAttributes.xes │ ├── logNoNestedAttributes.xes │ ├── logOutOfPlace.xes │ ├── logTooManyAttributes.xes │ ├── noLog.xes │ ├── realCorrectValue.xes │ ├── realIncorrectValue.xes │ ├── stringCorrectAttributes.xes │ ├── stringNestedNotDeclared.xes │ ├── stringNoAttributes.xes │ ├── stringNotNestedButDeclared.xes │ ├── stringTooManyAttributes.xes │ ├── traceCorrectAttributes.xes │ ├── traceEventSwapped.xes │ ├── traceOutOfPlace.xes │ └── traceTooManyAttributes.xes ├── xescert_exportlogs │ └── README.txt ├── xescert_images │ └── README.txt ├── xescerttest.py └── xesinput │ └── README.txt └── third_party ├── LICENSES_TRANSITIVE.md ├── cvxopt.LICENSE ├── deprecation.LICENSE ├── generate_dependencies.py ├── graphviz.LICENSE ├── intervaltree.LICENSE ├── jsonpickle.LICENSE ├── lxml.LICENSE ├── matplotlib.LICENSE ├── networkx.LICENSE ├── numpy.LICENSE ├── old_python_deps ├── optional_py38.txt └── requirements_py38.txt ├── pandas.LICENSE ├── pydotplus.LICENSE ├── pytz.LICENSE ├── pyvis.LICENSE ├── scipy.LICENSE ├── sympy.LICENSE └── tqdm.LICENSE /MANIFEST.in: -------------------------------------------------------------------------------- 1 | recursive-include pm4py *.svg 2 | recursive-include pm4py *.html 3 | -------------------------------------------------------------------------------- /docs/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 5eb7f31d57fb2354f38aa0b1fbc31deb 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/docs/.nojekyll -------------------------------------------------------------------------------- /docs/HOWTO.txt: -------------------------------------------------------------------------------- 1 | This document describes how to generate API documentation using sphinx. 2 | 3 | First, install sphinx (we assume you are able to do this via the official sphinx website). 4 | 5 | To generate the docs perform the following steps. 6 | 1. First create all the actuall .rst files that define all the documentation. 7 | In cmd/terminal browse to the docs folder (this folder ;-)) and run: 8 | > sphinx-apidoc --module-first -o source ../ 9 | You can optionally opt to choose to remove all the .rst files from the source folder (except for index.rst!!!!) 10 | 11 | 2. Generate corresponding html files: 12 | make html 13 | -------------------------------------------------------------------------------- /docs/LICENSE_HEADER_GITHUB.txt: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SPHINXPROJ = pm4py 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # PM4Py Documentation 2 | 3 | See the website [Process Intelligence Solutions](https://processintelligence.solutions/pm4py). 4 | -------------------------------------------------------------------------------- /docs/header_script.py: -------------------------------------------------------------------------------- 1 | import glob 2 | 3 | if __name__ == '__main__': 4 | LICENSE_HEADER_FILE_PATH = r'LICENSE_HEADER_GITHUB.txt' 5 | with open(LICENSE_HEADER_FILE_PATH, 'r') as license_file: 6 | license = license_file.read() 7 | for filename in glob.iglob('../pm4py/' + '**/*.py', recursive=True): 8 | with open(filename, 'r', encoding='utf-8') as original: 9 | data = original.read() 10 | if "Copyright (C) 2024 Process Intelligence Solutions UG" not in data: 11 | with open(filename, 'w', encoding='utf-8') as modified: 12 | print('adding license to: ' + filename) 13 | modified.write(license + '\n' + data) 14 | else: 15 | print('skipping: ' + filename) 16 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | set SPHINXPROJ=pm4py 13 | 14 | if "%1" == "" goto help 15 | 16 | %SPHINXBUILD% >NUL 2>NUL 17 | if errorlevel 9009 ( 18 | echo. 19 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 20 | echo.installed, then set the SPHINXBUILD environment variable to point 21 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 22 | echo.may add the Sphinx directory to PATH. 23 | echo. 24 | echo.If you don't have Sphinx installed, grab it from 25 | echo.http://sphinx-doc.org/ 26 | exit /b 1 27 | ) 28 | 29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 30 | goto end 31 | 32 | :help 33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 34 | 35 | :end 36 | popd 37 | -------------------------------------------------------------------------------- /docs/source/.gitignore: -------------------------------------------------------------------------------- 1 | generated/* 2 | -------------------------------------------------------------------------------- /docs/source/_static/css/custom.css: -------------------------------------------------------------------------------- 1 | .bd-header { 2 | display: none; 3 | } 4 | 5 | .bd-footer { 6 | display: none; 7 | } 8 | -------------------------------------------------------------------------------- /docs/source/examples.rst: -------------------------------------------------------------------------------- 1 | Examples 2 | =========== 3 | 4 | Filtering XYZ 5 | ------------- 6 | 7 | Decision Point Analysis 8 | ----------------------- 9 | 10 | Computing a DFG with Performance Overlay 11 | ---------------------------------------- 12 | -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | Welcome to PM4Py's Documentation! 2 | =================================== 3 | 4 | ``PM4Py`` is a Python library implementing a variety of `process mining `_ algorithms. 5 | 6 | A simple example of ``PM4Py`` in action: 7 | 8 | .. code-block:: python 9 | 10 | import pm4py 11 | 12 | if __name__ == "__main__": 13 | log = pm4py.read_xes('') 14 | process_model = pm4py.discover_bpmn_inductive(log) 15 | pm4py.view_bpmn(process_model) 16 | 17 | In this documentation, you can find all relevant information to set up ``PM4Py`` and start your process mining journey. 18 | Please consult the contents listed below to navigate the documentation. 19 | 20 | Happy #ProcessMining! 21 | 22 | 23 | Contents 24 | -------- 25 | 26 | .. toctree:: 27 | :maxdepth: 2 28 | 29 | install 30 | getting_started 31 | api 32 | release_notes 33 | -------------------------------------------------------------------------------- /docs/source/install.rst: -------------------------------------------------------------------------------- 1 | ```rst 2 | Installation 3 | =========== 4 | 5 | pip 6 | --- 7 | 8 | To use ``PM4Py`` on any OS, install it using ``pip``: 9 | 10 | .. code-block:: console 11 | 12 | (.venv) $ pip install pm4py 13 | 14 | ``PM4Py`` uses the ``Graphviz`` library for rendering visualizations. 15 | Please install `Graphviz `_. 16 | 17 | After installation, Graphviz is located in the ``program files`` directory. 18 | The ``bin\`` folder of the Graphviz directory needs to be added manually to the ``system path``. 19 | In order to do so, please follow `this instruction `_. 20 | 21 | Docker 22 | ------ 23 | To install PM4Py via Docker, use: 24 | 25 | .. code-block:: console 26 | 27 | $ docker pull pm4py/pm4py-core:latest 28 | 29 | To run PM4Py via Docker, use: 30 | 31 | .. code-block:: console 32 | 33 | $ docker run -it pm4py/pm4py-core:latest bash 34 | ``` -------------------------------------------------------------------------------- /docs/source/modules.rst: -------------------------------------------------------------------------------- 1 | pm4py-source 2 | ============ 3 | 4 | .. toctree:: 5 | :maxdepth: 4 6 | 7 | pm4py 8 | -------------------------------------------------------------------------------- /docs/source/pm4py-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/docs/source/pm4py-logo.png -------------------------------------------------------------------------------- /examples/CHECK_MISSING.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | if __name__ == "__main__": 5 | files = [x.split(".")[0] for x in os.listdir(".") if x.endswith(".py") and not "execute_everything" in x and not "CHECK_MISSING" in x] 6 | contents_ex_everything = open("execute_everything.py", "r").read() 7 | for f in files: 8 | if f not in contents_ex_everything: 9 | print(f) 10 | -------------------------------------------------------------------------------- /examples/activities_to_alphabet.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.objects.log.util import activities_to_alphabet 3 | from pm4py.util import constants 4 | 5 | 6 | def execute_script(): 7 | dataframe = pm4py.read_xes("../tests/input_data/running-example.xes", return_legacy_log_object=False) 8 | renamed_dataframe = activities_to_alphabet.apply(dataframe, parameters={constants.PARAMETER_CONSTANT_ACTIVITY_KEY: "concept:name"}) 9 | print(renamed_dataframe) 10 | 11 | 12 | if __name__ == "__main__": 13 | execute_script() 14 | -------------------------------------------------------------------------------- /examples/activity_position.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.util import constants, pandas_utils 3 | from pm4py.objects.log.util import dataframe_utils 4 | import os 5 | 6 | 7 | def execute_script(): 8 | dataframe = pandas_utils.read_csv(os.path.join("..", "tests", "input_data", "receipt.csv")) 9 | dataframe = dataframe_utils.convert_timestamp_columns_in_df(dataframe, timest_format=constants.DEFAULT_TIMESTAMP_PARSE_FORMAT, timest_columns=["time:timestamp"]) 10 | # prints the summary of the positions of two activities 11 | print(pm4py.get_activity_position_summary(dataframe, "Confirmation of receipt")) 12 | print(pm4py.get_activity_position_summary(dataframe, "T02 Check confirmation of receipt")) 13 | 14 | 15 | if __name__ == "__main__": 16 | execute_script() 17 | -------------------------------------------------------------------------------- /examples/all_optimal_alignments.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.conformance.alignments.petri_net.variants import generator_dijkstra_less_memory 3 | import os 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "running-example.xes"), return_legacy_log_object=True) 8 | 9 | net, im, fm = pm4py.discover_petri_net_inductive(log) 10 | 11 | for trace in log: 12 | print("\n\n") 13 | for ali in generator_dijkstra_less_memory.apply(trace, net, im, fm): 14 | print(ali) 15 | 16 | 17 | if __name__ == "__main__": 18 | execute_script() 19 | -------------------------------------------------------------------------------- /examples/backwards_token_replay.py: -------------------------------------------------------------------------------- 1 | from pm4py.objects.log.importer.xes import importer as xes_importer 2 | from pm4py.algo.discovery.inductive import algorithm as inductive_miner 3 | from pm4py.algo.conformance.tokenreplay import algorithm as tr 4 | from pm4py.objects.conversion.process_tree import converter as process_tree_converter 5 | import os 6 | 7 | 8 | def execute_script(): 9 | log = xes_importer.apply(os.path.join("..", "tests", "input_data", "running-example.xes")) 10 | process_tree = inductive_miner.apply(log) 11 | net, im, fm = process_tree_converter.apply(process_tree) 12 | # perform the backwards token-based replay 13 | replayed_traces = tr.apply(log, net, im, fm, variant=tr.Variants.BACKWARDS) 14 | print(replayed_traces) 15 | 16 | 17 | if __name__ == "__main__": 18 | execute_script() 19 | -------------------------------------------------------------------------------- /examples/batch_detection.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.discovery.batches import algorithm 3 | import os 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 8 | # detect the batches from the event log 9 | batches = algorithm.apply(log) 10 | # print the batches (complete information) in a single row 11 | print(batches) 12 | # print a summary information (size) for each activity-resource combination that is performed in batches 13 | for batch in batches: 14 | print(batch[0], batch[1]) 15 | 16 | 17 | if __name__ == "__main__": 18 | execute_script() 19 | -------------------------------------------------------------------------------- /examples/bpmn_from_pt_conversion.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import pm4py 4 | from pm4py.objects.conversion.process_tree import converter as pt_converter 5 | from pm4py.algo.discovery.inductive import algorithm as inductive_miner 6 | from pm4py.objects.log.importer.xes import importer as xes_import 7 | from pm4py.objects.bpmn.exporter import exporter as bpmn_exporter 8 | from examples import examples_conf 9 | import importlib.util 10 | 11 | 12 | 13 | def execute_script(): 14 | log_path = os.path.join(os.path.join("..", "tests", "input_data", "running-example.xes")) 15 | log = xes_import.apply(log_path) 16 | ptree = inductive_miner.apply(log) 17 | bpmn = pt_converter.apply(ptree, variant=pt_converter.Variants.TO_BPMN) 18 | 19 | if importlib.util.find_spec("graphviz"): 20 | bpmn_exporter.apply(bpmn, "stru.bpmn") 21 | os.remove("stru.bpmn") 22 | pm4py.view_bpmn(bpmn, format=examples_conf.TARGET_IMG_FORMAT) 23 | 24 | 25 | if __name__ == "__main__": 26 | execute_script() 27 | -------------------------------------------------------------------------------- /examples/bpmn_import_and_to_petri_net.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import pm4py 4 | from pm4py.objects.bpmn.importer import importer as bpmn_importer 5 | from pm4py.objects.conversion.bpmn import converter as bpmn_converter 6 | 7 | 8 | def execute_script(): 9 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "running-example.xes")) 10 | bpmn_graph = bpmn_importer.apply(os.path.join("..", "tests", "input_data", "running-example.bpmn")) 11 | net, im, fm = bpmn_converter.apply(bpmn_graph, variant=bpmn_converter.Variants.TO_PETRI_NET) 12 | precision_tbr = pm4py.precision_token_based_replay(log, net, im, fm) 13 | print("precision", precision_tbr) 14 | fitness_tbr = pm4py.precision_token_based_replay(log, net, im, fm) 15 | print("fitness", fitness_tbr) 16 | print(pm4py.check_soundness(net, im, fm)) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/bpmn_js_visualization.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import importlib.util 3 | 4 | 5 | def execute_script(): 6 | log = pm4py.read_xes("../tests/input_data/running-example.xes") 7 | 8 | bpmn_model = pm4py.discover_bpmn_inductive(log) 9 | 10 | if importlib.util.find_spec("graphviz"): 11 | pm4py.view_bpmn(bpmn_model, variant_str="dagrejs") 12 | 13 | 14 | if __name__ == "__main__": 15 | execute_script() 16 | -------------------------------------------------------------------------------- /examples/case_overlap_stat.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from pm4py.statistics.overlap.cases.log import get as case_overlap_get 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 8 | # calculates the WIP statistics from the event log object. 9 | # The WIP statistic associates to each case the number of cases open during the lifecycle of the case 10 | wip = case_overlap_get.apply(log) 11 | print(wip) 12 | 13 | 14 | if __name__ == "__main__": 15 | execute_script() 16 | -------------------------------------------------------------------------------- /examples/consecutive_act_case_grouping_filter.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.filtering.pandas.consecutive_act_case_grouping import consecutive_act_case_grouping_filter 3 | 4 | 5 | def execute_script(): 6 | dataframe = pm4py.read_xes("../tests/input_data/receipt.xes") 7 | print(dataframe) 8 | filtered_dataframe = consecutive_act_case_grouping_filter.apply(dataframe) 9 | print(filtered_dataframe) 10 | 11 | 12 | if __name__ == "__main__": 13 | execute_script() 14 | -------------------------------------------------------------------------------- /examples/cost_based_dfg.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from pm4py.algo.discovery.dfg.adapters.pandas import df_statistics 4 | from examples import examples_conf 5 | import importlib.util 6 | 7 | 8 | def execute_script(): 9 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "roadtraffic100traces.xes"), return_legacy_log_object=False) 10 | cost_based_dfg = df_statistics.get_dfg_graph(log, measure="cost", cost_attribute="amount") 11 | 12 | if importlib.util.find_spec("graphviz"): 13 | from pm4py.visualization.dfg import visualizer as dfg_visualizer 14 | gviz = dfg_visualizer.apply(cost_based_dfg, variant=dfg_visualizer.Variants.COST, parameters={"format": examples_conf.TARGET_IMG_FORMAT}) 15 | dfg_visualizer.view(gviz) 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/cycle_time.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import pm4py 4 | from pm4py.statistics.traces.cycle_time.log import get as cycle_time_get 5 | 6 | 7 | def execute_script(): 8 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "interval_event_log.xes")) 9 | print(cycle_time_get.apply(log, parameters={cycle_time_get.Parameters.START_TIMESTAMP_KEY: "start_timestamp", 10 | cycle_time_get.Parameters.TIMESTAMP_KEY: "time:timestamp"})) 11 | 12 | 13 | if __name__ == "__main__": 14 | execute_script() 15 | -------------------------------------------------------------------------------- /examples/dataframe_prefix_and_fea_extraction.py: -------------------------------------------------------------------------------- 1 | from pm4py.objects.log.util import dataframe_utils 2 | from pm4py.util import pandas_utils, constants 3 | 4 | 5 | def execute_script(): 6 | # loads a dataframe. setup dates 7 | df = pandas_utils.read_csv("../tests/input_data/receipt.csv") 8 | df = dataframe_utils.convert_timestamp_columns_in_df(df, timest_format=constants.DEFAULT_TIMESTAMP_PARSE_FORMAT) 9 | print(df) 10 | # insert the case index in the dataframe 11 | df = pandas_utils.insert_ev_in_tr_index(df, case_id="case:concept:name", column_name="@@index_in_trace") 12 | # filter all the prefixes of length 5 from the dataframe 13 | df = df[df["@@index_in_trace"] <= 5] 14 | print(df) 15 | # performs the automatic feature extraction 16 | fea_df = dataframe_utils.automatic_feature_extraction_df(df) 17 | print("\nfea_df =") 18 | print(fea_df) 19 | print(fea_df.columns) 20 | 21 | 22 | if __name__ == "__main__": 23 | execute_script() 24 | -------------------------------------------------------------------------------- /examples/declare_simple.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | """ 6 | Example script to discover a DECLARE model from an event log, 7 | obtain its textual (LLM) abstraction, and perform conformance checking. 8 | """ 9 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 10 | 11 | declare_model = pm4py.discover_declare(log) 12 | print(declare_model) 13 | 14 | # prints a textual abstraction of the declare model that can be provided to GPT 15 | text_abstr = pm4py.llm.abstract_declare(declare_model) 16 | print(text_abstr) 17 | 18 | # provides conformance checking based on the DECLARE model 19 | conf_result = pm4py.conformance_declare(log, declare_model, return_diagnostics_dataframe=True) 20 | print(conf_result) 21 | 22 | 23 | if __name__ == "__main__": 24 | execute_script() 25 | -------------------------------------------------------------------------------- /examples/df_to_log_postpro.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.util import constants, pandas_utils 3 | from pm4py.objects.conversion.log import converter as log_converter 4 | import os 5 | 6 | 7 | def execute_script(): 8 | dataframe = pandas_utils.read_csv(os.path.join("..", "tests", "input_data", "running-example.csv")) 9 | dataframe = pm4py.format_dataframe(dataframe, timest_format=constants.DEFAULT_TIMESTAMP_PARSE_FORMAT) 10 | log = log_converter.apply(dataframe, variant=log_converter.Variants.TO_EVENT_LOG, parameters={"stream_postprocessing": False}) 11 | pm4py.write_xes(log, "non_postprocessed.xes") 12 | log = log_converter.apply(dataframe, variant=log_converter.Variants.TO_EVENT_LOG, parameters={"stream_postprocessing": True}) 13 | pm4py.write_xes(log, "postprocessed.xes") 14 | os.remove("non_postprocessed.xes") 15 | os.remove("postprocessed.xes") 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/dfg_filt_act_paths_perc.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from examples import examples_conf 3 | import importlib.util 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 8 | dfg, start_act, end_act = pm4py.discover_dfg(log) 9 | # keep the specified amount of activities 10 | dfg, start_act, end_act = pm4py.filter_dfg_activities_percentage(dfg, start_act, end_act, percentage=0.3) 11 | # keep the specified amount of paths 12 | dfg, start_act, end_act = pm4py.filter_dfg_paths_percentage(dfg, start_act, end_act, percentage=0.3) 13 | 14 | if importlib.util.find_spec("graphviz"): 15 | # view the DFG 16 | pm4py.view_dfg(dfg, start_act, end_act, format="svg") 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/discovery_data_petri_net.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.decision_mining import algorithm as decision_mining 3 | from examples import examples_conf 4 | import os 5 | import importlib.util 6 | 7 | 8 | def execute_script(): 9 | log_path = os.path.join("..", "tests", "input_data", "roadtraffic100traces.xes") 10 | log = pm4py.read_xes(log_path) 11 | net, im, fm = pm4py.discover_petri_net_inductive(log) 12 | net, im, fm = decision_mining.create_data_petri_nets_with_decisions(log, net, im, fm) 13 | 14 | if importlib.util.find_spec("graphviz"): 15 | pm4py.view_petri_net(net, im, fm, format=examples_conf.TARGET_IMG_FORMAT) 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/dotted_chart.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from examples import examples_conf 3 | import importlib.util 4 | import os 5 | 6 | 7 | def execute_script(): 8 | # reads a XES log 9 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 10 | 11 | if importlib.util.find_spec("graphviz"): 12 | # generates the default dotted chart (timestamp on X-axis, case ID on Y-axis, activity as color) 13 | pm4py.view_dotted_chart(log, format=examples_conf.TARGET_IMG_FORMAT) 14 | # generates the dotted chart with the activity on the X-axis, the resource on the Y-axis, and the group 15 | # as color 16 | pm4py.view_dotted_chart(log, format=examples_conf.TARGET_IMG_FORMAT, attributes=["concept:name", "org:resource", "org:group"]) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/enrich_log_with_align.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from pm4py.algo.conformance.alignments.petri_net import algorithm as alignments 4 | from pm4py.algo.conformance.alignments.petri_net.utils import log_enrichment 5 | from pm4py.objects.log.importer.xes import importer as xes_importer 6 | 7 | 8 | def execute_script(): 9 | log = xes_importer.apply(os.path.join("..", "tests", "input_data", "running-example.xes")) 10 | filtered_log = pm4py.filter_variants_top_k(log, 1) 11 | net, im, fm = pm4py.discover_petri_net_inductive(filtered_log) 12 | aligned_traces = alignments.apply(log, net, im, fm, parameters={"ret_tuple_as_trans_desc": True}) 13 | enriched_log = log_enrichment.apply(log, aligned_traces) 14 | print(enriched_log) 15 | 16 | 17 | if __name__ == "__main__": 18 | execute_script() 19 | -------------------------------------------------------------------------------- /examples/ev_to_obj_types_graph.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from examples import examples_conf 3 | import importlib.util 4 | 5 | 6 | def execute_script(): 7 | ocel = pm4py.read_ocel('../tests/input_data/ocel/example_log.jsonocel') 8 | 9 | if importlib.util.find_spec("graphviz"): 10 | from pm4py.visualization.ocel.eve_to_obj_types import visualizer 11 | gviz = visualizer.apply(ocel, parameters={"format": examples_conf.TARGET_IMG_FORMAT, "annotate_frequency": True}) 12 | visualizer.view(gviz) 13 | 14 | 15 | if __name__ == "__main__": 16 | execute_script() 17 | -------------------------------------------------------------------------------- /examples/example_check_fitness.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | import pm4py 4 | from pm4py.objects.log.util import filtering_utils 5 | 6 | 7 | def execute_script(): 8 | log = pm4py.read_xes("../tests/compressed_input_data/02_teleclaims.xes.gz") 9 | tree = pm4py.discover_process_tree_inductive(log, noise_threshold=0.3) 10 | net, im, fm = pm4py.convert_to_petri_net(tree) 11 | # reduce the log to one trace per variant 12 | log = filtering_utils.keep_one_trace_per_variant(log) 13 | for index, trace in enumerate(log): 14 | print(index) 15 | aa = time.time() 16 | check_tree = pm4py.check_is_fitting(trace, tree) 17 | bb = time.time() 18 | check_petri = pm4py.check_is_fitting(trace, net, im, fm) 19 | cc = time.time() 20 | print("check on tree: ", check_tree, "time", bb - aa) 21 | print("check on Petri net: ", check_petri, "time", cc - bb) 22 | print() 23 | 24 | 25 | if __name__ == "__main__": 26 | execute_script() 27 | -------------------------------------------------------------------------------- /examples/examples_conf.py: -------------------------------------------------------------------------------- 1 | TARGET_IMG_FORMAT = "svg" 2 | -------------------------------------------------------------------------------- /examples/feature_extraction.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.transformation.log_to_features import algorithm as feature_extraction 3 | import os 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "running-example.xes")) 8 | data, feature_names = feature_extraction.apply(log, variant=feature_extraction.Variants.TRACE_BASED) 9 | print(data) 10 | print(feature_names) 11 | data, feature_names = feature_extraction.apply(log, variant=feature_extraction.Variants.EVENT_BASED) 12 | print(data) 13 | print(feature_names) 14 | 15 | 16 | if __name__ == "__main__": 17 | execute_script() 18 | -------------------------------------------------------------------------------- /examples/feature_extraction_case_loc.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 6 | fea_df = pm4py.extract_features_dataframe(log, include_case_id=True) 7 | # sets the case ID as index for the dataframe, so a row for a specific case 8 | # can be retrieved 9 | fea_df = fea_df.set_index("case:concept:name") 10 | # identifies the features for the case with identifier "case-10017" 11 | features_per_case = fea_df.loc["case-10017"].to_dict() 12 | print(features_per_case) 13 | 14 | 15 | if __name__ == "__main__": 16 | execute_script() 17 | -------------------------------------------------------------------------------- /examples/feature_extraction_ocel.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pm4py 3 | from pm4py.algo.transformation.ocel.features.events import algorithm as events_feature_extraction 4 | from pm4py.util import pandas_utils, constants 5 | 6 | 7 | def execute_script(): 8 | ocel = pm4py.read_ocel(os.path.join("..", "tests", "input_data", "ocel", "example_log.jsonocel")) 9 | # extracts some features on the objects and embed them in a Pandas dataframe 10 | objects_features_df = pm4py.extract_ocel_features(ocel, "element") 11 | print(objects_features_df) 12 | # extracts some features on the events and embed them in a Pandas dataframe 13 | data_events, feature_names_events = events_feature_extraction.apply(ocel) 14 | events_features_df = pandas_utils.instantiate_dataframe(data_events, columns=feature_names_events) 15 | print(events_features_df) 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/graphs_visualization.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import pm4py 4 | from examples import examples_conf 5 | import importlib.util 6 | 7 | 8 | def execute_script(): 9 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 10 | 11 | if importlib.util.find_spec("graphviz"): 12 | # visualize case duration graph 13 | pm4py.view_case_duration_graph(log, format=examples_conf.TARGET_IMG_FORMAT) 14 | 15 | # visualize events over time graph 16 | pm4py.view_events_per_time_graph(log, format=examples_conf.TARGET_IMG_FORMAT) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/hybrid_ilp_miner.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from examples import examples_conf 4 | import importlib.util 5 | 6 | 7 | 8 | def execute_script(): 9 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "running-example.xes")) 10 | net, im, fm = pm4py.discover_petri_net_ilp(log) 11 | 12 | if importlib.util.find_spec("graphviz"): 13 | pm4py.view_petri_net(net, im, fm, format=examples_conf.TARGET_IMG_FORMAT) 14 | 15 | 16 | if __name__ == "__main__": 17 | execute_script() 18 | -------------------------------------------------------------------------------- /examples/inductive_miner.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from examples import examples_conf 4 | import importlib.util 5 | 6 | 7 | 8 | def execute_script(): 9 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "running-example.xes")) 10 | tree = pm4py.discover_process_tree_inductive(log, noise_threshold=0.2) 11 | 12 | if importlib.util.find_spec("graphviz"): 13 | pm4py.view_process_tree(tree, format=examples_conf.TARGET_IMG_FORMAT) 14 | 15 | net, im, fm = pm4py.convert_to_petri_net(tree) 16 | 17 | if importlib.util.find_spec("graphviz"): 18 | pm4py.view_petri_net(net, im, fm, format=examples_conf.TARGET_IMG_FORMAT) 19 | 20 | 21 | if __name__ == "__main__": 22 | execute_script() 23 | -------------------------------------------------------------------------------- /examples/inductive_miner_dfg.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from pm4py.objects.dfg.obj import DFG 4 | from examples import examples_conf 5 | import importlib.util 6 | 7 | 8 | def execute_script(): 9 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "running-example.xes"), return_legacy_log_object=False) 10 | typed_dfg_1 = pm4py.discover_dfg_typed(log) 11 | # in alternative ... 12 | dfg, sa, ea = pm4py.discover_dfg(log) 13 | typed_dfg_2 = DFG(dfg, sa, ea) 14 | 15 | tree = pm4py.discover_process_tree_inductive(typed_dfg_2, noise_threshold=0.2) 16 | net, im, fm = pm4py.convert_to_petri_net(tree) 17 | 18 | if importlib.util.find_spec("graphviz"): 19 | pm4py.view_process_tree(tree, format=examples_conf.TARGET_IMG_FORMAT) 20 | pm4py.view_petri_net(net, im, fm, format=examples_conf.TARGET_IMG_FORMAT) 21 | 22 | 23 | if __name__ == "__main__": 24 | execute_script() 25 | -------------------------------------------------------------------------------- /examples/interval_events_overlap.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.statistics.overlap.interval_events.log import get as interval_events_overlap 3 | import os 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "interval_event_log.xes")) 8 | # gets the overlap of each interval event with the other events of the log 9 | overlap = interval_events_overlap.apply(log, parameters={ 10 | interval_events_overlap.Parameters.START_TIMESTAMP_KEY: "start_timestamp"}) 11 | # print the overlap for all the events 12 | print(overlap) 13 | # print the number of intersections of the event having max overlap 14 | print(max(overlap)) 15 | 16 | 17 | if __name__ == "__main__": 18 | execute_script() 19 | -------------------------------------------------------------------------------- /examples/label_splitting.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.label_splitting import algorithm as label_splitter 3 | 4 | 5 | def execute_script(): 6 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 7 | log = log[["case:concept:name", "concept:name", "time:timestamp"]] 8 | 9 | # relabeling with the default options 10 | rlog1 = label_splitter.apply(log, variant=label_splitter.Variants.CONTEXTUAL) 11 | print(rlog1) 12 | 13 | # relabeling with a single activity allowed in the prefix and suffix, 14 | # plus the relabeling only applies to a given activity 15 | rlog2 = label_splitter.apply(log, variant=label_splitter.Variants.CONTEXTUAL, 16 | parameters={"prefix_length": 1, "suffix_length": 1, 17 | "target_activities": ["Confirmation of receipt"]}) 18 | print(rlog2) 19 | 20 | 21 | if __name__ == "__main__": 22 | execute_script() 23 | -------------------------------------------------------------------------------- /examples/llm/PET/doc-1.2: -------------------------------------------------------------------------------- 1 | A customer brings in a defective computer and the CRS checks the defect and hands out a repair cost calculation back. 2 | 3 | If the customer decides that the costs are acceptable , the process continues , otherwise she takes her computer home unrepaired. 4 | 5 | The ongoing repair consists of two activities , which are executed , in an arbitrary order. 6 | 7 | The first activity is to check and repair the hardware , whereas the second activity checks and configures the software. 8 | 9 | After each of these activities , the proper system functionality is tested. 10 | 11 | If an error is detected another arbitrary repair activity is executed , otherwise the repair is finished . -------------------------------------------------------------------------------- /examples/llm/PET/doc-1.3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/examples/llm/PET/doc-1.3 -------------------------------------------------------------------------------- /examples/llm/PET/doc-1.4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/examples/llm/PET/doc-1.4 -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.1: -------------------------------------------------------------------------------- 1 | The MPON sents the dismissal to the MPOO. 2 | 3 | The MPOO reviews the dismissal. 4 | 5 | The MPOO opposes the dismissal of MPON or the MPOO confirmes the dismissal of the MPON . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.10: -------------------------------------------------------------------------------- 1 | The fault detector reports a failure to the MPO or MPO has a suspicion of their own fault. 2 | 3 | The MPO shall examine the failure. 4 | 5 | The MPO rejects the failure of the fault detector or the MPO confirms the failure of the fault detector. 6 | 7 | If the MPO confirms the failure of the fault detector , he informes the GO and the MSP. 8 | 9 | The MPO fixes the fault at the measuring device. 10 | 11 | The MPO shares the results of the repairs carried out with the fault detector. 12 | 13 | The MPO will inform the GO about the resolution of the interference. 14 | 15 | The MPO will inform the MSP about the resolution of the interference . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.11: -------------------------------------------------------------------------------- 1 | The GO requests the measurements to the MSP. 2 | 3 | The MSP checks the received request. 4 | 5 | The MSP denies the request of the GO or the MSP performs the measurement. 6 | 7 | The MSP informs the GO about the failure of the reading or the MSP transmits the measured values to the GO. 8 | 9 | The GO processes the measured values. 10 | 11 | The GO sends the changed values to the MSP. 12 | 13 | The GO transmit the readings to the SP . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.12: -------------------------------------------------------------------------------- 1 | The EC tells the INQ about the change of his master data. 2 | 3 | The INQ notifies the IP of the change. 4 | 5 | The IP checks whether the master data can be changed at the desired time. 6 | 7 | The IP confirmes the changes of the INQ or the IP rejectes the changes of the INQ . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.13: -------------------------------------------------------------------------------- 1 | The INQ transmits the transaction data request to the IP. 2 | 3 | The IP checks the request of the INQ. 4 | 5 | The IP answers the question of the INQ depending on the outcome of the examination , i.e. 6 | 7 | Transmission of data or rejection . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.14: -------------------------------------------------------------------------------- 1 | If the MPOO sends the bill for the temporary continuation of the metering point operations to the GO , the GO examines the bill. 2 | 3 | If the MSPO sends the bill for the temporary continuation of the measurement to the GO , the GO examines the bill. 4 | 5 | If the MSPO sends the bill for additional readings to the GO , the GO examines the bill. 6 | 7 | If the MPOO sends the bill for the equipment acquisition to the MPON or the GO , the MPON or the GO examines the bill. 8 | 9 | The GO or the MPON confirms the invoice with payment advice to the MPOO or the MSPO , or the GO or the MPON rejects the invoice of the MPOO or the MSPO . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.3: -------------------------------------------------------------------------------- 1 | The MPOO deregisters at the GO. 2 | 3 | The GO verifies the deregistration. 4 | 5 | The GO rejects the deregistration of the MPOO or the GO preliminarily confirms the deregistration of the MPOO. 6 | 7 | The GO prepares the readmission of the measuring point. 8 | 9 | Optionally , the GO may oblige the MPOO to continue the operations. 10 | 11 | If the GO binds the MPOO to continue the operation , the MPOO confirmes the continuation to the MPOO. 12 | 13 | The GO performs the equipment acquisition and / or equipment changes. 14 | 15 | The GO assigns the GO as MPO. 16 | 17 | The GO informs the MPOO about the end of the assignment of the MPOO and the beginning of the assignment of the GO. 18 | 19 | The GO informs the MSPO about the assignment of the GO. 20 | 21 | The GO informs the SP about the assignment of the GO . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.4: -------------------------------------------------------------------------------- 1 | The MPON notifies the MPOO about equipment change intentions. 2 | 3 | The MPOO announces self dismounting to the MPON or the MPOO shall notify the MPON about no self-dismounting of the MPOO. 4 | 5 | The MPON or the MPOO perform the final reading. 6 | 7 | The MPON or the MPOO dismount the old equipment. 8 | 9 | The MPON mounts the new device. 10 | 11 | The MPON reads the meter count from the installed meter. 12 | 13 | The MPON sents the values of the final reading to the GO. 14 | 15 | The MPON tells the GO about the device changes , the master data and the meter count at installation. 16 | 17 | The GO shall notify the MSP about the device changes , the master data , the meter count at dismounting , and the meter count at installation . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.5: -------------------------------------------------------------------------------- 1 | The MPON requests a device takeover bid of the MPOO. 2 | 3 | The MPOO sends a tender for the equipment takeover to the MPON. 4 | 5 | The MPON places an order at the MPOO. 6 | 7 | The MPOO confirms the order of the MPON and sends the master data . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.6: -------------------------------------------------------------------------------- 1 | The MSPN sents a dismissal to the MSPO. 2 | 3 | The MSPO reviews the dismissal. 4 | 5 | The MSPO rejects the dismissal of the MSPN or The MSPO confirms the dismissal of the MSPN . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.7: -------------------------------------------------------------------------------- 1 | The MSPN registers the measurement at the GO. 2 | 3 | The GO examines the application of the MSPN. 4 | 5 | The GO rejects the application of the MSPN or the GO confirmes the application of the MSPN. 6 | 7 | The GO assigns the MSPN. 8 | 9 | The GO informs the MSPO about the assignment of MSPN. 10 | 11 | The GO informs the MPO about the assignment of the MSPN. 12 | 13 | The GO informs the SP about the assignment of MSPN . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.8: -------------------------------------------------------------------------------- 1 | The MSPO deregisters at the GO. 2 | 3 | The GO verifies the deregistration. 4 | 5 | The GO rejects the deregistration of the MSPO or the GO preliminarily confirms the deregistration of the MSPO. 6 | 7 | The GO assigns himself as MSP. 8 | 9 | The GO informs the MSPO about the end of the assignment and the beginning of the assignment of the GO. 10 | 11 | The GO informs the MPO about the assignment of the GO. 12 | 13 | The GO informs the SP about the assignment of the GO . -------------------------------------------------------------------------------- /examples/llm/PET/doc-10.9: -------------------------------------------------------------------------------- 1 | The SP / PU / GO request changes to the MPO or the MPO himself causes a change. 2 | 3 | The MPO reviews the change request. 4 | 5 | The MPO rejects the change of the measuring point by the SP / PU / GO or the MPO confirmes the request of the SP / PU / GO. 6 | 7 | The MPO performs the measuring point change. 8 | 9 | The MPO reports the implementation to the SP / PU / GO or notifies the SP / PU / GO about the failure of the changes . -------------------------------------------------------------------------------- /examples/llm/PET/doc-3.1: -------------------------------------------------------------------------------- 1 | The party sends a warrant possession request asking a warrant to be released. 2 | 3 | The Client Service Back Office as part of the Small Claims Registry Operations receives the request and retrieves the SCT file. 4 | 5 | Then , the SCT Warrant Possession is forwarded to Queensland Police. 6 | 7 | The SCT physical file is stored by the Back Office awaiting a report to be sent by the Police. 8 | 9 | When the report is received , the respective SCT file is retrieved. 10 | 11 | Then , Back Office attaches the new SCT document , and stores the expanded SCT physical file. 12 | 13 | After that , some other MC internal staff receives the physical SCT file ( out of scope ) . -------------------------------------------------------------------------------- /examples/llm/PET/doc-3.2: -------------------------------------------------------------------------------- 1 | Each morning , the files which have yet to be processed need to be checked , to make sure they are in order for the court hearing that day. 2 | 3 | If some files are missing , a search is initiated , otherwise the files can be physically tracked to the intended location. 4 | 5 | Once all the files are ready , these are handed to the Associate , and meantime the Judgeis Lawlist is distributed to the relevant people. 6 | 7 | Afterwards , the directions hearings are conducted . -------------------------------------------------------------------------------- /examples/llm/PET/doc-3.3: -------------------------------------------------------------------------------- 1 | After a claim is registered , it is examined by a claims officer. 2 | 3 | The claims officer then writes a settlement recommendation. 4 | 5 | This recommendation is then checked by a senior claims officer who may mark the claim as OK or Not OK. 6 | 7 | If the claim is marked as Not OK , it is sent back to the claims officer and the recommendation is repeated. 8 | 9 | If the claim is OK , the claim handling process proceeds . -------------------------------------------------------------------------------- /examples/llm/PET/doc-3.5: -------------------------------------------------------------------------------- 1 | Mail from the party is collected on a daily basis by the Mail Processing Unit. 2 | 3 | Within this unit , the Mail Clerk sorts the unopened mail into the various business areas. 4 | 5 | The mail is then distributed. 6 | 7 | When the mail is received by the Registry , it is opened and sorted into groups for distribution , and thus registered in a manual incoming Mail Register. 8 | 9 | Afterwards , the Assistant Registry Manager within the Registry performs a quality check. 10 | 11 | If the mail is not compliant , a list of requisition explaining the reason for rejection is compiled and sent back to the party. 12 | 13 | Otherwise , the matter details ( types of action ) are captured and provided to the Cashier , who takes the applicable fees attached to the mail. 14 | 15 | At this point , the Assistant Registry Manager puts the receipt and copied documents into an envelope and posts it to the party. 16 | 17 | Meantime , the Cashier captures the Party Details and prints the Physical Court File . -------------------------------------------------------------------------------- /examples/llm/PET/doc-3.6: -------------------------------------------------------------------------------- 1 | When a claim is received , it is first checked whether the claimant is insured by the organization. 2 | 3 | If not , the claimant is informed that the claim must be rejected. 4 | 5 | Otherwise , the severity of the claim is evaluated. 6 | 7 | Based on the outcome ( simple or complex claims ) , relevant forms are sent to the claimant. 8 | 9 | Once the forms are returned , they are checked for completeness. 10 | 11 | If the forms provide all relevant details , the claim is registered in the Claims Management system , which ends the Claims Notification process. 12 | 13 | Otherwise , the claimant is informed to update the forms. 14 | 15 | Upon reception of the updated forms , they are checked again . -------------------------------------------------------------------------------- /examples/llm/PET/doc-3.7: -------------------------------------------------------------------------------- 1 | The Police Report related to the car accident is searched within the Police Report database and put in a file together with the Claim Documentation. 2 | 3 | This file serves as input to a claims handler who calculates an initial claim estimate. 4 | 5 | Then , the claims handler creates an Action Plan based on an Action Plan Checklist available in the Document Management system. 6 | 7 | Based on the Action Plan , a claims manager tries to negotiate a settlement on the claim estimate. 8 | 9 | The claimant is informed of the outcome , which ends the process . -------------------------------------------------------------------------------- /examples/llm/PET/doc-3.8: -------------------------------------------------------------------------------- 1 | The process starts when a customer submits a claim by sending in relevant documentation. 2 | 3 | The Notification department at the car insurer checks the documents upon completeness and registers the claim. 4 | 5 | Then , the Handling department picks up the claim and checks the insurance. 6 | 7 | Then , an assessment is performed. 8 | 9 | If the assessment is positive , a garage is phoned to authorise the repairs and the payment is scheduled ( in this order ). 10 | 11 | Otherwise , the claim is rejected. 12 | 13 | In any case ( whether the outcome is positive or negative ) , a letter is sent to the customer and the process is considered to be complete . -------------------------------------------------------------------------------- /examples/llm/PET/doc-5.1: -------------------------------------------------------------------------------- 1 | The loan approval process starts by receiving a customer request for a loan amount. 2 | 3 | The risk assessment Web service is invoked to assess the request. 4 | 5 | If the loan is small and the customer is low risk , the loan is approved. 6 | 7 | If the customer is high risk , the loan is denied. 8 | 9 | If the customer needs further review or the loan amount is for $10,000 or more , the request is sent to the approver Web service. 10 | 11 | The customer receives feedback from the assessor or approver . -------------------------------------------------------------------------------- /examples/llm/PET/doc-5.2: -------------------------------------------------------------------------------- 1 | The process of Vacations Request starts when any employee of the organization submits a vacation request. 2 | 3 | Once the requirement is registered , the request is received by the immediate supervisor of the employee requesting the vacation. 4 | 5 | The supervisor must approve or reject the request. 6 | 7 | If the request is rejected , the application is returned to the applicant / employee who can review the rejection reasons. 8 | 9 | If the request is approved a notification is generated to the Human Resources Representative , who must complete the respective management procedures . -------------------------------------------------------------------------------- /examples/llm/PET/doc-6.2: -------------------------------------------------------------------------------- 1 | The process starts periodically on the first of each month , when Assembler AG places an order with the supplier in order to request more product parts. 2 | 3 | a ) Assembler AG sends the order to the supplier. 4 | 5 | b ) The supplier processes the order. 6 | 7 | c ) The supplier sends an invoice to Assembler AG. 8 | 9 | d ) Assembler AG receives the invoice . -------------------------------------------------------------------------------- /examples/llm/PET/doc-6.3: -------------------------------------------------------------------------------- 1 | Every time we get a new order from the sales department , first , one of my masters determines the necessary parts and quantities as well as the delivery date. 2 | 3 | Once that information is present , it has to be entered into our production planning system ( PPS ). 4 | 5 | It optimizes our production processes and creates possibly uniform work packages so that the setup times are minimized. 6 | 7 | Besides , it creates a list of parts to be procured. 8 | 9 | Unfortunately it is not coupled correctly to our Enterprise Resource Planning system ( ERP ) , so the data must be transferred manually. 10 | 11 | By the way , that is the second step. 12 | 13 | Once all the data is present , we need to decide whether any parts are missing and must be procured or if this is not necessary. 14 | 15 | Once production is scheduled to start , we receive a notice from the system and an employee takes care of the implementation. 16 | 17 | Finally , the order will be checked again for its quality . -------------------------------------------------------------------------------- /examples/llm/PET/doc-7.1: -------------------------------------------------------------------------------- 1 | First , the Manager checks the open leads. 2 | 3 | Afterwards , he selects the top five ones. 4 | 5 | He then tells his Sales Assistant to call the contact person of the leads. 6 | 7 | The Sales Assistant calls each customer. 8 | 9 | If someone is interested , he sends a note to the Manager. 10 | 11 | The Manager then processes the lead. 12 | 13 | Otherwise , he calls the next customer . -------------------------------------------------------------------------------- /examples/llm/PET/doc-8.1: -------------------------------------------------------------------------------- 1 | The process is triggered by the demand of a functional department to fill a post. 2 | 3 | The post is advertised , applicants apply , the applications are checked and the post is filled. 4 | 5 | The process finishes when the post was filled , precisely through the conclusion of a contract of employment . -------------------------------------------------------------------------------- /examples/llm/PET/doc-8.2: -------------------------------------------------------------------------------- 1 | I am the HR clerk. 2 | 3 | When a vacancy is reported to me , I create a job description from the information. 4 | 5 | Sometimes there is still confusion in the message , then I must ask the Department again. 6 | 7 | I am submitting the job description for consideration and waiting for the approval. 8 | 9 | But , it can also happen that the department does not approve it , but rejects it , and requests a correction. 10 | 11 | Then I correct the description and submit it again for consideration. 12 | 13 | If the description is finally approved , I post the job . -------------------------------------------------------------------------------- /examples/llm/PET/doc-8.3: -------------------------------------------------------------------------------- 1 | I am the Head of the functional department. 2 | 3 | When I have detected a number of personnel requirements , I report the vacancy to the Personnel Department. 4 | 5 | Then I wait to get the job description for review before it is advertized. 6 | 7 | Under certain circumstances , I must ask for corrections again , otherwise I approve the job description. 8 | 9 | Sometimes it also happens that the colleague from the HR department still has questions about the tasks and requirements before he can describe the job. 10 | 11 | Then I am available for clarifications , of course . -------------------------------------------------------------------------------- /examples/llm/PET/doc-9.1: -------------------------------------------------------------------------------- 1 | Every weekday morning , the database is backed up and then it is checked to see whether the Account Defaulter table has new records. 2 | 3 | If no new records are found , then the process should check the CRM system to see whether new returns have been filed. 4 | 5 | If new returns exist , then register all defaulting accounts and customers. 6 | 7 | If the defaulting client codes have not been previously advised , produce another table of defaulting accounts and send to account management. 8 | 9 | All of this must be completed by 2 : 30 pm , if it is not , then an alert should be sent to the supervisor. 10 | 11 | Once the new defaulting account report has been completed , check the CRM system to see whether new returns have been filed. 12 | 13 | If new returns have been filed , reconcile with the existing account defaulters table. 14 | 15 | This must be completed by 4 : 0 pm otherwise a supervisor should be sent a message . -------------------------------------------------------------------------------- /examples/llm/PET/doc-9.2: -------------------------------------------------------------------------------- 1 | The Customer Service Representative sends a Mortgage offer to the customer and waits for a reply. 2 | 3 | If the customer calls or writes back declining the mortgage , the case details are updated and the work is then archived prior to cancellation. 4 | 5 | If the customer sends back the completed offer documents and attaches all prerequisite documents then the case is moved to administration for completion. 6 | 7 | If all pre-requisite documents are not provided a message is generated to the customer requesting outstanding documents. 8 | 9 | If no answer is received after 2 weeks , the case details are updated prior to archive and cancellation . -------------------------------------------------------------------------------- /examples/llm/PET/doc-9.3: -------------------------------------------------------------------------------- 1 | In November of each year , the Coordination Unit at the Town Planning Authority drafts a schedule of meetings for the next calendar year and adds draft dates to all calendars. 2 | 3 | The Support Officer then checks the dates and suggests modifications. 4 | 5 | The Coordination Unit then rechecks all dates and looks for potential conflicts. 6 | 7 | The final schedule of meeting dates is sent to all the independent Committee Members by email , who then check their diaries and advise the Coordination Unit of any conflicts . -------------------------------------------------------------------------------- /examples/llm/PET/doc-9.4: -------------------------------------------------------------------------------- 1 | Once the dates are finalized ( by the Coordination Unit ) , the Support Officer updates all group calendars and creates meeting folders for each meeting and ensures all appropriate documents are uploaded to system. 2 | 3 | Committee Members are advised a week before each meeting to read all related documents. 4 | 5 | The Committee Members hold their meeting , and the Support Office then produces minutes including any Action Points for each Committee Member. 6 | 7 | Within 5 working days , the Coordination Unit must conduct a QA check on the minutes , which are then sent to all Committee Members. 8 | 9 | The Support Officer then updates all departmental records . -------------------------------------------------------------------------------- /examples/llm/PET/doc-9.5: -------------------------------------------------------------------------------- 1 | After the Expense Report is received , a new account must be created if the employee does not already have one. 2 | 3 | The report is then reviewed for automatic approval. 4 | 5 | Amounts under $200 are automatically approved , whereas amounts equal to or over $200 require approval of the supervisor. 6 | 7 | In case of rejection , the employee must receive a rejection notice by email. 8 | 9 | Otherwise , the reimbursement goes to the employees direct deposit bank account. 10 | 11 | If the request is not completed in 7 days , then the employee must receive an approval in progress email. 12 | 13 | If the request is not finished within 30 days , then the process is stopped and the employee receives an email cancellation notice and must re-submit the expense report . -------------------------------------------------------------------------------- /examples/log_skeleton.py: -------------------------------------------------------------------------------- 1 | from pm4py.objects.log.importer.xes import importer as xes_importer 2 | from pm4py.algo.discovery.log_skeleton import algorithm as lsk 3 | from pm4py.algo.conformance.log_skeleton import algorithm as lsk_conf 4 | import os 5 | 6 | 7 | def execute_script(): 8 | log = xes_importer.apply(os.path.join("..", "tests", "input_data", "receipt.xes")) 9 | # discovers the log skeleton with a minimal noise 10 | log_skeleton = lsk.apply(log, parameters={lsk.Variants.CLASSIC.value.Parameters.NOISE_THRESHOLD: 0.01}) 11 | print(log_skeleton) 12 | # applies conformance checking to it 13 | results = lsk_conf.apply(log, log_skeleton) 14 | for i in range(min(len(results), 5)): 15 | # print the i-the conformance checking 16 | print(results[i]) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/log_to_fit_precise_pn.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.objects.conversion.trie import converter as trie_converter 3 | 4 | 5 | def execute_script(): 6 | log = pm4py.read_xes("../tests/input_data/running-example.xes") 7 | 8 | prefix_tree = pm4py.discover_prefix_tree(log) 9 | 10 | net, im, fm = trie_converter.apply(prefix_tree, variant=trie_converter.Variants.TO_PETRI_NET) 11 | 12 | pm4py.view_petri_net(net, im, fm, format="svg") 13 | 14 | 15 | if __name__ == "__main__": 16 | execute_script() 17 | -------------------------------------------------------------------------------- /examples/manual_log_generation.py: -------------------------------------------------------------------------------- 1 | from copy import deepcopy 2 | 3 | from pm4py.objects.log.obj import EventLog, Trace, Event 4 | 5 | 6 | def execute_script(): 7 | L = EventLog() 8 | e1 = Event() 9 | e1["concept:name"] = "A" 10 | e2 = Event() 11 | e2["concept:name"] = "B" 12 | e3 = Event() 13 | e3["concept:name"] = "C" 14 | e4 = Event() 15 | e4["concept:name"] = "D" 16 | t = Trace() 17 | t.append(e1) 18 | t.append(e2) 19 | t.append(e3) 20 | t.append(e4) 21 | for i in range(10000): 22 | L.append(deepcopy(t)) 23 | print(len(L)) 24 | 25 | 26 | if __name__ == "__main__": 27 | execute_script() 28 | -------------------------------------------------------------------------------- /examples/ml_insert_case_arrival_finish.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | log = pm4py.read_xes("../tests/input_data/running-example.xes") 6 | log = pm4py.insert_case_arrival_finish_rate(log) 7 | print(log) 8 | 9 | 10 | if __name__ == "__main__": 11 | execute_script() 12 | -------------------------------------------------------------------------------- /examples/ml_insert_waiting_service_time.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | log = pm4py.read_xes("../tests/input_data/running-example.xes") 6 | log = pm4py.insert_case_service_waiting_time(log) 7 | print(log) 8 | 9 | 10 | if __name__ == "__main__": 11 | execute_script() 12 | -------------------------------------------------------------------------------- /examples/ml_log_to_target_vectory.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.transformation.log_to_target import algorithm as log_to_target 3 | 4 | 5 | def execute_script(): 6 | log = pm4py.read_xes("../tests/input_data/running-example.xes") 7 | rem_time_target, classes = log_to_target.apply(log, variant=log_to_target.Variants.REMAINING_TIME) 8 | print(rem_time_target) 9 | next_time_target, classes = log_to_target.apply(log, variant=log_to_target.Variants.NEXT_TIME) 10 | print(next_time_target) 11 | next_activity_target, next_activities = log_to_target.apply(log, variant=log_to_target.Variants.NEXT_ACTIVITY) 12 | print(next_activity_target) 13 | print(next_activities) 14 | 15 | 16 | if __name__ == "__main__": 17 | execute_script() 18 | -------------------------------------------------------------------------------- /examples/ml_outcome_enriched.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | log = pm4py.read_xes("../tests/input_data/running-example.xes") 6 | log = pm4py.extract_outcome_enriched_dataframe(log) 7 | print(log) 8 | 9 | 10 | if __name__ == "__main__": 11 | execute_script() 12 | -------------------------------------------------------------------------------- /examples/multialignments.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pm4py.algo.conformance.multialignments.variants.discounted_a_star import apply as multii 3 | from pm4py.algo.conformance.multialignments.algorithm import Parameters 4 | from pm4py.objects.log.importer.xes import importer as xes_importer 5 | from pm4py.objects.petri_net.importer import importer as petri_importer 6 | 7 | 8 | if __name__ == '__main__': 9 | log_path = os.path.join("..", "tests", "input_data", "running-example.xes") 10 | pnml_path = os.path.join("..", "tests", "input_data", "running-example.pnml") 11 | log = xes_importer.apply(log_path) 12 | net, marking, fmarking = petri_importer.apply(pnml_path) 13 | 14 | THETA = 1.1 15 | MU = 20 16 | multiali = multii(log,net,marking,fmarking, parameters={Parameters.EXPONENT:THETA, Parameters.MARKING_LIMIT:MU}) 17 | print("Multi-alignment:",multiali['multi-alignment']) 18 | print("Maximal Levenshtein Edit Distance to Log:", multiali['max_distance_to_log']) 19 | -------------------------------------------------------------------------------- /examples/nx_ocel_to_graphviz.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from examples import examples_conf 3 | import importlib.util 4 | 5 | 6 | def execute_script(): 7 | ocel = pm4py.read_ocel2("../tests/input_data/ocel/ocel20_example.jsonocel") 8 | 9 | # convers the OCEL to a NetworkX graph with events, objects, E2O, O2O, and object changes 10 | event_graph = pm4py.convert_ocel_to_networkx(ocel) 11 | 12 | if importlib.util.find_spec("graphviz"): 13 | from pm4py.visualization.networkx import visualizer as nx_to_gv_vis 14 | 15 | # visualize the NX DiGraph using Graphviz 16 | gviz = nx_to_gv_vis.apply(event_graph, parameters={"format": examples_conf.TARGET_IMG_FORMAT}) 17 | nx_to_gv_vis.view(gviz) 18 | 19 | 20 | if __name__ == "__main__": 21 | execute_script() 22 | -------------------------------------------------------------------------------- /examples/nx_traditional_to_graphviz.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from examples import examples_conf 3 | import importlib.util 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes("../tests/input_data/running-example.xes") 8 | # gets an 'event graph' where events, cases and their relationships 9 | # are represented in a graph (NetworkX DiGraph) 10 | event_graph = pm4py.convert_log_to_networkx(log) 11 | 12 | if importlib.util.find_spec("graphviz"): 13 | from pm4py.visualization.networkx import visualizer as nx_to_gv_vis 14 | 15 | # visualize the NX DiGraph using Graphviz 16 | gviz = nx_to_gv_vis.apply(event_graph, parameters={"format": examples_conf.TARGET_IMG_FORMAT}) 17 | nx_to_gv_vis.view(gviz) 18 | 19 | 20 | if __name__ == "__main__": 21 | execute_script() 22 | -------------------------------------------------------------------------------- /examples/object_centric_petri_net_discovery.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from examples import examples_conf 3 | import os 4 | import importlib.util 5 | 6 | 7 | def execute_script(): 8 | ocel = pm4py.read_ocel(os.path.join("..", "tests", "input_data", "ocel", "example_log.jsonocel")) 9 | model = pm4py.discover_oc_petri_net(ocel) 10 | print(model.keys()) 11 | 12 | if importlib.util.find_spec("graphviz"): 13 | pm4py.view_ocpn(model, format=examples_conf.TARGET_IMG_FORMAT) 14 | 15 | 16 | if __name__ == "__main__": 17 | execute_script() 18 | -------------------------------------------------------------------------------- /examples/ocdfg_discovery.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from examples import examples_conf 3 | import os 4 | import importlib.util 5 | 6 | 7 | def execute_script(): 8 | ocel = pm4py.read_ocel(os.path.join("..", "tests", "input_data", "ocel", "example_log.jsonocel")) 9 | ocdfg = pm4py.discover_ocdfg(ocel) 10 | 11 | if importlib.util.find_spec("graphviz"): 12 | # views the model with the frequency annotation 13 | pm4py.view_ocdfg(ocdfg, format=examples_conf.TARGET_IMG_FORMAT) 14 | # views the model with the performance annotation 15 | pm4py.view_ocdfg(ocdfg, format=examples_conf.TARGET_IMG_FORMAT, annotation="performance", performance_aggregation="median") 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/ocel_clustering.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.transformation.ocel.split_ocel import algorithm as ocel_splitter 3 | 4 | 5 | def execute_script(): 6 | ocel = pm4py.read_ocel("../tests/input_data/ocel/example_log.jsonocel") 7 | object_type = "order" 8 | #ocel = pm4py.read_ocel("../tests/input_data/ocel/recruiting-red.jsonocel") 9 | #object_type = "applications" 10 | # obtains an OCEL for every application, containing the events of the application and of the connected 11 | # objects (offers) 12 | lst_ocels = ocel_splitter.apply(ocel, variant=ocel_splitter.Variants.ANCESTORS_DESCENDANTS, parameters={"object_type": object_type}) 13 | # alternatively, performs a clustering grouping by sub-OCELs following the same patterns (lifecycle activities and connection with offers) 14 | ocel_clusters = pm4py.cluster_equivalent_ocel(ocel, object_type) 15 | print(sorted([len(y) for x, y in ocel_clusters.items()])) 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/ocel_enrichment.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | ocel = pm4py.read_ocel("../tests/input_data/ocel/example_log.jsonocel") 6 | # creates artificial O2O relationships based on the object interaction, descendants, inheritance, cobirth, codeath graph 7 | ocel = pm4py.ocel_o2o_enrichment(ocel) 8 | # creates artificial E2O qualifications based on the fact that an event creates/terminates the lifecycle of an object 9 | ocel = pm4py.ocel_e2o_lifecycle_enrichment(ocel) 10 | # prints the E2O table 11 | print(ocel.relations) 12 | # prints the O2O table 13 | print(ocel.o2o) 14 | 15 | 16 | if __name__ == "__main__": 17 | execute_script() 18 | -------------------------------------------------------------------------------- /examples/ocel_filter_cc.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import sys 3 | 4 | 5 | def execute_script(): 6 | ocel = pm4py.read_ocel("../tests/input_data/ocel/example_log.jsonocel") 7 | print(ocel) 8 | # filters the connected components of the OCEL in which there is at least a delivery, 9 | # obtaining a filtered OCEL back. 10 | ocel_with_del = pm4py.filter_ocel_cc_otype(ocel, "delivery") 11 | print(ocel_with_del) 12 | # filters the connected components of the OCEL with at least five different objects, 13 | # obtaining a filtered OCEL back. 14 | ocel_with_three_objs = pm4py.filter_ocel_cc_length(ocel, 5, sys.maxsize) 15 | print(ocel_with_three_objs) 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/ocel_merge_duplicates.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | ocel = pm4py.read_ocel("../tests/input_data/ocel/example_log.jsonocel") 6 | print(ocel.get_extended_table()) 7 | ocel = pm4py.ocel_merge_duplicates(ocel) 8 | print(ocel.get_extended_table()) 9 | 10 | 11 | if __name__ == "__main__": 12 | execute_script() 13 | -------------------------------------------------------------------------------- /examples/ocel_saw_net_disc.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.discovery.ocel.saw_nets import algorithm as saw_nets_disc 3 | from pm4py.objects.petri_net.obj import Marking 4 | from examples import examples_conf 5 | import importlib.util 6 | 7 | 8 | def execute_script(): 9 | ocel = pm4py.read_ocel("../tests/input_data/ocel/ocel_order_simulated.csv") 10 | res = saw_nets_disc.apply(ocel) 11 | 12 | if importlib.util.find_spec("graphviz"): 13 | for ot in res["ot_saw_nets"]: 14 | pm4py.view_petri_net(res["ot_saw_nets"][ot], Marking(), Marking(), format=examples_conf.TARGET_IMG_FORMAT) 15 | pm4py.view_petri_net(res["multi_saw_net"], Marking(), Marking(), decorations=res["decorations_multi_saw_net"], 16 | format=examples_conf.TARGET_IMG_FORMAT) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/ocel_to_nx.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import networkx as nx 3 | import os 4 | 5 | 6 | def execute_script(): 7 | ocel = pm4py.read_ocel("../tests/input_data/ocel/example_log.jsonocel") 8 | nx_digraph = pm4py.convert_ocel_to_networkx(ocel) 9 | nx.write_gexf(nx_digraph, "converted_graph.gexf") 10 | os.remove("converted_graph.gexf") 11 | 12 | 13 | if __name__ == "__main__": 14 | execute_script() 15 | -------------------------------------------------------------------------------- /examples/ocel_validation.py: -------------------------------------------------------------------------------- 1 | from pm4py.objects.ocel.validation import jsonocel, xmlocel 2 | import os 3 | import importlib.util 4 | 5 | 6 | def execute_script(): 7 | if importlib.util.find_spec("jsonschema"): 8 | # validate a JSONOCEL file against the corresponding schema 9 | validation_result = jsonocel.apply(os.path.join("..", "tests", "input_data", "ocel", "example_log.jsonocel"), os.path.join("..", "tests", "input_data", "ocel", "validation", "schema.json")) 10 | print(validation_result) 11 | # validate an XMLOCEL file against the corresponding schema 12 | validation_result = xmlocel.apply(os.path.join("..", "tests", "input_data", "ocel", "example_log.xmlocel"), os.path.join("..", "tests", "input_data", "ocel", "validation", "schema.xml")) 13 | print(validation_result) 14 | 15 | 16 | if __name__ == "__main__": 17 | execute_script() 18 | -------------------------------------------------------------------------------- /examples/performance_dfg_simulation.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import pm4py 4 | from pm4py.algo.simulation.playout.dfg import algorithm as dfg_simulator 5 | 6 | 7 | def execute_script(): 8 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 9 | frequency_dfg, sa, ea = pm4py.discover_dfg(log) 10 | performance_dfg, sa, ea = pm4py.discover_performance_dfg(log) 11 | simulated_log = dfg_simulator.apply(frequency_dfg, sa, ea, variant=dfg_simulator.Variants.PERFORMANCE, 12 | parameters={"performance_dfg": performance_dfg}) 13 | print(simulated_log) 14 | 15 | 16 | if __name__ == "__main__": 17 | execute_script() 18 | -------------------------------------------------------------------------------- /examples/powl_parsing.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from examples import examples_conf 3 | import importlib.util 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes("../tests/input_data/running-example.xes") 8 | 9 | powl_model = pm4py.discover_powl(log) 10 | # get the __repr__ of the POWL model 11 | powl_string = str(powl_model) 12 | print(powl_model) 13 | 14 | # parse the same string into a new POWL model 15 | powl_model2 = pm4py.parse_powl_model_string(powl_string) 16 | # see that the __repr__ of the two models are the same (same length) 17 | powl_string2 = str(powl_model2) 18 | print(powl_string2) 19 | print(len(powl_string), len(powl_string2)) 20 | 21 | if importlib.util.find_spec("graphviz"): 22 | # represents the parsed model on the screen 23 | pm4py.view_powl(powl_model2, format=examples_conf.TARGET_IMG_FORMAT) 24 | 25 | 26 | if __name__ == "__main__": 27 | execute_script() 28 | -------------------------------------------------------------------------------- /examples/pripel_anonymization.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.anonymization.trace_variant_query import algorithm as trace_variant_query 3 | from pm4py.algo.anonymization.pripel import algorithm as pripel 4 | from pm4py.objects.log.obj import EventLog 5 | 6 | 7 | def execute_script(): 8 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 9 | log = EventLog(log[0:100]) 10 | 11 | epsilon = 0.5 12 | sacofa_result = trace_variant_query.apply(log=log, variant=trace_variant_query.Variants.SACOFA, 13 | parameters={"epsilon": epsilon, "k": 30, "p": 4}) 14 | anonymized_log = pripel.apply(log=log, trace_variant_query=sacofa_result, epsilon=epsilon) 15 | 16 | dfg, sa, ea = pm4py.discover_dfg(log) 17 | pm4py.view_dfg(dfg, sa, ea, format="svg") 18 | 19 | dfg, sa, ea = pm4py.discover_dfg(anonymized_log) 20 | pm4py.view_dfg(dfg, sa, ea, format="svg") 21 | 22 | 23 | if __name__ == "__main__": 24 | execute_script() 25 | -------------------------------------------------------------------------------- /examples/process_tree_frequency_annotation.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from pm4py.algo.conformance.alignments.process_tree.util import search_graph_pt_frequency_annotation 4 | from pm4py.visualization.process_tree import visualizer as pt_visualizer 5 | from examples import examples_conf 6 | import importlib.util 7 | 8 | 9 | def execute_script(): 10 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 11 | tree = pm4py.discover_process_tree_inductive(log) 12 | aligned_traces = pm4py.conformance_diagnostics_alignments(log, tree, return_diagnostics_dataframe=False) 13 | tree = search_graph_pt_frequency_annotation.apply(tree, aligned_traces) 14 | 15 | if importlib.util.find_spec("graphviz"): 16 | gviz = pt_visualizer.apply(tree, parameters={"format": examples_conf.TARGET_IMG_FORMAT}, variant=pt_visualizer.Variants.FREQUENCY_ANNOTATION) 17 | pt_visualizer.view(gviz) 18 | 19 | 20 | if __name__ == "__main__": 21 | execute_script() 22 | -------------------------------------------------------------------------------- /examples/rework.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from pm4py.statistics.rework.log import get as rework_get 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 8 | rework = rework_get.apply(log) 9 | print(rework) 10 | 11 | 12 | if __name__ == "__main__": 13 | execute_script() 14 | -------------------------------------------------------------------------------- /examples/roles_detection.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pm4py.objects.log.importer.xes import importer as xes_importer 3 | from pm4py.algo.organizational_mining.roles import algorithm as roles_algorithm 4 | 5 | 6 | def execute_script(): 7 | # import the log 8 | log = xes_importer.apply(os.path.join("..", "tests", "input_data", "receipt.xes"), variant="nonstandard") 9 | 10 | roles = roles_algorithm.apply(log) 11 | 12 | # print the results (grouped activities) on the screen 13 | print([x.activities for x in roles]) 14 | 15 | 16 | if __name__ == "__main__": 17 | execute_script() 18 | -------------------------------------------------------------------------------- /examples/segments_retrieval_filtering.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 6 | 7 | # gets the frequent trace segments 8 | traces = pm4py.get_frequent_trace_segments(log, min_occ=100) 9 | 10 | for t in traces: 11 | # filter on the given trace segment, to obtain an event log where all the cases contain the trace segment 12 | print(t) 13 | filtered_log = pm4py.filter_trace_segments(log, [t]) 14 | print(filtered_log) 15 | 16 | break 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/streaming_conformance_temporal_profile.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.discovery.temporal_profile import algorithm as temporal_profile_disc 3 | from pm4py.streaming.algo.conformance.temporal import algorithm as streaming_temporal_conformance 4 | from pm4py.streaming.stream.live_event_stream import LiveEventStream 5 | 6 | 7 | def execute_script(): 8 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 9 | static_stream = pm4py.convert_to_event_stream(log) 10 | temporal_profile = temporal_profile_disc.apply(log) 11 | cc = streaming_temporal_conformance.apply(temporal_profile) 12 | live_stream = LiveEventStream() 13 | live_stream.register(cc) 14 | live_stream.start() 15 | for index, ev in enumerate(static_stream): 16 | live_stream.append(ev) 17 | live_stream.stop() 18 | print(cc.get()) 19 | 20 | 21 | if __name__ == "__main__": 22 | execute_script() 23 | -------------------------------------------------------------------------------- /examples/streaming_csv_reader_event_stream.py: -------------------------------------------------------------------------------- 1 | from pm4py.streaming.stream.live_event_stream import LiveEventStream 2 | from pm4py.streaming.importer.csv import importer as streaming_csv_importer 3 | from pm4py.streaming.util.event_stream_printer import EventStreamPrinter 4 | import os, time 5 | 6 | 7 | def execute_script(): 8 | live_event_stream = LiveEventStream() 9 | event_stream_printer = EventStreamPrinter() 10 | live_event_stream.register(event_stream_printer) 11 | live_event_stream.start() 12 | importer = streaming_csv_importer.apply(os.path.join("..", "tests", "input_data", "running-example.csv")) 13 | importer.to_event_stream(live_event_stream) 14 | live_event_stream.stop() 15 | 16 | 17 | if __name__ == "__main__": 18 | execute_script() 19 | -------------------------------------------------------------------------------- /examples/streaming_declare.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.streaming.stream.live_event_stream import LiveEventStream 3 | from pm4py.streaming.algo.conformance.declare import algorithm as declare_streaming_cc 4 | import os 5 | 6 | 7 | def execute_script(): 8 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 9 | declare = pm4py.discover_declare(log, min_support_ratio=0.3, min_confidence_ratio=1.0) 10 | event_stream = pm4py.convert_to_event_stream(log) 11 | conf_obj = declare_streaming_cc.apply(declare) 12 | live_stream = LiveEventStream() 13 | live_stream.register(conf_obj) 14 | live_stream.start() 15 | for index, event in enumerate(event_stream): 16 | live_stream.append(event) 17 | live_stream.stop() 18 | diagn_df = conf_obj.get() 19 | print(diagn_df.keys()) 20 | print(diagn_df["total_events_processed"]) 21 | print(diagn_df["total_deviations"]) 22 | 23 | 24 | if __name__ == "__main__": 25 | execute_script() 26 | -------------------------------------------------------------------------------- /examples/streaming_xes_reader_event_stream.py: -------------------------------------------------------------------------------- 1 | from pm4py.streaming.stream.live_event_stream import LiveEventStream 2 | from pm4py.streaming.importer.xes import importer as streaming_xes_importer 3 | from pm4py.streaming.util.event_stream_printer import EventStreamPrinter 4 | import os, time 5 | 6 | 7 | def execute_script(): 8 | live_event_stream = LiveEventStream() 9 | event_stream_printer = EventStreamPrinter() 10 | live_event_stream.register(event_stream_printer) 11 | live_event_stream.start() 12 | importer = streaming_xes_importer.apply(os.path.join("..", "tests", "input_data", "running-example.xes"), 13 | variant=streaming_xes_importer.Variants.XES_EVENT_STREAM) 14 | importer.to_event_stream(live_event_stream) 15 | live_event_stream.stop() 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/streaming_xes_reader_trace_stream.py: -------------------------------------------------------------------------------- 1 | from pm4py.streaming.stream.live_trace_stream import LiveTraceStream 2 | from pm4py.streaming.importer.xes import importer as streaming_xes_importer 3 | from pm4py.streaming.util.trace_stream_printer import TraceStreamPrinter 4 | import os, time 5 | 6 | 7 | def execute_script(): 8 | live_trace_stream = LiveTraceStream() 9 | trace_stream_printer = TraceStreamPrinter() 10 | live_trace_stream.register(trace_stream_printer) 11 | live_trace_stream.start() 12 | importer = streaming_xes_importer.apply(os.path.join("..", "tests", "input_data", "running-example.xes"), 13 | variant=streaming_xes_importer.Variants.XES_TRACE_STREAM) 14 | importer.to_trace_stream(live_trace_stream) 15 | live_trace_stream.stop() 16 | 17 | 18 | if __name__ == "__main__": 19 | execute_script() 20 | -------------------------------------------------------------------------------- /examples/temporal_features.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | 4 | 5 | def execute_script(): 6 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes")) 7 | temporal_features = pm4py.extract_temporal_features_dataframe(log, grouper_freq="W") 8 | print(temporal_features) 9 | 10 | 11 | if __name__ == "__main__": 12 | execute_script() 13 | -------------------------------------------------------------------------------- /examples/temporal_profile_dataframe.py: -------------------------------------------------------------------------------- 1 | from pm4py.algo.discovery.temporal_profile import algorithm as temporal_profile_discovery 2 | from pm4py.algo.conformance.temporal_profile import algorithm as temporal_profile_conformance 3 | from pm4py.util import constants, pandas_utils 4 | from pm4py.objects.log.util import dataframe_utils 5 | 6 | 7 | def execute_script(): 8 | dataframe = pandas_utils.read_csv("../tests/input_data/receipt.csv") 9 | dataframe = dataframe_utils.convert_timestamp_columns_in_df(dataframe, timest_format=constants.DEFAULT_TIMESTAMP_PARSE_FORMAT) 10 | tf = temporal_profile_discovery.apply(dataframe) 11 | conformance = temporal_profile_conformance.apply(dataframe, tf, parameters={"zeta": 6.0}) 12 | for index, dev in enumerate(conformance): 13 | if len(dev) > 0: 14 | print(index, dev) 15 | 16 | 17 | if __name__ == "__main__": 18 | execute_script() 19 | -------------------------------------------------------------------------------- /examples/temporal_profile_log.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.discovery.temporal_profile import algorithm as temporal_profile_discovery 3 | from pm4py.algo.conformance.temporal_profile import algorithm as temporal_profile_conformance 4 | 5 | 6 | def execute_script(): 7 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 8 | tf = temporal_profile_discovery.apply(log) 9 | conformance = temporal_profile_conformance.apply(log, tf, parameters={"zeta": 6.0}) 10 | for index, dev in enumerate(conformance): 11 | if len(dev) > 0: 12 | print(index, dev) 13 | 14 | 15 | if __name__ == "__main__": 16 | execute_script() 17 | -------------------------------------------------------------------------------- /examples/test_evaluation.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from pm4py.algo.discovery.inductive import algorithm as inductive_miner 4 | from pm4py.algo.evaluation import algorithm as general_evaluation 5 | from pm4py.objects.log.importer.xes import importer as xes_importer 6 | from pm4py.objects.conversion.process_tree import converter as process_tree_converter 7 | 8 | 9 | def execute_script(): 10 | log = xes_importer.apply(os.path.join("..", "tests", "input_data", "reviewing.xes")) 11 | process_tree = inductive_miner.apply(log) 12 | net, marking, final_marking = process_tree_converter.apply(process_tree) 13 | metrics = general_evaluation.apply(log, net, marking, final_marking) 14 | print("metrics=", metrics) 15 | 16 | 17 | if __name__ == "__main__": 18 | execute_script() 19 | -------------------------------------------------------------------------------- /examples/timeline_dfg.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.discovery.dfg.variants import clean_time 3 | from pm4py.visualization.dfg.variants import timeline as timeline_gviz_generator 4 | from pm4py.visualization.dfg import visualizer as dfg_visualizer 5 | 6 | 7 | def execute_script(): 8 | dataframe = pm4py.read_xes("../tests/input_data/running-example.xes") 9 | 10 | dfg, start_act, end_act = pm4py.discover_dfg_typed(dataframe) 11 | 12 | dfg_time = clean_time.apply(dataframe) 13 | 14 | gviz = timeline_gviz_generator.apply(dfg, dfg_time, parameters={"format": "svg", "start_activities": start_act, 15 | "end_activities": end_act}) 16 | dfg_visualizer.view(gviz) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/timestamp_case_grouping_filter.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.filtering.pandas.timestamp_case_grouping import timestamp_case_grouping_filter 3 | 4 | 5 | def execute_script(): 6 | dataframe = pm4py.read_xes("../tests/input_data/roadtraffic100traces.xes") 7 | print(dataframe) 8 | filtered_dataframe = timestamp_case_grouping_filter.apply(dataframe, parameters={"filter_type": "concat"}) 9 | print(filtered_dataframe) 10 | print(filtered_dataframe["concept:name"].value_counts()) 11 | 12 | 13 | if __name__ == "__main__": 14 | execute_script() 15 | -------------------------------------------------------------------------------- /examples/trace_clustering.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | import os 3 | from examples import examples_conf 4 | import importlib.util 5 | 6 | 7 | def execute_script(): 8 | dataframe = pm4py.read_xes(os.path.join("..", "tests", "input_data", "receipt.xes"), return_legacy_log_object=True) 9 | 10 | # define a K-Means with 3 clusters 11 | from pm4py.util import ml_utils 12 | clusterer = ml_utils.KMeans(n_clusters=3, random_state=0, n_init="auto") 13 | 14 | for clust_log in pm4py.cluster_log(dataframe, sklearn_clusterer=clusterer): 15 | print(clust_log) 16 | process_tree = pm4py.discover_process_tree_inductive(clust_log) 17 | 18 | if importlib.util.find_spec("graphviz"): 19 | pm4py.view_process_tree(process_tree, format=examples_conf.TARGET_IMG_FORMAT) 20 | 21 | 22 | if __name__ == "__main__": 23 | execute_script() 24 | -------------------------------------------------------------------------------- /examples/trans_system_stochastic_vis.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | from pm4py.algo.discovery.transition_system import algorithm as transition_system_discovery 3 | from examples import examples_conf 4 | import os 5 | import importlib.util 6 | 7 | 8 | def execute_script(): 9 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "running-example.xes")) 10 | ts = transition_system_discovery.apply(log, parameters={"include_data": True, "direction": "forward"}) 11 | 12 | if importlib.util.find_spec("graphviz"): 13 | from pm4py.visualization.transition_system.variants import trans_frequency 14 | from pm4py.visualization.transition_system import visualizer as transition_system_visualizer 15 | gviz = trans_frequency.apply(ts, parameters={"format": examples_conf.TARGET_IMG_FORMAT}) 16 | transition_system_visualizer.view(gviz) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/tree_playout.py: -------------------------------------------------------------------------------- 1 | from pm4py.objects.log.importer.xes import importer as xes_importer 2 | from pm4py.algo.discovery.inductive import algorithm as inductive_miner 3 | from pm4py.algo.simulation.playout.process_tree import algorithm as tree_playout 4 | import os 5 | 6 | 7 | def execute_script(): 8 | log = xes_importer.apply(os.path.join("..", "tests", "input_data", "running-example.xes")) 9 | tree = inductive_miner.apply(log) 10 | new_log_1 = tree_playout.apply(tree) 11 | print(len(new_log_1)) 12 | new_tree_1 = inductive_miner.apply(new_log_1) 13 | print(new_tree_1) 14 | new_log_2 = tree_playout.apply(tree, variant=tree_playout.Variants.EXTENSIVE) 15 | print(len(new_log_2)) 16 | new_tree_2 = inductive_miner.apply(new_log_2) 17 | print(new_tree_2) 18 | 19 | 20 | if __name__ == "__main__": 21 | execute_script() 22 | -------------------------------------------------------------------------------- /examples/trie.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import pm4py 4 | from pm4py.algo.transformation import log_to_trie 5 | from examples import examples_conf 6 | import importlib.util 7 | 8 | 9 | def execute_script(): 10 | log = pm4py.read_xes(os.path.join("..", "tests", "input_data", "running-example.xes")) 11 | trie = log_to_trie.algorithm.apply(log) 12 | 13 | if importlib.util.find_spec("graphviz"): 14 | from pm4py.visualization.trie import visualizer 15 | gviz = visualizer.apply(trie, parameters={"format": examples_conf.TARGET_IMG_FORMAT}) 16 | visualizer.view(gviz) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/validation_ocel20_relational.py: -------------------------------------------------------------------------------- 1 | from pm4py.objects.ocel.validation import ocel20_rel_validation 2 | 3 | 4 | def execute_script(): 5 | file_path = "../tests/input_data/ocel/ocel20_example.sqlite" 6 | 7 | try: 8 | satisfied, unsatisfied = ocel20_rel_validation.apply(file_path) 9 | print("satisfied", satisfied) 10 | print("unsatisfied", unsatisfied) 11 | except: 12 | print("Impossible to validate the OCEL!") 13 | 14 | 15 | if __name__ == "__main__": 16 | execute_script() 17 | -------------------------------------------------------------------------------- /examples/validation_ocel20_xml.py: -------------------------------------------------------------------------------- 1 | from pm4py.objects.ocel.validation import xmlocel 2 | 3 | 4 | def execute_script(): 5 | file_path = "../tests/input_data/ocel/ocel20_example.xmlocel" 6 | validation_path = "../tests/input_data/ocel/ocel2-validation.xsd" 7 | 8 | try: 9 | is_valid = xmlocel.apply(file_path, validation_path) 10 | print(is_valid) 11 | except: 12 | print("Impossible to validate the OCEL!") 13 | 14 | 15 | if __name__ == "__main__": 16 | execute_script() 17 | -------------------------------------------------------------------------------- /examples/variants_paths_duration.py: -------------------------------------------------------------------------------- 1 | import pm4py 2 | 3 | 4 | def execute_script(): 5 | log = pm4py.read_xes("../tests/input_data/receipt.xes") 6 | var_paths_durs = pm4py.get_variants_paths_duration(log) 7 | print(var_paths_durs.columns) 8 | 9 | # gets for each variant the average times (between all the cases of the given variant) 10 | # between the activities 'Confirmation of receipt' and 'T02 Check confirmation of receipt' 11 | df1 = var_paths_durs[(var_paths_durs["concept:name"] == "Confirmation of receipt") & (var_paths_durs["concept:name_2"] == "T02 Check confirmation of receipt")] 12 | print(df1[["@@variant_column", "@@flow_time"]]) 13 | 14 | # gets the paths which are repeated in some variants, along with the number of variants for which they are repeated 15 | df2 = var_paths_durs[var_paths_durs["@@cumulative_occ_path_column"] == 1] 16 | print(df2.groupby(["concept:name", "concept:name_2"]).size()) 17 | 18 | 19 | if __name__ == "__main__": 20 | execute_script() 21 | -------------------------------------------------------------------------------- /examples/windows_key_mouse_logger.py: -------------------------------------------------------------------------------- 1 | from pm4py.streaming.stream.live_event_stream import LiveEventStream 2 | from pm4py.streaming.connectors.windows.click_key_logger import WindowsEventLogger 3 | from pm4py.streaming.util.event_stream_printer import EventStreamPrinter 4 | import time 5 | 6 | 7 | def execute_script(): 8 | stream = LiveEventStream() 9 | wel = WindowsEventLogger(stream, screenshots_folder="output") 10 | printer = EventStreamPrinter() 11 | stream.register(printer) 12 | stream.start() 13 | wel.start() 14 | 15 | print("listening") 16 | 17 | # listen only for 5 seconds 18 | time.sleep(5) 19 | 20 | wel.stop() 21 | stream.stop() 22 | 23 | print("stopped") 24 | 25 | 26 | if __name__ == "__main__": 27 | execute_script() 28 | -------------------------------------------------------------------------------- /examples/woflan.py: -------------------------------------------------------------------------------- 1 | from pm4py.objects.log.importer.xes import importer as xes_importer 2 | from pm4py.algo.discovery.alpha import algorithm as alpha_miner 3 | from pm4py.algo.analysis.woflan import algorithm as woflan 4 | import os 5 | 6 | 7 | def execute_script(): 8 | log = xes_importer.apply(os.path.join("..", "tests", "input_data", "running-example.xes")) 9 | net, im, fm = alpha_miner.apply(log) 10 | is_sound, diagn = woflan.apply(net, im, fm, parameters={"print_diagnostics": True, "return_diagnostics": True}) 11 | print("is_sound", is_sound) 12 | print(diagn) 13 | 14 | 15 | if __name__ == "__main__": 16 | execute_script() 17 | -------------------------------------------------------------------------------- /examples/workalendar_example.py: -------------------------------------------------------------------------------- 1 | from pm4py.util.business_hours import BusinessHours 2 | from pm4py.util.dt_parsing.variants import strpfromiso 3 | import datetime 4 | from workalendar.europe import Italy 5 | from pm4py.util import constants 6 | 7 | 8 | def execute_script(): 9 | ts1 = 100000000 10 | ts2 = 110000000 11 | d1 = strpfromiso.fix_naivety(datetime.datetime.fromtimestamp(ts1)) 12 | d2 = strpfromiso.fix_naivety(datetime.datetime.fromtimestamp(ts2)) 13 | print(ts2-ts1) 14 | # default business hours: all the days of the week except Saturday and Sunday are working days. 15 | bh1 = BusinessHours(d1, d2, business_hour_slots=constants.DEFAULT_BUSINESS_HOUR_SLOTS) 16 | print(bh1.get_seconds()) 17 | # let's calculate the business hours using a proper work calendar. 18 | bh2 = BusinessHours(d1, d2, business_hour_slots=constants.DEFAULT_BUSINESS_HOUR_SLOTS, workcalendar=Italy()) 19 | print(bh2.get_seconds()) 20 | 21 | 22 | if __name__ == "__main__": 23 | execute_script() 24 | -------------------------------------------------------------------------------- /notebooks/.gitignore: -------------------------------------------------------------------------------- 1 | /event_data.slides.html 2 | /running_example_csv_exported_as_xes.xes 3 | /running_example_exported.csv 4 | /running_example_exported.csv 5 | /running_example_xes_exported_as_csv.csv 6 | -------------------------------------------------------------------------------- /notebooks/img/bpmn_running_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/notebooks/img/bpmn_running_example.png -------------------------------------------------------------------------------- /pm4py/algo/clustering/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/connectors/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | 23 | -------------------------------------------------------------------------------- /pm4py/algo/discovery/footprints/powl/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/discovery/footprints/powl/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/discovery/powl/inductive/utils/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/common/attributes/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/common/timestamp/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/common/traces/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/dfg/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/log/traces/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/pandas/attributes/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/pandas/ends_with/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/pandas/starts_with/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/pandas/suffixes/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | 23 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/pandas/traces/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | 23 | -------------------------------------------------------------------------------- /pm4py/algo/filtering/pandas/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/querying/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | 23 | -------------------------------------------------------------------------------- /pm4py/algo/simulation/playout/declare/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/simulation/playout/declare/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/algo/transformation/ocel/description/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | 23 | -------------------------------------------------------------------------------- /pm4py/algo/transformation/ocel/description/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | 23 | -------------------------------------------------------------------------------- /pm4py/objects/conversion/trie/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/conversion/trie/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/dfg/filtering/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/dfg/retrieval/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/dfg/utils/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | from pm4py.objects.dfg.utils import dfg_utils 23 | -------------------------------------------------------------------------------- /pm4py/objects/ocel/exporter/xmlocel/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/org/roles/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | from pm4py.objects.org.roles import obj 23 | -------------------------------------------------------------------------------- /pm4py/objects/org/sna/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | from pm4py.objects.org.sna import obj 23 | -------------------------------------------------------------------------------- /pm4py/objects/petri_net/data_petri_nets/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/petri_net/inhibitor_reset/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/powl/utils/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/process_tree/utils/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/objects/random_variables/deterministic/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/statistics/ocel/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/streaming/algo/conformance/declare/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/streaming/algo/conformance/declare/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/streaming/connectors/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/streaming/connectors/windows/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/util/compression/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | from pm4py.util.compression import dtypes, util -------------------------------------------------------------------------------- /pm4py/util/dt_parsing/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/util/lp/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | from pm4py.util.lp import solver, util, variants 23 | -------------------------------------------------------------------------------- /pm4py/util/lp/util/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/bpmn/util/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/decisiontree/util/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/networkx/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/networkx/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/ocel/eve_to_obj_types/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/ocel/eve_to_obj_types/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/ocel/object_graph/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/ocel/object_graph/variants/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/ocel/ocdfg/util/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | PM4Py – A Process Mining Library for Python 3 | Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt) 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as 7 | published by the Free Software Foundation, either version 3 of the 8 | License, or any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU Affero General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see this software project's root or 17 | visit . 18 | 19 | Website: https://processintelligence.solutions 20 | Contact: info@processintelligence.solutions 21 | ''' 22 | -------------------------------------------------------------------------------- /pm4py/visualization/powl/variants/icons/end.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /pm4py/visualization/powl/variants/icons/gate.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /pm4py/visualization/powl/variants/icons/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 12 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | pandas 3 | deprecation 4 | networkx 5 | graphviz 6 | wheel 7 | setuptools 8 | intervaltree 9 | lxml 10 | matplotlib 11 | pydotplus 12 | pytz 13 | scipy 14 | tqdm 15 | cvxopt;python_version<'3.14' 16 | -------------------------------------------------------------------------------- /requirements_complete.txt: -------------------------------------------------------------------------------- 1 | colorama 2 | contourpy 3 | cycler 4 | deprecation 5 | fonttools 6 | graphviz 7 | intervaltree 8 | kiwisolver 9 | lxml 10 | matplotlib 11 | networkx 12 | numpy 13 | packaging 14 | pandas 15 | pillow 16 | pydotplus 17 | pyparsing 18 | python-dateutil 19 | pytz 20 | scipy 21 | setuptools 22 | six 23 | sortedcontainers 24 | tqdm 25 | tzdata 26 | wheel 27 | -------------------------------------------------------------------------------- /requirements_stable.txt: -------------------------------------------------------------------------------- 1 | colorama==0.4.6 2 | contourpy==1.3.2 3 | cycler==0.12.1 4 | deprecation==2.1.0 5 | fonttools==4.58.0 6 | graphviz==0.20.3 7 | intervaltree==3.1.0 8 | kiwisolver==1.4.8 9 | lxml==5.4.0 10 | matplotlib==3.10.3 11 | networkx==3.4.2 12 | numpy==2.2.6 13 | packaging==25.0 14 | pandas==2.2.3 15 | pillow==11.2.1 16 | pydotplus==2.0.2 17 | pyparsing==3.2.3 18 | python-dateutil==2.9.0.post0 19 | pytz==2025.2 20 | scipy==1.15.3 21 | setuptools==80.8.0 22 | six==1.17.0 23 | sortedcontainers==2.4.0 24 | tqdm==4.67.1 25 | tzdata==2025.2 26 | wheel==0.45.1 27 | -------------------------------------------------------------------------------- /safety_checks/20240314: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/safety_checks/20240314 -------------------------------------------------------------------------------- /safety_checks/20270524: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/safety_checks/20270524 -------------------------------------------------------------------------------- /tests/README.txt: -------------------------------------------------------------------------------- 1 | To execute all tests: 2 | 3 | python execute_tests.py -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/__init__.py -------------------------------------------------------------------------------- /tests/compressed_input_data/01_running-example.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/01_running-example.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/02_teleclaims.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/02_teleclaims.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/03_repairExample.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/03_repairExample.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/04_reviewing.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/04_reviewing.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/05_bpic2017.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/05_bpic2017.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/06_bpic2013_closed.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/06_bpic2013_closed.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/07_bpic2013_incidents.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/07_bpic2013_incidents.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/08_receipt.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/08_receipt.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/09_a32f0n00.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/09_a32f0n00.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/10_orders.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/10_orders.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/11_tickets.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/11_tickets.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/12_roadtraffic_1t_per_variant.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/12_roadtraffic_1t_per_variant.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/13_SEPSIS_1t_per_variant.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/13_SEPSIS_1t_per_variant.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/14_Billing_1t_per_variant.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/14_Billing_1t_per_variant.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/15_bpic2020_permit_log_1t_per_variant.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/15_bpic2020_permit_log_1t_per_variant.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/16_bpic2019_1t_per_variant.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/16_bpic2019_1t_per_variant.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/17_bpic2012_1t_per_variant.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/17_bpic2012_1t_per_variant.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/18_bpic2017_application_1t_per_variant.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/18_bpic2017_application_1t_per_variant.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/19_roadtraffic_1t_per_variant.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/compressed_input_data/19_roadtraffic_1t_per_variant.xes.gz -------------------------------------------------------------------------------- /tests/compressed_input_data/DISCLAIMER: -------------------------------------------------------------------------------- 1 | These logs were taken from the 4TU.ResearchData log repository located at https://data.4tu.nl/repository/collection:event_logs_real 2 | 3 | And they were published under the license found on https://researchdata.4tu.nl/fileadmin/editor_upload/pdf/Terms_of_use/General_terms_of_use_4TU.ResearchData.pdf 4 | 5 | In particular, the terms of license obligate to cite the authors: 6 | 7 | BPI Challenge 2013 logs: 8 | Ward Steeman 9 | 10 | Receipt phase of an environmental permit application process (‘WABO’), CoSeLoG project: 11 | Buijs, J.C.A.M. 12 | 13 | BPI Challenge 2017: 14 | van Dongen, B.F. (Boudewijn) -------------------------------------------------------------------------------- /tests/constants.py: -------------------------------------------------------------------------------- 1 | INPUT_DATA_DIR = "input_data" 2 | OUTPUT_DATA_DIR = "test_output_data" 3 | PROBLEMATIC_XES_DIR = "xes_importer_tests" 4 | COMPRESSED_INPUT_DATA = "compressed_input_data" 5 | -------------------------------------------------------------------------------- /tests/dfg_tests.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | import pm4py 4 | 5 | 6 | class DfgTests(unittest.TestCase): 7 | def test_filter_act_percentage(self): 8 | from pm4py.algo.filtering.dfg import dfg_filtering 9 | log = pm4py.read_xes("input_data/running-example.xes") 10 | dfg, sa, ea = pm4py.discover_dfg(log) 11 | act_count = pm4py.get_event_attribute_values(log, "concept:name") 12 | dfg_filtering.filter_dfg_on_activities_percentage(dfg, sa, ea, act_count, 0.1) 13 | 14 | def test_filter_paths_percentage(self): 15 | from pm4py.algo.filtering.dfg import dfg_filtering 16 | log = pm4py.read_xes("input_data/running-example.xes") 17 | dfg, sa, ea = pm4py.discover_dfg(log) 18 | act_count = pm4py.get_event_attribute_values(log, "concept:name") 19 | dfg_filtering.filter_dfg_on_paths_percentage(dfg, sa, ea, act_count, 0.3) 20 | 21 | 22 | if __name__ == "__main__": 23 | unittest.main() 24 | -------------------------------------------------------------------------------- /tests/imp_everything.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | 4 | 5 | class Pm4pyImportPackageTest(unittest.TestCase): 6 | def test_importeverything(self): 7 | # to avoid static method warnings in tests, 8 | # that by construction of the unittest package have to be expressed in such way 9 | self.dummy_variable = "dummy_value" 10 | import pm4py 11 | log = pm4py.objects.log.importer.xes.importer.apply( 12 | os.path.join("input_data", "running-example.xes")) 13 | self.assertEqual(len(log), 6) 14 | 15 | 16 | if __name__ == "__main__": 17 | unittest.main() 18 | -------------------------------------------------------------------------------- /tests/input_data/bpic2012.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/bpic2012.xes.gz -------------------------------------------------------------------------------- /tests/input_data/correlation_mining.csv: -------------------------------------------------------------------------------- 1 | case:concept:name,concept:name,time:timestamp 2 | 1,A,1971-01-01 00:20 3 | 1,B,1971-01-01 02:04 4 | 1,E,1971-01-01 02:32 5 | 2,A,1971-01-01 02:15 6 | 2,D,1971-01-01 03:14 7 | 2,E,1971-01-01 05:06 8 | 3,A,1971-01-01 02:27 9 | 3,D,1971-01-01 04:17 10 | 3,E,1971-01-01 06:51 11 | 4,A,1971-01-01 03:06 12 | 4,B,1971-01-01 05:04 13 | 4,E,1971-01-01 07:26 14 | 5,A,1971-01-01 03:40 15 | 5,B,1971-01-01 05:59 16 | 5,E,1971-01-01 07:49 17 | 6,A,1971-01-01 04:18 18 | 6,C,1971-01-01 07:08 19 | 6,E,1971-01-01 09:05 20 | 7,A,1971-01-01 05:54 21 | 7,C,1971-01-01 07:30 22 | 7,E,1971-01-01 09:17 23 | 8,A,1971-01-01 06:20 24 | 8,D,1971-01-01 08:36 25 | 8,E,1971-01-01 10:03 26 | 9,A,1971-01-01 06:41 27 | 9,D,1971-01-01 08:56 28 | 9,E,1971-01-01 10:20 29 | 10,A,1971-01-01 07:13 30 | 10,C,1971-01-01 09:10 31 | 10,E,1971-01-01 10:26 32 | -------------------------------------------------------------------------------- /tests/input_data/db/Chinook_Sqlite.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/db/Chinook_Sqlite.sqlite -------------------------------------------------------------------------------- /tests/input_data/db/northwind.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/db/northwind.sqlite -------------------------------------------------------------------------------- /tests/input_data/fairness/hiring_log_high.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/fairness/hiring_log_high.xes.gz -------------------------------------------------------------------------------- /tests/input_data/fairness/hospital_log_high.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/fairness/hospital_log_high.xes.gz -------------------------------------------------------------------------------- /tests/input_data/fairness/lending_log_high.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/fairness/lending_log_high.xes.gz -------------------------------------------------------------------------------- /tests/input_data/fairness/renting_log_high.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/fairness/renting_log_high.xes.gz -------------------------------------------------------------------------------- /tests/input_data/helpdesk.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/helpdesk.xes.gz -------------------------------------------------------------------------------- /tests/input_data/ocel/VBFA.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/ocel/VBFA.zip -------------------------------------------------------------------------------- /tests/input_data/ocel/example_log.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/ocel/example_log.sqlite -------------------------------------------------------------------------------- /tests/input_data/ocel/newocel.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/ocel/newocel.sqlite -------------------------------------------------------------------------------- /tests/input_data/ocel/ocel20_example.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/ocel/ocel20_example.sqlite -------------------------------------------------------------------------------- /tests/input_data/receipt.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/receipt.parquet -------------------------------------------------------------------------------- /tests/input_data/roadtraffic.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/roadtraffic.parquet -------------------------------------------------------------------------------- /tests/input_data/running-example.dfg: -------------------------------------------------------------------------------- 1 | 8 2 | reinitiate request 3 | examine casually 4 | check ticket 5 | register request 6 | reject request 7 | pay compensation 8 | decide 9 | examine thoroughly 10 | 1 11 | 3x6 12 | 2 13 | 5x3 14 | 4x3 15 | 3>1x3 16 | 1>2x4 17 | 2>6x6 18 | 6>0x3 19 | 0>7x1 20 | 7>2x2 21 | 6>5x3 22 | 3>2x2 23 | 2>1x2 24 | 1>6x2 25 | 3>7x1 26 | 6>4x3 27 | 0>2x1 28 | 0>1x1 29 | 2>7x1 30 | 7>6x1 31 | -------------------------------------------------------------------------------- /tests/input_data/running-example.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/running-example.parquet -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a12/a12f0n00.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a12/a12f0n00.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a12/a12f0n05.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a12/a12f0n05.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a12/a12f0n10.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a12/a12f0n10.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a12/a12f0n20.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a12/a12f0n20.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a12/a12f0n50.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a12/a12f0n50.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a22/a22f0n00.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a22/a22f0n00.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a22/a22f0n05.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a22/a22f0n05.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a22/a22f0n10.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a22/a22f0n10.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a22/a22f0n20.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a22/a22f0n20.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a22/a22f0n50.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a22/a22f0n50.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a32/a32f0n00.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a32/a32f0n00.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a32/a32f0n05.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a32/a32f0n05.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a32/a32f0n10.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a32/a32f0n10.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a32/a32f0n20.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a32/a32f0n20.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a32/a32f0n50.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a32/a32f0n50.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a42/a42f0n00.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a42/a42f0n00.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a42/a42f0n05.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a42/a42f0n05.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a42/a42f0n10.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a42/a42f0n10.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a42/a42f0n20.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a42/a42f0n20.xes.gz -------------------------------------------------------------------------------- /tests/input_data/synthetic_logs/a42/a42f0n50.xes.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/input_data/synthetic_logs/a42/a42f0n50.xes.gz -------------------------------------------------------------------------------- /tests/input_data/xes_20.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/test_output_data/README.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/test_output_data/README.txt -------------------------------------------------------------------------------- /tests/xes_importer_tests/attributeEventSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/attributeTraceSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/attributeValuesSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/booleanCorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/booleanIncorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierAttributeSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierEmptyKeys.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierEventCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierEventSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierIncorrectKey.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierIncorrectScope.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierNoAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 0 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierTooManyAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierTraceCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/classifierTraceSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/dateCorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/dateIncorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/dateNoTZD.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionAttributeSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionClassifierSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionEventSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionGlobalSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionIncorrectKey.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionNoAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionNotDeclared.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionStandard.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionTooManyAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/extensionTraceSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalAttributeSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalClassifierSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalEventStringCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalEventSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalIncorrectScope.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalNoAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalStringCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalStringNoAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalStringTooManyAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalTooManyAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalTraceStringCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/globalTraceSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/idCorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/idIncorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/intCorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/intIncorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/listEmptyValues.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/listNoValues.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/listTwoValues.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/logCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/logNoAttributes.xes: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/logNoNestedAttributes.xes: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/logTooManyAttributes.xes: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/noLog.xes: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/tests/xes_importer_tests/noLog.xes -------------------------------------------------------------------------------- /tests/xes_importer_tests/realCorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/realIncorrectValue.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/stringCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/stringNestedNotDeclared.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/stringNoAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/stringNotNestedButDeclared.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/stringTooManyAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/traceCorrectAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/traceEventSwapped.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /tests/xes_importer_tests/traceTooManyAttributes.xes: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tests/xescert_exportlogs/README.txt: -------------------------------------------------------------------------------- 1 | This folder shall contain the logs exported by the XES certification script. -------------------------------------------------------------------------------- /tests/xescert_images/README.txt: -------------------------------------------------------------------------------- 1 | This folder shall contain the images produced by the XES certification script. -------------------------------------------------------------------------------- /tests/xesinput/README.txt: -------------------------------------------------------------------------------- 1 | This folder shall contain the input XES files for XES certification. -------------------------------------------------------------------------------- /third_party/old_python_deps/optional_py38.txt: -------------------------------------------------------------------------------- 1 | cvxopt==1.3.2 2 | joblib==1.3.2 3 | pyarrow==13.0.0 4 | pyemd==1.0.0 5 | scikit-learn==1.3.1 6 | threadpoolctl==3.2.0 7 | -------------------------------------------------------------------------------- /third_party/old_python_deps/requirements_py38.txt: -------------------------------------------------------------------------------- 1 | colorama==0.4.6 2 | contourpy==1.1.1 3 | cycler==0.12.0 4 | deprecation==2.1.0 5 | fonttools==4.43.0 6 | graphviz==0.20.1 7 | intervaltree==3.1.0 8 | kiwisolver==1.4.5 9 | lxml==4.9.3 10 | matplotlib==3.7.3 11 | networkx==3.1 12 | numpy==1.24.4 13 | packaging==23.2 14 | pandas==2.0.3 15 | Pillow==10.0.1 16 | pydotplus==2.0.2 17 | pyparsing==3.1.1 18 | python-dateutil==2.8.2 19 | pytz==2023.3.post1 20 | scipy==1.10.1 21 | six==1.16.0 22 | sortedcontainers==2.4.0 23 | StringDist==1.0.9 24 | tqdm==4.66.1 25 | tzdata==2023.3 26 | -------------------------------------------------------------------------------- /third_party/tqdm.LICENSE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/process-intelligence-solutions/pm4py/c9b64e38965f15db973a82b1f9508c830ebdba51/third_party/tqdm.LICENSE --------------------------------------------------------------------------------