コード例 #1
0
ファイル: compare.py プロジェクト: ddlddl58/improver
def process(
    actual: cli.inputpath,
    desired: cli.inputpath,
    rtol: float = DEFAULT_TOLERANCE,
    atol: float = DEFAULT_TOLERANCE,
) -> None:
    """
    Compare two netcdf files

    Args:
        actual: path to output data netcdf file
        desired: path to desired/known good data netcdf file
        rtol: relative tolerance for data in variables
        atol: absolute tolerance for data in variables

    Returns:
        None
    """
    from improver.utilities import compare

    compare.compare_netcdfs(actual,
                            desired,
                            rtol=rtol,
                            atol=atol,
                            reporter=print)
コード例 #2
0
def compare(
    output_path,
    kgo_path,
    recreate=True,
    atol=DEFAULT_TOLERANCE,
    rtol=DEFAULT_TOLERANCE,
    exclude_vars=None,
):
    """
    Compare output against expected using KGO file with absolute and
    relative tolerances. Also recreates KGO if that setting is enabled.

    Args:
        output_path (pathlib.Path): Path to output produced by test
        kgo_path (pathlib.Path): Path to KGO file
        recreate (bool): False to disable KGO recreation, compare only
        atol (float): Absolute tolerance
        rtol (float): Relative tolerance
        exclude_vars (Iterable[str]): Variables to exclude from comparison

    Returns:
        None
    """
    # don't show this function in pytest tracebacks
    # pylint: disable=unused-variable
    __tracebackhide__ = True
    assert output_path.is_absolute()
    assert kgo_path.is_absolute()
    if not isinstance(atol, (int, float)):
        raise ValueError("atol")
    if not isinstance(rtol, (int, float)):
        raise ValueError("rtol")

    difference_found = False
    message = ""

    def message_recorder(exception_message):
        nonlocal difference_found
        nonlocal message
        difference_found = True
        message = exception_message

    compare_netcdfs(
        output_path,
        kgo_path,
        atol=atol,
        rtol=rtol,
        exclude_vars=exclude_vars,
        reporter=message_recorder,
        ignored_attributes=IGNORED_ATTRIBUTES,
    )
    if difference_found:
        if recreate:
            recreate_if_needed(output_path, kgo_path)
        raise AssertionError(message)
    if not checksum_ignore():
        verify_checksum(kgo_path)
コード例 #3
0
def test_compare_missing_files(dummy_nc, tmp_path):
    """Check that comparing missing files raises exception"""
    actual_nc, expected_nc = dummy_nc
    messages_reported = []

    def message_collector(message):
        messages_reported.append(message)

    compare.compare_netcdfs(actual_nc, tmp_path / "missing", reporter=message_collector)
    assert len(messages_reported) == 1
    assert "No such file" in messages_reported[0]
    compare.compare_netcdfs(
        tmp_path / "missing", expected_nc, reporter=message_collector
    )
    assert len(messages_reported) == 2
    assert "No such file" in messages_reported[1]
コード例 #4
0
def process(
    actual: cli.inputpath,
    desired: cli.inputpath,
    rtol: float = DEFAULT_TOLERANCE,
    atol: float = DEFAULT_TOLERANCE,
    *,
    ignored_attributes: cli.comma_separated_list = None,
) -> None:
    """
    Compare two netcdf files

    Args:
        actual:
            Path to output data netcdf file
        desired:
            Path to desired/known good data netcdf file
        rtol:
            Relative tolerance for data in variables
        atol:
            Absolute tolerance for data in variables
        ignored_attributes:
            List of attributes to ignore in the comparison. This option allows for
            attributes such as "history" to be ignored, where such attributes often
            vary between files without indicating any differences in the data.

    Returns:
        None
    """
    from improver.utilities import compare

    compare.compare_netcdfs(
        actual,
        desired,
        rtol=rtol,
        atol=atol,
        ignored_attributes=ignored_attributes,
        reporter=print,
    )
コード例 #5
0
def test_compare_identical_netcdfs(dummy_nc):
    """Check that comparing identical netCDFs does not raise any exceptions"""
    actual_nc, expected_nc = dummy_nc
    for tol in (1.0, 1e-5, 1e-10, 0.0):
        compare.compare_netcdfs(actual_nc, expected_nc, atol=tol, rtol=tol)