├── .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 |
15 |
--------------------------------------------------------------------------------
/pm4py/visualization/powl/variants/icons/gate.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
16 |
--------------------------------------------------------------------------------
/pm4py/visualization/powl/variants/icons/play.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
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
--------------------------------------------------------------------------------