- Optimal alignments (
conformance::alignments):align_log/align_projection/align_trace/align_empty_tracecompute cost-optimal alignments via Dijkstra over a synchronous product netcompute_fitnessderives log/trace fitness for pre-computed alignments- Configurable
AlignmentOptions(CostFunction,max_states) - Exposed as bindings
- Generic, reusable state-space search in
utils::dijkstra_search(SearchProblemtrait +search) register_bindingmacro accepts slice arguments (&[T]extracted asVec<T>)
- Translate a
ProcessTreeinto aPetriNet:ProcessTree::to_petri_netreturns a workflow net with initial and final marking setadd_to_petri_netonNode/Operator/Leaffor recursive insertion into an existing netFrom<ProcessTree> for PetriNet
- Bump MSRV to 1.88
- Update dependencies (pin
cxx-buildto matchkuzu'scxx, refreshcargo denylicense allowlist) - Add Criterion + dhat benchmarks for event log import (+ DataFrame conversion)
SlimLinkedOCELand bindings:add_event/add_objectpad or truncateattributesto the declared length with a warning, instead of causing out-of-bounds panics lateradd_e2o/add_o2o/delete_e2o/delete_o2oreturnbool; invalid indices warn and returnfalseinstead of panicking- Multiple qualifiers between the same
(event, object)or(from, to)pair are kept, and reverse lookups return every qualifier fat_ev/fat_obfall back toNull/ empty attribute on missing positional values- Drop
unwrap()s on unknown type names in reverse-type lookups - Expanded docstrings on
slim_ocel_bindingsfor the auto-generated Python API docs
Importable/ExportableforSlimLinkedOCELaligned with theOCELversions- OCEL import/export supports
.gzfor all formats - Better defaults for OCEL 2.0 CSV export
- Add
stream_xes_bufreadfunction for streaming XES traces from aBufRead(supports gzipped input) - Remove noisy
println!in OCEL XML import for extended OCELs
- Parse XES version from log element
- Fix some missing unescapes in XML-based imports (XES, PNML)
- New
analysismodule with reusable analysis functions (also exposed as bindings ;))analysis::case_centric::dotted_chart: Configurable multi-axis dotted chart generation (DottedChartOptions)analysis::case_centric::event_timestamp_histogram: Aggregate event timestamps into bins grouped by activity (EventTimestampOptions)analysis::object_centric::object_attribute_changes: Extract time-stamped attribute change history for an OCEL object
- Rename bindings function for SlimLinkedOCEL bindings (not breaking, as 0.5.0 bindings were not published yet)
- Fix SlimLinkedOCEL addObject function (previously did not correctly expand the reverse E2O/O2O reference array)
- Change error type of OCEL XML import to
OCELIOError(Breaking), return error if XML does not contain any event or object types- Added related test (
test_xes_as_ocel_xml_import) to ensure xes files are not correctly imported as OCEL
- Added related test (
- Implement
Defaultfor SlimLinkedOCEL, addnewfunction for SlimLinkedOCEL - Expose SlimLinkedOCEL binding functions (e.g., for adding events/objects, getting relations, etc.)
- Implement From<...> for (bi-directional) conversion between (XES)
AttributeValues toOCELAttributeValues - Remove
Hashderive fromOCELType(Breaking)
- Fix version mismatch in macros crate
- Fix: typo in function name:
oc_declare_conformace->oc_declare_conformance(Breaking)
- New OCEL CSV Format
- Added CSV format support for OCEL:
- Added Importer/Exporter for CSV OCEL file format
- Added CSV file format to OCEL io trait + known formats (as
.ocel.csv)
- Bindings Improvements:
- Exposed OC-DECLARE conformance function (
oc_declare_conformace) to bindings - Renamed
discover_oc-declarebinding todiscover_oc_declare(Breaking for Bindings) - Renamed
discover_dfg_from_loceltodiscover_dfg_from_ocel(Breaking) - Added
SlimLinkedOCEL<->OCELconversion support in bindings - Implemented
LinkedOCELAccesstrait support in bindings macro for more generic functions - Added
ocel_type_statsbinding to compute event/object type statistics - Exposed
flatten_ocel_onfunction to bindings for flattening OCEL on object types - Exposed
add_init_exit_events_to_ocelfunction to bindings
- Exposed OC-DECLARE conformance function (
- Other Fixes and Improvements:
- Fixed SQLite/DuckDB export to remove existing file before export (prevents UNIQUE constraint errors)
- Combined/Deduped timestamp-related parsing functionality across files
- Implemented
Nullas defaultOCELAttributeValue
- Internal Improvements:
- Updated
rusqliteand related dependencies - Improved CLI in
r4pm
- Updated
- The
From<OCELAttributeValue>implementation forOCELAttributeTypewas removed. Instead, use theget_typefunction onOCELAttributeValueto retrieve its type. - Updates related to io module for CSV parsing (e.g., new error variant in
OCELIOError) - Renamed binding
discover_oc-declaretodiscover_oc_declare
- Added
verboseoption toXESImportOptions, defaulting to true- Note: Technically this is a breaking change, however the recommended way to use
XESImportOptionsis non-exhaustive with default fallback:- e.g.,
XESImportOptions {verbose: false, ..Default::default()}
- e.g.,
- Note: Technically this is a breaking change, however the recommended way to use
- Unified IO Traits: Introduced
ImportableandExportabletraits inprocess_mining::core::ioto standardize import and export operations across different data structures. - EventLog IO: Implemented
ImportableandExportableforEventLog, supporting JSON (.json), XES (.xes), and Gzipped XES (.xes.gz) formats. - PetriNet IO: Implemented
ImportableandExportableforPetriNet, supporting PNML (.pnml) format. - OCEL IO: Implemented
ImportableandExportablefor Object-Centric Event Logs (OCEL), including support for SQLite and DuckDB (if features enabled). - Format Inference: Added automatic format inference based on file extensions (e.g.,
.xes,.xes.gz,.pnml). - Auto-Bindings: Added auto-binding functionality to facilitate Python bindings generation.
- Module Restructuring:
- Moved Alpha+++ discovery to
process_mining::discovery. - Moved Petri nets to
process_mining::core::process_models. - Moved DFG discovery to
process_mining::discovery.
- Moved Alpha+++ discovery to
- API Simplification: Users can now use generic
import_from_pathandexport_to_pathmethods. These methods now strictly rely on file extension for format inference, removing the optional format argument.
- KuzuDB Support: Added initial support for OCEL export to KuzuDB.
- DuckDB Support: Added example for OCEL export to DuckDB.
- Polars Export: Added OCEL to Polars DataFrame export.
- Object-Centric Process Trees: Added implementation of object-centric process trees and abstraction-based conformance checking.
- Token-Based Replay: Implemented token-based replay on Petri nets.
- Incidence Matrices: Added incidence matrices for Petri nets.
- Event Log Macros: Implemented macros for easier event log creation.
- OC-DECLARE: Object-centric declarative process models, with discovery and conformance checking.
- Exposed Fields: Exposed
OCLanguageAbstractionfields.
- Importing Event Logs:
- Old:
import_xes_file("log.xes") - New:
EventLog::import_from_path("log.xes")
- Old:
- Exporting Event Logs:
- New:
log.export_to_path("log.xes")
- New:
- Traits: Ensure
process_mining::Importableandprocess_mining::Exportableare in scope if you need to use the traits generically. - Format Specification: If you need to specify a format explicitly (e.g., reading from a stream or non-standard extension), use
import_from_readerorexport_to_writerwhich still accept a format string.