-
Notifications
You must be signed in to change notification settings - Fork 19
Squeeze morph warning handling #272
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| **Added:** | ||
|
|
||
| * Warnings added to `squeeze` morph if the squeeze causes the grid to become non-monotonic. | ||
|
|
||
| **Changed:** | ||
|
|
||
| * <news item> | ||
|
|
||
| **Deprecated:** | ||
|
|
||
| * <news item> | ||
|
|
||
| **Removed:** | ||
|
|
||
| * <news item> | ||
|
|
||
| **Fixed:** | ||
|
|
||
| * <news item> | ||
|
|
||
| **Security:** | ||
|
|
||
| * <news item> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -170,3 +170,141 @@ def test_morphsqueeze_extrapolate(user_filesystem, squeeze_coeffs, wmsg_gen): | |
| ) | ||
| with pytest.warns(UserWarning, match=expected_wmsg): | ||
| single_morph(parser, opts, pargs, stdout_flag=False) | ||
|
|
||
|
|
||
| @pytest.mark.parametrize( | ||
| "squeeze_coeffs, x_morph", | ||
| [ | ||
sbillinge marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| ({"a0": 0.01, "a1": 0.01, "a2": -0.1}, np.linspace(0, 10, 101)), | ||
| ], | ||
| ) | ||
| def test_non_strictly_increasing_squeeze(squeeze_coeffs, x_morph): | ||
| x_target = x_morph | ||
| y_target = np.sin(x_target) | ||
| coeffs = [squeeze_coeffs[f"a{i}"] for i in range(len(squeeze_coeffs))] | ||
| squeeze_polynomial = Polynomial(coeffs) | ||
| x_squeezed = x_morph + squeeze_polynomial(x_morph) | ||
| # non-strictly-increasing | ||
| assert not np.all(np.sign(np.diff(x_squeezed)) > 0) | ||
sbillinge marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| y_morph = np.sin(x_squeezed) | ||
| # all zero initial guess | ||
| morph_results = morphpy.morph_arrays( | ||
| np.array([x_morph, y_morph]).T, | ||
| np.array([x_target, y_target]).T, | ||
| squeeze=[0, 0, 0], | ||
| apply=True, | ||
| ) | ||
| _, y_morph_actual = morph_results[1].T # noqa: F841 | ||
| y_morph_expected = np.sin(x_morph) # noqa: F841 | ||
| # squeeze morph extrapolates. | ||
| # Need to extract extrap_index from morph_results to examine | ||
| # the convergence. | ||
| # assert np.allclose(y_morph_actual, y_morph_expected, atol=1e-3) | ||
| # Raise warning when called without --check-increase | ||
| with pytest.warns() as w: | ||
| morph_results = morphpy.morph_arrays( | ||
| np.array([x_morph, y_morph]).T, | ||
| np.array([x_target, y_target]).T, | ||
| squeeze=[0.01, 0.01, -0.1], | ||
| apply=True, | ||
| ) | ||
| assert w[0].category is UserWarning | ||
| actual_wmsg = " ".join([str(w[i].message) for i in range(len(w))]) | ||
| expected_wmsg = ( | ||
| "Warning: The squeeze morph has interpolated your morphed " | ||
sbillinge marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| "function from a non-monotonically increasing grid. " | ||
| ) | ||
| assert expected_wmsg in actual_wmsg | ||
| _, y_morph_actual = morph_results[1].T # noqa: F841 | ||
| y_morph_expected = np.sin(x_morph) # noqa: F841 | ||
| # squeeze morph extrapolates. | ||
| # Need to extract extrap_index from morph_results to examine | ||
| # the convergence. | ||
| # assert np.allclose(y_morph_actual, y_morph_expected, atol=1e-3) | ||
| # System exits when called with --check-increase | ||
| with pytest.raises(SystemExit) as excinfo: | ||
| morphpy.morph_arrays( | ||
| np.array([x_morph, y_morph]).T, | ||
| np.array([x_target, y_target]).T, | ||
| squeeze=[0.01, 0.009, -0.1], | ||
| check_increase=True, | ||
| ) | ||
| actual_emsg = str(excinfo.value) | ||
| expected_emsg = "2" | ||
| assert expected_emsg == actual_emsg | ||
|
|
||
|
|
||
| @pytest.mark.parametrize( | ||
| "squeeze_coeffs, x_morph", | ||
| [ | ||
sbillinge marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ({"a0": -1, "a1": -1, "a2": 2}, np.linspace(-1, 1, 101)), | ||
| ( | ||
| {"a0": -1, "a1": -1, "a2": 0, "a3": 0, "a4": 2}, | ||
| np.linspace(-1, 1, 101), | ||
| ), | ||
| ], | ||
| ) | ||
| def test_sort_squeeze_bad(user_filesystem, squeeze_coeffs, x_morph): | ||
| # call in .py without --check-increase | ||
| x_target = x_morph | ||
| y_target = np.sin(x_target) | ||
| coeffs = [squeeze_coeffs[f"a{i}"] for i in range(len(squeeze_coeffs))] | ||
|
||
| squeeze_polynomial = Polynomial(coeffs) | ||
| x_squeezed = x_morph + squeeze_polynomial(x_morph) | ||
| y_morph = np.sin(x_squeezed) | ||
| morph = MorphSqueeze() | ||
| morph.squeeze = squeeze_coeffs | ||
| with pytest.warns() as w: | ||
|
||
| morphpy.morph_arrays( | ||
| np.array([x_morph, y_morph]).T, | ||
| np.array([x_target, y_target]).T, | ||
| squeeze=coeffs, | ||
| apply=True, | ||
| ) | ||
| assert len(w) == 1 | ||
| assert w[0].category is UserWarning | ||
| actual_wmsg = str(w[0].message) | ||
| expected_wmsg = ( | ||
| "Warning: The squeeze morph has interpolated your morphed " | ||
| "function from a non-monotonically increasing grid. " | ||
| ) | ||
| assert expected_wmsg in actual_wmsg | ||
|
|
||
| # call in CLI without --check-increase | ||
| morph_file, target_file = create_morph_data_file( | ||
| user_filesystem / "cwd_dir", x_morph, y_morph, x_target, y_target | ||
| ) | ||
| parser = create_option_parser() | ||
| (opts, pargs) = parser.parse_args( | ||
| [ | ||
| "--squeeze", | ||
| ",".join(map(str, coeffs)), | ||
| f"{morph_file.as_posix()}", | ||
| f"{target_file.as_posix()}", | ||
| "--apply", | ||
| "-n", | ||
| ] | ||
| ) | ||
| with pytest.warns(UserWarning) as w: | ||
sbillinge marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| single_morph(parser, opts, pargs, stdout_flag=False) | ||
| assert len(w) == 1 | ||
| actual_wmsg = str(w[0].message) | ||
| assert expected_wmsg in actual_wmsg | ||
|
|
||
|
|
||
| def test_handle_duplicates(): | ||
| unq_x = np.linspace(0, 11, 10) | ||
sbillinge marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| iter = 10 | ||
| morph = MorphSqueeze() | ||
sbillinge marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| for i in range(iter): | ||
| actual_x = np.random.choice(unq_x, size=20) | ||
| actual_y = np.sin(actual_x) | ||
| actual_handled_x, actual_handled_y = morph._handle_duplicates( | ||
| actual_x, actual_y | ||
| ) | ||
| expected_handled_x = np.unique(actual_x) | ||
| expected_handled_y = np.array( | ||
| [actual_y[actual_x == x].mean() for x in expected_handled_x] | ||
| ) | ||
| assert np.allclose(actual_handled_x, expected_handled_x) | ||
| assert np.allclose(actual_handled_y, expected_handled_y) | ||
Uh oh!
There was an error while loading. Please reload this page.