From d464e60b0683d62428d35252c218e822e043ea2a Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 23 Sep 2025 16:57:34 +0300 Subject: [PATCH 1/5] Logistic map tests --- testing_project/logistic.py | 3 +++ testing_project/test_logistic.py | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/testing_project/logistic.py b/testing_project/logistic.py index e49d1c2..2853d04 100644 --- a/testing_project/logistic.py +++ b/testing_project/logistic.py @@ -1 +1,4 @@ # Your code goes here + +def f(x, r): + return r * x * (1 - x) diff --git a/testing_project/test_logistic.py b/testing_project/test_logistic.py index 100d824..53a32f2 100644 --- a/testing_project/test_logistic.py +++ b/testing_project/test_logistic.py @@ -13,6 +13,16 @@ def test_f_corner_cases(): result = f(x, r) assert_allclose(result, expected) +def test_f_generic_cases(): + cases = [ + (0.1, 2.2 ,0.198), + (0.2, 3.4 ,0.544), + (0.5, 2 ,0.5) + ] + for x, r, expected in cases: + result = f(x, r) + assert_allclose(result, expected) + # Hands on 1 #Add a new test for these generic cases using the for-loop pattern: # x=0.1, r=2.2 => f(x, r)=0.198 -- 2.39.5 From 4736cc7ac9fa402194f3d3cd36b81af2f7d9099f Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 23 Sep 2025 17:42:49 +0300 Subject: [PATCH 2/5] Parametrize generic cases --- testing_project/test_logistic.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/testing_project/test_logistic.py b/testing_project/test_logistic.py index 53a32f2..2b6ff30 100644 --- a/testing_project/test_logistic.py +++ b/testing_project/test_logistic.py @@ -1,3 +1,4 @@ +import pytest from numpy.testing import assert_allclose from logistic import f @@ -13,15 +14,17 @@ def test_f_corner_cases(): result = f(x, r) assert_allclose(result, expected) -def test_f_generic_cases(): - cases = [ +@pytest.mark.parametrize( + 'x, r, expected', + [ (0.1, 2.2 ,0.198), (0.2, 3.4 ,0.544), (0.5, 2 ,0.5) ] - for x, r, expected in cases: - result = f(x, r) - assert_allclose(result, expected) +) +def test_f_generic_cases(x, r, expected): + result = f(x, r) + assert_allclose(result, expected) # Hands on 1 #Add a new test for these generic cases using the for-loop pattern: -- 2.39.5 From b192a2a76fb7dbe9493a4a0244c60228f73f1e75 Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 23 Sep 2025 18:07:05 +0300 Subject: [PATCH 3/5] Add iterating function and the test for it --- testing_project/logistic.py | 9 +++++++++ testing_project/test_logistic.py | 34 +++++++++++++++++++++----------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/testing_project/logistic.py b/testing_project/logistic.py index 2853d04..3737044 100644 --- a/testing_project/logistic.py +++ b/testing_project/logistic.py @@ -1,4 +1,13 @@ # Your code goes here +import numpy as np def f(x, r): return r * x * (1 - x) + +def iterate_f(x, r, n_iterations): + trajectory = np.zeros(n_iterations+1) + trajectory[0] = x + for i in range(n_iterations): + trajectory[i+1] = f(x, r) + x = trajectory[i+1] + return trajectory diff --git a/testing_project/test_logistic.py b/testing_project/test_logistic.py index 2b6ff30..39e8bf6 100644 --- a/testing_project/test_logistic.py +++ b/testing_project/test_logistic.py @@ -1,7 +1,7 @@ import pytest from numpy.testing import assert_allclose -from logistic import f +from logistic import f, iterate_f def test_f_corner_cases(): @@ -14,6 +14,17 @@ def test_f_corner_cases(): result = f(x, r) assert_allclose(result, expected) +# Hands on 1 +#Add a new test for these generic cases using the for-loop pattern: +# x=0.1, r=2.2 => f(x, r)=0.198 +# x=0.2, r=3.4 => f(x, r)=0.544 +# x=0.5, r=2 => f(x, r)=0.5 + + +# Hands on 2: +# parametrize the above test using @pytest.mark.parametrize + + @pytest.mark.parametrize( 'x, r, expected', [ @@ -26,17 +37,18 @@ def test_f_generic_cases(x, r, expected): result = f(x, r) assert_allclose(result, expected) -# Hands on 1 -#Add a new test for these generic cases using the for-loop pattern: -# x=0.1, r=2.2 => f(x, r)=0.198 -# x=0.2, r=3.4 => f(x, r)=0.544 -# x=0.5, r=2 => f(x, r)=0.5 - - -# Hands on 2: -# parametrize the above test using @pytest.mark.parametrize - +@pytest.mark.parametrize( + 'x, r, n_iterations, expected', + [ + (0.1, 2.2 , 1, [0.1, 0.198]), + (0.2, 3.4 , 4, [0.2, 0.544, 0.843418, 0.449019, 0.841163]), + (0.5, 2, 3, [0.5, 0.5, 0.5, 0.5]) + ] +) +def test_iterate_f_generic(x, r, n_iterations, expected): + result = iterate_f(x, r, n_iterations) + assert_allclose(result, expected, rtol=1e-6) # Hands on 3 # Implement a function iterate_f that runs f for it iterations. Write tests for the following cases: # x=0.1, r=2.2, it=1 => iterate_f(it, x, r)=[0.1, 0.198] -- 2.39.5 From 25e001e855469208eefcfae9cb909dba87250bce Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 23 Sep 2025 18:44:31 +0300 Subject: [PATCH 4/5] Test for logistic fit and minor fix to fit func --- testing_project/logistic.py | 1 + testing_project/logistic_fit.py | 2 +- testing_project/test_logistic_fit.py | 11 +++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 testing_project/test_logistic_fit.py diff --git a/testing_project/logistic.py b/testing_project/logistic.py index 3737044..a60f6dc 100644 --- a/testing_project/logistic.py +++ b/testing_project/logistic.py @@ -11,3 +11,4 @@ def iterate_f(x, r, n_iterations): trajectory[i+1] = f(x, r) x = trajectory[i+1] return trajectory + diff --git a/testing_project/logistic_fit.py b/testing_project/logistic_fit.py index 1d38ac7..55ee1f0 100644 --- a/testing_project/logistic_fit.py +++ b/testing_project/logistic_fit.py @@ -24,7 +24,7 @@ def fit_r(xs): it = len(xs) - 1 def error(r): - return np.linalg.norm(xs - iterate_f(it, x0, r)) + return np.linalg.norm(xs - iterate_f(x0, r, it)) errors = [] for r in np.linspace(0, 4, 4001): diff --git a/testing_project/test_logistic_fit.py b/testing_project/test_logistic_fit.py new file mode 100644 index 0000000..4323c5a --- /dev/null +++ b/testing_project/test_logistic_fit.py @@ -0,0 +1,11 @@ +from numpy.testing import assert_allclose + +from logistic import iterate_f +from logistic_fit import fit_r + +def test_fit_r(): + r = 3.421 + trajectory = iterate_f(0.3, r, 23) + fit_result_r = fit_r(trajectory) + assert_allclose(r, fit_result_r) + -- 2.39.5 From 19587cea33a4df8f93e438e61680324827c2b371 Mon Sep 17 00:00:00 2001 From: ASPP Student Date: Tue, 23 Sep 2025 18:56:49 +0300 Subject: [PATCH 5/5] Randomize parameters for test --- testing_project/test_logistic_fit.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/testing_project/test_logistic_fit.py b/testing_project/test_logistic_fit.py index 4323c5a..1a03e0c 100644 --- a/testing_project/test_logistic_fit.py +++ b/testing_project/test_logistic_fit.py @@ -1,4 +1,5 @@ from numpy.testing import assert_allclose +import numpy as np from logistic import iterate_f from logistic_fit import fit_r @@ -9,3 +10,13 @@ def test_fit_r(): fit_result_r = fit_r(trajectory) assert_allclose(r, fit_result_r) + +def test_fit_r_randomized(): + random_state = np.random.RandomState(42) + x0 = 0.3 + for _ in range(100): + r = random_state.rand() + trajectory = iterate_f(x0, r, 23) + fit_result_r = fit_r(trajectory) + assert_allclose(r, fit_result_r, atol=0.1) + -- 2.39.5