aesoptparam 0.3.6a0__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.

@@ -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)