QuLab 2.6.1__tar.gz → 2.7.0__tar.gz
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.6.1 → qulab-2.7.0}/PKG-INFO +1 -1
- {qulab-2.6.1 → qulab-2.7.0}/QuLab.egg-info/PKG-INFO +1 -1
- {qulab-2.6.1 → qulab-2.7.0}/qulab/executor/cli.py +70 -34
- {qulab-2.6.1 → qulab-2.7.0}/qulab/executor/schedule.py +29 -6
- {qulab-2.6.1 → qulab-2.7.0}/qulab/executor/storage.py +1 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/executor/transform.py +7 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/executor/utils.py +18 -0
- qulab-2.7.0/qulab/version.py +1 -0
- qulab-2.6.1/qulab/version.py +0 -1
- {qulab-2.6.1 → qulab-2.7.0}/LICENSE +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/MANIFEST.in +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/QuLab.egg-info/SOURCES.txt +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/QuLab.egg-info/dependency_links.txt +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/QuLab.egg-info/entry_points.txt +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/QuLab.egg-info/requires.txt +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/QuLab.egg-info/top_level.txt +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/README.md +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/pyproject.toml +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/__main__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/cli/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/cli/commands.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/cli/config.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/dicttree.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/executor/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/executor/load.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/__main__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/config.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/dataset.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/event_queue.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/mainwindow.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/monitor.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/ploter.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/qt_compat.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/monitor/toolbar.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/curd.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/expression.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/models.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/optimize.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/query.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/record.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/scan.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/server.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/space.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/scan/utils.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/__main__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/backend/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/backend/redis.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/base_dataset.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/chunk.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/dataset.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/file.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/base.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/config.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/file.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/ipy.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/models.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/record.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/report.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/models/tag.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/storage/storage.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/chat.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/device/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/device/basedevice.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/device/loader.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/device/utils.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/drivers/FakeInstrument.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/drivers/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/ipy_events.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/net/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/net/bencoder.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/net/cli.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/net/dhcp.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/net/dhcpd.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/net/kad.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/net/kcp.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/net/nginx.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/progress.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/client.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/exceptions.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/msgpack.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/msgpack.pyi +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/router.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/rpc.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/serialize.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/server.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/socket.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/utils.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/worker.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/sys/rpc/zmq_socket.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/typing.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/__init__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/__main__.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/_autoplot.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/plot_circ.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/plot_layout.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/plot_seq.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/qdat.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/rot3d.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/qulab/visualization/widgets.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/setup.cfg +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/setup.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/src/qulab.h +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/tests/test_kad.py +0 -0
- {qulab-2.6.1 → qulab-2.7.0}/tests/test_scan.py +0 -0
@@ -10,6 +10,7 @@ from loguru import logger
|
|
10
10
|
from ..cli.config import get_config_value, log_options
|
11
11
|
from .load import (WorkflowType, find_unreferenced_workflows, get_entries,
|
12
12
|
load_workflow, make_graph)
|
13
|
+
from .schedule import CalibrationFailedError
|
13
14
|
from .schedule import maintain as maintain_workflow
|
14
15
|
from .schedule import run as run_workflow
|
15
16
|
from .transform import set_config_api
|
@@ -135,16 +136,20 @@ def get(key, api):
|
|
135
136
|
'-n',
|
136
137
|
is_flag=True,
|
137
138
|
help='Do not run dependents.')
|
138
|
-
@click.option('--
|
139
|
+
@click.option('--retry', '-r', default=1, type=int, help='Retry times.')
|
140
|
+
@click.option('--freeze', is_flag=True, help='Freeze the config table.')
|
139
141
|
@log_options
|
140
142
|
@command_option('run')
|
141
|
-
def run(workflow, code, data, api, plot, no_dependents,
|
143
|
+
def run(workflow, code, data, api, plot, no_dependents, retry, freeze):
|
142
144
|
"""
|
143
145
|
Run a workflow.
|
144
146
|
"""
|
145
147
|
logger.info(
|
146
|
-
f'[CMD]: run {workflow} --code {code} --data {data} --api {api}
|
147
|
-
|
148
|
+
f'[CMD]: run {workflow} --code {code} --data {data} --api {api}'
|
149
|
+
f'{" --plot" if plot else ""}'
|
150
|
+
f'{" --no-dependents" if no_dependents else ""}'
|
151
|
+
f' --retry {retry}'
|
152
|
+
f'{" --freeze " if freeze else ""}')
|
148
153
|
if api is not None:
|
149
154
|
api = importlib.import_module(api)
|
150
155
|
set_config_api(api.query_config, api.update_config, api.export_config)
|
@@ -159,42 +164,56 @@ def run(workflow, code, data, api, plot, no_dependents, update):
|
|
159
164
|
wf = load_workflow(workflow, code)
|
160
165
|
check_toplogy(wf, code)
|
161
166
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
167
|
+
for i in range(retry):
|
168
|
+
try:
|
169
|
+
if no_dependents:
|
170
|
+
if hasattr(wf, 'entries'):
|
171
|
+
for entry in get_entries(wf, code):
|
172
|
+
run_workflow(entry,
|
173
|
+
code,
|
174
|
+
data,
|
175
|
+
plot=plot,
|
176
|
+
freeze=freeze)
|
177
|
+
else:
|
178
|
+
run_workflow(wf, code, data, plot=plot, freeze=freeze)
|
179
|
+
else:
|
180
|
+
if hasattr(wf, 'entries'):
|
181
|
+
for entry in get_entries(wf, code):
|
182
|
+
maintain_workflow(entry,
|
183
|
+
code,
|
184
|
+
data,
|
185
|
+
run=True,
|
186
|
+
plot=plot,
|
187
|
+
freeze=freeze)
|
188
|
+
else:
|
189
|
+
maintain_workflow(wf,
|
190
|
+
code,
|
191
|
+
data,
|
192
|
+
run=True,
|
193
|
+
plot=plot,
|
194
|
+
freeze=freeze)
|
195
|
+
break
|
196
|
+
except CalibrationFailedError as e:
|
197
|
+
if i == retry - 1:
|
198
|
+
raise e
|
199
|
+
logger.warning(f'Calibration failed, retrying ({i + 1}/{retry})')
|
200
|
+
continue
|
184
201
|
|
185
202
|
|
186
203
|
@click.command()
|
187
204
|
@click.argument('workflow')
|
205
|
+
@click.option('--retry', '-r', default=1, type=int, help='Retry times.')
|
188
206
|
@click.option('--plot', '-p', is_flag=True, help='Plot the result.')
|
189
207
|
@log_options
|
190
208
|
@command_option('maintain')
|
191
|
-
def maintain(workflow, code, data, api, plot):
|
209
|
+
def maintain(workflow, code, data, api, retry, plot):
|
192
210
|
"""
|
193
211
|
Maintain a workflow.
|
194
212
|
"""
|
195
213
|
logger.info(
|
196
|
-
f'[CMD]: maintain {workflow} --code {code} --data {data} --api {api}
|
197
|
-
|
214
|
+
f'[CMD]: maintain {workflow} --code {code} --data {data} --api {api}'
|
215
|
+
f' --retry {retry}'
|
216
|
+
f'{" --plot" if plot else ""}')
|
198
217
|
if api is not None:
|
199
218
|
api = importlib.import_module(api)
|
200
219
|
set_config_api(api.query_config, api.update_config, api.export_config)
|
@@ -209,8 +228,25 @@ def maintain(workflow, code, data, api, plot):
|
|
209
228
|
wf = load_workflow(workflow, code)
|
210
229
|
check_toplogy(wf, code)
|
211
230
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
231
|
+
for i in range(retry):
|
232
|
+
try:
|
233
|
+
if hasattr(wf, 'entries'):
|
234
|
+
for entry in get_entries(wf, code):
|
235
|
+
maintain_workflow(entry,
|
236
|
+
code,
|
237
|
+
data,
|
238
|
+
run=False,
|
239
|
+
plot=plot,
|
240
|
+
freeze=False)
|
241
|
+
else:
|
242
|
+
maintain_workflow(wf,
|
243
|
+
code,
|
244
|
+
data,
|
245
|
+
run=False,
|
246
|
+
plot=plot,
|
247
|
+
freeze=False)
|
248
|
+
except CalibrationFailedError as e:
|
249
|
+
if i == retry - 1:
|
250
|
+
raise e
|
251
|
+
logger.warning(f'Calibration failed, retrying ({i + 1}/{retry})')
|
252
|
+
continue
|
@@ -9,7 +9,7 @@ from loguru import logger
|
|
9
9
|
from .load import WorkflowType, get_dependents
|
10
10
|
from .storage import (Result, find_result, renew_result, revoke_result,
|
11
11
|
save_result)
|
12
|
-
from .transform import current_config, update_parameters
|
12
|
+
from .transform import current_config, obey_the_oracle, update_parameters
|
13
13
|
|
14
14
|
|
15
15
|
class CalibrationFailedError(Exception):
|
@@ -100,6 +100,18 @@ def call_analyzer(node,
|
|
100
100
|
else:
|
101
101
|
result = node.analyze(result, history=history)
|
102
102
|
veryfy_analyzed_result(result, node.__workflow_id__, "analyze")
|
103
|
+
if hasattr(node, 'oracle') and callable(node.oracle):
|
104
|
+
logger.debug(
|
105
|
+
f'"{node.__workflow_id__}" has oracle method, calling ...')
|
106
|
+
try:
|
107
|
+
result = node.oracle(result, history=history)
|
108
|
+
except Exception as e:
|
109
|
+
logger.exception(e)
|
110
|
+
result.oracle = {}
|
111
|
+
if not is_pickleable(result.oracle):
|
112
|
+
raise TypeError(
|
113
|
+
f'"{node.__workflow_id__}" : "oracle" return not pickleable data'
|
114
|
+
)
|
103
115
|
result.fully_calibrated = True
|
104
116
|
if plot:
|
105
117
|
call_plot(node, result)
|
@@ -276,6 +288,7 @@ def diagnose(workflow: WorkflowType, code_path: str | Path,
|
|
276
288
|
|
277
289
|
result = calibrate(workflow, code_path, state_path, plot, session_id)
|
278
290
|
if result.bad_data or not result.in_spec:
|
291
|
+
obey_the_oracle(result, state_path)
|
279
292
|
raise CalibrationFailedError(
|
280
293
|
f'"{workflow.__workflow_id__}": All dependents passed, but calibration failed!'
|
281
294
|
)
|
@@ -290,7 +303,7 @@ def maintain(workflow: WorkflowType,
|
|
290
303
|
session_id: str | None = None,
|
291
304
|
run: bool = False,
|
292
305
|
plot: bool = False,
|
293
|
-
|
306
|
+
freeze: bool = False):
|
294
307
|
if session_id is None:
|
295
308
|
session_id = uuid.uuid4().hex
|
296
309
|
logger.debug(f'run "{workflow.__workflow_id__}"'
|
@@ -300,7 +313,13 @@ def maintain(workflow: WorkflowType,
|
|
300
313
|
logger.debug(
|
301
314
|
f'maintain "{n.__workflow_id__}" because it is depended by "{workflow.__workflow_id__}"'
|
302
315
|
)
|
303
|
-
maintain(n,
|
316
|
+
maintain(n,
|
317
|
+
code_path,
|
318
|
+
state_path,
|
319
|
+
session_id,
|
320
|
+
run=False,
|
321
|
+
plot=plot,
|
322
|
+
freeze=freeze)
|
304
323
|
else:
|
305
324
|
logger.debug(
|
306
325
|
f'"{workflow.__workflow_id__}": All dependents maintained')
|
@@ -331,10 +350,12 @@ def maintain(workflow: WorkflowType,
|
|
331
350
|
logger.debug(f'recalibrate "{workflow.__workflow_id__}"')
|
332
351
|
result = calibrate(workflow, code_path, state_path, plot, session_id)
|
333
352
|
if result.bad_data or not result.in_spec:
|
353
|
+
if not freeze:
|
354
|
+
obey_the_oracle(result, state_path)
|
334
355
|
raise CalibrationFailedError(
|
335
356
|
f'"{workflow.__workflow_id__}": All dependents passed, but calibration failed!'
|
336
357
|
)
|
337
|
-
if
|
358
|
+
if not freeze:
|
338
359
|
update_parameters(result, state_path)
|
339
360
|
return
|
340
361
|
|
@@ -344,7 +365,7 @@ def run(workflow: WorkflowType,
|
|
344
365
|
code_path: str | Path,
|
345
366
|
state_path: str | Path,
|
346
367
|
plot: bool = False,
|
347
|
-
|
368
|
+
freeze: bool = False):
|
348
369
|
session_id = uuid.uuid4().hex
|
349
370
|
logger.debug(f'run "{workflow.__workflow_id__}" without dependences.')
|
350
371
|
result = calibrate(workflow,
|
@@ -353,9 +374,11 @@ def run(workflow: WorkflowType,
|
|
353
374
|
plot,
|
354
375
|
session_id=session_id)
|
355
376
|
if result.bad_data or not result.in_spec:
|
377
|
+
if not freeze:
|
378
|
+
obey_the_oracle(result, state_path)
|
356
379
|
raise CalibrationFailedError(
|
357
380
|
f'"{workflow.__workflow_id__}": All dependents passed, but calibration failed!'
|
358
381
|
)
|
359
|
-
if
|
382
|
+
if not freeze:
|
360
383
|
update_parameters(result, state_path)
|
361
384
|
return
|
@@ -23,6 +23,7 @@ class Result():
|
|
23
23
|
checked_time: datetime = field(default_factory=datetime.now)
|
24
24
|
ttl: timedelta = timedelta(days=3650)
|
25
25
|
parameters: dict = field(default_factory=dict)
|
26
|
+
oracle: dict = field(default_factory=dict)
|
26
27
|
other_infomation: dict = field(default_factory=dict)
|
27
28
|
data: Any = field(default_factory=tuple)
|
28
29
|
index: int = -1
|
@@ -43,6 +43,13 @@ def _export_config() -> dict:
|
|
43
43
|
return parameters
|
44
44
|
|
45
45
|
|
46
|
+
def obey_the_oracle(result: Result, data_path):
|
47
|
+
global __current_config_id
|
48
|
+
update_config(result.oracle)
|
49
|
+
cfg = export_config()
|
50
|
+
__current_config_id = save_config(cfg, data_path)
|
51
|
+
|
52
|
+
|
46
53
|
def update_parameters(result: Result, data_path):
|
47
54
|
global __current_config_id
|
48
55
|
update_config(result.parameters)
|
@@ -133,6 +133,24 @@ def check_analyze(result: Result, history: Result | None = None) -> Result:
|
|
133
133
|
result.state = random.choice(['Outdated', 'OK', 'Bad'])
|
134
134
|
|
135
135
|
return result
|
136
|
+
|
137
|
+
|
138
|
+
def oracle(result: Result, history: Result | None = None):
|
139
|
+
\"\"\"
|
140
|
+
谕示:指凭直觉或经验判断,改动某些配置,以期望下次校准成功。
|
141
|
+
|
142
|
+
当校准失败时,根据 analyze 的结果,尝试改变某些配置再重新校准整个系统。
|
143
|
+
比如通常我们在死活测不到 rabi 或能谱时,会换一个 idle bias 再试试。这
|
144
|
+
里我们凭直觉设的那个 bias 值,就是一个谕示,可以通过 oracle 来设定。
|
145
|
+
|
146
|
+
该函数代入的参数 result 是 analyze 函数的返回值。
|
147
|
+
\"\"\"
|
148
|
+
result.oracle = {{}}
|
149
|
+
|
150
|
+
# result.oracle['Q0.bias'] = 0.1
|
151
|
+
# result.oracle['Q1.bias'] = -0.03
|
152
|
+
|
153
|
+
return result
|
136
154
|
"""
|
137
155
|
|
138
156
|
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "2.7.0"
|
qulab-2.6.1/qulab/version.py
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "2.6.1"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|