Skip to main content

PQL46 (PQL Function Library - CPM 4.6)

CONFORMANCE

Applies to: CELONIS 4.2 CELONIS 4.3 CELONIS 4.4 CELONIS 4.5 CELONIS 4.6

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.

Conformance Description

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.

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.string_column, [ places ], [ transitions ], [ edges ], [ mapping ], [ start_places ], [ end_places ] )
  • 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.

Return values

Integer column fitting to the activity column. Flags violations:

  • R = 0: Activity matches the Petri net.

  • R < 0: Activity is not mapped to a transition. Violating transitions are always determined based on existing activities, e.g. undesired activities are not taken into account in this violation type.

  • 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.

READABLE Description

This operator converts the integer values of the CONFORMANCE operator into meaningful strings. (Since:  CELONIS 4.6)

Syntax

READABLE ( conformance_query )

Return values

conformance_query: The CONFORMANCE query (see above). Can also be retrieved from the model in the conformance checker sheet using a variable.

  • Conforms: Activity matches the Petri net.

  • X is an undesired activity: Activity is not mapped to a transition.

  • X is followed by Y: The transition is not found in the specified Petri net. Violating transitions are always determined based on existing activities, e.g. undesired activities are not taken into account in this violation type.

  • 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.

Examples

[1] In this simple example the case fully matches the Petri net.

ConformanceCheckerPetriNet.png

Query

Column1

