1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
//! # Multi-Perspective Process Evidence
//!
//! Typed shapes for multi-perspective process analysis.
//! The four perspectives of process mining are control-flow, data,
//! resource, and time. This module provides witness markers for each.
//!
//! ## What this module IS
//!
//! - Zero-cost perspective marker types for use in generic bounds and `PhantomData`
//! positions, following Mannhardt et al. (2016) "Balanced Multi-Perspective
//! Checking of Process Conformance".
//! - A `MultiPerspectiveEvidence<T, Perspectives>` carrier that threads a
//! perspective combination through the type system.
//! - Structure only. No alignment computation, no conformance checking.
//!
//! ## What this module is NOT
//!
//! - Not a conformance checker. Per-perspective cost weighting and multi-perspective
//! alignment execution graduate to `wasm4pm`.
//! - Not a runtime value store. All perspective markers are zero-sized.
//!
//! ## Paper anchor
//!
//! Mannhardt, F., de Leoni, M., Reijers, H. A., & van der Aalst, W. M. P. (2016).
//! "Balanced Multi-Perspective Checking of Process Conformance."
//! *Computing*, 98(4), 407–437.
//!
//! ## Graduation
//!
//! When you need to *compute* per-perspective alignment costs or *check* multi-
//! perspective conformance, graduate to `wasm4pm`.
use PhantomData;
/// The four classic process mining perspectives (van der Aalst).
///
/// ### Representation
/// Each variant names one of the four canonical analysis dimensions in the
/// Mannhardt et al. (2016) balanced multi-perspective conformance framework.
///
/// ### Structure-only
/// This is structure only; it names a perspective but does not analyse it.
/// Zero-sized marker variants or light enum discriminant.
///
/// ### Graduation
/// When you need to *compute* per-perspective alignment costs or *check* multi-
/// perspective conformance, graduate to `wasm4pm`.
///
/// # Examples
///
/// ```
/// use wasm4pm_compat::multiperspective::ProcessPerspective;
///
/// let p = ProcessPerspective::ControlFlow;
/// assert_eq!(format!("{}", p), "control-flow");
/// ```
/// Marker that evidence covers the control-flow perspective.
///
/// ### Representation
/// Zero-sized marker type representing the control-flow perspective, which focuses on the ordering, routing, and synchronization of activities.
/// Used in `PhantomData` positions to assert that a value is typed
/// against the control-flow perspective of the Mannhardt et al. (2016) framework.
///
/// ### Structure-only
/// Structure-only perspective marker. No alignment computation, no conformance checking, and zero runtime storage cost.
///
/// ### Graduation
/// Graduate to `wasm4pm` when control-flow alignment cost computation is required.
///
/// # Examples
///
/// ```
/// use wasm4pm_compat::multiperspective::ControlFlowPerspective;
/// use core::marker::PhantomData;
///
/// struct MyEvidence<P>(PhantomData<P>);
/// let _ev: MyEvidence<ControlFlowPerspective> = MyEvidence(PhantomData);
/// ```
;
/// Marker that evidence covers the data perspective.
///
/// ### Representation
/// Zero-sized marker type representing the data perspective, which focuses on case and event attributes, variable values, and guards.
/// Asserts that a value is typed against the data perspective
/// (event/object attributes) in the multi-perspective framework.
///
/// ### Structure-only
/// Structure-only perspective marker. No condition evaluation or guard checking, and zero runtime storage cost.
///
/// ### Graduation
/// Graduate to `wasm4pm` when data-condition guard evaluation is required.
///
/// # Examples
///
/// ```
/// use wasm4pm_compat::multiperspective::DataPerspective;
/// use core::marker::PhantomData;
///
/// struct MyEvidence<P>(PhantomData<P>);
/// let _ev: MyEvidence<DataPerspective> = MyEvidence(PhantomData);
/// ```
;
/// Marker that evidence covers the resource perspective.
///
/// ### Representation
/// Zero-sized marker type representing the resource perspective, focusing on organizational roles, resources, departments, and performers.
/// Asserts that a value is typed against the resource perspective
/// (`org:resource` or equivalent organisational attribute) in the multi-perspective
/// framework.
///
/// ### Structure-only
/// Structure-only perspective marker. No resource allocation checks or conformance cost evaluation, and zero runtime storage cost.
///
/// ### Graduation
/// Graduate to `wasm4pm` when resource-based conformance cost computation is required.
///
/// # Examples
///
/// ```
/// use wasm4pm_compat::multiperspective::ResourcePerspective;
/// use core::marker::PhantomData;
///
/// struct MyEvidence<P>(PhantomData<P>);
/// let _ev: MyEvidence<ResourcePerspective> = MyEvidence(PhantomData);
/// ```
;
/// Marker that evidence covers the time perspective.
///
/// ### Representation
/// Zero-sized marker type representing the time perspective, focusing on timestamps, activity durations, waiting times, and performance metrics.
/// Asserts that a value is typed against the temporal perspective
/// (timestamps, durations, sojourn times) in the multi-perspective framework.
///
/// ### Structure-only
/// Structure-only perspective marker. No temporal profile validation, sojourn time checks, or performance calculations.
///
/// ### Graduation
/// Graduate to `wasm4pm` when temporal conformance checking (e.g. temporal profile comparison) is required.
///
/// # Examples
///
/// ```
/// use wasm4pm_compat::multiperspective::TimePerspective;
/// use core::marker::PhantomData;
///
/// struct MyEvidence<P>(PhantomData<P>);
/// let _ev: MyEvidence<TimePerspective> = MyEvidence(PhantomData);
/// ```
;
/// Evidence enriched with perspective markers.
///
/// ### Representation
/// `MultiPerspectiveEvidence<T, Perspectives>` wraps an inner value `T` and
/// threads a perspective combination (e.g. `PerspectiveCombination<ControlFlowPerspective,
/// DataPerspective>`) through the type system as a zero-sized phantom.
///
/// The `Perspectives` type parameter is intentionally open — callers compose
/// [`PerspectiveCombination`] types to declare which perspectives are present.
///
/// ### Structure-only
/// This is structure only; no engine logic or conformance algorithms belong here.
/// It introduces zero runtime cost or extra storage overhead.
///
/// ### Graduation
/// Graduate to `wasm4pm` when you need to calculate multi-perspective alignment
/// scores or run multi-perspective conformance checking.
///
/// # Examples
///
/// ```
/// use wasm4pm_compat::multiperspective::{MultiPerspectiveEvidence, ControlFlowPerspective};
///
/// let evidence = MultiPerspectiveEvidence::<_, ControlFlowPerspective>::new(42);
/// assert_eq!(evidence.inner, 42);
/// ```
/// A combination of two perspectives for multi-perspective analysis.
///
/// ### Representation
/// Used as the `Perspectives` parameter in [`MultiPerspectiveEvidence`] when
/// evidence covers exactly two perspectives. For three or four perspectives,
/// nest: `PerspectiveCombination<A, PerspectiveCombination<B, C>>`.
///
/// ### Structure-only
/// Zero-sized marker type for type-level generic combination, carrying no runtime representation
/// or data storage overhead.
///
/// ### Graduation
/// Graduate to `wasm4pm` to analyze processes along the combined dimensions.
///
/// # Examples
///
/// ```
/// use wasm4pm_compat::multiperspective::{
/// PerspectiveCombination, ControlFlowPerspective, DataPerspective, MultiPerspectiveEvidence
/// };
///
/// type FlowAndData = PerspectiveCombination<ControlFlowPerspective, DataPerspective>;
/// let evidence = MultiPerspectiveEvidence::<_, FlowAndData>::new("evidence");
/// assert_eq!(evidence.inner, "evidence");
/// ```