'''
    PM4Py – A Process Mining Library for Python
Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt)

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see this software project's root or
visit <https://www.gnu.org/licenses/>.

Website: https://processintelligence.solutions
Contact: info@processintelligence.solutions
'''
import time

from pm4py import (
    util,
    objects,
    statistics,
    algo,
    visualization,
    llm,
    connectors,
)
from pm4py import (
    analysis,
    conformance,
    convert,
    discovery,
    filtering,
    hof,
    ml,
    ocel,
    org,
    read,
    sim,
    stats,
    utils,
    vis,
    write,
)
from pm4py.read import (
    read_xes,
    read_dfg,
    read_bpmn,
    read_pnml,
    read_ptml,
    read_ocel,
    read_ocel_csv,
    read_ocel_xml,
    read_ocel_json,
    read_ocel_sqlite,
    read_ocel2,
    read_ocel2_sqlite,
    read_ocel2_json,
    read_ocel2_xml,
)
from pm4py.write import (
    write_xes,
    write_dfg,
    write_bpmn,
    write_pnml,
    write_ptml,
    write_ocel,
    write_ocel_json,
    write_ocel_csv,
    write_ocel_xml,
    write_ocel_sqlite,
    write_ocel2,
    write_ocel2_sqlite,
    write_ocel2_xml,
    write_ocel2_json,
)
from pm4py.utils import (
    format_dataframe,
    parse_process_tree,
    serialize,
    deserialize,
    set_classifier,
    parse_event_log_string,
    project_on_event_attribute,
    sample_cases,
    sample_events,
    rebase,
    parse_powl_model_string,
)
from pm4py.filtering import (
    filter_log_relative_occurrence_event_attribute,
    filter_start_activities,
    filter_end_activities,
    filter_variants,
    filter_directly_follows_relation,
    filter_time_range,
    filter_eventually_follows_relation,
    filter_event_attribute_values,
    filter_trace_attribute_values,
    filter_between,
    filter_case_size,
    filter_case_performance,
    filter_activities_rework,
    filter_paths_performance,
    filter_variants_by_coverage_percentage,
    filter_variants_top_k,
    filter_ocel_event_attribute,
    filter_ocel_object_attribute,
    filter_ocel_object_types_allowed_activities,
    filter_ocel_object_per_type_count,
    filter_ocel_start_events_per_object_type,
    filter_ocel_end_events_per_object_type,
    filter_ocel_events_timestamp,
    filter_prefixes,
    filter_suffixes,
    filter_trace_segments,
    filter_four_eyes_principle,
    filter_activity_done_different_resources,
    filter_ocel_events,
    filter_ocel_objects,
    filter_ocel_object_types,
    filter_ocel_cc_object,
    filter_ocel_cc_length,
    filter_ocel_cc_otype,
    filter_ocel_cc_activity,
    filter_ocel_activities_connected_object_type,
    filter_dfg_activities_percentage,
    filter_dfg_paths_percentage
)
from pm4py.discovery import (
    discover_petri_net_alpha,
    discover_petri_net_alpha_plus,
    discover_petri_net_ilp,
    discover_petri_net_heuristics,
    discover_petri_net_inductive,
    discover_process_tree_inductive,
    discover_heuristics_net,
    discover_dfg,
    discover_footprints,
    discover_eventually_follows_graph,
    discover_directly_follows_graph,
    discover_bpmn_inductive,
    discover_performance_dfg,
    discover_transition_system,
    discover_prefix_tree,
    discover_temporal_profile,
    discover_log_skeleton,
    discover_batches,
    derive_minimum_self_distance,
    discover_dfg_typed,
    discover_declare,
    discover_powl,
    correlation_miner,
    discover_otg,
    discover_etot,
)
from pm4py.conformance import (
    conformance_diagnostics_token_based_replay,
    conformance_diagnostics_alignments,
    fitness_token_based_replay,
    fitness_alignments,
    precision_token_based_replay,
    precision_alignments,
    conformance_diagnostics_footprints,
    fitness_footprints,
    precision_footprints,
    check_is_fitting,
    conformance_temporal_profile,
    conformance_declare,
    conformance_log_skeleton,
    conformance_ocdfg,
    conformance_otg,
    conformance_etot,
    replay_prefix_tbr,
    generalization_tbr,
)
from pm4py.ocel import (
    ocel_objects_interactions_summary,
    ocel_temporal_summary,
    ocel_objects_summary,
    ocel_get_object_types,
    ocel_get_attribute_names,
    ocel_flattening,
    ocel_object_type_activities,
    ocel_objects_ot_count,
    discover_ocdfg,
    discover_oc_petri_net,
    discover_objects_graph,
    sample_ocel_objects,
    ocel_drop_duplicates,
    ocel_merge_duplicates,
    ocel_sort_by_additional_column,
    ocel_add_index_based_timedelta,
    sample_ocel_connected_components,
    ocel_o2o_enrichment,
    ocel_e2o_lifecycle_enrichment,
    cluster_equivalent_ocel,
)
from pm4py.vis import (
    view_petri_net,
    save_vis_petri_net,
    view_dfg,
    save_vis_dfg,
    view_process_tree,
    save_vis_process_tree,
    view_ocdfg,
    save_vis_ocdfg,
    view_heuristics_net,
    save_vis_heuristics_net,
    view_bpmn,
    save_vis_bpmn,
    view_sna,
    save_vis_sna,
    view_dotted_chart,
    save_vis_dotted_chart,
    view_performance_spectrum,
    save_vis_performance_spectrum,
    view_case_duration_graph,
    view_events_per_time_graph,
    save_vis_case_duration_graph,
    save_vis_events_per_time_graph,
    view_events_distribution_graph,
    save_vis_events_distribution_graph,
    view_performance_dfg,
    save_vis_performance_dfg,
    view_ocpn,
    save_vis_ocpn,
    view_network_analysis,
    save_vis_network_analysis,
    view_transition_system,
    save_vis_transition_system,
    view_prefix_tree,
    save_vis_prefix_tree,
    view_object_graph,
    save_vis_object_graph,
    view_alignments,
    save_vis_alignments,
    view_footprints,
    save_vis_footprints,
    view_powl,
    save_vis_powl,
)
from pm4py.convert import (
    convert_to_event_log,
    convert_to_event_stream,
    convert_to_dataframe,
    convert_to_bpmn,
    convert_to_petri_net,
    convert_to_process_tree,
    convert_to_reachability_graph,
    convert_log_to_ocel,
    convert_ocel_to_networkx,
    convert_log_to_networkx,
    convert_log_to_time_intervals,
    convert_petri_net_to_networkx,
    convert_petri_net_type,
    convert_to_powl,
)
from pm4py.analysis import (
    cluster_log,
    check_soundness,
    compute_emd,
    solve_marking_equation,
    solve_extended_marking_equation,
    construct_synchronous_product_net,
    insert_artificial_start_end,
    check_is_workflow_net,
    maximal_decomposition,
    generate_marking,
    reduce_petri_net_invisibles,
    reduce_petri_net_implicit_places,
    insert_case_arrival_finish_rate,
    insert_case_service_waiting_time,
    get_enabled_transitions,
    simplicity_petri_net,
    behavioral_similarity,
    structural_similarity,
    embeddings_similarity,
    get_activity_labels,
    replace_activity_labels,
    label_sets_similarity,
    map_labels_from_second_model
)
from pm4py.stats import (
    get_start_activities,
    get_process_cube,
    get_end_activities,
    get_event_attributes,
    get_event_attribute_values,
    get_variants,
    get_trace_attributes,
    get_variants_as_tuples,
    get_trace_attribute_values,
    get_case_arrival_average,
    get_minimum_self_distances,
    get_minimum_self_distance_witnesses,
    get_frequent_trace_segments,
    get_case_arrival_average,
    get_rework_cases_per_activity,
    get_case_overlap,
    get_cycle_time,
    get_all_case_durations,
    get_case_duration,
    get_activity_position_summary,
    get_stochastic_language,
    split_by_process_variant,
    get_variants_paths_duration,
    get_service_time
)
from pm4py.sim import play_out, generate_process_tree
from pm4py.ml import (
    split_train_test,
    get_prefixes_from_log,
    extract_ocel_features,
    extract_features_dataframe,
    extract_temporal_features_dataframe,
    extract_outcome_enriched_dataframe,
    extract_target_vector,
)
from pm4py.org import (
    discover_handover_of_work_network,
    discover_activity_based_resource_similarity,
    discover_subcontracting_network,
    discover_working_together_network,
    discover_organizational_roles,
    discover_network_analysis,
)

# from pm4py.hof import filter_log, filter_trace, sort_trace, sort_log
from pm4py.meta import (
    __name__,
    __version__,
    __doc__,
    __author__,
    __author_email__,
    __maintainer__,
    __maintainer_email__,
)

from pm4py.objects.petri_net.obj import PetriNet, Marking
from pm4py.objects.process_tree.obj import ProcessTree
from pm4py.objects.ocel.obj import OCEL
from pm4py.objects.bpmn.obj import BPMN

time.clock = time.process_time
