r4pm
Python bindings for the Rust4PM Project: Process mining in Python with the speed of Rust
This library provides basic import/export of XES/OCEL event data, as well as other exposed functionality from the Rust4PM project (e.g., process discovery algorithms).
Features
- Fast XES/OCEL Import/Export: Efficient Rust-based import and export of
.xes,.xes.gz, and OCEL2 (.xml/.json) files - Auto-Generated Bindings: All process_mining functions automatically exposed with full IDE support (autocomplete, type hints, docs)
- Registry System: Manage data objects and convert between types as needed
- Polars DataFrames: Polars facilitates the fast transfer of event data from Python to Rust and vice versa
Installation
pip install r4pm # default
pip install r4pm-full # additionally bundles DuckDB (~15 MiB larger)
Both provide the r4pm import package, so install one or the other. r4pm-full adds the DuckDB
bindings (stream_ocel_to_duckdb, read_consolidated_ocel_from_duckdb, ...), nothing else differs.
import r4pm
r4pm.__variant__ # "default" or "full"
r4pm.__features__ # optional features compiled in
r4pm.has_feature("ocel-duckdb")
Quick Start
from r4pm import bindings
import r4pm
# Load an OCEL file - returns a registry ID
ocel_id = r4pm.import_item('OCEL', 'data/orders.xml')
# Convert to SlimLinkedOCEL for analysis functions
locel_id = bindings.slim_link_ocel(ocel=ocel_id)
# Get statistics
num = bindings.num_events(ocel=locel_id)
print(f"Events: {num}")
# Discover object-centric DFG
dfg = bindings.discover_dfg_from_ocel(locel_id)
print(f"Discovered DFG for {len(dfg['object_type_to_dfg'])} object types")
# For case-centric event logs:
log_id = r4pm.import_item('EventLog', 'data/log.xes')
case_dfg = bindings.discover_dfg(log_id)
How It Works
Auto-Generated Bindings
All functions from the process_mining Rust library are automatically discovered and exposed as Python functions with:
- Full type hints for IDE autocomplete
- Automatic documentation from Rust docs
- Type validation via JSON schemas
The bindings are organized by module (mirroring the Rust crate structure):
from r4pm import bindings
# Top-level access to all functions
bindings.discover_dfg(event_log=log_id)
bindings.num_events(ocel=locel_id)
# Or use submodules for organization
from r4pm.bindings.discovery.case_centric import dfg
dfg.discover_dfg(event_log=log_id)
Bindings are automatically generated during the Rust build via build.rs.
Registry System
Data is managed through a registry that holds different object types:
OCEL- Raw OCEL dataSlimLinkedOCEL- Memory-efficient linked OCEL (required by most functions)IndexLinkedOCEL- Indexed OCEL for analysisEventLog- Case-centric event logEventLogActivityProjection- Activity-projected log for discovery
# Load files into registry
ocel_id = r4pm.import_item('OCEL', 'file.xml')
log_id = r4pm.import_item('EventLog', 'file.xes')
# Convert between types (either like this or using r4pm.convert_item)
locel_id = bindings.index_link_ocel(ocel=ocel_id)
proj_id = bindings.log_to_activity_projection(log=log_id)
# List registry contents
for item in r4pm.list_items():
print(f"{item['id']}: {item['type']}")
Simple Import/Export API
For direct DataFrame operations without the registry, use the df submodule.
XES
import r4pm
# Import returns (DataFrame, log_attributes_json)
xes, attrs = r4pm.df.import_xes("file.xes", date_format="%Y-%m-%d")
r4pm.df.export_xes(xes, "test_data/output.xes")
OCEL
# Returns dict with DataFrames: events, objects, relations, o2o, object_changes
ocel = r4pm.df.import_ocel("file.xml")
print(ocel['events'].shape)
r4pm.df.export_ocel(ocel, "export.xml")
# PM4Py integration (requires pm4py)
ocel_pm4py = r4pm.df.import_ocel_pm4py("file.xml")
print(ocel['events'].shape)
r4pm.df.export_ocel_pm4py(ocel_pm4py, "export.xml")
Petri Nets & Alignments
A Petri net is a plain JSON-compatible dict (r4pm.petri_net.PetriNet). Import/export
PNML, convert to/from PM4Py, and compute alignment-based fitness with the fast Rust
alignment implementation.
import pm4py
import r4pm
from r4pm import petri_net
from r4pm.bindings.conformance.case_centric.alignments import align_variants, compute_fitness
LOG = "test_data/Sepsis Cases - Event Log.xes.gz"
# 1. Discover a Petri net with PM4Py (Inductive Miner infrequent, 0.2 noise threshold)
log = pm4py.read_xes(LOG)
net, im, fm = pm4py.discover_petri_net_inductive(log, noise_threshold=0.2)
# 2. Convert the PM4Py net (+ markings) to an r4pm Petri net dict
rnet = petri_net.from_pm4py(net, im, fm)
# petri_net.export_pnml(rnet, "model.pnml") # write PNML
# rnet = petri_net.import_pnml("model.pnml") # or read PNML directly
# 3. Load the log into the registry
log_id = r4pm.import_item("EventLog", LOG)
# 4. Align all variants with the Rust binding and compute fitness
# (the EventLog id is auto-projected to activity variants)
align_res = align_variants(rnet, log_id)
fitness = compute_fitness(align_res, rnet)
print(fitness)
# {'log_fitness': 0.962, 'average_fitness': 0.907,
# 'perfectly_fitting_frac': 0.626, 'total_costs': 573}
Development
Setup
# Install Rust: https://rustup.rs/
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Create virtual environment
python -m venv .venv
source .venv/bin/activate
# Install in development mode
pip install maturin
maturin develop --release
How Bindings Are Generated
Python bindings are automatically generated during the Rust build via build.rs.
Thus, bindings are always in sync with the Rust code and do not require manual regeneration.
The build script:
- Reads function metadata from the
process_miningcrate - Generates
r4pm/bindings/with typed Python wrappers and.pyistubs - Organizes functions by their Rust module structure
Building for Release
maturin build --release # Creates wheels in target/wheels/
The wheel automatically includes the generated bindings.
Running Tests
# Run comprehensive test suite
python test_all.py
# Run simple example
python example.py
The test suite (test_all.py) covers:
- Automatic type conversion (positional & keyword arguments)
- Process discovery (DFG, OC-Declare)
- Registry operations (CRUD, DataFrames, export)
- Simple Import/Export DataFrame (
df) API - Edge cases and conversion caching
LICENSE
This package is licensed under either Apache License Version 2.0 or MIT License at your option.
Metadata
Release files for r4pm-full 0.6.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| r4pm_full-0.6.1.tar.gz | 70.7 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| r4pm_full-0.6.1-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| r4pm_full-0.6.1-cp39-abi3-musllinux_1_2_x86_64.whl | CPython 3.9 | abi3 | Linux musl 1.2+ x86-64 | Details |
| r4pm_full-0.6.1-cp39-abi3-manylinux_2_28_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| r4pm_full-0.6.1-cp39-abi3-manylinux_2_28_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| r4pm_full-0.6.1-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
| r4pm_full-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 159.7 MB
Release files / r4pm_full-0.6.1.tar.gz
| Download URL | r4pm_full-0.6.1.tar.gz |
|---|---|
| Size | 70.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
738700f5a3a833bf281817477f8ce2ed1e948d80cb3e320707ac76ac4971ad95
|
|
BLAKE2b-256 checksum How to use checksums |
0d7354e0df959ae1f5985f5350878064f7483358feb63ea7d37e336a9da5721f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / r4pm_full-0.6.1-cp39-abi3-win_amd64.whl
| Download URL | r4pm_full-0.6.1-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 21.2 MB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
adc9fa72dc4fb214720619b87b12600d35d8f753b8635059f93f957b17972fc0
|
|
BLAKE2b-256 checksum How to use checksums |
3724c29b1cbe3c12cd3d3b87506b224182da188efee14a89391b2cf89cb03408
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / r4pm_full-0.6.1-cp39-abi3-musllinux_1_2_x86_64.whl
| Download URL | r4pm_full-0.6.1-cp39-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 35.4 MB |
| Tags | CPython 3.9 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c1403abcff0abbb4f70b3489b5719da2f73770aa2205da4790857baf65553002
|
|
BLAKE2b-256 checksum How to use checksums |
b6eddabab20a360150aebad50cca8742ac1094433194853595cd747808c7a5ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / r4pm_full-0.6.1-cp39-abi3-manylinux_2_28_x86_64.whl
| Download URL | r4pm_full-0.6.1-cp39-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 27.8 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
d0a29dc1bfab0df5850eed18a5fba400402be6d855d890c4382973ff28e12356
|
|
BLAKE2b-256 checksum How to use checksums |
6538f087cee389269af2e55a9c03cceb60f47e892e35a62a93c5822ecfec1af4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / r4pm_full-0.6.1-cp39-abi3-manylinux_2_28_aarch64.whl
| Download URL | r4pm_full-0.6.1-cp39-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 27.2 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
f6b53310f8a62cd97be2ffbd5ebfcb1b966c11ad3684b37b8d9490110fca2489
|
|
BLAKE2b-256 checksum How to use checksums |
a1965b16fa71fc56eaebe3c0af04fcf632bfaaf5e840ab734bd56be40d7e637c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / r4pm_full-0.6.1-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | r4pm_full-0.6.1-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 23.4 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
64359fdc42d9c7d03ef7f7a17d8a8589480c9435be4db1c8fd45ddb46962b944
|
|
BLAKE2b-256 checksum How to use checksums |
03fb3e9cb41545afa1b7cfd6ebb78eed375d60478e35db86f068d7fb5bf9d6a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / r4pm_full-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | r4pm_full-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 24.6 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
b68fdf2d084e77078b0878873003708017b49f71233a19a826202993251bff75
|
|
BLAKE2b-256 checksum How to use checksums |
ba8e359baa467e4bc64baba124d4d89961192119508dbadd2500150fc66d9f46
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency log