QuLab 2.0.6__cp311-cp311-win_amd64.whl → 2.0.7__cp311-cp311-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.7
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.cp311-win_amd64.pyd,sha256=2nVf41t9jlQF33-fJ_TFVWG6XkxwMm-j4fGP264cB8s,31232
4
- qulab/version.py,sha256=IoNlI2ogLAGBFo-lP1Eg_QnxTNCxj3o2OCiBaMyJrP8,21
3
+ qulab/fun.cp311-win_amd64.pyd,sha256=jCMRaQoq_yQDw7haxtPNmjGu5nRk1LTJzAZfTd1BJ6I,31232
4
+ qulab/version.py,sha256=Ch1foRTConPN5Ppjf6BSKYuXYy0kR0uQuUlG41WPUX4,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=QIMjc9JpB-4Epsg8WPgEmHKppJ1dWTY2R8H5Co6YRG0,28937
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=nSybvzWlmdJnHiUQSY-d7V1ycwEVUTqXiTvr2eshg44,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.7.dist-info/LICENSE,sha256=b4NRQ-GFVpJMT7RuExW3NwhfbrYsX7AcdB7Gudok-fs,1086
81
+ QuLab-2.0.7.dist-info/METADATA,sha256=4YsQ1mzdMruQZL4uFSVCEQ0UX71Jd3iz3tPAInCKOLU,3609
82
+ QuLab-2.0.7.dist-info/WHEEL,sha256=nSybvzWlmdJnHiUQSY-d7V1ycwEVUTqXiTvr2eshg44,102
83
+ QuLab-2.0.7.dist-info/entry_points.txt,sha256=ohBzutEnQimP_BZWiuXdSliu4QAYSHHcN0PZD8c7ZCY,46
84
+ QuLab-2.0.7.dist-info/top_level.txt,sha256=3T886LbAsbvjonu_TDdmgxKYUn939BVTRPxPl9r4cEg,6
85
+ QuLab-2.0.7.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):
@@ -418,7 +442,8 @@ class Scan():
418
442
  task = asyncio.create_task(self._update_progress())
419
443
  self._task_pool.append(task)
420
444
  self._variables = {'self': self}
421
- self._variables.update(self.description['consts'])
445
+ await _update_variables(self._variables, self.description['consts'],
446
+ self.description['setters'])
422
447
  for level, total in self.description['total'].items():
423
448
  if total == np.inf:
424
449
  total = None
@@ -428,6 +453,11 @@ class Scan():
428
453
  if name in self.description['functions']:
429
454
  self.variables[name] = await call_function(
430
455
  self.description['functions'][name], self.variables)
456
+ if name in self.description['setters']:
457
+ coro = self.description['setters'][name](
458
+ self.variables[name])
459
+ if inspect.isawaitable(coro):
460
+ await coro
431
461
  if isinstance(
432
462
  self.description['database'],
433
463
  str) and self.description['database'].startswith("tcp://"):
@@ -505,7 +535,8 @@ class Scan():
505
535
  self.variables,
506
536
  self.description['loops'].get(self.current_level, []),
507
537
  self.description['order'].get(self.current_level, []),
508
- self.description['functions'], self.description['optimizers']):
538
+ self.description['functions'], self.description['optimizers'],
539
+ self.description['setters'], self.description['getters']):
509
540
  self._current_level += 1
510
541
  if await self._filter(variables, self.current_level - 1):
511
542
  yield variables
@@ -744,12 +775,23 @@ def assymbly(description):
744
775
  return description
745
776
 
746
777
 
778
+ async def _update_variables(variables, updates, setters):
779
+ for name, value in updates.items():
780
+ if name in setters:
781
+ coro = setters[name](value)
782
+ if inspect.isawaitable(coro):
783
+ await coro
784
+ variables[name] = value
785
+
786
+
747
787
  async def _iter_level(variables,
748
788
  iters: list[tuple[str, Iterable | Expression | Callable
749
789
  | OptimizeSpace]],
750
790
  order: list[list[str]],
751
791
  functions: dict[str, Callable | Expression],
752
- optimizers: dict[str, Optimizer]):
792
+ optimizers: dict[str, Optimizer],
793
+ setters: dict[str, Callable] = {},
794
+ getters: dict[str, Callable] = {}):
753
795
  iters_d = {}
754
796
  env = Env()
755
797
  env.variables = variables
@@ -772,23 +814,32 @@ async def _iter_level(variables,
772
814
  maxiter = min(maxiter, opt_cfg.maxiter)
773
815
 
774
816
  async for args in async_zip(*iters_d.values(), range(maxiter)):
775
- variables.update(dict(zip(iters_d.keys(), args[:-1])))
817
+ await _update_variables(variables, dict(zip(iters_d.keys(),
818
+ args[:-1])), setters)
776
819
  for name, opt in opts.items():
777
820
  args = opt.ask()
778
821
  opt_cfg = optimizers[name]
779
- variables.update({
822
+ await _update_variables(variables, {
780
823
  n: v
781
824
  for n, v in zip(opt_cfg.dimensions.keys(), args)
782
- })
825
+ }, setters)
783
826
 
784
827
  for group in order:
785
828
  for name in group:
786
829
  if name in functions:
787
- variables[name] = await call_function(
788
- functions[name], variables)
830
+ await _update_variables(variables, {
831
+ name:
832
+ await call_function(functions[name], variables)
833
+ }, setters)
789
834
 
790
835
  yield variables
791
836
 
837
+ for group in order:
838
+ for name in group:
839
+ if name in getters:
840
+ variables[name] = await call_function(
841
+ getters[name], variables)
842
+
792
843
  for name, opt in opts.items():
793
844
  opt_cfg = optimizers[name]
794
845
  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.7"
File without changes
File without changes