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.
- cdxcore/__init__.py +1 -9
- cdxcore/config.py +1188 -521
- cdxcore/crman.py +95 -25
- cdxcore/err.py +371 -0
- cdxcore/pretty.py +468 -0
- cdxcore/pretty.py_bak.py +750 -0
- cdxcore/subdir.py +2238 -1339
- cdxcore/uniquehash.py +515 -363
- cdxcore/util.py +358 -417
- cdxcore/verbose.py +683 -248
- cdxcore/version.py +399 -140
- cdxcore-0.1.10.dist-info/METADATA +27 -0
- cdxcore-0.1.10.dist-info/RECORD +35 -0
- {cdxcore-0.1.6.dist-info → cdxcore-0.1.10.dist-info}/top_level.txt +2 -1
- docs/source/conf.py +123 -0
- tests/test_config.py +500 -0
- tests/test_crman.py +54 -0
- tests/test_err.py +86 -0
- tests/test_pretty.py +404 -0
- tests/test_subdir.py +289 -0
- tests/test_uniquehash.py +159 -144
- tests/test_util.py +122 -83
- tests/test_verbose.py +119 -0
- tests/test_version.py +153 -0
- up/git_message.py +2 -2
- cdxcore/logger.py +0 -319
- cdxcore/prettydict.py +0 -388
- cdxcore/prettyobject.py +0 -64
- cdxcore-0.1.6.dist-info/METADATA +0 -1418
- cdxcore-0.1.6.dist-info/RECORD +0 -30
- conda/conda_exists.py +0 -10
- conda/conda_modify_yaml.py +0 -42
- tests/_cdxbasics.py +0 -1086
- {cdxcore-0.1.6.dist-info → cdxcore-0.1.10.dist-info}/WHEEL +0 -0
- {cdxcore-0.1.6.dist-info → cdxcore-0.1.10.dist-info}/licenses/LICENSE +0 -0
- {cdxcore → tmp}/deferred.py +0 -0
- {cdxcore → tmp}/dynaplot.py +0 -0
- {cdxcore → tmp}/filelock.py +0 -0
- {cdxcore → tmp}/np.py +0 -0
- {cdxcore → tmp}/npio.py +0 -0
- {cdxcore → tmp}/sharedarray.py +0 -0
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
|
-
|