{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Conformance Checking with a LTLf model\n", "\n", "The class `ProcessMiningTasks.ConformanceChecking.LTLAnalyzer.LTLAnalyzer` provides a way to check if the log conforms to a Linear Temporal Logic on finite traces (LTLf) formula. The formula can be a provided by the user as a string, note that we adopted the LTLf syntax [here](http://ltlf2dfa.diag.uniroma1.it/ltlf_syntax). In addition, we also provide the following set of LTLf templates:\n", "\n", "1. `eventually_a`;\n", "2. `next_a`;\n", "3. `eventually_a_and_eventually_b`;\n", "4. `eventually_a_then_b`;\n", "5. `eventually_a_or_b`;\n", "6. `eventually_a_next_b`;\n", "7. `eventually_a_then_b_then_c`;\n", "8. `eventually_a_next_b_next_c`;\n", "\n", "the following set of LTLf templates called Is First (Last):\n", "1. `is_first_state_a`;\n", "2. `is_second_state_a`;\n", "3. `is_third_state_a`;\n", "4. `last`;\n", "5. `second_last`;\n", "6. `third_last`;\n", "7. `is_last_state_a`;\n", "8. `is_second_last_state_a`;\n", "9. `is_third_last_state_a`;\n", "\n", "the following set of LTLf templates with multiple attributes:\n", "\n", "1. `p_does_a`;\n", "2. `a_is_done_by_p_and_q`;\n", "3. `p_does_a_and_b`;\n", "4. `p_does_a_and_then_b`;\n", "5. `p_does_a_and_eventually_b`;\n", "6. `p_does_a_a_not_b`;\n", "7. `a_done_by_p_p_not_q`;\n", "\n", "and the following [Target-Branched DECLARE templates](https://www.sciencedirect.com/science/article/pii/S0306437915001271):\n", "\n", "1. `precedence`;\n", "2. `chain_precedence`;\n", "3. `responded_existence`;\n", "4. `chain_response`;\n", "5. `not_chain_precedence`;\n", "6. `not_chain_response`;\n", "7. `response`;\n", "8. `not_precedence`;\n", "9. `not_response`;\n", "10. `not_responded_existence`;\n", "11. `alternate_response`;\n", "12. `alternate_precedence`.\n", "\n", "First of all, an event log has to be imported." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8b1b675b8daa437a8a3621ed7edf4bd5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "parsing log, completed traces :: 0%| | 0/1050 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from Declare4Py.ProcessModels.LTLModel import LTLTemplate\n", "\n", "template: LTLTemplate = LTLTemplate('eventually_a')\n", "model: LTLModel = template.fill_template(['CRP'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `next_a`\n", "This is a unary template taking one activity as input. The corresponding LTLf formula is `X(a)`." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: X[!](con_ertriage)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INATrue
1047JNATrue
1048KNATrue
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA True\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('next_a')\n", "model = template.fill_template(['ER Triage'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `eventually_a_and_eventually_b`\n", "This is a binary template taking two activities as input. The corresponding LTLf formula is `F(a) && F(b)`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_leucocytes) && F(con_crp)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('eventually_a_and_eventually_b')\n", "model = template.fill_template(['Leucocytes', 'CRP'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `eventually_a_then_b`\n", "\n", "This is a binary template taking two activities as input. The corresponding LTLf formula is `F(a && F(b))`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_leucocytes && F(con_crp))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4EFalse
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E False\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('eventually_a_then_b')\n", "model = template.fill_template(['Leucocytes', 'CRP'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `eventually_a_or_b`\n", "\n", "This is a binary template taking two activities as input. The corresponding LTLf formula is `F(a) || F(b)`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_leucocytes) || F(con_crp)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('eventually_a_or_b')\n", "model = template.fill_template(['Leucocytes', 'CRP'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `eventually_a_next_b`\n", "\n", "This is a binary template taking two activities as input. The corresponding LTLf formula is `F(a && X(b))`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_leucocytes && X[!](con_crp))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BFalse
2CTrue
3DTrue
4EFalse
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B False\n", "2 C True\n", "3 D True\n", "4 E False\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('eventually_a_next_b')\n", "model = template.fill_template(['Leucocytes', 'CRP'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `eventually_a_then_b_then_c`\n", "\n", "This is a ternary template taking three activities as input. The corresponding LTLf formula is `F(a && F(b && F(c)))`." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_erregistration && F(con_leucocytes && F(con_crp)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4EFalse
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E False\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('eventually_a_then_b_then_c')\n", "model = template.fill_template(['ER Registration', 'Leucocytes', 'CRP'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `eventually_a_next_b_next_c`\n", "\n", "This is a ternary template taking three activities as input. The corresponding LTLf formula is `F(a && X(b && X(c)))`." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_erregistration && X[!](con_crp && X[!](con_leucocytes)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('eventually_a_next_b_next_c')\n", "model = template.fill_template(['ER Registration', 'CRP', 'Leucocytes'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conformance Checking with LTLf Templates Is First (Last)\n", "\n", "These tempaltes follow the same structure as the one used for simple LTLf templates. The `fill_template` method takes a list of generic attributes and a list of attribute types that match the type of the attributes in the first list. If the type of the attribute is 'concept:name' then the second list can be omitted." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `is_first_state_a`\n", "This formula identifies all traces where attribute A is performed in the first event." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: con_erregistration\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INATrue
1047JNATrue
1048KNATrue
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA True\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('is_first_state_a')\n", "model : LTLModel = template.fill_template(['ER Registration'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `is_second_state_a`\n", "This formula identifies all traces where attribute A is performed in the second event." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: X[!](con_ertriage)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INATrue
1047JNATrue
1048KNATrue
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA True\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('is_second_state_a')\n", "model : LTLModel = template.fill_template(['ER Triage'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `is_third_state_a`\n", "This formula identifies all traces where attribute A is performed in the third event." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: X[!](X[!](con_ersepsistriage))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INATrue
1047JNATrue
1048KNATrue
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA True\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('is_third_state_a')\n", "model : LTLModel = template.fill_template(['ER Sepsis Triage'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `last`\n", "This fomrula identifies all traces where the attribute is guaranteed to change in the very next event. This formula takes an empty list as paramter." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: !(X[!](true))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('last')\n", "model : LTLModel = template.fill_template([])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `second_last`\n", "This fomrula identifies all traces where at some point, there will be a change in the activity, indicating that it is not always equal to its previous event. This formula takes an empty list as paramter." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: X[!](!(X[!](true)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('second_last')\n", "model : LTLModel = template.fill_template([])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `third_last`\n", "This fomrula identifies all traces where there will be a change in the activity in the very next time step and that this change will persist at least once more in the future. This formula takes an empty list as paramter." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: X[!](X[!](!(X[!](true))))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('third_last')\n", "model : LTLModel = template.fill_template([])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `is_last_state_a`\n", "This formula identifies all traces where attribute A is performed in the last event." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_releasea && !(X[!](true)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DFalse
4EFalse
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('is_last_state_a')\n", "model : LTLModel = template.fill_template(['Release A'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `is_second_last_state_a`\n", "This formula identifies all traces where attribute A is performed in the penultimate event." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_leucocytes && X[!](!(X[!](true))))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('is_second_last_state_a')\n", "model : LTLModel = template.fill_template(['Leucocytes'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `is_third_last_state_a`\n", "This formula identifies all traces where attribute A is performed in the third-last event." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_crp && X[!](X[!](!(X[!](true)))))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CFalse
3DTrue
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C False\n", "3 D True\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('is_third_last_state_a')\n", "model : LTLModel = template.fill_template(['CRP'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conformance Checking with LTLf Templates with multiple attributes\n", "\n", "For these templates, the `fill_template` method takes a list of generic attributes (in string format) and a list of attribute types (also strings) as parameters. The order of the elements of these two lists is important. For each template, the instantiated template formula and its corresponding checking in the input log will be computed." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `p_does_a`" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(org_a && con_erregistration)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INATrue
1047JNATrue
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('p_does_a')\n", "model : LTLModel = template.fill_template(['A', 'ER Registration'], attr_type=['org:group', 'concept:name'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `a_is_done_by_p_and_q`" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: (F(F(org_a && con_erregistration)) && F(F(org_b && con_erregistration)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('a_is_done_by_p_and_q')\n", "model : LTLModel = template.fill_template(['A', 'B', 'ER Registration'], attr_type=['org:group', 'concept:name'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `p_does_a_and_b`" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: (F(F(org_a && con_erregistration)) && F(F(org_a && con_leucocytes)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('p_does_a_and_b')\n", "model : LTLModel = template.fill_template(['A', 'ER Registration', 'Leucocytes'], attr_type=['org:group', 'concept:name'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `p_does_a_and_then_b`" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F((F(org_a && con_erregistration) && X[!](F(org_a && con_leucocytes))))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('p_does_a_and_then_b')\n", "model : LTLModel = template.fill_template(['A', 'ER Registration', 'Leucocytes'], attr_type=['org:group', 'concept:name'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `p_does_a_and_eventually_b`" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F((F(org_a && con_erregistration) && F(F(org_a && con_leucocytes))))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('p_does_a_and_eventually_b')\n", "model : LTLModel = template.fill_template(['A', 'ER Registration', 'Leucocytes'], attr_type=['org:group', 'concept:name'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `p_does_a_a_not_b`" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F((con_erregistration && (!con_leucocytes && org_a)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INATrue
1047JNATrue
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template: LTLTemplate = LTLTemplate('p_does_a_a_not_b')\n", "model : LTLModel = template.fill_template(['A', 'ER Registration', 'Leucocytes'], attr_type=['org:group', 'concept:name'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `a_done_by_p_p_not_q`" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F((org_a && (!org_b && con_erregistration)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INATrue
1047JNATrue
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('a_done_by_p_p_not_q')\n", "model = template.fill_template(['A', 'B', 'ER Registration'], attr_type=['org:group', 'concept:name'])\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conformance Checking with Target-Branched DECLARE templates\n", "\n", "For these binary templates, the `fill_template` method takes two lists of activities (in string format) as parameters. For each template, the instantiated template formula and its corresponding checking in the input log will be computed." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `precedence`" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: ((!(con_leucocytes || con_admissionnc || con_releasea))U(con_ertriage || con_crp)) || G(!(con_leucocytes || con_admissionnc || con_releasea))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INATrue
1047JNATrue
1048KNATrue
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA True\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('precedence')\n", "activities_a = [\"ER Triage\", \"CRP\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `chain_precedence`" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: G(X[!](con_leucocytes || con_admissionnc || con_releasea) -> (con_ertriage || con_crp || con_leucocytes))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4ETrue
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E True\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('chain_precedence')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `responded_existence`" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_ertriage || con_crp || con_leucocytes) -> F(con_leucocytes || con_admissionnc || con_releasea)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('responded_existence')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `chain_response`" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: G((con_erregistration || con_crp) -> X[!](con_ertriage || con_leucocytes || con_releasea))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4ETrue
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E True\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('chain_response')\n", "activities_a = [\"ER Registration\", \"CRP\"]\n", "activities_b = [\"ER Triage\", \"Leucocytes\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `not_chain_precedence`" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: G(X[!](con_leucocytes || con_admissionnc || con_releasea) -> !(con_ertriage || con_crp || con_leucocytes))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('not_chain_precedence')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `not_chain_response`" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: G((con_ertriage || con_crp || con_leucocytes) -> X[!](!(con_leucocytes || con_admissionnc || con_releasea)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('not_chain_response')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `response`" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: G((con_ertriage || con_crp || con_leucocytes) -> F(con_leucocytes || con_admissionnc || con_releasea))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0ATrue
1BTrue
2CTrue
3DTrue
4ETrue
.........
1045HNATrue
1046INAFalse
1047JNAFalse
1048KNATrue
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A True\n", "1 B True\n", "2 C True\n", "3 D True\n", "4 E True\n", "... ... ...\n", "1045 HNA True\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA True\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('response')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `not_precedence`" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: G(F(con_leucocytes || con_admissionnc || con_releasea) -> !(con_ertriage || con_crp || con_leucocytes))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('not_precedence')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `not_response`" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: G((con_ertriage || con_crp || con_leucocytes) -> !(F(con_leucocytes || con_admissionnc || con_releasea)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('not_response')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `not_responded_existence`" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: F(con_ertriage || con_crp || con_leucocytes) -> !(F(con_leucocytes || con_admissionnc || con_releasea))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('not_responded_existence')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `alternate_response`" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: G((con_ertriage || con_crp || con_leucocytes) -> X[!]((!(con_ertriage || con_crp || con_leucocytes)U(con_leucocytes || con_admissionnc || con_releasea))))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INAFalse
1047JNAFalse
1048KNAFalse
1049LNAFalse
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA False\n", "1047 JNA False\n", "1048 KNA False\n", "1049 LNA False\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('alternate_response')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `alternate_precedence`" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formula: ((!(con_leucocytes || con_admissionnc || con_releasea))U(con_ertriage || con_crp || con_leucocytes)) && G((con_leucocytes || con_admissionnc || con_releasea) -> X[!]((!(con_leucocytes || con_admissionnc || con_releasea))U(con_ertriage || con_crp || con_leucocytes)) || G(!(con_leucocytes || con_admissionnc || con_releasea)))\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
case:concept:nameaccepted
0AFalse
1BFalse
2CFalse
3DFalse
4EFalse
.........
1045HNAFalse
1046INATrue
1047JNATrue
1048KNAFalse
1049LNATrue
\n", "

1050 rows × 2 columns

\n", "
" ], "text/plain": [ " case:concept:name accepted\n", "0 A False\n", "1 B False\n", "2 C False\n", "3 D False\n", "4 E False\n", "... ... ...\n", "1045 HNA False\n", "1046 INA True\n", "1047 JNA True\n", "1048 KNA False\n", "1049 LNA True\n", "\n", "[1050 rows x 2 columns]" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "template = LTLTemplate('alternate_precedence')\n", "activities_a = [\"ER Triage\", \"CRP\", \"Leucocytes\"]\n", "activities_b = [\"Leucocytes\", \"Admission NC\", \"Release A\"]\n", "model = template.fill_template(activities_a, activities_b)\n", "print(f\"Formula: {model.formula}\")\n", "analyzer = LTLAnalyzer(event_log, model)\n", "conf_check_res_df = analyzer.run()\n", "conf_check_res_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" } }, "nbformat": 4, "nbformat_minor": 2 }