CONFORMANCE ( "Table1"."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 ( "Table1"."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" ] ) )InputTable1CASE_ID : STRINGACTIVITY : STRINGTIMESTAMP : DATE'1''A'Tue Jan 01 2019 13:00:00.000'1''B'Tue Jan 01 2019 13:01:00.000OutputResultColumn1 : INTColumn2 : STRING0'Conforms'0'Conforms'[2]In this simple example a non matched activity (C) is part of the case:QueryColumn1CONFORMANCE ( "Table1"."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" ] )Column2READABLE ( CONFORMANCE ( "Table1"."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" ] ) )InputTable1CASE_ID : STRINGACTIVITY : STRINGTIMESTAMP : DATE'1''A'Tue Jan 01 2019 13:00:00.000'1''C'Tue Jan 01 2019 13:01:00.000OutputResultColumn1 : INTColumn2 : STRING0'Conforms'-2'C is an undesired activity'[3]In this simple example the second A activity violates the Petri net:QueryColumn1CONFORMANCE ( "Table1"."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" ] )Column2READABLE ( CONFORMANCE ( "Table1"."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" ] ) )InputTable1CASE_ID : STRINGACTIVITY : STRINGTIMESTAMP : DATE'1''A'Tue Jan 01 2019 13:00:00.000'1''A'Tue Jan 01 2019 13:01:00.000OutputResultColumn1 : INTColumn2 : STRING0'Conforms'4294967297'A is followed by A'[4]In this simple example the case doesn't violate the Petri net but stops in the middle of the case:QueryColumn1CONFORMANCE ( "Table1"."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" ] )Column2READABLE ( CONFORMANCE ( "Table1"."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" ] ) )InputTable1CASE_ID : STRINGACTIVITY : STRINGTIMESTAMP : DATE'1''A'Tue Jan 01 2019 13:00:00.000'2''A'Tue Jan 01 2019 13:01:00.000'2''B'Tue Jan 01 2019 13:02:00.000OutputResultColumn1 : INTColumn2 : STRING2147483647'Incomplete'0'Conforms'0'Conforms'[5]In this simple example the start activity B violates the Petri net:QueryColumn1CONFORMANCE ( "Table1"."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" ] )Column2READABLE ( CONFORMANCE ( "Table1"."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" ] ) )InputTable1CASE_ID : STRINGACTIVITY : STRINGTIMESTAMP : DATE'1''B'Tue Jan 01 2019 13:00:00.000'1''A'Tue Jan 01 2019 13:01:00.000'1''B'Tue Jan 01 2019 13:02:00.000OutputResultColumn1 : INTColumn2 : STRING57423712747522'B executed as start activity'0'Conforms'0'Conforms'    

Input

Output

Table1

CASE_ID : STRING

ACTIVITY : STRING

TIMESTAMP : DATE

'1'

'A'

Tue Jan 01 2019 13:00:00.000

'1'

'B'

Tue Jan 01 2019 13:01:00.000

Result

Column1 : INT

Column2 : STRING

0

'Conforms'

0

'Conforms'

[2] In this simple example a non matched activity (C) is part of the case.

ConformanceCheckerPetriNet.png

Query

Column1

CONFORMANCE ( "Table1"."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 ( "Table1"."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" ] ) )
       

Input

Output

Table1

Case_ID : STRING

Activity : STRING

Timestamp : DATE

'1'

'A'

Fri Jan 01 2016 01:00:00.000

'1'

'C'

Fri Jan 01 2016 02:00:00.000

Result

Column1 : INT

Column2 : STRING

0

'Conforms'

-2

'C is an undesired activity'

[3] In this simple example the second A activity violates the Petri net.

ConformanceCheckerPetriNet.png

Query

Column1

CONFORMANCE ( "Table1"."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 ( "Table1"."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" ] ) )

Input

Output

Table1

Case_ID : STRING

Activity : STRING

Timestamp : DATE

'1'

'A'

Fri Jan 01 2016 01:00:00.000

2

'A'

Fri Jan 01 2016 02:00:00.000

Result

Column1 : INT

Column2 : STRING

0

'Conforms'

4294967297

'A is followed by A'

[4] In this simple example the case doesn't violate the Petri net but stops in the middle of the case.

ConformanceCheckerPetriNet.png

Query

Column1

 CONFORMANCE ( "Table1"."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 ( "Table1"."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" ] ) )      

Input

Output

Table1

Case_ID : STRING

Activity : STRING

Timestamp : DATE

'1'

'A'

Tue Jan 01 2019 13:00:00.000

'2'

'A'

Tue Jan 01 2019 13:01:00.000

'2'

'B'

Tue Jan 01 2019 13:02:00.000

Result

Column1 : INT

Column2 : STRING

2147483647

'Incomplete'

o

'Conforms'

0

'Conforms'

[5] In this simple example the case doesn't violate the Petri net but stops in the middle of the case.

ConformanceCheckerPetriNet.png

Query

Column1

CONFORMANCE ( "Table1"."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 ( "Table1"."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"        

Input

Output

Table1

Case_ID : STRING

Activity : STRING

Timestamp : DATE

'1'

'B'

Tue Jan 01 2019 13:00:00.000

'1'

'A'

Tue Jan 01 2019 13:01:00.000

'1'

'B'

Tue Jan 01 2019 13:02:00.000

Result

Column1 : INT

Column2 : STRING

57423712747522

'B executed as start activity'

0

'Conforms'

0

'Conforms'

[6]

In this simple example the start activity B violates the Petri net:

ConformanceCheckerPetriNet.png

Query

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" ] ) )
        

Input

Output

Activities

Case : INT

Activity : STRING

Timestamp : DATE

1

'B'

Fri Jan 01 2016 01:00:00.000

1

'A'

Fri Jan 01 2016 02:00:00.000

1

'B'

Fri Jan 01 2016 03:00:00.000

Result

Column1 : INT

Column2 : STRING

57423712747522

'B executed as start activity'

0

'Conforms'

0

'Conforms'

[7]

In this example, activity C is not mapped to any transition on this Petri Net:

ConformanceCheckerPetriNet.png

Therefore it is marked as undesired and ignored by the conformance algorithm. After ignoring C, the variant becomes A, A and therefore the violation \"A is followed by A\" is detected.

Query

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" ] ) )
        

Input

Output

Activities

Case : INT

Activity : STRING

Timestamp : DATE

1

'A'

Fri Jan 01 2016 01:00:00.000

1

'C'

Fri Jan 01 2016 02:00:00.000

1

'A'

Fri Jan 01 2016 03:00:00.000

Result

Column1 : INT

Column : STRING

0

'Conforms'

-2

'C is an undesired activity'

4294967297

'A is followed by A'