Skip to main content

Rust-based Process Mining

Project description

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

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 data
  • SlimLinkedOCEL - Memory-efficient linked OCEL (required by most functions)
  • IndexLinkedOCEL - Indexed OCEL for analysis
  • EventLog - Case-centric event log
  • EventLogActivityProjection - 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:

  1. Reads function metadata from the process_mining crate
  2. Generates r4pm/bindings/ with typed Python wrappers and .pyi stubs
  3. 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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

r4pm-0.6.1a2.tar.gz (67.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

r4pm-0.6.1a2-cp39-abi3-win_amd64.whl (17.9 MB view details)

Uploaded CPython 3.9+Windows x86-64

r4pm-0.6.1a2-cp39-abi3-musllinux_1_2_x86_64.whl (31.5 MB view details)

Uploaded CPython 3.9+musllinux: musl 1.2+ x86-64

r4pm-0.6.1a2-cp39-abi3-manylinux_2_28_x86_64.whl (24.1 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

r4pm-0.6.1a2-cp39-abi3-manylinux_2_28_aarch64.whl (23.5 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

r4pm-0.6.1a2-cp39-abi3-macosx_11_0_arm64.whl (20.1 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

r4pm-0.6.1a2-cp39-abi3-macosx_10_12_x86_64.whl (21.1 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file r4pm-0.6.1a2.tar.gz.

File metadata

  • Download URL: r4pm-0.6.1a2.tar.gz
  • Upload date:
  • Size: 67.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for r4pm-0.6.1a2.tar.gz
Algorithm Hash digest
SHA256 421d3b328a1e0390b977b574f7271849a35b98a9fff4a9a6ced982ed7c86c9fb
MD5 ff2d5e68c9bf167717f08c46f001c611
BLAKE2b-256 084a469ada207a7d0563f65c8670f926bf0dbf21a3bc44e92fd45489e6013ddd

See more details on using hashes here.

File details

Details for the file r4pm-0.6.1a2-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: r4pm-0.6.1a2-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 17.9 MB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for r4pm-0.6.1a2-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 96e62781a40b019da04d0365994d1df0fd84cbfc1447993317c664496fc0c4a1
MD5 ca478ce4a5f5f30fd87f735b4be825ab
BLAKE2b-256 3f8126c6a456a53a6a133f1fae5d0c922cf7f84662879e77a7cb85c0b9970293

See more details on using hashes here.

File details

Details for the file r4pm-0.6.1a2-cp39-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for r4pm-0.6.1a2-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3574db89c8f2e49a17d511d80a74de815361eeb4c8813a9f9f1c86fab2040c84
MD5 6d24ce8726a46a15d4b6c5d12e17de36
BLAKE2b-256 e6385fd59f70cfbe93aacebe87a86a2456627eff993119c5396737c4004cc2fa

See more details on using hashes here.

File details

Details for the file r4pm-0.6.1a2-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for r4pm-0.6.1a2-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3aa58e055232dc19451372880266d7a3c965a9c821293f6b308415abddb0ee82
MD5 501f48bbcc85d72f4999286813520dbb
BLAKE2b-256 4e3e9ffa11110ae2f4e401f077bd6078bb9d44b4347ba91b191aee52f7b89aaa

See more details on using hashes here.

File details

Details for the file r4pm-0.6.1a2-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for r4pm-0.6.1a2-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1ee1c3540cbb1ac93e6c5be26f3dc5946b9053c2f10f744c6fea36b649df4af3
MD5 1af0175d75b000f6c86ac42ac7d2759c
BLAKE2b-256 1ed13e245a2a74e3bf2cb52eccbc39b28281b437134e865c387ac57eaae63416

See more details on using hashes here.

File details

Details for the file r4pm-0.6.1a2-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for r4pm-0.6.1a2-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 22e60c5e414d5e7c735a459f4f560e7e5fbd5945aee33e46ef435ec4f07dd65e
MD5 5b26c9ec3bacf599eb02cf80e49157ac
BLAKE2b-256 736bbb1b5a73f63b0bcb18cd85ae5859f37ad0449668d11b4a5e33f617df6bf3

See more details on using hashes here.

File details

Details for the file r4pm-0.6.1a2-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for r4pm-0.6.1a2-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 700829e1dae5ec49fb3cae057a09a8f75fe7aab868b91dff075a276d7114dda6
MD5 64cf6be298f991efbaf5a6ceaf7f4ac7
BLAKE2b-256 ab54f6c1a33c7b2a7d3cbb53c7a78c51983da14a10f39f8bb8bb4c21fcad49bd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page