cdxcore 0.1.6__py3-none-any.whl → 0.1.10__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 cdxcore might be problematic. Click here for more details.

tests/_cdxbasics.py DELETED
@@ -1,1086 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
- Created on Tue Apr 14 21:24:52 2020
4
- @author: hansb
5
- """
6
-
7
- import importlib as imp
8
- import unittest
9
- import pickle
10
-
11
- import cdxbasics.util as util
12
- imp.reload(util)
13
- import cdxbasics.np as cdxnp
14
- imp.reload(cdxnp)
15
- import cdxbasics.config as config
16
- imp.reload(config)
17
- import cdxbasics.subdir as subdir
18
- imp.reload(subdir)
19
- import cdxbasics.prettydict as prettydict
20
- import cdxbasics.prettyobject as prettydict
21
-
22
- import cdxbasics.verbose as verbose
23
- import cdxbasics.version as ver
24
- import datetime as datetime
25
- import dataclasses as dataclasses
26
- import numpy as np
27
- import hashlib as hashlib
28
-
29
- if False:
30
- import importlib as imp
31
- imp.reload(mdl_kwargs)
32
- imp.reload(mdl_subdir)
33
- imp.reload(mdl_logger)
34
- imp.reload(config)
35
- imp.reload(prettydict)
36
- imp.reload(util)
37
-
38
- import numpy as np
39
- import pandas as pd
40
-
41
- SubDir = mdl_subdir.SubDir
42
- CacheMode = mdl_subdir.CacheMode
43
- Logger = mdl_logger.Logger
44
- LogException = Logger.LogException
45
- dctkwargs = mdl_kwargs.dctkwargs
46
- Generic = util.Generic
47
- fmt = util.fmt
48
- PrettyDict = prettydict.PrettyDict
49
- PrettySortedDict = prettydict.PrettySortedDict
50
- PrettyOrderedDict = prettydict.PrettyOrderedDict
51
- PrettyDictField = prettydict.PrettyDictField
52
- uniqueHash = util.uniqueHash
53
- uniqueHash32 = util.uniqueHash32
54
- uniqueHash48 = util.uniqueHash48
55
- uniqueHash64 = util.uniqueHash64
56
- uniqueHashExt = util.uniqueHashExt
57
- namedUniqueHashExt = util.namedUniqueHashExt
58
- _compress_function_code = util._compress_function_code
59
- OrderedDict = prettydict.OrderedDict
60
-
61
- Config = config.Config
62
- ConfigField = config.ConfigField
63
- Float = config.Float
64
- Int = config.Int
65
- version = ver.version
66
-
67
- mdl_subdir._log.setLevel(Logger.CRITICAL+1) # no logging in testing
68
-
69
- class CDXBasicsTest(unittest.TestCase):
70
-
71
- def test_dctkwargs(self):
72
-
73
- BACKWARD_COMPATIBLE_ITEM_ACCESS = config
74
- def f1(**kwargs):
75
- kwargs = dctkwargs(kwargs)
76
- a = kwargs('a',1) # with default
77
- b = kwargs('b') # no default; must exist
78
- c = kwargs.get('c',3) # with default
79
- kwargs.done()
80
- return (a,b,c)
81
-
82
- self.assertEqual((-1,-2,-3), f1(a=-1,b=-2,c=-3))
83
- self.assertEqual((+1,-2,+3), f1(b=-2))
84
- with self.assertRaises(KeyError):
85
- f1() # missing b
86
-
87
- def test_Generic(self):
88
- # PrettyDict is now PrettyDict
89
- self.assertEqual( Generic, PrettyDict )
90
-
91
- def test_PrettyDict(self):
92
-
93
- g1 = PrettyDict(a=1)
94
- g1.b = 2
95
- g1['c'] = 3
96
- self.assertEqual(g1.a, 1)
97
- self.assertEqual(g1.b, 2)
98
- self.assertEqual(g1.c, 3)
99
-
100
- with self.assertRaises(KeyError):
101
- _ = g1.d
102
-
103
- g1.e = 4
104
- g1.f = 5
105
- del g1['e']
106
- del g1['f']
107
- with self.assertRaises(KeyError):
108
- _ = g1.e
109
- with self.assertRaises(KeyError):
110
- _ = g1.f
111
-
112
- self.assertEqual(g1.get('c',4),3)
113
- self.assertEqual(g1.get('d',4),4)
114
- self.assertEqual(g1('c'),3)
115
- self.assertEqual(g1('c',4),3)
116
- self.assertEqual(g1('d',4),4)
117
-
118
- g1 = PrettyDict(g1)
119
- self.assertEqual(g1.a, 1)
120
- self.assertEqual(g1.b, 2)
121
- self.assertEqual(g1.c, 3)
122
-
123
- g1.update({ 'd':4 })
124
- self.assertEqual(g1.d, 4)
125
- g1.update(PrettyDict(e=5))
126
- self.assertEqual(g1.e, 5)
127
-
128
- g1.update({ 'd':4 },d=3)
129
- self.assertEqual(g1.d, 3)
130
-
131
- # functions
132
- def F(self,x):
133
- self.x = x
134
-
135
- g = util.PrettyDict()
136
- g.F = F
137
- g.F(2)
138
- self.assertEqual(g.x,2)
139
-
140
- g2 = util.PrettyDict()
141
- g2.F = g.F
142
- g2.F(3)
143
- self.assertEqual(g2.x,3) # new value only for this object is 3
144
- self.assertEqual(g.x,2) # old value remains 2
145
-
146
- with self.assertRaises(TypeError):
147
- def G():
148
- return 1
149
- g.G = G
150
- g.G()
151
-
152
- # __ does not work
153
- g = PrettyDict()
154
- g.__x = 1
155
- g._y = 2
156
- self.assertEqual(g.__x,1) # works as usual
157
- self.assertEqual(g['_y'],2) # protected works as for all python objects
158
- with self.assertRaises(KeyError):
159
- _ = g['__x'] # does not work: cannot use private members as dictionary elements
160
- self.assertEqual( getattr(g, "__z", None), None )
161
- with self.assertRaises(AttributeError):
162
- getattr(g, "__z",)
163
-
164
-
165
- # ordered dict
166
- g1 = PrettyOrderedDict(a=1)
167
- g1.b = 2
168
- g1['c'] = 3
169
- self.assertEqual(g1.a, 1)
170
- self.assertEqual(g1.b, 2)
171
- self.assertEqual(g1.c, 3)
172
-
173
- with self.assertRaises(KeyError):
174
- _ = g1.d
175
-
176
- g = PrettyOrderedDict()
177
- g.__x = 1
178
- g._y = 2
179
- self.assertEqual(g.__x,1) # works as usual
180
- self.assertEqual(g['_y'],2) # protected works as for all python objects
181
- with self.assertRaises(KeyError):
182
- _ = g['__x'] # does not work: cannot use private members as dictionary elements
183
- self.assertEqual( getattr(g, "__z", None), None )
184
- with self.assertRaises(AttributeError):
185
- getattr(g, "__z",)
186
-
187
- # at_pos
188
- g1 = PrettyOrderedDict()
189
- g1.a=1
190
- g1.b=2
191
- g1.d=4
192
- g1.c=3
193
- self.assertEqual(g1.a, 1)
194
- self.assertEqual(g1.b, 2)
195
- self.assertEqual(g1.c, 3)
196
- self.assertEqual(g1.d, 4)
197
- self.assertEqual( g1.at_pos[3], 3)
198
- self.assertEqual( g1.at_pos[0:2], [1,2])
199
- self.assertEqual( g1.at_pos.keys[3], 'c')
200
- self.assertEqual( g1.at_pos.keys[0:2], ['a', 'b'])
201
- self.assertEqual( g1.at_pos.items[3], ('c',3))
202
- self.assertEqual( g1.at_pos.items[0:2], [('a',1), ('b',2)])
203
-
204
- import dataclasses as dataclasses
205
- @dataclasses.dataclass
206
- class Data:
207
- data : PrettyDictField = PrettyDictField.Field()
208
- data = Data()
209
- with self.assertRaises(KeyError):
210
- _ = data.data.x
211
- data = Data(PrettyOrderedDict(x=1))
212
- self.assertEqual(data.data.x,1)
213
-
214
- @dataclasses.dataclass
215
- class Data:
216
- data : PrettyDictField = PrettyDictField.Field(x=2)
217
- data = Data()
218
- self.assertEqual(data.data.x,2)
219
- data = Data( data=PrettyOrderedDict({'x':3}))
220
- self.assertEqual(data.data.x,3)
221
- data = Data( data={'x':3})
222
- self.assertEqual(data.data['x'],3)
223
-
224
-
225
- # sorted dict
226
- g1 = PrettySortedDict(a=1)
227
- g1.b = 2
228
- g1['c'] = 3
229
- self.assertEqual(g1.a, 1)
230
- self.assertEqual(g1.b, 2)
231
- self.assertEqual(g1.c, 3)
232
-
233
- with self.assertRaises(KeyError):
234
- _ = g1.d
235
-
236
- g = PrettySortedDict()
237
- g.__x = 1
238
- g._y = 2
239
- self.assertEqual(g.__x,1) # works as usual
240
- with self.assertRaises(KeyError):
241
- _ = g['__x'] # does not work: cannot use private members as dictionary elements
242
- with self.assertRaises(KeyError):
243
- _ = g['_y'] # does not work: cannot use protected members as dictionary elements
244
- with self.assertRaises(AttributeError):
245
- _ = g.__z # must throw attribute errors otherwise various class handling processes get confused
246
-
247
-
248
-
249
-
250
-
251
- def test_subdir(self):
252
-
253
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", eraseEverything=True )
254
- sub.x = 1
255
- sub['y'] = 2
256
- sub.write('z',3)
257
- sub.writeString('l',"hallo")
258
- sub.write(['a','b'],[11,22])
259
-
260
- lst = str(sorted(sub.keys()))
261
- self.assertEqual(lst, "['a', 'b', 'x', 'y', 'z']")
262
- lst = str(sorted(sub.keys(ext="txt")))
263
- self.assertEqual(lst, "['l']")
264
-
265
- # test naming
266
- self.assertEqual( str(sub), sub.path + ";*" + sub.ext )
267
- self.assertEqual( repr(sub), "SubDir(" + sub.path + ";*" + sub.ext + ")" )
268
-
269
- # read them all back
270
- self.assertEqual(sub.x,1)
271
- self.assertEqual(sub.y,2)
272
- self.assertEqual(sub.z,3)
273
- self.assertEqual(sub.readString('l'),"hallo")
274
- self.assertEqual(sub.a,11)
275
- self.assertEqual(sub.b,22)
276
- self.assertEqual(sub(['a','b'], None), [11,22])
277
- self.assertEqual(sub.read(['a','b']), [11,22])
278
- self.assertEqual(sub[['a','b']], [11,22])
279
- self.assertEqual(sub(['aaaa','bbbb'], None), [None,None])
280
-
281
- # test alternatives
282
- self.assertEqual(sub['x'],1)
283
- self.assertEqual(sub.read('x'),1)
284
- self.assertEqual(sub.read('x',None),1)
285
- self.assertEqual(sub.read('u',None),None)
286
- self.assertEqual(sub('x',None),1)
287
- self.assertEqual(sub('u',None),None)
288
-
289
- # missing objects
290
- with self.assertRaises(AttributeError):
291
- print(sub.x2)
292
- with self.assertRaises(KeyError):
293
- print(sub['x2'])
294
- with self.assertRaises(KeyError):
295
- print(sub.read('x2',raiseOnError=True))
296
-
297
- # delete & confirm they are gone
298
- del sub.x
299
- del sub['y']
300
- sub.delete('z')
301
-
302
- del sub.x # silent
303
- del sub['x'] # silent
304
- with self.assertRaises(KeyError):
305
- sub.delete('x',raiseOnError=True)
306
-
307
- # sub dirs
308
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", eraseEverything=True )
309
- s1 = sub("subDir1")
310
- s2 = sub("subDir2/")
311
- s3 = SubDir("subDir3/",parent=sub)
312
- s4 = SubDir("subDir4", parent=sub)
313
- self.assertEqual(s1.path, sub.path + "subDir1/")
314
- self.assertEqual(s2.path, sub.path + "subDir2/")
315
- self.assertEqual(s3.path, sub.path + "subDir3/")
316
- self.assertEqual(s4.path, sub.path + "subDir4/")
317
- lst = str(sorted(sub.subDirs()))
318
- self.assertEqual(lst, "[]")
319
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", eraseEverything=True )
320
- s1 = sub("subDir1", createDirectory=True)
321
- s2 = sub("subDir2/", createDirectory=True)
322
- s3 = SubDir("subDir3/",parent=sub, createDirectory=True)
323
- s4 = SubDir("subDir4", parent=sub, createDirectory=True)
324
- self.assertEqual(s1.path, sub.path + "subDir1/")
325
- self.assertEqual(s2.path, sub.path + "subDir2/")
326
- self.assertEqual(s3.path, sub.path + "subDir3/")
327
- self.assertEqual(s4.path, sub.path + "subDir4/")
328
- lst = str(sorted(sub.subDirs()))
329
- self.assertEqual(lst, "['subDir1', 'subDir2', 'subDir3', 'subDir4']")
330
-
331
- sub.deleteAllContent()
332
- self.assertEqual(len(sub.keys()),0)
333
- self.assertEqual(len(sub.subDirs()),0)
334
- sub.eraseEverything()
335
-
336
- # test vectors
337
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", eraseEverything=True )
338
- sub.x = 1
339
- sub[['y','z']] = [2,3]
340
-
341
- self.assertEqual(sub[['x','y','z']], [1,2,3])
342
- with self.assertRaises(KeyError):
343
- self.assertEqual(sub[['x','y','z','r']], [1,2,3,None])
344
- self.assertEqual(sub.read(['x','r'],default=None), [1,None])
345
- self.assertEqual(sub(['x','r'],default=None), [1,None])
346
-
347
- sub.write(['a','b'],1)
348
- self.assertEqual(sub.read(['a','b']),[1,1])
349
- with self.assertRaises(LogException):
350
- sub.write(['x','y'],[1,2,3])
351
- with self.assertRaises(LogException):
352
- sub.write(['x','y'],[1,2,3])
353
- sub.eraseEverything()
354
-
355
- # test setting ext
356
- sub1 = "!/.tmp_test_for_cdxbasics.subdir"
357
- fd1 = SubDir(sub1).path
358
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir/test;*.bin", eraseEverything=True )
359
- self.assertEqual(sub.path, fd1+"test/")
360
- fn = sub.fullKeyName("file")
361
- self.assertEqual(fn,fd1+"test/file.bin")
362
- sub.eraseEverything()
363
-
364
- # test versioning
365
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir")
366
- version = "1.0.0"
367
- sub.write("test", "hans", version=version )
368
- r = sub.read("test", version=version )
369
- self.assertEqual(r, "hans")
370
- r = sub.read("test", "nothans", version="2.0.0", delete_wrong_version=False )
371
- self.assertEqual(r, "nothans")
372
- self.assertTrue(sub.exists("test"))
373
- r = sub.is_version("test", version=version )
374
- self.assertTrue(r)
375
- r = sub.is_version("test", version="2.0.0" )
376
- self.assertFalse(r)
377
- r = sub.read("test", "nothans", version="2.0.0", delete_wrong_version=True )
378
- self.assertFalse(sub.exists("test"))
379
- sub.eraseEverything()
380
-
381
- # test JSON
382
- x = np.ones((10,))
383
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", fmt=SubDir.JSON_PICKLE )
384
- sub.write("test", x)
385
- r = sub.read("test", None, raiseOnError=True)
386
- r = sub.read("test", None)
387
- self.assertEqual( list(x), list(r) )
388
- self.assertEqual(sub.ext, ".jpck")
389
- sub.eraseEverything()
390
-
391
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", fmt=SubDir.JSON_PLAIN )
392
- sub.write("test", x)
393
- r = sub.read("test", None)
394
- self.assertEqual( list(x), list(r) )
395
- self.assertEqual(sub.ext, ".json")
396
- sub.eraseEverything()
397
-
398
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", fmt=SubDir.BLOSC )
399
- sub.write("test", x)
400
- r = sub.read("test", None )
401
- self.assertEqual( list(x), list(r) )
402
- self.assertEqual(sub.ext, ".zbsc")
403
- sub.write("test", x, version="1")
404
- r = sub.read("test", None, version="1")
405
- self.assertEqual( list(x), list(r) )
406
- with self.assertRaises(Exception):
407
- r = sub.read("test", None, version="2", raiseOnError=True)
408
- # wrong version
409
- sub.eraseEverything()
410
-
411
- sub = SubDir("!/.tmp_test_for_cdxbasics.subdir", fmt=SubDir.GZIP )
412
- sub.write("test", x)
413
- r = sub.read("test", None )
414
- self.assertEqual( list(x), list(r) )
415
- self.assertEqual(sub.ext, ".pgz")
416
- sub.write("test", x, version="1")
417
- r = sub.read("test", None, version="1")
418
- self.assertEqual( list(x), list(r) )
419
- with self.assertRaises(Exception):
420
- r = sub.read("test", None, version="2", raiseOnError=True)
421
- # wrong version
422
- sub.eraseEverything()
423
-
424
-
425
- def test_cache_mode(self):
426
-
427
- on = CacheMode("on")
428
- gn = CacheMode("gen")
429
- of = CacheMode("off")
430
- cl = CacheMode("clear")
431
- up = CacheMode("update")
432
- ro = CacheMode("readonly")
433
-
434
- with self.assertRaises(KeyError):
435
- _ = CacheMode("OFF")
436
-
437
- allc = [on, gn, of, cl, up, ro]
438
-
439
- self.assertEqual( [ x.is_on for x in allc ], [True, False, False, False, False, False ] )
440
- self.assertEqual( [ x.is_gen for x in allc ], [False, True, False, False, False, False ] )
441
- self.assertEqual( [ x.is_off for x in allc ], [False, False, True, False, False, False ] )
442
- self.assertEqual( [ x.is_clear for x in allc ], [False, False, False, True, False, False ] )
443
- self.assertEqual( [ x.is_update for x in allc ], [False, False, False, False, True, False ] )
444
- self.assertEqual( [ x.is_readonly for x in allc ], [False, False, False, False, False, True ] )
445
-
446
- self.assertEqual( [ x.read for x in allc ], [True, True, False, False, False, True] )
447
- self.assertEqual( [ x.write for x in allc ], [True, True, False, False, True, False] )
448
- self.assertEqual( [ x.delete for x in allc ], [False, False, False, True, True, False ] )
449
- self.assertEqual( [ x.del_incomp for x in allc ], [True, False, False, True, True, False ] )
450
-
451
- def test_fmt_marcos(self):
452
-
453
- self.assertEqual( util.fmt_seconds(10), "10s" )
454
- self.assertEqual( util.fmt_seconds(61), "1:01" )
455
- self.assertEqual( util.fmt_seconds(12+60*2+60*60*3), "3:02:12" )
456
- self.assertEqual( util.fmt_seconds(12+60*2+60*60*100), "100:02:12" )
457
-
458
- self.assertEqual( util.fmt_list(None), "-" )
459
- self.assertEqual( util.fmt_list(None, none="n/a"), "n/a" )
460
- self.assertEqual( util.fmt_list(["a"]), "a" )
461
- self.assertEqual( util.fmt_list(["a","b"]), "a and b" )
462
- self.assertEqual( util.fmt_list(["a","b"], link="or"), "a or b" )
463
- self.assertEqual( util.fmt_list(["a","b"], link=None), "a, b" )
464
- self.assertEqual( util.fmt_list(["a","b"], link=""), "a, b" )
465
- self.assertEqual( util.fmt_list(["a","b", "c"]), "a, b and c" )
466
- self.assertEqual( util.fmt_list(["a","b", "c"], link="or"), "a, b or c" )
467
- self.assertEqual( util.fmt_list(["a","b", "c"], link=None), "a, b, c" )
468
- self.assertEqual( util.fmt_list(["a","b", "c"], link=""), "a, b, c" )
469
- self.assertEqual( util.fmt_dict({}), "-" )
470
- self.assertEqual( util.fmt_dict({},none="n/a"), "n/a" )
471
- self.assertEqual( util.fmt_dict(dict(a=1),sort=True), "a: 1" )
472
- self.assertEqual( util.fmt_dict(dict(a=1,b=2),sort=True), "a: 1 and b: 2" )
473
- self.assertEqual( util.fmt_dict(dict(a=1,b=2,c=3),sort=True), "a: 1, b: 2 and c: 3" )
474
- self.assertEqual( util.fmt_dict(OrderedDict(c=1,b=2,a=3),sort=False), "c: 1, b: 2 and a: 3" )
475
-
476
- self.assertEqual( util.fmt_big_number(1), "1" )
477
- self.assertEqual( util.fmt_big_number(123), "123" )
478
- self.assertEqual( util.fmt_big_number(1234), "1234" )
479
- self.assertEqual( util.fmt_big_number(12345), "12.35K" )
480
- self.assertEqual( util.fmt_big_number(123456), "123.46K" )
481
- self.assertEqual( util.fmt_big_number(1234567), "1234.57K" )
482
- self.assertEqual( util.fmt_big_number(12345678), "12.35M" )
483
- self.assertEqual( util.fmt_big_number(123456789), "123.46M" )
484
- self.assertEqual( util.fmt_big_number(1234567890), "1234.57M" )
485
- self.assertEqual( util.fmt_big_number(12345678900), "12.35B" )
486
- self.assertEqual( util.fmt_big_number(1234567890000), "1234.57B" )
487
- self.assertEqual( util.fmt_big_number(12345678900000), "12.35T" )
488
-
489
- self.assertEqual( util.fmt_big_byte_number(1), "1" )
490
- self.assertEqual( util.fmt_big_byte_number(123), "123" )
491
- self.assertEqual( util.fmt_big_byte_number(1234), "1234" )
492
- self.assertEqual( util.fmt_big_byte_number(12345), "12.06K" )
493
- self.assertEqual( util.fmt_big_byte_number(123456), "120.56K" )
494
- self.assertEqual( util.fmt_big_byte_number(12*1024), "12K" )
495
- self.assertEqual( util.fmt_big_byte_number(1234567), "1205.63K" )
496
- self.assertEqual( util.fmt_big_byte_number(12345678), "11.77M" )
497
- self.assertEqual( util.fmt_big_byte_number(123456789), "117.74M" )
498
- self.assertEqual( util.fmt_big_byte_number(1234567890), "1177.38M" )
499
- self.assertEqual( util.fmt_big_byte_number(12345678900), "11.5G" )
500
- self.assertEqual( util.fmt_big_byte_number(1234567890000), "1149.78G" )
501
- self.assertEqual( util.fmt_big_byte_number(12345678900000), "11.23T" )
502
-
503
- self.assertEqual( util.fmt_big_byte_number(12*1024, True), "12KB" )
504
- self.assertEqual( util.fmt_big_byte_number(1234567890000, True), "1149.78GB" )
505
-
506
- DD = datetime.date
507
- DT = datetime.datetime
508
- TT = datetime.time
509
- self.assertEqual( util.fmt_datetime(DD(2023,3,18)), "2023-03-18" )
510
- self.assertEqual( util.fmt_datetime(DT(2023,3,18)), "2023-03-18 00:00:00" )
511
- self.assertEqual( util.fmt_datetime(DT(2023,3,18,1,2,3)), "2023-03-18 01:02:03" )
512
- self.assertEqual( util.fmt_datetime(TT(1,2,3)), "01:02:03" )
513
-
514
- filename1 = "(*Hans/*\\|this << is >>>?"
515
- filename2 = "Hans_this-is-(not).a;problem"
516
-
517
- self.assertEqual( util.fmt_filename(filename2), filename2)
518
- self.assertEqual( util.fmt_filename(filename1), "(.Hans_.__this (( is )))!")
519
-
520
- def test_np(self):
521
-
522
- P = np.exp( np.linspace(-10.,-1.,10) )
523
- X = np.sin( np.linspace(-1,+1,10) )
524
- mean = np.sum( P*X ) / np.sum(P)
525
-
526
- self.assertAlmostEqual( cdxnp.mean(P, X), mean )
527
- self.assertAlmostEqual( cdxnp.mean(None, X), 0. )
528
- self.assertAlmostEqual( cdxnp.var(P, X), 0.02698584874615149 )
529
- self.assertAlmostEqual( cdxnp.var(None, X), 0.3195943287456196 )
530
- self.assertAlmostEqual( cdxnp.std(P, X), 0.16427370071363065 )
531
- self.assertAlmostEqual( cdxnp.std(None, X), 0.5653267451179181 )
532
- self.assertAlmostEqual( cdxnp.err(P, X), 0.051947905391990054 )
533
- self.assertAlmostEqual( cdxnp.err(None, X), 0.17877201367820958 )
534
-
535
- np.random.seed(112133123)
536
- x = np.random.normal(size=(101,3))
537
- P = np.random.uniform(size=(101,))
538
- q1 = cdxnp.quantile( P, x, 0.5, axis=0 ).tolist()
539
- q2 = cdxnp.quantile( P, x, 0.5, axis=0, keepdims=True ).tolist()
540
- q3 = cdxnp.median( P, x, axis=0 ).tolist()
541
- q4 = cdxnp.median( P, x, axis=0, keepdims=True ).tolist()
542
- q1 = [ round(_, 4) for _ in q1 ]
543
- q2 = [ [ round(_, 4) for _ in l ] for l in q2 ]
544
- q3 = [ round(_, 4) for _ in q3 ]
545
- q4 = [ [ round(_, 4) for _ in l ] for l in q4 ]
546
- r1 = [0.0945, -0.5187, 0.0604]
547
- r2 = [[0.0945, -0.5187, 0.0604]]
548
- self.assertEqual(q1, r1)
549
- self.assertEqual(q2, r2)
550
- self.assertEqual(q3, r1)
551
- self.assertEqual(q4, r2)
552
-
553
- q1 = cdxnp.quantile( P, x, (0.1,0.5,0.7), axis=0 ).tolist()
554
- q2 = cdxnp.quantile( P, x, (0.1,0.5,0.7), axis=0, keepdims=True ).tolist()
555
- q1 = [ [ round(_, 4) for _ in l ] for l in q1 ]
556
- q2 = [ [ round(_, 4) for _ in l ] for l in q2 ]
557
- r = [[-1.3685, -1.3959, -0.9856], [0.0945, -0.5187, 0.0604], [0.6551, 0.3987, 0.5158]]
558
- self.assertEqual(q1, r)
559
- self.assertEqual(q2, r)
560
-
561
- def test_verbose(self):
562
-
563
- quiet = verbose.quiet
564
- Context = verbose.Context
565
-
566
- def f_sub( num=10, context = quiet ):
567
- context.report(0, "Entering loop")
568
- for i in range(num):
569
- context.report(1, "Number %ld", i)
570
-
571
- def f_main( context = quiet ):
572
- context.write( "First step" )
573
- # ... do something
574
- context.report( 1, "Intermediate step 1" )
575
- context.report( 1, "Intermediate step 2\nwith newlines" )
576
- # ... do something
577
- f_sub( context=context(1) )
578
- # ... do something
579
- context.write( "Final step" )
580
-
581
- print("Verbose=1")
582
- context = Context(1)
583
- f_main(context)
584
-
585
- print("\nVerbose=2")
586
- context = Context(2)
587
- f_main(context)
588
-
589
- print("\nVerbose='all'")
590
- context = Context('all')
591
- f_main(context)
592
-
593
- print("\nVerbose='quiet'")
594
- context = Context('quiet')
595
- f_main(context)
596
-
597
- verbose1 = Context(1)
598
- verbose1.level = 2
599
- verbose2 = Context(2,indent=3)
600
- verbose2.level = 3
601
- self.assertEqual( uniqueHash( verbose1 ), uniqueHash( verbose2 ) )
602
-
603
-
604
- @version("1.0")
605
- def f(x):
606
- return x
607
- @version("2.0", dependencies=[f])
608
- def g1(x):
609
- return f(x)
610
- @version("2.1", dependencies=[f])
611
- def g2(x):
612
- return f(x)
613
- class A(object):
614
- @version("2.2")
615
- def r1(self, x):
616
- return x
617
- @version("2.3", dependencies=['A.r1', 'g1'])
618
- def r2(self, x):
619
- return x
620
- @version("XV")
621
- class B(object):
622
- def f(self, x):
623
- return x
624
-
625
- @version("3.0", dependencies=['g1', g2, 'A.r1', A.r2, B])
626
- def h(x,y):
627
- a = A()
628
- return g1(x)+g2(y)+a.r1(x)+a.r2(y)
629
-
630
- @version("0.0.1")
631
- class baseA(object):
632
- pass
633
- print("\n****", type(baseA.version))
634
- @version("0.0.2")
635
- class baseB(baseA):
636
- pass
637
-
638
- class CDXBasicsVersionTest(unittest.TestCase):
639
-
640
- def test_version(self):
641
- # test dependency
642
- self.assertEqual( h.version.input, "3.0" )
643
- self.assertEqual( h.version.full, "3.0 { A.r1: 2.2, A.r2: 2.3 { A.r1: 2.2, g1: 2.0 { f: 1.0 } }, B: XV, g1: 2.0 { f: 1.0 }, g2: 2.1 { f: 1.0 } }" )
644
- self.assertEqual( h.version.unique_id48, "3.0 { A.r1: 2.2, A.r2: 2.3 { A.r1: 2.2, 70b51907" )
645
- self.assertEqual( h.version.is_dependent( g2 ), "2.1" )
646
- self.assertEqual( h.version.is_dependent( "g2" ), "2.1" )
647
- self.assertEqual( h.version.is_dependent( f ), "1.0" )
648
- self.assertEqual( h.version.is_dependent( "f" ), "1.0" )
649
- self.assertEqual( h.version.is_dependent( B ), "XV" )
650
-
651
- self.assertEqual( baseA.version.full, "0.0.1")
652
- self.assertEqual( baseB.version.full, "0.0.2 { baseA: 0.0.1 }")
653
-
654
-
655
- # testing config
656
-
657
- class CDXCConfigTest(unittest.TestCase):
658
-
659
- def test_config(self):
660
-
661
- config = Config(x=0., z=-1.)
662
- x = config("x", 10., float, "test x")
663
- self.assertEqual( x, 0. )
664
- y = config("y", 10., float, "test y")
665
- self.assertEqual( y, 10. )
666
-
667
- with self.assertRaises(Exception):
668
- # 'z' was not read
669
- config.done()
670
-
671
- # calling twice with different values
672
- config = Config(x=0.)
673
- x = config("x", 1., float, "test x")
674
- x = config("x", 1., float, "test x") # ok: same parameters
675
- with self.assertRaises(Exception):
676
- x = config("x", 1., Float<0.5, "test x") # not ok: Float condition
677
- with self.assertRaises(Exception):
678
- x = config("x", 2., float, "test x") # not ok: different default
679
- config.done()
680
-
681
- # test usage per access method:
682
- # __call__('a')
683
- # get('a')
684
- # get_default('a', ...)
685
- # all register usage;
686
- # get_raw('a')
687
- # ['a']
688
- # do not.
689
- config = Config(a=1)
690
- _ = config.get("a")
691
- self.assertTrue( not 'a' in config.not_done )
692
- config = Config(a=1)
693
- _ = config.get_default("a", 0)
694
- self.assertTrue( not 'a' in config.not_done )
695
- config = Config(a=1)
696
- _ = config("a")
697
- self.assertTrue( not 'a' in config.not_done )
698
- config = Config(a=1)
699
- _ = config("a", 0)
700
- self.assertTrue( not 'a' in config.not_done )
701
-
702
- config = Config(a=1)
703
- _ = config.get_raw('a')
704
- self.assertTrue( 'a' in config.not_done )
705
- config = Config(a=1)
706
- _ = config['a']
707
- self.assertTrue( 'a' in config.not_done )
708
-
709
- # test sub configs
710
- config = Config()
711
- config.x = 1
712
- config.a = "a"
713
- config.sub.x = 2.
714
-
715
- self.assertEqual(1., config("x", 0., float, "x"))
716
- self.assertEqual("a", config("a", None, str, "a"))
717
- self.assertEqual(2, config.sub("x", 0, int, "x"))
718
- self.assertTrue( isinstance( config.sub, Config ) )
719
- config.done()
720
-
721
- # test detach
722
- config = Config()
723
- config.sub.x = 1
724
- with self.assertRaises(Exception):
725
- config.done() # 'sub.x' not read
726
-
727
- config = Config()
728
- config.sub.x = 1
729
- sub = config.sub.detach()
730
- config.done() # ok
731
- _ = sub("x", 1)
732
- config.done() # fine now
733
-
734
- # test list (_Enum)
735
- config = Config(t="a", q="q")
736
- _ = config("t", "b", ['a', 'b', 'c'] )
737
- self.assertEqual(_, 'a')
738
- with self.assertRaises(Exception):
739
- _ = config("q", "b", ['a', 'b', 'c'] ) # exception: 'q' not in set
740
-
741
- # test tuple (_Alt)
742
- config = Config(t="a")
743
- _ = config("t", "b", (None, str) )
744
- self.assertEqual(_, 'a')
745
- config = Config(t=None)
746
- _ = config("t", "b", (None, str) )
747
- self.assertEqual(_, None)
748
- with self.assertRaises(Exception):
749
- config = Config(t="a")
750
- _ = config("t", 1, (None, int) )
751
- self.assertEqual(_, None)
752
- config = Config()
753
- _ = config("t", "b", (None, ['a','b']) )
754
- self.assertEqual(_, 'b')
755
- config = Config(t=2)
756
- _ = config("t", 1, (Int>=1, Int<=1) )
757
- self.assertEqual(_, 2)
758
- config = Config()
759
- _ = config("t", 3, (Int>=1, Int<=1) )
760
- self.assertEqual(_, 3)
761
- with self.assertRaises(Exception):
762
- config = Config()
763
- _ = config("t", 0, (Int>=1, Int<=-1) )
764
- with self.assertRaises(Exception):
765
- config = Config(t=0)
766
- _ = config("t", 3, (Int>=1, Int<=-1) )
767
-
768
- # combined conditons
769
- config = Config(x=1., y=1.)
770
-
771
- x = config("x", 1., ( Float>=0.) & (Float<=1.), "test x")
772
- with self.assertRaises(Exception):
773
- # test that violated condition is caught
774
- y = config("y", 1., ( Float>=0.) & (Float<1.), "test y")
775
-
776
- config = Config(x=1., y=1.)
777
- with self.assertRaises(NotImplementedError):
778
- # left hand must be > or >=
779
- y = config("y", 1., ( Float<=0.) & (Float<1.), "test x")
780
- config = Config(x=1., y=1.)
781
- with self.assertRaises(NotImplementedError):
782
- # right hand must be < or <=
783
- y = config("y", 1., ( Float>=0.) & (Float>1.), "test x")
784
-
785
- # test int
786
- config = Config(x=1)
787
- x = config("x", 0, ( Int>=0 ) & ( Int<=1), "int test")
788
- config = Config(x=1)
789
- with self.assertRaises(NotImplementedError):
790
- # cannot mix types
791
- x = config("x", 1., ( Float>=0.) & (Int<=1), "test x")
792
-
793
- # test deleting children
794
- config = Config()
795
- config.a.x = 1
796
- config.b.x = 2
797
- config.c.x = 3
798
- config.delete_children( 'a' )
799
- l = sorted( config.children )
800
- self.assertEqual(l, ['b', 'c'])
801
- config = Config()
802
- config.a.x = 1
803
- config.b.x = 2
804
- config.c.x = 3
805
- config.delete_children( ['a','b'] )
806
- l = sorted( config.children )
807
- self.assertEqual(l, ['c'])
808
-
809
- # test conversion to dictionaries
810
- config = Config()
811
- config.x = 1
812
- config.y = 2
813
- config.sub.x = 10
814
- config.sub.y = 20
815
- inp_dict = config.input_dict()
816
-
817
- test = PrettyDict()
818
- test.x = 1
819
- test.y = 2
820
- test.sub = PrettyDict()
821
- test.sub.x = 10
822
- test.sub.y = 20
823
-
824
- self.assertEqual( test, inp_dict)
825
-
826
- # clean_copy
827
- config = Config()
828
- config.gym.user_version = 1
829
- config.gym.world_character_id = 2
830
- config.gym.vol_model.type = "decoder"
831
- _ = config.clean_copy()
832
-
833
- """
834
- test = PrettyDict()
835
- test.x = config("x", 1)
836
- test.y = config("y", 22)
837
- test.z = config("z", 33)
838
- test.sub = PrettyDict()
839
- test.sub.x = config.sub("x", 10)
840
- test.sub.y = config.sub("y", 222)
841
- test.sub.z = config.sub("z", 333)
842
- usd_dict = config.usage_dict()
843
- self.assertEqual( usd_dict, test )
844
- """
845
-
846
- # test keys()
847
-
848
- config = Config()
849
- config.a = 1
850
- config.x.b = 2
851
- keys = list(config)
852
- sorted(keys)
853
- self.assertEqual( keys, ['a'])
854
- keys = list(config.keys())
855
- sorted(keys)
856
- self.assertEqual( keys, ['a'])
857
-
858
- # test update
859
-
860
- config = Config()
861
- config.a = 1
862
- config.x.a = 1
863
- config.z.a =1
864
-
865
- config2 = Config()
866
- config2.b = 2
867
- config2.x.a = 2
868
- config2.x.b = 2
869
- config2.y.b = 2
870
- config2.z = 2
871
- config.update( config2 )
872
- ur1 = config.input_report()
873
-
874
- econfig = Config()
875
- econfig.a = 1
876
- econfig.b = 2
877
- econfig.x.a = 2
878
- econfig.x.b = 2
879
- econfig.y.b = 2
880
- econfig.z = 2
881
- ur2 = econfig.input_report()
882
- self.assertEqual( ur1, ur2 )
883
-
884
- config = Config()
885
- config.a = 1
886
- config.x.a = 1
887
-
888
- d = dict(b=2,x=dict(a=2,b=2),y=dict(b=2),z=2)
889
- config.update(d)
890
- ur2 = econfig.input_report()
891
- self.assertEqual( ur1, ur2 )
892
-
893
- # test str and repr
894
-
895
- config = Config()
896
- config.x = 1
897
- config.y = 2
898
- config.sub.x = 10
899
- config.sub.y = 20
900
-
901
- self.assertEqual( str(config), "config{'x': 1, 'y': 2, 'sub': {'x': 10, 'y': 20}}")
902
- self.assertEqual( repr(config), "Config( **{'x': 1, 'y': 2, 'sub': {'x': 10, 'y': 20}}, config_name='config' )")
903
-
904
- # test recorded usage
905
-
906
- config = Config()
907
- config.x = 1
908
- config.sub.a = 1
909
- config.det.o = 1
910
-
911
- _ = config("x", 11)
912
- _ = config("y", 22)
913
- _ = config.sub("a", 11)
914
- _ = config.sub("b", 22)
915
- det = config.det.detach() # shares the same recorder !
916
- _ = det("o", 11)
917
- _ = det("p", 22)
918
-
919
- self.assertEqual( config.get_recorded("x"), 1)
920
- self.assertEqual( config.get_recorded("y"), 22)
921
- self.assertEqual( config.sub.get_recorded("a"), 1)
922
- self.assertEqual( config.sub.get_recorded("b"), 22)
923
- self.assertEqual( config.det.get_recorded("o"), 1)
924
- self.assertEqual( config.det.get_recorded("p"), 22)
925
-
926
- # unique ID
927
-
928
- config = Config()
929
- # world
930
- config.world.samples = 10000
931
- config.world.steps = 20
932
- config.world.black_scholes = True
933
- config.world.rvol = 0.2 # 20% volatility
934
- config.world.drift = 0. # real life drift
935
- config.world.cost_s = 0.
936
- # gym
937
- config.gym.objective.utility = "cvar"
938
- config.gym.objective.lmbda = 1.
939
- config.gym.agent.network.depth = 6
940
- config.gym.agent.network.width = 40
941
- config.gym.agent.network.activation = "softplus"
942
- # trainer
943
- config.trainer.train.optimizer = "adam"
944
- config.trainer.train.batch_size = None
945
- config.trainer.train.epochs = 400
946
- config.trainer.caching.epoch_freq = 10
947
- config.trainer.caching.mode = "on"
948
- config.trainer.visual.epoch_refresh = 1
949
- config.trainer.visual.time_refresh = 10
950
- config.trainer.visual.confidence_pcnt_lo = 0.25
951
- config.trainer.visual.confidence_pcnt_hi = 0.75
952
-
953
- id1 = config.unique_id()
954
-
955
- config = Config()
956
- # world
957
- config.world.samples = 10000
958
- config.world.steps = 20
959
- config.world.black_scholes = True
960
- config.world.rvol = 0.2 # 20% volatility
961
- config.world.drift = 0. # real life drift
962
- config.world.cost_s = 0.
963
- # gym
964
- config.gym.objective.utility = "cvar"
965
- config.gym.objective.lmbda = 1.
966
- config.gym.agent.network.depth = 5 # <====== changed this
967
- config.gym.agent.network.width = 40
968
- config.gym.agent.network.activation = "softplus"
969
- # trainer
970
- config.trainer.train.optimizer = "adam"
971
- config.trainer.train.batch_size = None
972
- config.trainer.train.epochs = 400
973
- config.trainer.caching.epoch_freq = 10
974
- config.trainer.caching.mode = "on"
975
- config.trainer.visual.epoch_refresh = 1
976
- config.trainer.visual.time_refresh = 10
977
- config.trainer.visual.confidence_pcnt_lo = 0.25
978
- config.trainer.visual.confidence_pcnt_hi = 0.75
979
-
980
- id2 = config.unique_id()
981
- self.assertNotEqual(id1,id2)
982
- self.assertEqual(id2,"ee3f0548a51125451d18ce9297d17252")
983
-
984
- _ = config.nothing("get_nothing", 0) # this triggered a new ID in old versions
985
-
986
- id3 = config.unique_id()
987
- self.assertEqual(id2,id3)
988
-
989
- # pickle test
990
-
991
- binary = pickle.dumps(config)
992
- restored = pickle.loads(binary)
993
- idrest = restored.unique_id()
994
- self.assertEqual(idrest,id2)
995
-
996
- # unique ID test
997
-
998
- config1 = Config()
999
- config1.x = 1
1000
- config1.sub.y = 2
1001
- config2 = Config()
1002
- config2.x = 1
1003
- config2.sub.y = 3
1004
- self.assertNotEqual( uniqueHash(config1), uniqueHash(config2) )
1005
-
1006
- config1 = Config()
1007
- config1.x = 1
1008
- config1.sub.y = 2
1009
- config2 = Config()
1010
- config2.x = 2
1011
- config2.sub.y = 2
1012
- self.assertNotEqual( uniqueHash(config1), uniqueHash(config2) )
1013
-
1014
- config1 = Config()
1015
- config1.x = 1
1016
- config1.sub.y = 2
1017
- config2 = Config()
1018
- config2.x = 1
1019
- config2.sub.y = 2
1020
- self.assertEqual( uniqueHash(config1), uniqueHash(config2) )
1021
-
1022
- # uniqueHash() ignores protected and private members
1023
- config1 = Config()
1024
- config1.x = 1
1025
- config1.sub._y = 2
1026
- config2 = Config()
1027
- config2.x = 1
1028
- config2.sub._y = 3
1029
- self.assertEqual( uniqueHash(config1), uniqueHash(config2) )
1030
-
1031
-
1032
- def test_detach(self):
1033
- """ testing detach/copy/clean_cooy """
1034
-
1035
- config = Config(a=1,b=2)
1036
- config.child.x = 1
1037
- _ = config("a", 2)
1038
- c1 = config.detach()
1039
- with self.assertRaises(Exception):
1040
- _ = c1("a", 1) # different default
1041
- _ = c1("b", 3)
1042
- with self.assertRaises(Exception):
1043
- _ = config("b", 2) # different default
1044
-
1045
- config = Config(a=1,b=2)
1046
- config.child.x = 1
1047
- _ = config("a", 2)
1048
- c1 = config.copy()
1049
- with self.assertRaises(Exception):
1050
- _ = c1("a", 1) # different default
1051
- _ = c1("b", 3)
1052
- _ = config("b", 2) # different default - ok
1053
-
1054
- config = Config(a=1,b=2)
1055
- config.child.x = 1
1056
- _ = config("a", 2)
1057
- c1 = config.clean_copy()
1058
- _ = c1("a", 1) # different default - ok
1059
- _ = c1("b", 3)
1060
- _ = config("b", 2) # different default - ok
1061
-
1062
- def test_dataclass(self):
1063
-
1064
- @dataclasses.dataclass
1065
- class A:
1066
- i : int = 0
1067
- config : ConfigField = ConfigField.Field()
1068
-
1069
- def f(self):
1070
- return self.config("a", 1, int, "Test")
1071
-
1072
- a = A()
1073
- self.assertEqual(a.f(),1)
1074
- c = Config()
1075
- a = A(i=2,config=ConfigField(c))
1076
- self.assertEqual(a.f(),1)
1077
- c = Config(a=2)
1078
- a = A(i=2,config=ConfigField(c))
1079
- self.assertEqual(a.f(),2)
1080
- a = A(i=2,config=Config(a=2))
1081
- self.assertEqual(a.f(),2)
1082
-
1083
- if __name__ == '__main__':
1084
- unittest.main()
1085
-
1086
-