|
16 | 16 |
|
17 | 17 | import unittest |
18 | 18 |
|
| 19 | +import numpy as np |
19 | 20 | import pytest |
20 | 21 | from scipy.optimize import leastsq |
21 | 22 |
|
22 | 23 | from diffpy.srfit.fitbase.fitrecipe import FitRecipe |
23 | | -from diffpy.srfit.fitbase.fitresults import FitResults, initializeRecipe |
| 24 | +from diffpy.srfit.fitbase.fitresults import ( |
| 25 | + FitResults, |
| 26 | + initializeRecipe, |
| 27 | + resultsDictionary, |
| 28 | +) |
24 | 29 |
|
25 | 30 | # The fit results from the recipe fixture in conftest.py |
26 | 31 | expected_fitresults = """\ |
@@ -138,6 +143,69 @@ def test_save_results(build_recipe_one_contribution, tmp_path): |
138 | 143 | assert expected_var in actual_results.strip() |
139 | 144 |
|
140 | 145 |
|
| 146 | +def test_get_results_dictionary(build_recipe_one_contribution): |
| 147 | + # Case: user gets results dictionary after optimization |
| 148 | + # expected: results dictionary contains expected keys and values |
| 149 | + recipe = build_recipe_one_contribution |
| 150 | + optimize_recipe(recipe) |
| 151 | + results = FitResults(recipe) |
| 152 | + actual_results_dict = results.get_results_dictionary() |
| 153 | + expected_results_dict = { |
| 154 | + "amplitude": 1.000000000060171, |
| 155 | + "wave_number": 1.00000000012548, |
| 156 | + "phase_shift": -1.6129114631049646e-18, |
| 157 | + "Residual": 3.3284672708760557e-19, |
| 158 | + "Contributions": 3.3284672708760557e-19, |
| 159 | + "Restraints": 0, |
| 160 | + "Chi2": 3.3284672708760557e-19, |
| 161 | + "Reduced Chi2": 4.7549532441086507e-20, |
| 162 | + "Rw": 2.7196679825449506e-10, |
| 163 | + } |
| 164 | + actual_values = np.round(np.array(list(actual_results_dict.values())), 5) |
| 165 | + actual_keys = set(actual_results_dict.keys()) |
| 166 | + expected_values = np.round( |
| 167 | + np.array(list(expected_results_dict.values())), 5 |
| 168 | + ) |
| 169 | + expected_keys = set(expected_results_dict.keys()) |
| 170 | + assert expected_keys == actual_keys |
| 171 | + assert list(expected_values == list(actual_values)) |
| 172 | + |
| 173 | + |
| 174 | +def test_resultsDictionary(temp_data_files): |
| 175 | + # Case: user gets results dictionary from a results file |
| 176 | + # expected: results dictionary contains expected keys and values |
| 177 | + actual_results_dict = resultsDictionary( |
| 178 | + temp_data_files / "fit_results.res" |
| 179 | + ) |
| 180 | + # bad behavior: values are stored as strings |
| 181 | + expected_results_dict = { |
| 182 | + "than": "25", # bad behavior: shouldn't be here |
| 183 | + "wave_number": "1.00000000e+00", |
| 184 | + "phase_shift": "-1.61291146e-18", |
| 185 | + "amplitude": "1.00000000e+00", |
| 186 | + "Rw": "0.00000000", |
| 187 | + "Chi2": "0.00000000", |
| 188 | + "Restraints": "0.00000000", |
| 189 | + "Contributions": "0.00000000", |
| 190 | + "Residual": "0.00000000", |
| 191 | + "Feb": "25", # bad behavior: shouldn't be here |
| 192 | + } |
| 193 | + # convert values to float for comparison (with rounding) |
| 194 | + for key in expected_results_dict: |
| 195 | + expected_results_dict[key] = float(expected_results_dict[key]) |
| 196 | + for key in actual_results_dict: |
| 197 | + actual_results_dict[key] = float(actual_results_dict[key]) |
| 198 | + |
| 199 | + actual_keys = set(actual_results_dict.keys()) |
| 200 | + actual_values = np.round(np.array(list(actual_results_dict.values())), 5) |
| 201 | + expected_keys = set(expected_results_dict.keys()) |
| 202 | + expected_values = np.round( |
| 203 | + np.array(list(expected_results_dict.values())), 5 |
| 204 | + ) |
| 205 | + assert expected_keys == actual_keys |
| 206 | + assert list(expected_values == list(actual_values)) |
| 207 | + |
| 208 | + |
141 | 209 | def testInitializeFromFileName(datafile): |
142 | 210 | recipe = FitRecipe("recipe") |
143 | 211 | recipe.create_new_variable("A", 0) |
|
0 commit comments