QuLab 2.0.6__cp310-cp310-win_amd64.whl → 2.0.8__cp310-cp310-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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: QuLab
3
- Version: 2.0.6
3
+ Version: 2.0.8
4
4
  Summary: contral instruments and manage data
5
5
  Author-email: feihoo87 <feihoo87@gmail.com>
6
6
  Maintainer-email: feihoo87 <feihoo87@gmail.com>
@@ -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.cp310-win_amd64.pyd,sha256=mvEXZaWIH3aNiZd7ggJKUUfeKQ1dIMeRhKoOONl7adg,31232
4
- qulab/version.py,sha256=IoNlI2ogLAGBFo-lP1Eg_QnxTNCxj3o2OCiBaMyJrP8,21
3
+ qulab/fun.cp310-win_amd64.pyd,sha256=1barv1qyRFoNqphdufFTMzafar5r3yRlush7ULt3L_Y,31232
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=3HXIpwoQJJNWRBXCqTsNqzMJsZ_tnygkANOH1UJC7Xs,26847
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.6.dist-info/LICENSE,sha256=b4NRQ-GFVpJMT7RuExW3NwhfbrYsX7AcdB7Gudok-fs,1086
81
- QuLab-2.0.6.dist-info/METADATA,sha256=541-jW-KE_KRTxXVjXDg4Hb4Bn_rFtpb3KeNgEhoM6I,3609
82
- QuLab-2.0.6.dist-info/WHEEL,sha256=lO6CqtLHCAi38X3Es1a4R1lAjZFvN010IMRCFo2S7Mc,102
83
- QuLab-2.0.6.dist-info/entry_points.txt,sha256=ohBzutEnQimP_BZWiuXdSliu4QAYSHHcN0PZD8c7ZCY,46
84
- QuLab-2.0.6.dist-info/top_level.txt,sha256=3T886LbAsbvjonu_TDdmgxKYUn939BVTRPxPl9r4cEg,6
85
- QuLab-2.0.6.dist-info/RECORD,,
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=lO6CqtLHCAi38X3Es1a4R1lAjZFvN010IMRCFo2S7Mc,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,,
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
- def search(self, name: str, range, level: int | None = None):
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 _run(self):
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
- if isinstance(
432
- self.description['database'],
433
- str) and self.description['database'].startswith("tcp://"):
434
- async with ZMQContextManager(
435
- zmq.DEALER,
436
- connect=self.description['database']) as socket:
437
- self._sock = socket
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._run())
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.update(dict(zip(iters_d.keys(), args[:-1])))
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.update({
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
- variables[name] = await call_function(
788
- functions[name], variables)
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.6"
1
+ __version__ = "2.0.8"
File without changes
File without changes