QuLab 2.0.6__cp312-cp312-win_amd64.whl → 2.0.8__cp312-cp312-win_amd64.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.
- {QuLab-2.0.6.dist-info → QuLab-2.0.8.dist-info}/METADATA +1 -1
- {QuLab-2.0.6.dist-info → QuLab-2.0.8.dist-info}/RECORD +9 -9
- qulab/fun.cp312-win_amd64.pyd +0 -0
- qulab/scan/scan.py +87 -27
- qulab/version.py +1 -1
- {QuLab-2.0.6.dist-info → QuLab-2.0.8.dist-info}/LICENSE +0 -0
- {QuLab-2.0.6.dist-info → QuLab-2.0.8.dist-info}/WHEEL +0 -0
- {QuLab-2.0.6.dist-info → QuLab-2.0.8.dist-info}/entry_points.txt +0 -0
- {QuLab-2.0.6.dist-info → QuLab-2.0.8.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
qulab/__init__.py,sha256=8zLGg-DfQhnDl2Ky0n-zXpN-8e-g7iR0AcaI4l4Vvpk,32
|
|
2
2
|
qulab/__main__.py,sha256=XN2wrhlmEkTIPq_ZeSaO8rWXfYgD2Czkm9DVFVoCw_U,515
|
|
3
|
-
qulab/fun.cp312-win_amd64.pyd,sha256=
|
|
4
|
-
qulab/version.py,sha256=
|
|
3
|
+
qulab/fun.cp312-win_amd64.pyd,sha256=jyJ7pRvEdNlgqhnjLuVhhV7SeUgxF4Yy2cdZsHwegLQ,31744
|
|
4
|
+
qulab/version.py,sha256=DfI-RPnMF5c2VXIHTsOnE09mUWlPr23ZlXLyX4lCZxY,21
|
|
5
5
|
qulab/monitor/__init__.py,sha256=xEVDkJF8issrsDeLqQmDsvtRmrf-UiViFcGTWuzdlFU,43
|
|
6
6
|
qulab/monitor/__main__.py,sha256=k2H1H5Zf9LLXTDLISJkbikLH-z0f1e5i5i6wXXYPOrE,105
|
|
7
7
|
qulab/monitor/config.py,sha256=y_5StMkdrbZO1ziyKBrvIkB7Jclp9RCPK1QbsOhCxnY,785
|
|
@@ -19,7 +19,7 @@ qulab/scan/models.py,sha256=TkiVHF_fUZzYHs4MsCTRh391thpf4Ozd3R_LAU0Gxkg,17657
|
|
|
19
19
|
qulab/scan/optimize.py,sha256=MlT4y422CnP961IR384UKryyZh8riNvrPSd2z_MXLEg,2356
|
|
20
20
|
qulab/scan/query_record.py,sha256=rpw4U3NjLzlv9QMwKdCvEUGHjzPF8u1UpodfLW8aoTY,11853
|
|
21
21
|
qulab/scan/recorder.py,sha256=lbIASqH4-4eTzqX1sG9K1LnUkqvkcRK5ab2OpXSeE-Y,22801
|
|
22
|
-
qulab/scan/scan.py,sha256=
|
|
22
|
+
qulab/scan/scan.py,sha256=jLYEn5WpAEdyCz-gGKz1My-6YK5xV-WlJ5kSfkINizY,29292
|
|
23
23
|
qulab/scan/server.py,sha256=zDZfG6bOB3EUubfByQMq0BSQ9C6IV_Av0tDinzgpGjQ,2950
|
|
24
24
|
qulab/scan/utils.py,sha256=XM-eKL5Xkm0hihhGS7Kq4g654Ye7n7TcU_f95gxtXq8,2634
|
|
25
25
|
qulab/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -77,9 +77,9 @@ qulab/visualization/plot_layout.py,sha256=yAnMONOms7_szCdng-8wPpUMPis5UnbaNNzV4K
|
|
|
77
77
|
qulab/visualization/plot_seq.py,sha256=h9D0Yl_yO64IwlvBgzMu9EBKr9gg6y8QE55gu2PfTns,2783
|
|
78
78
|
qulab/visualization/qdat.py,sha256=HubXFu4nfcA7iUzghJGle1C86G6221hicLR0b-GqhKQ,5887
|
|
79
79
|
qulab/visualization/widgets.py,sha256=HcYwdhDtLreJiYaZuN3LfofjJmZcLwjMfP5aasebgDo,3266
|
|
80
|
-
QuLab-2.0.
|
|
81
|
-
QuLab-2.0.
|
|
82
|
-
QuLab-2.0.
|
|
83
|
-
QuLab-2.0.
|
|
84
|
-
QuLab-2.0.
|
|
85
|
-
QuLab-2.0.
|
|
80
|
+
QuLab-2.0.8.dist-info/LICENSE,sha256=b4NRQ-GFVpJMT7RuExW3NwhfbrYsX7AcdB7Gudok-fs,1086
|
|
81
|
+
QuLab-2.0.8.dist-info/METADATA,sha256=INSqm390STs1Mj_4DDCF6cb3B99R9d-H9Jmk4NelB9Q,3609
|
|
82
|
+
QuLab-2.0.8.dist-info/WHEEL,sha256=fZWyj_84lK0cA-ZNCsdwhbJl0OTrpWkxInEn424qrSs,102
|
|
83
|
+
QuLab-2.0.8.dist-info/entry_points.txt,sha256=ohBzutEnQimP_BZWiuXdSliu4QAYSHHcN0PZD8c7ZCY,46
|
|
84
|
+
QuLab-2.0.8.dist-info/top_level.txt,sha256=3T886LbAsbvjonu_TDdmgxKYUn939BVTRPxPl9r4cEg,6
|
|
85
|
+
QuLab-2.0.8.dist-info/RECORD,,
|
qulab/fun.cp312-win_amd64.pyd
CHANGED
|
Binary file
|
qulab/scan/scan.py
CHANGED
|
@@ -185,6 +185,8 @@ class Scan():
|
|
|
185
185
|
'loops': {},
|
|
186
186
|
'consts': {},
|
|
187
187
|
'functions': {},
|
|
188
|
+
'getters': {},
|
|
189
|
+
'setters': {},
|
|
188
190
|
'optimizers': {},
|
|
189
191
|
'namespace': {} if dump_globals else None,
|
|
190
192
|
'actions': {},
|
|
@@ -342,7 +344,7 @@ class Scan():
|
|
|
342
344
|
self.description['filters'][level] = []
|
|
343
345
|
self.description['filters'][level].append(func)
|
|
344
346
|
|
|
345
|
-
def set(self, name: str, value):
|
|
347
|
+
def set(self, name: str, value, setter: Callable | None = None):
|
|
346
348
|
try:
|
|
347
349
|
dill.dumps(value)
|
|
348
350
|
except:
|
|
@@ -355,8 +357,14 @@ class Scan():
|
|
|
355
357
|
self.description['functions'][name] = value
|
|
356
358
|
else:
|
|
357
359
|
self.description['consts'][name] = value
|
|
358
|
-
|
|
359
|
-
|
|
360
|
+
if setter:
|
|
361
|
+
self.description['setters'][name] = setter
|
|
362
|
+
|
|
363
|
+
def search(self,
|
|
364
|
+
name: str,
|
|
365
|
+
range: Iterable | Expression | Callable | OptimizeSpace,
|
|
366
|
+
level: int | None = None,
|
|
367
|
+
setter: Callable | None = None):
|
|
360
368
|
if level is not None:
|
|
361
369
|
assert level >= 0, 'level must be greater than or equal to 0.'
|
|
362
370
|
if isinstance(range, OptimizeSpace):
|
|
@@ -370,12 +378,23 @@ class Scan():
|
|
|
370
378
|
self._add_loop_var(name, level, range)
|
|
371
379
|
if isinstance(range, Expression) or callable(range):
|
|
372
380
|
self.add_depends(name, range.symbols())
|
|
381
|
+
if setter:
|
|
382
|
+
self.description['setters'][name] = setter
|
|
383
|
+
|
|
384
|
+
def trace(self,
|
|
385
|
+
name: str,
|
|
386
|
+
depends: list[str],
|
|
387
|
+
getter: Callable | None = None):
|
|
388
|
+
self.add_depends(name, depends)
|
|
389
|
+
if getter:
|
|
390
|
+
self.description['getters'][name] = getter
|
|
373
391
|
|
|
374
392
|
def minimize(self,
|
|
375
393
|
name: str,
|
|
376
394
|
level: int,
|
|
377
395
|
method=NgOptimizer,
|
|
378
396
|
maxiter=100,
|
|
397
|
+
getter: Callable | None = None,
|
|
379
398
|
**kwds) -> Optimizer:
|
|
380
399
|
assert level >= 0, 'level must be greater than or equal to 0.'
|
|
381
400
|
opt = Optimizer(self,
|
|
@@ -386,6 +405,8 @@ class Scan():
|
|
|
386
405
|
minimize=True,
|
|
387
406
|
**kwds)
|
|
388
407
|
self.description['optimizers'][name] = opt
|
|
408
|
+
if getter:
|
|
409
|
+
self.description['getters'][name] = getter
|
|
389
410
|
return opt
|
|
390
411
|
|
|
391
412
|
def maximize(self,
|
|
@@ -393,6 +414,7 @@ class Scan():
|
|
|
393
414
|
level: int,
|
|
394
415
|
method=NgOptimizer,
|
|
395
416
|
maxiter=100,
|
|
417
|
+
getter: Callable | None = None,
|
|
396
418
|
**kwds) -> Optimizer:
|
|
397
419
|
assert level >= 0, 'level must be greater than or equal to 0.'
|
|
398
420
|
opt = Optimizer(self,
|
|
@@ -403,6 +425,8 @@ class Scan():
|
|
|
403
425
|
minimize=False,
|
|
404
426
|
**kwds)
|
|
405
427
|
self.description['optimizers'][name] = opt
|
|
428
|
+
if getter:
|
|
429
|
+
self.description['getters'][name] = getter
|
|
406
430
|
return opt
|
|
407
431
|
|
|
408
432
|
async def _update_progress(self):
|
|
@@ -413,12 +437,24 @@ class Scan():
|
|
|
413
437
|
elif inspect.isawaitable(task):
|
|
414
438
|
await task
|
|
415
439
|
|
|
416
|
-
async def
|
|
440
|
+
async def run(self):
|
|
417
441
|
assymbly(self.description)
|
|
442
|
+
if isinstance(
|
|
443
|
+
self.description['database'],
|
|
444
|
+
str) and self.description['database'].startswith("tcp://"):
|
|
445
|
+
async with ZMQContextManager(
|
|
446
|
+
zmq.DEALER,
|
|
447
|
+
connect=self.description['database']) as socket:
|
|
448
|
+
self._sock = socket
|
|
449
|
+
await self._run()
|
|
450
|
+
else:
|
|
451
|
+
await self._run()
|
|
452
|
+
|
|
453
|
+
async def _run(self):
|
|
418
454
|
task = asyncio.create_task(self._update_progress())
|
|
419
455
|
self._task_pool.append(task)
|
|
420
456
|
self._variables = {'self': self}
|
|
421
|
-
self._variables.update(self.description['consts'])
|
|
457
|
+
self._variables.update(self.description['consts'].copy())
|
|
422
458
|
for level, total in self.description['total'].items():
|
|
423
459
|
if total == np.inf:
|
|
424
460
|
total = None
|
|
@@ -428,18 +464,13 @@ class Scan():
|
|
|
428
464
|
if name in self.description['functions']:
|
|
429
465
|
self.variables[name] = await call_function(
|
|
430
466
|
self.description['functions'][name], self.variables)
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
self.record = await self.create_record()
|
|
439
|
-
await self.work()
|
|
440
|
-
else:
|
|
441
|
-
self.record = await self.create_record()
|
|
442
|
-
await self.work()
|
|
467
|
+
if name in self.description['setters']:
|
|
468
|
+
coro = self.description['setters'][name](
|
|
469
|
+
self.variables[name])
|
|
470
|
+
if inspect.isawaitable(coro):
|
|
471
|
+
await coro
|
|
472
|
+
self.record = await self.create_record()
|
|
473
|
+
await self.work()
|
|
443
474
|
for level, bar in self._bar.items():
|
|
444
475
|
bar.close()
|
|
445
476
|
|
|
@@ -449,10 +480,15 @@ class Scan():
|
|
|
449
480
|
evt.set()
|
|
450
481
|
elif inspect.isawaitable(evt):
|
|
451
482
|
await evt
|
|
452
|
-
task.cancel()
|
|
453
483
|
if self._single_step:
|
|
484
|
+
for group in self.description['order'].get(-1, []):
|
|
485
|
+
for name in group:
|
|
486
|
+
if name in self.description['getters']:
|
|
487
|
+
self.variables[name] = await call_function(
|
|
488
|
+
self.description['getters'][name], self.variables)
|
|
454
489
|
await self.emit(0, 0, 0, self.variables.copy())
|
|
455
490
|
await self.emit(-1, 0, 0, {})
|
|
491
|
+
task.cancel()
|
|
456
492
|
return self.variables
|
|
457
493
|
|
|
458
494
|
async def done(self):
|
|
@@ -467,7 +503,7 @@ class Scan():
|
|
|
467
503
|
|
|
468
504
|
def start(self):
|
|
469
505
|
import asyncio
|
|
470
|
-
self._main_task = asyncio.create_task(self.
|
|
506
|
+
self._main_task = asyncio.create_task(self.run())
|
|
471
507
|
|
|
472
508
|
async def submit(self, server='tcp://127.0.0.1:6788'):
|
|
473
509
|
assymbly(self.description)
|
|
@@ -505,7 +541,8 @@ class Scan():
|
|
|
505
541
|
self.variables,
|
|
506
542
|
self.description['loops'].get(self.current_level, []),
|
|
507
543
|
self.description['order'].get(self.current_level, []),
|
|
508
|
-
self.description['functions'], self.description['optimizers']
|
|
544
|
+
self.description['functions'], self.description['optimizers'],
|
|
545
|
+
self.description['setters'], self.description['getters']):
|
|
509
546
|
self._current_level += 1
|
|
510
547
|
if await self._filter(variables, self.current_level - 1):
|
|
511
548
|
yield variables
|
|
@@ -703,7 +740,10 @@ def assymbly(description):
|
|
|
703
740
|
|
|
704
741
|
levels = {}
|
|
705
742
|
passed = set()
|
|
706
|
-
all_keys = set()
|
|
743
|
+
all_keys = set(description['consts'].keys())
|
|
744
|
+
for key in dependents:
|
|
745
|
+
all_keys.add(key)
|
|
746
|
+
all_keys.update(dependents[key])
|
|
707
747
|
for level in reversed(description['loops'].keys()):
|
|
708
748
|
tag = f'#__loop_{level}'
|
|
709
749
|
for key, deps in full_depends.items():
|
|
@@ -744,12 +784,23 @@ def assymbly(description):
|
|
|
744
784
|
return description
|
|
745
785
|
|
|
746
786
|
|
|
787
|
+
async def _update_variables(variables, updates, setters):
|
|
788
|
+
for name, value in updates.items():
|
|
789
|
+
if name in setters:
|
|
790
|
+
coro = setters[name](value)
|
|
791
|
+
if inspect.isawaitable(coro):
|
|
792
|
+
await coro
|
|
793
|
+
variables[name] = value
|
|
794
|
+
|
|
795
|
+
|
|
747
796
|
async def _iter_level(variables,
|
|
748
797
|
iters: list[tuple[str, Iterable | Expression | Callable
|
|
749
798
|
| OptimizeSpace]],
|
|
750
799
|
order: list[list[str]],
|
|
751
800
|
functions: dict[str, Callable | Expression],
|
|
752
|
-
optimizers: dict[str, Optimizer]
|
|
801
|
+
optimizers: dict[str, Optimizer],
|
|
802
|
+
setters: dict[str, Callable] = {},
|
|
803
|
+
getters: dict[str, Callable] = {}):
|
|
753
804
|
iters_d = {}
|
|
754
805
|
env = Env()
|
|
755
806
|
env.variables = variables
|
|
@@ -772,23 +823,32 @@ async def _iter_level(variables,
|
|
|
772
823
|
maxiter = min(maxiter, opt_cfg.maxiter)
|
|
773
824
|
|
|
774
825
|
async for args in async_zip(*iters_d.values(), range(maxiter)):
|
|
775
|
-
variables
|
|
826
|
+
await _update_variables(variables, dict(zip(iters_d.keys(),
|
|
827
|
+
args[:-1])), setters)
|
|
776
828
|
for name, opt in opts.items():
|
|
777
829
|
args = opt.ask()
|
|
778
830
|
opt_cfg = optimizers[name]
|
|
779
|
-
variables
|
|
831
|
+
await _update_variables(variables, {
|
|
780
832
|
n: v
|
|
781
833
|
for n, v in zip(opt_cfg.dimensions.keys(), args)
|
|
782
|
-
})
|
|
834
|
+
}, setters)
|
|
783
835
|
|
|
784
836
|
for group in order:
|
|
785
837
|
for name in group:
|
|
786
838
|
if name in functions:
|
|
787
|
-
|
|
788
|
-
|
|
839
|
+
await _update_variables(variables, {
|
|
840
|
+
name:
|
|
841
|
+
await call_function(functions[name], variables)
|
|
842
|
+
}, setters)
|
|
789
843
|
|
|
790
844
|
yield variables
|
|
791
845
|
|
|
846
|
+
for group in order:
|
|
847
|
+
for name in group:
|
|
848
|
+
if name in getters:
|
|
849
|
+
variables[name] = await call_function(
|
|
850
|
+
getters[name], variables)
|
|
851
|
+
|
|
792
852
|
for name, opt in opts.items():
|
|
793
853
|
opt_cfg = optimizers[name]
|
|
794
854
|
args = [variables[n] for n in opt_cfg.dimensions.keys()]
|
qulab/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "2.0.
|
|
1
|
+
__version__ = "2.0.8"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|