Description
CONFORMANCE
flags activities whether they are conformant with the given model.
READABLE
returns violation descriptions in English. To use the model from the conformance checker sheet, the
CONFORMANCE
query can be written to a variable.
This operator matches cases against a Petri net. It flags activities which are violating the Petri net defined behavior. This is achieved with a Petri net based token replay with backtracking and error repair. This allows to use the same activity multiple times as places in the Petri net.
If the READABLE
function is invoked, the flags are translated into violation descriptions in English (Since: CELONIS 4.6).
A common use case is to generate the Petri net from a BPMN model and use it as input for the conformance checker.
Syntax
CONFORMANCE ( activity_table.activity_column, [ places ], [ transitions ], [ edges ], [ mapping ], [ start_places ], [ end_places ] )
- activity_table.activity_column: The activity column of the activity table.
- places: List of places in the Petri net.
- transitions: List of transitions in the Petri net.
- edges: List of edges from places to transitions and transitions to places.
- mapping: Mapping of activity names to transitions.
- start_places: List of start places of the Petri net.
- end_places: List of end places of the Petri net.
CONFORMANCE
accepts an activity column and a description of a process model, as a Petri net, as input.
The first part of the model description is a list containing all places of the Petri net, each specified by a unique
string ID. It is followed by a similar list of all transitions. The third part of the model description is a list of
flow relations, where each flow relation is specified as a pair of the source place and the target transition or a pair
of the source transition and the target place, respectively. After that, a list of value pairs defines the mapping of
activity names to the related transitions. The first value in such a pair is an activity name as a string while the
second value is the ID of a transition which must be defined in the list of transitions. The last two parts of the
model description are the lists of start and end places, respectively. Both lists consist of place IDs which must be
specified in the first part of the model description.
READABLE ( conformance_query )
- conformance_query: The
CONFORMANCE
query (see above). Can also be retrieved from the model in the conformance checker sheet using a variable.
Return values
CONFORMANCE
The CONFORMANCE
operator replays the activities' names from the input column
on the process model. As a result, it adds a temporary column of type INT to the activity table. The value of a row in this temporary column indicates if there is a
conformance issue or not. Also, the type of violation and the related activities in the
process model are encoded in this value, in the following way:
- R = 0: Activity matches the Petri net.
- R < 0: Activity is not mapped to a transition.
- R > 0: A positive result number describes which activity step violates the Petri net. The 32 most significant bits of the result value describe the source activity and the other 32 bits the target activity of the violating step.
- R = 2147483647: Case ended before reaching an end place.
- R = 2147483646: Could not evaluate the case because the model requires too much computation power. In most cases, such models can be transferred into equivalent, simpler models.
By summing up the absolute conformance values of a case using a PU_SUM, it can be determined if a case conforms (the sum is 0 in that case) or not (the sum is larger than 0).
READABLE
As the integer encoding is not suitable for the end-user, the CONFORMANCE
operator
can be wrapped in the READABLE
command. If there is a violation, this will translate
the encoding into a message explaining the violation:
- Conforms: Activity matches the Petri net.
- X is an undesired activity: Activity is not mapped to a transition.
- X is followed by Y 0: The transition is not found in the specified Petri net.
- X is executed as start activity: Case starts with the false activity.
- Incomplete: Case ended before reaching an end place.
- Too complex: Could not evaluate the case because the model requires too much computation power. In most cases, such models can be transferred into equivalent, simpler models.
NULL handling
A NULL value conforms with any Petri net, hence a match is returned.
Examples
Column1
CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] )
Column2
READABLE ( CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] ) )
Column1
CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] )
Column2
READABLE ( CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] ) )
Column1
"Cases"."CASE_ID"
Column2
CASE WHEN PU_SUM ( "Cases" , ABS ( CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] ) ) ) = 0 THEN 'Case conforms' ELSE 'Case does not conform' END
Column1
CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] )
Column2
READABLE ( CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] ) )
Column1
CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] )
Column2
READABLE ( CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] ) )
Column1
CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] )
Column2
READABLE ( CONFORMANCE ( "Activities"."ACTIVITY" , [ "P_0" "P_1" "P_2" ] , [ "T_01" "T_12" ] , [ [ "P_0" "T_01" ] [ "T_01" "P_1" ] [ "P_1" "T_12" ] [ "T_12" "P_2" ] ] , [ [ 'A' "T_01" ] [ 'B' "T_12" ] ] , [ "P_0" ] , [ "P_2" ] ) )