From 50e833f10fe43ea0d2ade57a94ddc3bd5852f98b Mon Sep 17 00:00:00 2001 From: gschnabel <40870991+gschnabel@users.noreply.github.com> Date: Sat, 25 Mar 2023 21:03:09 +0100 Subject: [PATCH] move compare_dictionaries fun to new module --- exfor_parserpy/utils/comparison_utils.py | 34 ++++++++++++++++++++++ exfor_parserpy/utils/convenience.py | 36 ------------------------ tests/test_exfor_parser.py | 2 +- tests/test_transformers.py | 2 +- 4 files changed, 36 insertions(+), 38 deletions(-) create mode 100644 exfor_parserpy/utils/comparison_utils.py diff --git a/exfor_parserpy/utils/comparison_utils.py b/exfor_parserpy/utils/comparison_utils.py new file mode 100644 index 0000000..8a1def3 --- /dev/null +++ b/exfor_parserpy/utils/comparison_utils.py @@ -0,0 +1,34 @@ +def compare_dictionaries(dic1, dic2, atol=1e-8, rtol=1e-8, info=True): + def write_info(msg): + if info: + print(msg) + + if dic1.keys() != dic2.keys(): + write_info("different number of keys") + return False + for k in dic1.keys(): + if isinstance(dic1[k], dict) and isinstance(dic2[k], dict): + if not compare_dictionaries(dic1[k], dic2[k], atol, rtol, info): + return False + elif isinstance(dic1[k], float) and isinstance(dic2[k], float): + if not abs(dic1[k] - dic2[k]) <= (atol + rtol * abs(dic2[k])): + write_info(f"number mismatch for {k}") + return False + elif isinstance(dic1[k], list) and isinstance(dic2[k], list): + if len(dic1[k]) != len(dic2[k]): + write_info(f"length mismatch for {k}") + return False + for x, y in zip(dic1[k], dic2[k]): + if x is not None and y is not None: + if abs(x - y) > (atol + rtol * abs(y)): + write_info( + f"number mismatch of element in list {k} ({x} vs {y})" + ) + return False + elif (x is None and y is not None) or (x is not None and y is None): + write_info(f"None versus non-None for {k}") + return False + elif dic1[k] != dic2[k]: + write_info(f"difference for {k}") + return False + return True diff --git a/exfor_parserpy/utils/convenience.py b/exfor_parserpy/utils/convenience.py index 4ff0c62..eaed606 100644 --- a/exfor_parserpy/utils/convenience.py +++ b/exfor_parserpy/utils/convenience.py @@ -185,42 +185,6 @@ def merge_common_into_datablock(datablock, commonblock): datablock["DATA"][curkey] = curdic -def compare_dictionaries(dic1, dic2, atol=1e-8, rtol=1e-8, info=True): - def write_info(msg): - if info: - print(msg) - - if dic1.keys() != dic2.keys(): - write_info("different number of keys") - return False - for k in dic1.keys(): - if isinstance(dic1[k], dict) and isinstance(dic2[k], dict): - if not compare_dictionaries(dic1[k], dic2[k], atol, rtol, info): - return False - elif isinstance(dic1[k], float) and isinstance(dic2[k], float): - if not abs(dic1[k] - dic2[k]) <= (atol + rtol * abs(dic2[k])): - write_info(f"number mismatch for {k}") - return False - elif isinstance(dic1[k], list) and isinstance(dic2[k], list): - if len(dic1[k]) != len(dic2[k]): - write_info(f"length mismatch for {k}") - return False - for x, y in zip(dic1[k], dic2[k]): - if x is not None and y is not None: - if abs(x - y) > (atol + rtol * abs(y)): - write_info( - f"number mismatch of element in list {k} ({x} vs {y})" - ) - return False - elif (x is None and y is not None) or (x is not None and y is None): - write_info(f"None versus non-None for {k}") - return False - elif dic1[k] != dic2[k]: - write_info(f"difference for {k}") - return False - return True - - def init_duplicate_field_counters(descrs): # determine duplicate descrs, e.g., 2x FLAG, see EXFOR formats manual chap. 4 dup_dic = {} diff --git a/tests/test_exfor_parser.py b/tests/test_exfor_parser.py index 0ccee4f..cee1340 100644 --- a/tests/test_exfor_parser.py +++ b/tests/test_exfor_parser.py @@ -1,7 +1,7 @@ from pathlib import Path import pytest from exfor_parserpy import from_exfor, to_exfor, read_exfor, write_exfor -from exfor_parserpy.utils.convenience import compare_dictionaries +from exfor_parserpy.utils.comparison_utils import compare_dictionaries def test_exforbaseparser_write_and_read_roundtrip_leaves_content_unchanged(entry_file): diff --git a/tests/test_transformers.py b/tests/test_transformers.py index 754d1b4..7157270 100644 --- a/tests/test_transformers.py +++ b/tests/test_transformers.py @@ -1,7 +1,7 @@ from pathlib import Path import pytest from exfor_parserpy import read_exfor -from exfor_parserpy.utils.convenience import compare_dictionaries +from exfor_parserpy.utils.comparison_utils import compare_dictionaries from exfor_parserpy.trafos import ( unitfy, depointerfy,