diff --git a/fuzzing.py b/fuzzing.py new file mode 100644 index 0000000..0e9d6e9 --- /dev/null +++ b/fuzzing.py @@ -0,0 +1,37 @@ +import sys +import atheris +import hypothesis.extra.numpy as npst +from hypothesis import given, strategies as st + +from cmaes import CMA + + +@given(data=st.data()) +def test_cma_tell(data): + dim = data.draw(st.integers(min_value=2, max_value=100)) + mean = data.draw(npst.arrays(dtype=float, shape=dim)) + sigma = data.draw(st.floats(min_value=1e-16)) + n_iterations = data.draw(st.integers(min_value=1)) + try: + optimizer = CMA(mean, sigma) + except AssertionError: + return + popsize = optimizer.population_size + for _ in range(n_iterations): + tell_solutions = data.draw( + st.lists( + st.tuples(npst.arrays(dtype=float, shape=dim), st.floats()), + min_size=popsize, + max_size=popsize, + ) + ) + optimizer.ask() + try: + optimizer.tell(tell_solutions) + except AssertionError: + return + optimizer.ask() + + +atheris.Setup(sys.argv, test_cma_tell.hypothesis.fuzz_one_input) +atheris.Fuzz() diff --git a/requirements-dev.txt b/requirements-dev.txt index ef02e88..9021021 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,8 +5,9 @@ numpy>=1.20.0 matplotlib scipy -# tests +# Fuzzing hypothesis +atheris # lint mypy