Skip to content

Commit

Permalink
move compare_dictionaries fun to new module
Browse files Browse the repository at this point in the history
  • Loading branch information
gschnabel committed Mar 25, 2023
1 parent 96e1c50 commit 50e833f
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 38 deletions.
34 changes: 34 additions & 0 deletions exfor_parserpy/utils/comparison_utils.py
Original file line number Diff line number Diff line change
@@ -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
36 changes: 0 additions & 36 deletions exfor_parserpy/utils/convenience.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {}
Expand Down
2 changes: 1 addition & 1 deletion tests/test_exfor_parser.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
2 changes: 1 addition & 1 deletion tests/test_transformers.py
Original file line number Diff line number Diff line change
@@ -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,
Expand Down

0 comments on commit 50e833f

Please sign in to comment.