From 32c54e27d629d3a5c2c501d3624f07a200b3a514 Mon Sep 17 00:00:00 2001 From: Matthew McDermott Date: Fri, 23 Aug 2024 22:14:01 -0400 Subject: [PATCH 1/3] Added a test with multiple levels of derived predicates that does not show desired effect. --- src/aces/config.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/aces/config.py b/src/aces/config.py index b5c6fe2..50a8eaf 100644 --- a/src/aces/config.py +++ b/src/aces/config.py @@ -905,7 +905,11 @@ class TaskExtractorConfig: ... "admission": PlainPredicateConfig("admission"), ... "discharge": PlainPredicateConfig("discharge"), ... "death": PlainPredicateConfig("death"), + ... "diabetes_icd9": PlainPredicateConfig("ICD9CM//250.02"), + ... "diabetes_icd10": PlainPredicateConfig("ICD10CM//E11.65"), ... "death_or_discharge": DerivedPredicateConfig("or(death, discharge)"), + ... "diabetes": DerivedPredicateConfig("or(diabetes_icd9, diabetes_icd10)"), + ... "diabetes_and_discharge": DerivedPredicateConfig("and(diabetes, discharge)"), ... } >>> trigger = EventConfig("admission") >>> windows = { @@ -950,6 +954,20 @@ class TaskExtractorConfig: static=False, other_cols={}), 'death': PlainPredicateConfig(code='death', + value_min=None, + value_max=None, + value_min_inclusive=None, + value_max_inclusive=None, + static=False, + other_cols={}), + 'diabetes_icd9': PlainPredicateConfig(code='ICD9CM//250.02', + value_min=None, + value_max=None, + value_min_inclusive=None, + value_max_inclusive=None, + static=False, + other_cols={}), + 'diabetes_icd10': PlainPredicateConfig(code='ICD10CM//E11.65', value_min=None, value_max=None, value_min_inclusive=None, @@ -962,11 +980,19 @@ class TaskExtractorConfig: >>> print(config.index_timestamp_window) # doctest: +NORMALIZE_WHITESPACE input >>> print(config.derived_predicates) # doctest: +NORMALIZE_WHITESPACE - {'death_or_discharge': DerivedPredicateConfig(expr='or(death, discharge)', static=False)} + {'death_or_discharge': DerivedPredicateConfig(expr='or(death, discharge)', static=False), + 'diabetes': DerivedPredicateConfig(expr='or(diabetes_icd9, diabetes_icd10)', static=False), + 'diabetes_and_discharge': DerivedPredicateConfig(expr='and(diabetes, discharge)', static=False)} >>> print(nx.write_network_text(config.predicates_DAG)) ╟── death ╎ └─╼ death_or_discharge ╾ discharge - ╙── discharge + ╟── discharge + ╎ ├─╼ diabetes_and_discharge ╾ diabetes + ╎ └─╼ ... + ╟── diabetes_icd9 + ╎ └─╼ diabetes ╾ diabetes_icd10 + ╎ └─╼ ... + ╙── diabetes_icd10 └─╼ ... >>> print_tree(config.window_tree) trigger From f910374992340481cfdfd5b693a36e84f83df2e8 Mon Sep 17 00:00:00 2001 From: Matthew McDermott Date: Fri, 23 Aug 2024 22:18:22 -0400 Subject: [PATCH 2/3] Re-ordered so it is not all plain then derived to be more similar to real configs. --- src/aces/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aces/config.py b/src/aces/config.py index 50a8eaf..7c1b739 100644 --- a/src/aces/config.py +++ b/src/aces/config.py @@ -905,9 +905,9 @@ class TaskExtractorConfig: ... "admission": PlainPredicateConfig("admission"), ... "discharge": PlainPredicateConfig("discharge"), ... "death": PlainPredicateConfig("death"), + ... "death_or_discharge": DerivedPredicateConfig("or(death, discharge)"), ... "diabetes_icd9": PlainPredicateConfig("ICD9CM//250.02"), ... "diabetes_icd10": PlainPredicateConfig("ICD10CM//E11.65"), - ... "death_or_discharge": DerivedPredicateConfig("or(death, discharge)"), ... "diabetes": DerivedPredicateConfig("or(diabetes_icd9, diabetes_icd10)"), ... "diabetes_and_discharge": DerivedPredicateConfig("and(diabetes, discharge)"), ... } From 77c7d864343cde4dc0e8ddda6aad6b8e705ce479 Mon Sep 17 00:00:00 2001 From: Matthew McDermott Date: Fri, 23 Aug 2024 23:08:06 -0400 Subject: [PATCH 3/3] Upgraded test descriptions. --- src/aces/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aces/config.py b/src/aces/config.py index 7c1b739..6376d38 100644 --- a/src/aces/config.py +++ b/src/aces/config.py @@ -974,7 +974,6 @@ class TaskExtractorConfig: value_max_inclusive=None, static=False, other_cols={})} - >>> print(config.label_window) # doctest: +NORMALIZE_WHITESPACE target >>> print(config.index_timestamp_window) # doctest: +NORMALIZE_WHITESPACE @@ -1001,6 +1000,7 @@ class TaskExtractorConfig: └── gap.end └── target.end + Configs will error out in various ways when passed inappropriate arguments: >>> config_path = "/foo/non_existent_file.yaml" >>> cfg = TaskExtractorConfig.load(config_path) Traceback (most recent call last):