aesoptparam 0.3.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of aesoptparam might be problematic. Click here for more details.
- aesoptparam/__init__.py +13 -0
- aesoptparam/example.py +110 -0
- aesoptparam/parameterized.py +417 -0
- aesoptparam/parameters.py +641 -0
- aesoptparam/serializer.py +94 -0
- aesoptparam/test/dummy_instance.json +30 -0
- aesoptparam/test/dummy_schema.json +752 -0
- aesoptparam/test/test_parameterized.py +574 -0
- aesoptparam/test/test_parameters.py +519 -0
- aesoptparam/test/test_units.py +369 -0
- aesoptparam/test/test_utils.py +147 -0
- aesoptparam/utils/__init__.py +63 -0
- aesoptparam/utils/html_repr.py +533 -0
- aesoptparam/utils/json_utils.py +127 -0
- aesoptparam/utils/unit_library.ini +233 -0
- aesoptparam/utils/units.py +1060 -0
- aesoptparam-0.3.6.dist-info/METADATA +86 -0
- aesoptparam-0.3.6.dist-info/RECORD +21 -0
- aesoptparam-0.3.6.dist-info/WHEEL +5 -0
- aesoptparam-0.3.6.dist-info/licenses/LICENSE +21 -0
- aesoptparam-0.3.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
import pytest
|
|
6
|
+
from jsonschema import validate
|
|
7
|
+
from jsonschema.validators import Draft7Validator
|
|
8
|
+
from param.serializer import UnserializableException
|
|
9
|
+
|
|
10
|
+
from aesoptparam import (
|
|
11
|
+
AESOptNumber,
|
|
12
|
+
AESOptParameterized,
|
|
13
|
+
Callable,
|
|
14
|
+
ClassSelector,
|
|
15
|
+
ListSelector,
|
|
16
|
+
copy_param,
|
|
17
|
+
copy_param_ref,
|
|
18
|
+
)
|
|
19
|
+
from aesoptparam.example import main as main_example
|
|
20
|
+
from aesoptparam.parameters import Function, Reference
|
|
21
|
+
|
|
22
|
+
file_path = os.path.dirname(__file__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def test_AESOptParameterized():
|
|
26
|
+
dummy_parent = object()
|
|
27
|
+
|
|
28
|
+
class dummy(AESOptParameterized):
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
dum_ins = dummy(dummy_parent)
|
|
32
|
+
assert isinstance(dum_ins.parent_object, object)
|
|
33
|
+
assert dum_ins.parent_object is dummy_parent
|
|
34
|
+
|
|
35
|
+
default_array = np.linspace(0, 10, 10)
|
|
36
|
+
main_ins = main_example(
|
|
37
|
+
xx="dummy"
|
|
38
|
+
) # Inputs which is not a parameters should be skipped
|
|
39
|
+
assert not hasattr(main_ins, "xx")
|
|
40
|
+
main_ins.add_sub_list()
|
|
41
|
+
|
|
42
|
+
# as_dict with only default
|
|
43
|
+
main_ins.sub1 # To insure that one sub param is initialized
|
|
44
|
+
out = main_ins.as_dict()
|
|
45
|
+
assert len(out) == 1
|
|
46
|
+
|
|
47
|
+
out_all = main_ins.as_dict(False)
|
|
48
|
+
|
|
49
|
+
# Main
|
|
50
|
+
assert len(out_all) == 15
|
|
51
|
+
assert main_ins.a == 4.0
|
|
52
|
+
assert main_ins.b == 5.0
|
|
53
|
+
assert main_ins.param.b.default_ref == ".sub1.a"
|
|
54
|
+
assert main_ins.c == 6.0
|
|
55
|
+
assert main_ins.param.c.default_ref == ".sub_list[0].a"
|
|
56
|
+
np.testing.assert_almost_equal(main_ins.d, default_array)
|
|
57
|
+
assert main_ins.param.d.default_ref == ".sub1.b"
|
|
58
|
+
assert main_ins.f == "Dummy"
|
|
59
|
+
assert main_ins.g == "Dummy"
|
|
60
|
+
assert main_ins.h == "Dummy2"
|
|
61
|
+
|
|
62
|
+
# Sub1
|
|
63
|
+
assert len(out_all["sub1"]) == 10
|
|
64
|
+
assert main_ins.sub1.a == 5.0
|
|
65
|
+
np.testing.assert_almost_equal(main_ins.sub1.b, default_array)
|
|
66
|
+
np.testing.assert_almost_equal(main_ins.sub1.c, main_ins.sub1.b)
|
|
67
|
+
assert main_ins.sub1.param.c.default_ref == ".b"
|
|
68
|
+
np.testing.assert_almost_equal(
|
|
69
|
+
main_ins.sub1.e, np.full_like(default_array, main_ins.sub1.a)
|
|
70
|
+
)
|
|
71
|
+
assert isinstance(main_ins.sub1.param.e.default, Function)
|
|
72
|
+
np.testing.assert_almost_equal(main_ins.sub1.f, main_ins.sub1.e)
|
|
73
|
+
assert main_ins.sub1.param.f.default_full == (".b", ".a")
|
|
74
|
+
assert main_ins.sub1.g.shape == (10,)
|
|
75
|
+
np.testing.assert_almost_equal(main_ins.sub1.g, 6.0)
|
|
76
|
+
assert main_ins.sub1.param.g.default_full == (".b", 6.0)
|
|
77
|
+
np.testing.assert_almost_equal(
|
|
78
|
+
main_ins.sub1.h, main_ins.sub1.param.h.default_interp[0]
|
|
79
|
+
)
|
|
80
|
+
assert main_ins.sub1.param.h.default_interp[1:] == (".b", ".c")
|
|
81
|
+
assert main_ins.sub1.i == "sub1.Dummy"
|
|
82
|
+
assert main_ins.sub1.j == "sub1.Dummy"
|
|
83
|
+
assert main_ins.sub1.k == "sub1.Dummy2"
|
|
84
|
+
# Sub2
|
|
85
|
+
assert len(out_all["sub2"]) == 8
|
|
86
|
+
assert main_ins.sub2.a == main_ins.sub1.a
|
|
87
|
+
assert main_ins.sub2.b == main_ins.a
|
|
88
|
+
assert main_ins.sub2.c == main_ins.sub_list[0].a
|
|
89
|
+
np.testing.assert_almost_equal(main_ins.sub2.d, main_ins.sub1.b)
|
|
90
|
+
np.testing.assert_almost_equal(main_ins.sub2.e, main_ins.sub1.b + 1)
|
|
91
|
+
assert main_ins.sub2.f == main_ins.f
|
|
92
|
+
assert main_ins.sub2.g == main_ins.sub1.i
|
|
93
|
+
assert main_ins.sub2.h == main_ins.sub_list[0].f
|
|
94
|
+
# Sub_list
|
|
95
|
+
assert len(out_all["sub_list"]) == 1
|
|
96
|
+
assert len(out_all["sub_list"][0]) == 7
|
|
97
|
+
assert main_ins.sub_list[0].a == 6.0
|
|
98
|
+
assert main_ins.sub_list[0].b == main_ins.a
|
|
99
|
+
assert main_ins.sub_list[0].c == main_ins.sub1.a
|
|
100
|
+
np.testing.assert_almost_equal(main_ins.sub_list[0].d, main_ins.d)
|
|
101
|
+
np.testing.assert_almost_equal(main_ins.sub_list[0].e, main_ins.sub1.b)
|
|
102
|
+
assert main_ins.sub_list[0].f == main_ins.f
|
|
103
|
+
assert main_ins.sub_list[0].g == main_ins.sub1.i
|
|
104
|
+
# Sub_list2
|
|
105
|
+
assert len(out_all["sub_list2"]) == 1
|
|
106
|
+
assert len(out_all["sub_list2"][0]) == 7
|
|
107
|
+
assert main_ins.sub_list2[0].a == 6.0
|
|
108
|
+
assert main_ins.sub_list2[0].b == main_ins.a
|
|
109
|
+
assert main_ins.sub_list2[0].c == main_ins.sub1.a
|
|
110
|
+
np.testing.assert_almost_equal(main_ins.sub_list2[0].d, main_ins.d)
|
|
111
|
+
np.testing.assert_almost_equal(main_ins.sub_list2[0].e, main_ins.sub1.b)
|
|
112
|
+
assert main_ins.sub_list2[0].f == main_ins.f
|
|
113
|
+
assert main_ins.sub_list2[0].g == main_ins.sub1.i
|
|
114
|
+
|
|
115
|
+
# Validating array shapes
|
|
116
|
+
main_ins.name = "main"
|
|
117
|
+
main_ins.validate_array_shapes()
|
|
118
|
+
new_array = default_array[:-1]
|
|
119
|
+
main_ins.d = new_array
|
|
120
|
+
with pytest.raises(ValueError, match=r"For main the shape of d"):
|
|
121
|
+
main_ins.validate_array_shapes()
|
|
122
|
+
main_ins.d = default_array
|
|
123
|
+
main_ins.validate_array_shapes()
|
|
124
|
+
main_ins.sub1.c = new_array
|
|
125
|
+
with pytest.raises(ValueError, match=r"For main.sub1_class[\d]+ the shape of c"):
|
|
126
|
+
main_ins.validate_array_shapes()
|
|
127
|
+
main_ins.sub1.c = default_array
|
|
128
|
+
main_ins.validate_array_shapes()
|
|
129
|
+
main_ins.sub2.d = new_array
|
|
130
|
+
with pytest.raises(ValueError, match=r"For main.sub2_class[\d]+ the shape of d"):
|
|
131
|
+
main_ins.validate_array_shapes()
|
|
132
|
+
main_ins.sub2.d = default_array
|
|
133
|
+
main_ins.validate_array_shapes()
|
|
134
|
+
main_ins.sub_list[0].d = new_array
|
|
135
|
+
with pytest.raises(
|
|
136
|
+
ValueError, match=r"For main.sub_list_class[\d]+ the shape of d"
|
|
137
|
+
):
|
|
138
|
+
main_ins.validate_array_shapes()
|
|
139
|
+
main_ins.sub_list[0].d = default_array
|
|
140
|
+
main_ins.validate_array_shapes()
|
|
141
|
+
|
|
142
|
+
# get/set units
|
|
143
|
+
np.testing.assert_almost_equal(
|
|
144
|
+
main_ins.get_val("a", "rpm"), main_ins.a * 30 / np.pi
|
|
145
|
+
)
|
|
146
|
+
np.testing.assert_almost_equal(main_ins.get_val("b", "mm/s"), main_ins.b * 1e3)
|
|
147
|
+
np.testing.assert_almost_equal(main_ins.get_val("d", "m/s"), main_ins.d * 1e-3)
|
|
148
|
+
main_ins.set_val("a", 1, "rpm")
|
|
149
|
+
np.testing.assert_almost_equal(main_ins.a, np.pi / 30)
|
|
150
|
+
main_ins.set_val("b", 1, "mm/s")
|
|
151
|
+
np.testing.assert_almost_equal(main_ins.b, 1e-3)
|
|
152
|
+
main_ins.set_val("d", np.ones(5) * 1e-2, "m/s")
|
|
153
|
+
np.testing.assert_almost_equal(main_ins.d, 1e1)
|
|
154
|
+
|
|
155
|
+
# has_parent
|
|
156
|
+
assert main_ins.has_parent() is False
|
|
157
|
+
assert main_ins.sub1.has_parent() is True
|
|
158
|
+
|
|
159
|
+
# Raises
|
|
160
|
+
with pytest.raises(TypeError, match="Units"):
|
|
161
|
+
main_ins.get_val("a", "kg")
|
|
162
|
+
with pytest.raises(TypeError, match="Units"):
|
|
163
|
+
main_ins.set_val("a", 1, "kg")
|
|
164
|
+
|
|
165
|
+
with pytest.raises(RuntimeError, match="parameter with name"):
|
|
166
|
+
main_ins.get_val("sub1")
|
|
167
|
+
with pytest.raises(RuntimeError, match="parameter with name"):
|
|
168
|
+
main_ins.set_val("sub1", 5)
|
|
169
|
+
|
|
170
|
+
with pytest.raises(TypeError, match="attribute name must be string, not 'tuple'"):
|
|
171
|
+
main_ins[(0, 0)]
|
|
172
|
+
|
|
173
|
+
with pytest.raises(TypeError, match="attribute name must be string, not 'tuple'"):
|
|
174
|
+
main_ins[(0, 0)] = 5
|
|
175
|
+
|
|
176
|
+
with pytest.raises(ValueError, match="Indices need to integers:"):
|
|
177
|
+
main_ins[".d[XX]"]
|
|
178
|
+
|
|
179
|
+
# Testing that it runs
|
|
180
|
+
main_ins.i = dict(
|
|
181
|
+
a=0.2, b=[0.1, 0.2], c=np.array([0.2, 0.3]), d=dict(a=0.1, b=dict(a=0.1))
|
|
182
|
+
)
|
|
183
|
+
main_ins._repr_html_()
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def test_AESOptParameterized_json(tmp_path):
|
|
187
|
+
# Tests .read_json, .from_dict, .as_serial, .as_dict
|
|
188
|
+
dum = main_example()
|
|
189
|
+
|
|
190
|
+
# %% .read_json and .from_dict
|
|
191
|
+
dum.read_json(os.path.join(file_path, "dummy_instance.json"))
|
|
192
|
+
# main
|
|
193
|
+
assert dum.a == 0.2
|
|
194
|
+
assert dum.b == 0.2
|
|
195
|
+
assert (
|
|
196
|
+
isinstance(dum._param__private.values["b"], Reference)
|
|
197
|
+
and dum._param__private.values["b"] == ".a"
|
|
198
|
+
)
|
|
199
|
+
assert dum.c == 0.3
|
|
200
|
+
assert (
|
|
201
|
+
isinstance(dum._param__private.values["c"], Reference)
|
|
202
|
+
and dum._param__private.values["c"] == ".sub_list[1].a"
|
|
203
|
+
)
|
|
204
|
+
np.testing.assert_almost_equal(dum.d, [0.0, 1.0, 2.0, 3.2])
|
|
205
|
+
assert isinstance(dum.d, np.ndarray)
|
|
206
|
+
assert np.issubdtype(dum.d.dtype, np.number)
|
|
207
|
+
np.testing.assert_almost_equal(dum.e, [1, 2, 10])
|
|
208
|
+
assert isinstance(dum.e, np.ndarray)
|
|
209
|
+
assert np.issubdtype(dum.e.dtype, int)
|
|
210
|
+
assert dum.name == "New main name"
|
|
211
|
+
assert dum.f == "Test"
|
|
212
|
+
assert dum.g == "Test3"
|
|
213
|
+
assert (
|
|
214
|
+
isinstance(dum._param__private.values["g"], Reference)
|
|
215
|
+
and dum._param__private.values["g"] == ".h"
|
|
216
|
+
)
|
|
217
|
+
assert dum.h == "Test3"
|
|
218
|
+
assert isinstance(dum._param__private.values["h"], Function)
|
|
219
|
+
|
|
220
|
+
# main.sub1
|
|
221
|
+
assert dum.sub1.a == 0.1
|
|
222
|
+
np.testing.assert_almost_equal(dum.sub1.b, [0.0, 0.2, 0.4, 0.6, 0.8, 1.0])
|
|
223
|
+
assert isinstance(dum.sub1.b, np.ndarray)
|
|
224
|
+
assert np.issubdtype(dum.sub1.b.dtype, np.number)
|
|
225
|
+
np.testing.assert_almost_equal(dum.sub1.c, dum.sub1.b)
|
|
226
|
+
assert (
|
|
227
|
+
isinstance(dum.sub1._param__private.values["c"], Reference)
|
|
228
|
+
and dum.sub1._param__private.values["c"] == ".b"
|
|
229
|
+
)
|
|
230
|
+
np.testing.assert_almost_equal(dum.sub1.e, np.full_like(dum.sub1.b, dum.a))
|
|
231
|
+
assert isinstance(dum.sub1.e, np.ndarray)
|
|
232
|
+
assert np.issubdtype(dum.sub1.e.dtype, np.number)
|
|
233
|
+
assert isinstance(dum.sub1._param__private.values["e"], Function)
|
|
234
|
+
np.testing.assert_almost_equal(dum.sub1.f, [0, 1, 2, 3, 4])
|
|
235
|
+
assert isinstance(dum.sub1._param__private.values["f"], np.ndarray)
|
|
236
|
+
assert np.issubdtype(dum.sub1._param__private.values["f"].dtype, np.number)
|
|
237
|
+
|
|
238
|
+
# main.sub2
|
|
239
|
+
assert dum.sub2.a == 0.3
|
|
240
|
+
|
|
241
|
+
# main.sub_list
|
|
242
|
+
assert len(dum.sub_list) == 2
|
|
243
|
+
assert dum.sub_list[0].a == 0.1
|
|
244
|
+
assert dum.sub_list[1].a == 0.3
|
|
245
|
+
|
|
246
|
+
with pytest.raises(
|
|
247
|
+
ValueError, match="A parameter with readonly has a different value"
|
|
248
|
+
):
|
|
249
|
+
dum.from_dict({"version": "0.0.1"})
|
|
250
|
+
|
|
251
|
+
# %% .as_dict(onlychanged=True, as_refs=True, as_funcs=True)
|
|
252
|
+
dict_rep = dum.as_dict(onlychanged=True, as_refs=True, as_funcs=True)
|
|
253
|
+
# main
|
|
254
|
+
assert isinstance(dict_rep, dict)
|
|
255
|
+
assert len(dict_rep) == 13
|
|
256
|
+
assert dict_rep["a"] == 0.2
|
|
257
|
+
assert dict_rep["b"] == ".a"
|
|
258
|
+
assert isinstance(dict_rep["b"], Reference)
|
|
259
|
+
assert dict_rep["c"] == ".sub_list[1].a"
|
|
260
|
+
assert isinstance(dict_rep["c"], Reference)
|
|
261
|
+
np.testing.assert_almost_equal(dict_rep["d"], [0.0, 1.0, 2.0, 3.2])
|
|
262
|
+
assert isinstance(dict_rep["d"], np.ndarray)
|
|
263
|
+
assert np.issubdtype(dict_rep["d"].dtype, np.number)
|
|
264
|
+
np.testing.assert_almost_equal(dict_rep["e"], [1, 2, 10])
|
|
265
|
+
assert isinstance(dict_rep["e"], np.ndarray)
|
|
266
|
+
assert np.issubdtype(dict_rep["e"].dtype, int)
|
|
267
|
+
assert dict_rep["name"] == "New main name"
|
|
268
|
+
|
|
269
|
+
# main.sub1
|
|
270
|
+
assert isinstance(dict_rep["sub1"], dict)
|
|
271
|
+
assert len(dict_rep["sub1"]) == 5
|
|
272
|
+
assert dict_rep["sub1"]["a"] == 0.1
|
|
273
|
+
np.testing.assert_almost_equal(
|
|
274
|
+
dict_rep["sub1"]["b"], [0.0, 0.2, 0.4, 0.6, 0.8, 1.0]
|
|
275
|
+
)
|
|
276
|
+
assert isinstance(dict_rep["sub1"]["b"], np.ndarray)
|
|
277
|
+
assert np.issubdtype(dict_rep["sub1"]["b"].dtype, np.number)
|
|
278
|
+
assert dict_rep["sub1"]["c"] == ".b"
|
|
279
|
+
assert isinstance(dict_rep["sub1"]["c"], Reference)
|
|
280
|
+
assert isinstance(dict_rep["sub1"]["e"], Function)
|
|
281
|
+
np.testing.assert_almost_equal(dict_rep["sub1"]["f"], [0, 1, 2, 3, 4])
|
|
282
|
+
assert isinstance(dict_rep["sub1"]["f"], np.ndarray)
|
|
283
|
+
assert np.issubdtype(dict_rep["sub1"]["f"].dtype, np.number)
|
|
284
|
+
|
|
285
|
+
# main.sub2
|
|
286
|
+
assert isinstance(dict_rep["sub2"], dict)
|
|
287
|
+
assert len(dict_rep["sub2"]) == 1
|
|
288
|
+
assert dict_rep["sub2"]["a"] == 0.3
|
|
289
|
+
|
|
290
|
+
# main.sub_list
|
|
291
|
+
assert isinstance(dict_rep["sub_list"], list)
|
|
292
|
+
assert len(dict_rep["sub_list"]) == 2
|
|
293
|
+
assert isinstance(dict_rep["sub_list"][0], dict)
|
|
294
|
+
assert len(dict_rep["sub_list"][0]) == 1
|
|
295
|
+
assert dict_rep["sub_list"][0]["a"] == 0.1
|
|
296
|
+
assert isinstance(dict_rep["sub_list"][1], dict)
|
|
297
|
+
assert len(dict_rep["sub_list"][1]) == 1
|
|
298
|
+
assert dict_rep["sub_list"][1]["a"] == 0.3
|
|
299
|
+
|
|
300
|
+
# %% .as_dict(onlychanged=False, as_refs=False, as_funcs=False)
|
|
301
|
+
dict_rep = dum.as_dict(onlychanged=False, as_refs=False, as_funcs=False)
|
|
302
|
+
# main
|
|
303
|
+
assert isinstance(dict_rep, dict)
|
|
304
|
+
assert len(dict_rep) == 15
|
|
305
|
+
assert dict_rep["a"] == 0.2
|
|
306
|
+
assert dict_rep["b"] == dict_rep["a"]
|
|
307
|
+
assert dict_rep["c"] == dict_rep["sub_list"][1]["a"]
|
|
308
|
+
np.testing.assert_almost_equal(dict_rep["d"], [0.0, 1.0, 2.0, 3.2])
|
|
309
|
+
assert isinstance(dict_rep["d"], np.ndarray)
|
|
310
|
+
assert np.issubdtype(dict_rep["d"].dtype, np.number)
|
|
311
|
+
np.testing.assert_almost_equal(dict_rep["e"], [1, 2, 10])
|
|
312
|
+
assert isinstance(dict_rep["e"], np.ndarray)
|
|
313
|
+
assert np.issubdtype(dict_rep["e"].dtype, int)
|
|
314
|
+
assert dict_rep["name"] == "New main name"
|
|
315
|
+
assert dict_rep["version"] == "0.0.0"
|
|
316
|
+
|
|
317
|
+
# main.sub1
|
|
318
|
+
assert isinstance(dict_rep["sub1"], dict)
|
|
319
|
+
assert len(dict_rep["sub1"]) == 10
|
|
320
|
+
assert dict_rep["sub1"]["a"] == 0.1
|
|
321
|
+
np.testing.assert_almost_equal(
|
|
322
|
+
dict_rep["sub1"]["b"], [0.0, 0.2, 0.4, 0.6, 0.8, 1.0]
|
|
323
|
+
)
|
|
324
|
+
assert isinstance(dict_rep["sub1"]["b"], np.ndarray)
|
|
325
|
+
assert np.issubdtype(dict_rep["sub1"]["b"].dtype, np.number)
|
|
326
|
+
np.testing.assert_almost_equal(dict_rep["sub1"]["c"], dict_rep["sub1"]["b"])
|
|
327
|
+
np.testing.assert_almost_equal(
|
|
328
|
+
dict_rep["sub1"]["e"], np.full_like(dict_rep["sub1"]["b"], dict_rep["a"])
|
|
329
|
+
)
|
|
330
|
+
np.testing.assert_almost_equal(dict_rep["sub1"]["f"], [0, 1, 2, 3, 4])
|
|
331
|
+
assert isinstance(dict_rep["sub1"]["f"], np.ndarray)
|
|
332
|
+
assert np.issubdtype(dict_rep["sub1"]["f"].dtype, np.number)
|
|
333
|
+
np.testing.assert_almost_equal(
|
|
334
|
+
dict_rep["sub1"]["g"], np.full_like(dict_rep["sub1"]["b"], 6.0)
|
|
335
|
+
)
|
|
336
|
+
np.testing.assert_almost_equal(dict_rep["sub1"]["h"], np.linspace(0, 10, 5))
|
|
337
|
+
|
|
338
|
+
# main.sub2
|
|
339
|
+
assert isinstance(dict_rep["sub2"], dict)
|
|
340
|
+
assert len(dict_rep["sub2"]) == 8
|
|
341
|
+
assert dict_rep["sub2"]["a"] == 0.3
|
|
342
|
+
assert dict_rep["sub2"]["b"] == dict_rep["a"]
|
|
343
|
+
assert dict_rep["sub2"]["c"] == dict_rep["sub_list"][0]["a"]
|
|
344
|
+
np.testing.assert_almost_equal(dict_rep["sub2"]["d"], dict_rep["sub1"]["b"])
|
|
345
|
+
np.testing.assert_almost_equal(dict_rep["sub2"]["e"], dict_rep["sub1"]["b"] + 1)
|
|
346
|
+
|
|
347
|
+
# main.sub_list
|
|
348
|
+
assert isinstance(dict_rep["sub_list"], list)
|
|
349
|
+
assert len(dict_rep["sub_list"]) == 2
|
|
350
|
+
for iel, el in enumerate(dict_rep["sub_list"]):
|
|
351
|
+
assert isinstance(el, dict)
|
|
352
|
+
assert len(el) == 7
|
|
353
|
+
a_val = 0.1 if iel == 0 else 0.3
|
|
354
|
+
assert el["a"] == a_val
|
|
355
|
+
assert el["b"] == dict_rep["a"]
|
|
356
|
+
assert el["c"] == dict_rep["sub1"]["a"]
|
|
357
|
+
np.testing.assert_almost_equal(el["d"], dict_rep["d"])
|
|
358
|
+
np.testing.assert_almost_equal(el["e"], dict_rep["sub1"]["b"])
|
|
359
|
+
|
|
360
|
+
# %% .as_serial(onlychanged=True, as_refs=True, as_funcs=True)
|
|
361
|
+
json_rep = dum.as_serial(onlychanged=True, as_refs=True, as_funcs=True)
|
|
362
|
+
# main
|
|
363
|
+
assert isinstance(json_rep, dict)
|
|
364
|
+
assert len(json_rep) == 13
|
|
365
|
+
assert json_rep["a"] == 0.2
|
|
366
|
+
assert json_rep["b"] == "$ref .a"
|
|
367
|
+
assert json_rep["c"] == "$ref .sub_list[1].a"
|
|
368
|
+
np.testing.assert_almost_equal(json_rep["d"], [0.0, 1.0, 2.0, 3.2])
|
|
369
|
+
assert isinstance(json_rep["d"], list)
|
|
370
|
+
np.testing.assert_almost_equal(json_rep["e"], [1, 2, 10])
|
|
371
|
+
assert isinstance(json_rep["e"], list)
|
|
372
|
+
assert json_rep["name"] == "New main name"
|
|
373
|
+
|
|
374
|
+
# main.sub1
|
|
375
|
+
assert isinstance(json_rep["sub1"], dict)
|
|
376
|
+
assert len(json_rep["sub1"]) == 5
|
|
377
|
+
assert json_rep["sub1"]["a"] == 0.1
|
|
378
|
+
np.testing.assert_almost_equal(
|
|
379
|
+
json_rep["sub1"]["b"], [0.0, 0.2, 0.4, 0.6, 0.8, 1.0]
|
|
380
|
+
)
|
|
381
|
+
assert isinstance(json_rep["sub1"]["b"], list)
|
|
382
|
+
assert json_rep["sub1"]["c"] == "$ref .b"
|
|
383
|
+
assert (
|
|
384
|
+
json_rep["sub1"]["e"]
|
|
385
|
+
== "$function lambda self: np.full_like(self.b, self['..a'])"
|
|
386
|
+
)
|
|
387
|
+
np.testing.assert_almost_equal(json_rep["sub1"]["f"], [0, 1, 2, 3, 4])
|
|
388
|
+
assert isinstance(json_rep["sub1"]["f"], list)
|
|
389
|
+
|
|
390
|
+
# main.sub2
|
|
391
|
+
assert isinstance(json_rep["sub2"], dict)
|
|
392
|
+
assert len(json_rep["sub2"]) == 1
|
|
393
|
+
assert json_rep["sub2"]["a"] == 0.3
|
|
394
|
+
|
|
395
|
+
# main.sub_list
|
|
396
|
+
assert isinstance(json_rep["sub_list"], list)
|
|
397
|
+
assert len(json_rep["sub_list"]) == 2
|
|
398
|
+
assert isinstance(json_rep["sub_list"][0], dict)
|
|
399
|
+
assert json_rep["sub_list"][0]["a"] == 0.1
|
|
400
|
+
assert isinstance(json_rep["sub_list"][1], dict)
|
|
401
|
+
assert json_rep["sub_list"][1]["a"] == 0.3
|
|
402
|
+
|
|
403
|
+
# main.sub_list2
|
|
404
|
+
assert isinstance(json_rep["sub_list2"], list)
|
|
405
|
+
assert len(json_rep["sub_list2"]) == 1
|
|
406
|
+
assert isinstance(json_rep["sub_list2"][0], dict)
|
|
407
|
+
assert isinstance(json_rep["sub_list2"][0], dict)
|
|
408
|
+
assert json_rep["sub_list2"][0]["a"] == 0.1
|
|
409
|
+
|
|
410
|
+
# JSON data
|
|
411
|
+
with open(os.path.join(file_path, "dummy_instance.json"), "r") as file:
|
|
412
|
+
json_data = json.load(file)
|
|
413
|
+
json_data.pop("version")
|
|
414
|
+
json_data.pop("$schema")
|
|
415
|
+
assert json_rep == json_data
|
|
416
|
+
assert json.loads(dum.as_json(onlychanged=True)) == json_rep
|
|
417
|
+
|
|
418
|
+
# %% .as_serial(onlychanged=False, as_refs=False, as_funcs=False)
|
|
419
|
+
json_rep = dum.as_serial(onlychanged=False, as_refs=False, as_funcs=False)
|
|
420
|
+
# main
|
|
421
|
+
assert isinstance(json_rep, dict)
|
|
422
|
+
assert len(json_rep) == 15
|
|
423
|
+
assert json_rep["a"] == 0.2
|
|
424
|
+
assert json_rep["b"] == json_rep["a"]
|
|
425
|
+
assert json_rep["c"] == json_rep["sub_list"][1]["a"]
|
|
426
|
+
np.testing.assert_almost_equal(json_rep["d"], [0.0, 1.0, 2.0, 3.2])
|
|
427
|
+
assert isinstance(json_rep["d"], list)
|
|
428
|
+
np.testing.assert_almost_equal(json_rep["e"], [1, 2, 10])
|
|
429
|
+
assert isinstance(json_rep["e"], list)
|
|
430
|
+
assert json_rep["name"] == "New main name"
|
|
431
|
+
assert json_rep["version"] == "0.0.0"
|
|
432
|
+
|
|
433
|
+
# main.sub1
|
|
434
|
+
assert isinstance(json_rep["sub1"], dict)
|
|
435
|
+
assert len(json_rep["sub1"]) == 10
|
|
436
|
+
assert json_rep["sub1"]["a"] == 0.1
|
|
437
|
+
np.testing.assert_almost_equal(
|
|
438
|
+
json_rep["sub1"]["b"], [0.0, 0.2, 0.4, 0.6, 0.8, 1.0]
|
|
439
|
+
)
|
|
440
|
+
assert isinstance(json_rep["sub1"]["b"], list)
|
|
441
|
+
np.testing.assert_almost_equal(json_rep["sub1"]["c"], json_rep["sub1"]["b"])
|
|
442
|
+
np.testing.assert_almost_equal(
|
|
443
|
+
json_rep["sub1"]["e"], np.full_like(json_rep["sub1"]["b"], json_rep["a"])
|
|
444
|
+
)
|
|
445
|
+
assert isinstance(json_rep["sub1"]["e"], list)
|
|
446
|
+
np.testing.assert_almost_equal(json_rep["sub1"]["f"], [0, 1, 2, 3, 4])
|
|
447
|
+
assert isinstance(json_rep["sub1"]["f"], list)
|
|
448
|
+
np.testing.assert_almost_equal(
|
|
449
|
+
json_rep["sub1"]["g"], np.full_like(json_rep["sub1"]["b"], 6.0)
|
|
450
|
+
)
|
|
451
|
+
assert isinstance(json_rep["sub1"]["g"], list)
|
|
452
|
+
np.testing.assert_almost_equal(json_rep["sub1"]["h"], np.linspace(0, 10, 5))
|
|
453
|
+
assert isinstance(json_rep["sub1"]["h"], list)
|
|
454
|
+
|
|
455
|
+
# main.sub2
|
|
456
|
+
assert isinstance(json_rep["sub2"], dict)
|
|
457
|
+
assert len(json_rep["sub2"]) == 8
|
|
458
|
+
assert json_rep["sub2"]["a"] == 0.3
|
|
459
|
+
assert json_rep["sub2"]["b"] == json_rep["a"]
|
|
460
|
+
assert json_rep["sub2"]["c"] == json_rep["sub_list"][0]["a"]
|
|
461
|
+
np.testing.assert_almost_equal(json_rep["sub2"]["d"], json_rep["sub1"]["b"])
|
|
462
|
+
np.testing.assert_almost_equal(
|
|
463
|
+
json_rep["sub2"]["e"], [el + 1 for el in json_rep["sub1"]["b"]]
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
# main.sub_list
|
|
467
|
+
assert isinstance(json_rep["sub_list"], list)
|
|
468
|
+
assert len(json_rep["sub_list"]) == 2
|
|
469
|
+
for iel, el in enumerate(json_rep["sub_list"]):
|
|
470
|
+
assert isinstance(el, dict)
|
|
471
|
+
assert len(el) == 7
|
|
472
|
+
a_val = 0.1 if iel == 0 else 0.3
|
|
473
|
+
assert el["a"] == a_val
|
|
474
|
+
assert el["b"] == json_rep["a"]
|
|
475
|
+
assert el["c"] == json_rep["sub1"]["a"]
|
|
476
|
+
np.testing.assert_almost_equal(el["d"], json_rep["d"])
|
|
477
|
+
assert isinstance(el["d"], list)
|
|
478
|
+
np.testing.assert_almost_equal(el["e"], json_rep["sub1"]["b"])
|
|
479
|
+
assert isinstance(el["e"], list)
|
|
480
|
+
|
|
481
|
+
# Round trip json conversion
|
|
482
|
+
dum.write_json(os.path.join(tmp_path, "temp.json"), False)
|
|
483
|
+
dum2 = main_example().read_json(os.path.join(tmp_path, "temp.json"))
|
|
484
|
+
assert dum.as_serial(onlychanged=False) == dum2.as_serial(onlychanged=False)
|
|
485
|
+
# %% Test function setting
|
|
486
|
+
dum.sub1.e = lambda self: np.full_like(self.b, self["..a"])
|
|
487
|
+
json_rep = dum.as_serial(onlychanged=True, as_refs=True, as_funcs=True)
|
|
488
|
+
assert (
|
|
489
|
+
json_rep["sub1"]["e"]
|
|
490
|
+
== '$function lambda self: np.full_like(self.b, self["..a"])'
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
def test_function(self):
|
|
494
|
+
return np.full_like(self.b, self["..a"] + 1)
|
|
495
|
+
|
|
496
|
+
dum.sub1.e = test_function
|
|
497
|
+
json_rep = dum.as_serial(onlychanged=True, as_refs=True, as_funcs=True)
|
|
498
|
+
assert (
|
|
499
|
+
json_rep["sub1"]["e"]
|
|
500
|
+
== '$function def test_function(self):\n return np.full_like(self.b, self["..a"] + 1)'
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
def test_AESOptParameterized_schema(tmp_path):
|
|
505
|
+
dum = main_example().read_json(os.path.join(file_path, "dummy_instance.json"))
|
|
506
|
+
|
|
507
|
+
# Write schema to file
|
|
508
|
+
temp_schema = os.path.join(tmp_path, "dummy_schema.json")
|
|
509
|
+
dum.write_json_schema(temp_schema)
|
|
510
|
+
# Serialize default
|
|
511
|
+
# Get schemas
|
|
512
|
+
with open(temp_schema, "r") as file:
|
|
513
|
+
schema_temp = json.load(file)
|
|
514
|
+
with open(os.path.join(file_path, "dummy_schema.json"), "r") as file:
|
|
515
|
+
schema = json.load(file)
|
|
516
|
+
assert schema == schema_temp
|
|
517
|
+
# Validate schema is Draft 7 valid
|
|
518
|
+
Draft7Validator.check_schema(schema)
|
|
519
|
+
# Check that it is a valid schema
|
|
520
|
+
validate(instance=dum.as_serial(), schema=schema)
|
|
521
|
+
|
|
522
|
+
# Check subset
|
|
523
|
+
json_schema = dum.as_json_schema(subset=["a"])
|
|
524
|
+
assert len(json_schema["properties"]) == 1
|
|
525
|
+
assert "a" in json_schema["properties"]
|
|
526
|
+
|
|
527
|
+
# Add a listselector to use default schema writer
|
|
528
|
+
dum.param.add_parameter(
|
|
529
|
+
"dummy_listselector", ListSelector(["one"], objects=["one", "two", "three"])
|
|
530
|
+
)
|
|
531
|
+
# Add empty class selector
|
|
532
|
+
dum.param.add_parameter("dummy_classselector_empty", ClassSelector(class_=object))
|
|
533
|
+
# Add class selector with multiple
|
|
534
|
+
dum.param.add_parameter(
|
|
535
|
+
"dummy_classselector_multi", ClassSelector(class_=(list, tuple))
|
|
536
|
+
)
|
|
537
|
+
# Add class selector with float
|
|
538
|
+
dum.param.add_parameter(
|
|
539
|
+
"dummy_classselector_float", ClassSelector(class_=float, allow_None=False)
|
|
540
|
+
)
|
|
541
|
+
json_schema = dum.as_json_schema()
|
|
542
|
+
assert "enum" in json_schema["properties"]["dummy_listselector"]["items"]
|
|
543
|
+
assert len(json_schema["properties"]["dummy_classselector_empty"]) == 1
|
|
544
|
+
assert "anyOf" in json_schema["properties"]["dummy_classselector_multi"]
|
|
545
|
+
assert (
|
|
546
|
+
json_schema["properties"]["dummy_classselector_float"]["anyOf"][0]["type"]
|
|
547
|
+
== "number"
|
|
548
|
+
)
|
|
549
|
+
|
|
550
|
+
# Fail with param.Callable
|
|
551
|
+
dum.param.add_parameter("dummy_call", Callable())
|
|
552
|
+
with pytest.raises(UnserializableException):
|
|
553
|
+
dum.as_json_schema()
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
def test_copy_param():
|
|
557
|
+
default = 0.5
|
|
558
|
+
doc = "test"
|
|
559
|
+
p = AESOptNumber(default, doc=doc, per_instance=False)
|
|
560
|
+
p2 = copy_param(p)
|
|
561
|
+
assert p2.default == default
|
|
562
|
+
assert p2.doc == doc
|
|
563
|
+
assert p2.per_instance is False
|
|
564
|
+
|
|
565
|
+
p3 = copy_param_ref(p, ".p")
|
|
566
|
+
assert p3.default is None
|
|
567
|
+
assert p3.default_ref == ".p"
|
|
568
|
+
assert p3.doc == doc
|
|
569
|
+
assert p3.per_instance is False
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
if __name__ == "__main__":
|
|
573
|
+
dum = main_example()
|
|
574
|
+
dum.write_json_schema(os.path.join(file_path, "dummy_schema.json"), indent=4)
|