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.1a1.tar.gz (68.4 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.1a1-cp39-abi3-win_amd64.whl (17.7 MB view details)

Uploaded CPython 3.9+Windows x86-64

r4pm-0.6.1a1-cp39-abi3-musllinux_1_2_x86_64.whl (31.4 MB view details)

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

r4pm-0.6.1a1-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.1a1-cp39-abi3-manylinux_2_28_aarch64.whl (23.3 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

r4pm-0.6.1a1-cp39-abi3-macosx_11_0_arm64.whl (20.0 MB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

r4pm-0.6.1a1-cp39-abi3-macosx_10_12_x86_64.whl (21.0 MB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for r4pm-0.6.1a1.tar.gz
Algorithm Hash digest
SHA256 7dce576d62c55f503101975713ea8ab63eef834737143dddeb8a0c81a5f9dcfa
MD5 1f6805e12d8dbca4896e11913e8bb081
BLAKE2b-256 48e85b8407789e398b67ddee58498403de93986ae589e975098900613fe94544

See more details on using hashes here.

File details

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

File metadata

  • Download URL: r4pm-0.6.1a1-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 17.7 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.1a1-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 81def54282b97a123344ec21bbb5e3a22c258082f799883c2e0e82f7ec285dac
MD5 13b09d7cc10100d2fdf5da64b554b282
BLAKE2b-256 3e978f9e51445e4ad2a315368abeae4f7a21bfdb716fef6f04a9905dfbc1a5e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for r4pm-0.6.1a1-cp39-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 39469ce2d2693b00bbb2ab82eed8199db7b4dd10b4c167929448c134fe1e0977
MD5 7ab421960f476968bcc50e57c5f2e482
BLAKE2b-256 ef3366922c2ab5db7bfdc9e8ccc30e887d2feffbc3d10136e0fc762b58b94b4a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for r4pm-0.6.1a1-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bb4a1972c13668a4fa3e746186b14ecfe3186a40903b29841a0b04b0f6390b71
MD5 82abba5d5d3e93f910f5562a7dd6ee2f
BLAKE2b-256 fb9c11df63246635b5af9b09d8157592ad678c6d706e131e9ee12a8d084409e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for r4pm-0.6.1a1-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fd65724829dcf47c779a544032ad044dcb3bcc068ded0c810912c7d295755959
MD5 b5b056c31b2587dc4457d45687c6e0bf
BLAKE2b-256 6463142238092733d27e2c4be2413673dd0f983fbea33665f2891d1a0ff5afdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for r4pm-0.6.1a1-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9f71465eb5fd6e49aed468d945cb86dee14f8cf21688a819df54ed785a808f89
MD5 a16385056a198514980007cda82c1ed5
BLAKE2b-256 fb13ca87b4cc8c2c4b35c2cedbbacea0347f5a5d6246244dd0633c4db2dacf79

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for r4pm-0.6.1a1-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 473d6c50290d982642dfa08eeb22634857fa78e79fc1e320c79e058051ddbabe
MD5 8bfb98eab23db593cbcf802a02a77a3c
BLAKE2b-256 9523315c9e6ba9df397cbfce1f1717f8affd50e332a6e2083617fd4acda470ae

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