qbraid 0.6.0.dev20240404040745__tar.gz → 0.6.1__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.
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/PKG-INFO +18 -15
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/README.md +16 -12
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/pyproject.toml +4 -3
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/__init__.py +1 -4
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/_about.py +1 -1
- qbraid-0.6.0.dev20240404040745/qbraid/_warnings.py → qbraid-0.6.1/qbraid/_compat.py +15 -14
- qbraid-0.6.1/qbraid/_version.py +17 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/compiler/braket/ionq.py +2 -7
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/get_devices.py +51 -58
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/get_jobs.py +35 -45
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/__init__.py +12 -0
- {qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions → qbraid-0.6.1/qbraid/programs}/qasm_passes.py +18 -1
- {qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions → qbraid-0.6.1/qbraid/programs}/qasm_qelib1.py +1 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/aws/job.py +3 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/device.py +10 -9
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/ibm/job.py +3 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/ibm/provider.py +2 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/job.py +3 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/provider.py +1 -5
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/__init__.py +2 -0
- qbraid-0.6.1/qbraid/transpiler/annotations.py +39 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/__init__.py +0 -14
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/braket/__init__.py +2 -3
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/braket/cirq_from_braket.py +7 -33
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/braket/cirq_to_braket.py +4 -4
- qbraid-0.6.1/qbraid/transpiler/conversions/braket/conversions_cirq.py +50 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/braket/conversions_qasm.py +2 -21
- qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions/braket/custom_gates.py → qbraid-0.6.1/qbraid/transpiler/conversions/braket/custom_instr.py +31 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/cirq/__init__.py +2 -2
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/cirq/cirq_qasm_parser.py +1 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/cirq/conversions_qasm.py +6 -5
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/openqasm3/__init__.py +1 -5
- qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions/openqasm3/convert_qasm.py → qbraid-0.6.1/qbraid/transpiler/conversions/openqasm3/conversions_qasm.py +1 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/pennylane/__init__.py +1 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/pyquil/__init__.py +1 -1
- qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions/pyquil/quil_output.py → qbraid-0.6.1/qbraid/transpiler/conversions/pyquil/cirq_quil_output.py +1 -3
- qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions/pyquil/conversions.py → qbraid-0.6.1/qbraid/transpiler/conversions/pyquil/conversions_cirq.py +18 -6
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/pytket/__init__.py +4 -1
- qbraid-0.6.1/qbraid/transpiler/conversions/pytket/conversions_braket.py +55 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/qiskit/__init__.py +1 -6
- qbraid-0.6.1/qbraid/transpiler/conversions/qiskit/conversions_braket.py +61 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/converter.py +9 -8
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/edge.py +27 -13
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/exceptions.py +1 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/graph.py +24 -4
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/visualization/plot_conversions.py +3 -1
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid.egg-info/PKG-INFO +18 -15
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid.egg-info/SOURCES.txt +13 -9
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid.egg-info/requires.txt +1 -2
- qbraid-0.6.1/requirements.txt +5 -0
- qbraid-0.6.1/tools/set_provider_configs.py +75 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/tox.ini +5 -2
- qbraid-0.6.0.dev20240404040745/qbraid/_version.py +0 -1
- qbraid-0.6.0.dev20240404040745/requirements.txt +0 -5
- qbraid-0.6.0.dev20240404040745/tools/set_provider_configs.py +0 -91
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/CODE_OF_CONDUCT.md +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/CONTRIBUTING.md +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/LICENSE +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/MANIFEST.in +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/cards/jupyter.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/cards/python.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/cards/terminal.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/favicon.ico +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/logo.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/pkg-logos/braket.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/pkg-logos/cirq.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/pkg-logos/pennylane.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/pkg-logos/pyquil.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/pkg-logos/qasm.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/pkg-logos/qir.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/pkg-logos/qiskit.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/pkg-logos/quantinuum.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/sdk-files/batch_counts.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/sdk-files/conversion_graph.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/sdk-files/get_devices.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/sdk-files/hub_spokes.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/sdk-files/lab_jobs.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/_static/sdk-files/plot_counts.png +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/api/qbraid.compiler.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/api/qbraid.interface.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/api/qbraid.programs.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/api/qbraid.providers.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/api/qbraid.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/api/qbraid.transpiler.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/api/qbraid.visualization.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/conf.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/index.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/sdk/devices.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/sdk/jobs.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/sdk/overview.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/sdk/programs.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/sdk/providers.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/sdk/results.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/docs/sdk/transpiler.rst +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/_display.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/_import.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/compiler/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/compiler/braket/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/compiler/exceptions.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/exceptions.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/interface/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/interface/circuit_equality.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/interface/random/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/interface/random/cirq_random.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/interface/random/qasm3_random.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/interface/random/qiskit_random.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/interface/random/random.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/_import.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/abc_program.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/exceptions.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/inspector.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/braket.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/cirq.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/pennylane.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/pyquil.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/pytket.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/qasm2.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/qasm3.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/libs/qiskit.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/programs/loader.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/_import.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/aws/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/aws/device.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/aws/provider.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/aws/result.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/aws/tracker.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/enums.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/exceptions.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/ibm/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/ibm/device.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/ibm/result.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/result.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/providers/status_maps.py +0 -0
- /qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions/cirq/cirq_gates.py → /qbraid-0.6.1/qbraid/transpiler/conversions/cirq/custom_ops.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/pennylane/conversions_qasm.py +0 -0
- /qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions/pyquil/quil_input.py → /qbraid-0.6.1/qbraid/transpiler/conversions/pyquil/cirq_quil_input.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/pytket/conversions_qasm.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/transpiler/conversions/qiskit/conversions_qasm.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/visualization/__init__.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/visualization/draw_circuit.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/visualization/draw_qasm3.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/visualization/exceptions.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid/visualization/plot_counts.py +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid.egg-info/dependency_links.txt +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid.egg-info/entry_points.txt +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/qbraid.egg-info/top_level.txt +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/requirements-dev.txt +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/setup.cfg +0 -0
- {qbraid-0.6.0.dev20240404040745 → qbraid-0.6.1}/tools/verify_headers.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: qbraid
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.1
|
|
4
4
|
Summary: A Python toolkit for cross-framework abstraction of quantum programs.
|
|
5
5
|
Author-email: qBraid Development Team <contact@qbraid.com>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -703,7 +703,7 @@ Requires-Dist: networkx<4.0,>=2.5
|
|
|
703
703
|
Requires-Dist: numpy<1.27,>=1.17
|
|
704
704
|
Requires-Dist: openqasm3[parser]<0.6.0,>=0.4.0
|
|
705
705
|
Requires-Dist: ply>=3.6
|
|
706
|
-
Requires-Dist: qbraid-core
|
|
706
|
+
Requires-Dist: qbraid-core<0.2.0,>=0.1.1
|
|
707
707
|
Provides-Extra: braket
|
|
708
708
|
Requires-Dist: amazon-braket-sdk<1.77.0,>=1.42.1; extra == "braket"
|
|
709
709
|
Provides-Extra: cirq
|
|
@@ -730,7 +730,6 @@ Requires-Dist: ipython; extra == "visualization"
|
|
|
730
730
|
Requires-Dist: matplotlib; extra == "visualization"
|
|
731
731
|
Requires-Dist: pylatexenc; extra == "visualization"
|
|
732
732
|
Provides-Extra: test
|
|
733
|
-
Requires-Dist: qbraid~=0.5.3; extra == "test"
|
|
734
733
|
Requires-Dist: pytest; extra == "test"
|
|
735
734
|
Requires-Dist: pytest-cov; extra == "test"
|
|
736
735
|
Provides-Extra: lint
|
|
@@ -794,11 +793,7 @@ For the best experience, install the qBraid-SDK environment on
|
|
|
794
793
|
[create an account](https://account.qbraid.com)) and follow the steps to
|
|
795
794
|
[install an environment](https://docs.qbraid.com/projects/lab/en/latest/lab/environments.html#install-environment).
|
|
796
795
|
|
|
797
|
-
Using the SDK on qBraid Lab means direct, pre-configured access to all
|
|
798
|
-
[Amazon Braket supported devices](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html)
|
|
799
|
-
with no additional access keys or API tokens required. See
|
|
800
|
-
[qBraid Quantum Jobs](https://docs.qbraid.com/projects/lab/en/latest/lab/quantum_jobs.html)
|
|
801
|
-
for more.
|
|
796
|
+
Using the SDK on [qBraid Lab](https://docs.qbraid.com/projects/lab/en/latest/lab/overview.html) means direct, pre-configured access to QPUs from IonQ, Oxford Quantum Circuits, QuEra, and Rigetti, as well as on-demand simulators from AWS, all with no additional access keys or API tokens required. See [qBraid Quantum Jobs](https://docs.qbraid.com/projects/lab/en/latest/lab/quantum_jobs.html) for more.
|
|
802
797
|
|
|
803
798
|
### Local install
|
|
804
799
|
|
|
@@ -902,12 +897,24 @@ from qbraid.transpiler import ConversionGraph
|
|
|
902
897
|
from qbraid.visualization import plot_conversion_graph
|
|
903
898
|
|
|
904
899
|
graph = ConversionGraph()
|
|
905
|
-
|
|
900
|
+
|
|
901
|
+
graph.plot()
|
|
906
902
|
```
|
|
907
903
|
|
|
908
904
|
<img align="middle" width="full" alt="conversion_graph" src="https://qbraid-static.s3.amazonaws.com/conversion_graph.png">
|
|
909
905
|
|
|
910
|
-
You can use the native conversions supported by qBraid, or define your own custom nodes and/or edges.
|
|
906
|
+
You can use the native conversions supported by qBraid, or define your own custom nodes and/or edges. For [example](https://github.com/qBraid/qbraid-qir?tab=readme-ov-file#add-qir-node-to-qbraid-conversion-graph):
|
|
907
|
+
|
|
908
|
+
```python
|
|
909
|
+
from qbraid_qir.qasm3 import qasm3_to_qir
|
|
910
|
+
from qbraid.transpiler import Conversion
|
|
911
|
+
|
|
912
|
+
conversion = Conversion("qasm3", "qir", qasm3_to_qir)
|
|
913
|
+
|
|
914
|
+
graph.add_conversion(conversion)
|
|
915
|
+
|
|
916
|
+
graph.plot()
|
|
917
|
+
```
|
|
911
918
|
|
|
912
919
|
### Devices & Jobs
|
|
913
920
|
|
|
@@ -1041,14 +1048,10 @@ Use the badge in your project's `README.rst`:
|
|
|
1041
1048
|
[CONTRIBUTING.md](CONTRIBUTING.md)
|
|
1042
1049
|
- For feature requests and bug reports:
|
|
1043
1050
|
[Submit an issue](https://github.com/qBraid/qBraid/issues)
|
|
1044
|
-
- For discussions, and specific questions about the qBraid
|
|
1045
|
-
other topics, [join our discord community](https://discord.gg/TPBU2sa8Et)
|
|
1051
|
+
- For discussions, and specific questions about the qBraid-SDK [join our discord community](https://discord.gg/TPBU2sa8Et)
|
|
1046
1052
|
- For questions that are more suited for a forum, post to
|
|
1047
1053
|
[Quantum Computing Stack Exchange](https://quantumcomputing.stackexchange.com/)
|
|
1048
1054
|
with the [`qbraid`](https://quantumcomputing.stackexchange.com/questions/tagged/qbraid) tag.
|
|
1049
|
-
- Want your open-source project featured as its own runtime environment on
|
|
1050
|
-
qBraid Lab? Fill out our
|
|
1051
|
-
[New Environment Request Form](https://forms.gle/a4v7Kdn7G7bs9jYD8)
|
|
1052
1055
|
|
|
1053
1056
|
## License
|
|
1054
1057
|
|
|
@@ -49,11 +49,7 @@ For the best experience, install the qBraid-SDK environment on
|
|
|
49
49
|
[create an account](https://account.qbraid.com)) and follow the steps to
|
|
50
50
|
[install an environment](https://docs.qbraid.com/projects/lab/en/latest/lab/environments.html#install-environment).
|
|
51
51
|
|
|
52
|
-
Using the SDK on qBraid Lab means direct, pre-configured access to all
|
|
53
|
-
[Amazon Braket supported devices](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html)
|
|
54
|
-
with no additional access keys or API tokens required. See
|
|
55
|
-
[qBraid Quantum Jobs](https://docs.qbraid.com/projects/lab/en/latest/lab/quantum_jobs.html)
|
|
56
|
-
for more.
|
|
52
|
+
Using the SDK on [qBraid Lab](https://docs.qbraid.com/projects/lab/en/latest/lab/overview.html) means direct, pre-configured access to QPUs from IonQ, Oxford Quantum Circuits, QuEra, and Rigetti, as well as on-demand simulators from AWS, all with no additional access keys or API tokens required. See [qBraid Quantum Jobs](https://docs.qbraid.com/projects/lab/en/latest/lab/quantum_jobs.html) for more.
|
|
57
53
|
|
|
58
54
|
### Local install
|
|
59
55
|
|
|
@@ -157,12 +153,24 @@ from qbraid.transpiler import ConversionGraph
|
|
|
157
153
|
from qbraid.visualization import plot_conversion_graph
|
|
158
154
|
|
|
159
155
|
graph = ConversionGraph()
|
|
160
|
-
|
|
156
|
+
|
|
157
|
+
graph.plot()
|
|
161
158
|
```
|
|
162
159
|
|
|
163
160
|
<img align="middle" width="full" alt="conversion_graph" src="https://qbraid-static.s3.amazonaws.com/conversion_graph.png">
|
|
164
161
|
|
|
165
|
-
You can use the native conversions supported by qBraid, or define your own custom nodes and/or edges.
|
|
162
|
+
You can use the native conversions supported by qBraid, or define your own custom nodes and/or edges. For [example](https://github.com/qBraid/qbraid-qir?tab=readme-ov-file#add-qir-node-to-qbraid-conversion-graph):
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
from qbraid_qir.qasm3 import qasm3_to_qir
|
|
166
|
+
from qbraid.transpiler import Conversion
|
|
167
|
+
|
|
168
|
+
conversion = Conversion("qasm3", "qir", qasm3_to_qir)
|
|
169
|
+
|
|
170
|
+
graph.add_conversion(conversion)
|
|
171
|
+
|
|
172
|
+
graph.plot()
|
|
173
|
+
```
|
|
166
174
|
|
|
167
175
|
### Devices & Jobs
|
|
168
176
|
|
|
@@ -296,14 +304,10 @@ Use the badge in your project's `README.rst`:
|
|
|
296
304
|
[CONTRIBUTING.md](CONTRIBUTING.md)
|
|
297
305
|
- For feature requests and bug reports:
|
|
298
306
|
[Submit an issue](https://github.com/qBraid/qBraid/issues)
|
|
299
|
-
- For discussions, and specific questions about the qBraid
|
|
300
|
-
other topics, [join our discord community](https://discord.gg/TPBU2sa8Et)
|
|
307
|
+
- For discussions, and specific questions about the qBraid-SDK [join our discord community](https://discord.gg/TPBU2sa8Et)
|
|
301
308
|
- For questions that are more suited for a forum, post to
|
|
302
309
|
[Quantum Computing Stack Exchange](https://quantumcomputing.stackexchange.com/)
|
|
303
310
|
with the [`qbraid`](https://quantumcomputing.stackexchange.com/questions/tagged/qbraid) tag.
|
|
304
|
-
- Want your open-source project featured as its own runtime environment on
|
|
305
|
-
qBraid Lab? Fill out our
|
|
306
|
-
[New Environment Request Form](https://forms.gle/a4v7Kdn7G7bs9jYD8)
|
|
307
311
|
|
|
308
312
|
## License
|
|
309
313
|
|
|
@@ -28,7 +28,7 @@ dependencies = [
|
|
|
28
28
|
"numpy>=1.17,<1.27",
|
|
29
29
|
"openqasm3[parser]>=0.4.0,<0.6.0",
|
|
30
30
|
"ply>=3.6",
|
|
31
|
-
"qbraid-core
|
|
31
|
+
"qbraid-core>=0.1.1,<0.2.0"
|
|
32
32
|
]
|
|
33
33
|
requires-python = ">= 3.9"
|
|
34
34
|
|
|
@@ -50,7 +50,7 @@ qir = ["qbraid-qir>=0.1.1,<0.2.0"]
|
|
|
50
50
|
qiskit = ["qiskit>=0.44.0,<1.1.0", "qiskit-ibm-provider>=0.5.3,<0.11.0", "qiskit-ibm-runtime>=0.18.0,<0.21.0", "qiskit[visualization]"]
|
|
51
51
|
ionq = ["cirq-core>=1.3.0,<1.4.0", "cirq-ionq>=1.3.0,<1.4.0", "pytket-braket>=0.30.0,<0.36.0"]
|
|
52
52
|
visualization = ["ipython", "matplotlib", "pylatexenc"]
|
|
53
|
-
test = ["
|
|
53
|
+
test = ["pytest", "pytest-cov"]
|
|
54
54
|
lint = ["black", "isort", "pylint"]
|
|
55
55
|
docs = ["sphinx~=7.2.6", "sphinx-autodoc-typehints>=1.24,<2.1", "sphinx-rtd-theme>=1.3,<2.1", "docutils<0.21"]
|
|
56
56
|
|
|
@@ -100,7 +100,8 @@ source = ["qbraid"]
|
|
|
100
100
|
omit = [
|
|
101
101
|
"**/qbraid/transpiler/conversions/cirq/cirq_gates.py",
|
|
102
102
|
"**/qbraid/visualization/plot_conversions.py",
|
|
103
|
-
"**/qbraid/visualization/draw_circuit.py.py"
|
|
103
|
+
"**/qbraid/visualization/draw_circuit.py.py",
|
|
104
|
+
"**/qbraid/_compat.py",
|
|
104
105
|
]
|
|
105
106
|
|
|
106
107
|
[tool.coverage.paths]
|
|
@@ -21,7 +21,6 @@ Functions
|
|
|
21
21
|
|
|
22
22
|
about
|
|
23
23
|
get_devices
|
|
24
|
-
refresh_devices
|
|
25
24
|
get_jobs
|
|
26
25
|
|
|
27
26
|
|
|
@@ -45,12 +44,11 @@ Exceptions
|
|
|
45
44
|
"""
|
|
46
45
|
import sys
|
|
47
46
|
|
|
48
|
-
from . import _warnings
|
|
49
47
|
from ._about import about
|
|
50
48
|
from ._import import LazyLoader
|
|
51
49
|
from ._version import __version__
|
|
52
50
|
from .exceptions import QbraidError
|
|
53
|
-
from .get_devices import get_devices
|
|
51
|
+
from .get_devices import get_devices
|
|
54
52
|
from .get_jobs import get_jobs
|
|
55
53
|
|
|
56
54
|
if "sphinx" in sys.modules:
|
|
@@ -74,7 +72,6 @@ __all__ = [
|
|
|
74
72
|
"programs",
|
|
75
73
|
"providers",
|
|
76
74
|
"QbraidError",
|
|
77
|
-
"refresh_devices",
|
|
78
75
|
"transpiler",
|
|
79
76
|
"visualization",
|
|
80
77
|
]
|
|
@@ -22,7 +22,7 @@ def about() -> None:
|
|
|
22
22
|
from numpy import __version__ as numpy_version
|
|
23
23
|
from openqasm3 import __version__ as openqasm3_version
|
|
24
24
|
from ply import __version__ as ply_version
|
|
25
|
-
from qbraid_core
|
|
25
|
+
from qbraid_core import __version__ as qbraid_core_version
|
|
26
26
|
|
|
27
27
|
from ._version import __version__ as qbraid_version
|
|
28
28
|
|
|
@@ -9,34 +9,35 @@
|
|
|
9
9
|
# THERE IS NO WARRANTY for the qBraid-SDK, as per Section 15 of the GPL v3.
|
|
10
10
|
|
|
11
11
|
"""
|
|
12
|
-
Module for emitting and
|
|
12
|
+
Module for emitting and configuring warnings and logging at top level.
|
|
13
13
|
|
|
14
14
|
"""
|
|
15
15
|
import logging
|
|
16
|
+
import os
|
|
16
17
|
import warnings
|
|
17
18
|
|
|
18
|
-
from qbraid_core.
|
|
19
|
+
from qbraid_core._compat import check_version
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
logging.
|
|
21
|
+
|
|
22
|
+
def configure_logging():
|
|
23
|
+
"""Configure logging to show warnings and errors."""
|
|
24
|
+
level = os.getenv("LOG_LEVEL", "INFO").upper() # Default to INFO if not set
|
|
25
|
+
logging.basicConfig(
|
|
26
|
+
level=getattr(logging, level, logging.INFO),
|
|
27
|
+
format="%(levelname)s - %(module)s - %(message)s",
|
|
28
|
+
)
|
|
23
29
|
|
|
24
30
|
|
|
25
|
-
def
|
|
31
|
+
def filterwarnings():
|
|
26
32
|
"""Filter out warnings that are not relevant to the user."""
|
|
27
33
|
warnings.filterwarnings("ignore", category=SyntaxWarning)
|
|
28
34
|
warnings.filterwarnings(
|
|
29
35
|
"ignore", category=UserWarning, message="Setuptools is replacing distutils"
|
|
30
36
|
)
|
|
31
37
|
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
|
32
|
-
# warnings.filterwarnings("ignore", category=PendingDeprecationWarning)
|
|
33
38
|
warnings.filterwarnings("ignore", category=RuntimeWarning, module="numpy")
|
|
34
39
|
|
|
35
40
|
|
|
36
|
-
def
|
|
37
|
-
"""Emit a warning."""
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
_warn_version()
|
|
42
|
-
_filterwarnings()
|
|
41
|
+
def check_warn_version_update():
|
|
42
|
+
"""Emit a warning if updated package version exists."""
|
|
43
|
+
check_version("qbraid")
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Copyright (C) 2023 qBraid
|
|
2
|
+
#
|
|
3
|
+
# This file is part of the qBraid-SDK
|
|
4
|
+
#
|
|
5
|
+
# The qBraid-SDK is free software released under the GNU General Public License v3
|
|
6
|
+
# or later. You can redistribute and/or modify it under the terms of the GPL v3.
|
|
7
|
+
# See the LICENSE file in the project root or <https://www.gnu.org/licenses/gpl-3.0.html>.
|
|
8
|
+
#
|
|
9
|
+
# THERE IS NO WARRANTY for the qBraid-SDK, as per Section 15 of the GPL v3.
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
Module containing version information
|
|
13
|
+
|
|
14
|
+
Version number (major.minor.patch[-label])
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
__version__ = "0.6.1"
|
|
@@ -15,7 +15,6 @@ Module for converting generic quantum circuits to basis gate set compatible with
|
|
|
15
15
|
from typing import Union
|
|
16
16
|
|
|
17
17
|
import pytket
|
|
18
|
-
import pytket.extensions.braket
|
|
19
18
|
from braket.circuits import Circuit
|
|
20
19
|
|
|
21
20
|
try:
|
|
@@ -118,10 +117,7 @@ def braket_ionq_compile(circuit: Union[Circuit, pytket.circuit.Circuit]) -> Circ
|
|
|
118
117
|
|
|
119
118
|
"""
|
|
120
119
|
if isinstance(circuit, Circuit):
|
|
121
|
-
|
|
122
|
-
tk_circuit = pytket.extensions.braket.braket_convert.braket_to_tk(circuit)
|
|
123
|
-
except NotImplementedError:
|
|
124
|
-
tk_circuit = transpile(circuit, "pytket")
|
|
120
|
+
tk_circuit = transpile(circuit, "pytket")
|
|
125
121
|
else:
|
|
126
122
|
tk_circuit = circuit
|
|
127
123
|
|
|
@@ -129,5 +125,4 @@ def braket_ionq_compile(circuit: Union[Circuit, pytket.circuit.Circuit]) -> Circ
|
|
|
129
125
|
ionq_rebase_pass.apply(cu)
|
|
130
126
|
if not cu.check_all_predicates():
|
|
131
127
|
raise CompilerError("Circuit cannot be compiled to IonQ Harmony.")
|
|
132
|
-
|
|
133
|
-
return compiled
|
|
128
|
+
return transpile(cu.circuit, "braket")
|
|
@@ -15,68 +15,20 @@ Module to retrieve, update, and display information about devices
|
|
|
15
15
|
supported by the qBraid SDK.
|
|
16
16
|
|
|
17
17
|
"""
|
|
18
|
-
from typing import
|
|
19
|
-
|
|
20
|
-
from qbraid_core import QbraidSession
|
|
21
|
-
from qbraid_core.services.quantum import QuantumClient, process_device_data
|
|
18
|
+
from typing import Any, Dict, List, Optional
|
|
22
19
|
|
|
23
20
|
try:
|
|
24
21
|
from IPython.display import HTML, clear_output, display
|
|
25
22
|
except ImportError:
|
|
26
23
|
pass
|
|
27
24
|
|
|
28
|
-
from
|
|
29
|
-
|
|
30
|
-
if TYPE_CHECKING:
|
|
31
|
-
from IPython.display import DisplayHandle
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def refresh_devices() -> None:
|
|
35
|
-
"""Refreshes status for all qbraid supported devices. Requires credential for each vendor."""
|
|
36
|
-
# pylint: disable-next=import-outside-toplevel
|
|
37
|
-
from qbraid.providers import QbraidProvider
|
|
38
|
-
|
|
39
|
-
client = QuantumClient()
|
|
40
|
-
provider = QbraidProvider(client=client)
|
|
41
|
-
devices = client.search_devices()
|
|
42
|
-
count = 0
|
|
43
|
-
num_devices = len(devices) # i.e. number of iterations
|
|
44
|
-
for document in devices:
|
|
45
|
-
progress = count / num_devices
|
|
46
|
-
update_progress_bar(progress)
|
|
47
|
-
if document["statusRefresh"] is not None: # None => internally not available at moment
|
|
48
|
-
qbraid_id = document["qbraid_id"]
|
|
49
|
-
try:
|
|
50
|
-
device = provider.get_device(qbraid_id)
|
|
51
|
-
status = device.status().name
|
|
52
|
-
client.update_device(data={"qbraid_id": qbraid_id, "status": status})
|
|
53
|
-
except Exception: # pylint: disable=broad-except
|
|
54
|
-
pass
|
|
55
|
-
|
|
56
|
-
count += 1
|
|
57
|
-
update_progress_bar(1)
|
|
58
|
-
print()
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def _get_device_data(query: Dict[str, Any]) -> Tuple[List[List[str]], int]:
|
|
62
|
-
"""Get devices helper function that queries the qBraid API for all supported devices
|
|
63
|
-
and returns a list of devices that match the query filters. Each device is
|
|
64
|
-
represented by its own length-4 list containing the [provider, name, qbraid_id, status].
|
|
65
|
-
"""
|
|
66
|
-
session = QbraidSession()
|
|
67
|
-
|
|
68
|
-
# forward compatibility for casing transition
|
|
69
|
-
if query.get("type") == "SIMULATOR":
|
|
70
|
-
query["type"] = "Simulator"
|
|
25
|
+
from qbraid_core import QbraidSession
|
|
26
|
+
from qbraid_core.services.quantum import QuantumClient, process_device_data
|
|
71
27
|
|
|
72
|
-
|
|
73
|
-
# encode the query. This is because certain queries contain regular
|
|
74
|
-
# expressions which cannot be encoded in GET request `params`.
|
|
75
|
-
devices = session.post("/public/lab/get-devices", json=query).json()
|
|
76
|
-
return process_device_data(devices)
|
|
28
|
+
from ._display import running_in_jupyter, update_progress_bar
|
|
77
29
|
|
|
78
30
|
|
|
79
|
-
def _display_basic(data: List[str], message: str)
|
|
31
|
+
def _display_basic(data: List[str], message: str):
|
|
80
32
|
if len(data) == 0:
|
|
81
33
|
print(message)
|
|
82
34
|
else:
|
|
@@ -134,9 +86,34 @@ def _display_jupyter(data: List[str], message: Optional[str] = None, align: str
|
|
|
134
86
|
return display(HTML(html))
|
|
135
87
|
|
|
136
88
|
|
|
137
|
-
def
|
|
138
|
-
|
|
139
|
-
|
|
89
|
+
def _refresh_devices() -> None:
|
|
90
|
+
"""Refreshes status for all qbraid supported devices. Requires credential for each vendor."""
|
|
91
|
+
# pylint: disable-next=import-outside-toplevel
|
|
92
|
+
from qbraid.providers import QbraidProvider
|
|
93
|
+
|
|
94
|
+
client = QuantumClient()
|
|
95
|
+
provider = QbraidProvider(client=client)
|
|
96
|
+
devices = client.search_devices()
|
|
97
|
+
count = 0
|
|
98
|
+
num_devices = len(devices) # i.e. number of iterations
|
|
99
|
+
for document in devices:
|
|
100
|
+
progress = count / num_devices
|
|
101
|
+
update_progress_bar(progress)
|
|
102
|
+
if document["statusRefresh"] is not None: # None => internally not available at moment
|
|
103
|
+
qbraid_id = document["qbraid_id"]
|
|
104
|
+
try:
|
|
105
|
+
device = provider.get_device(qbraid_id)
|
|
106
|
+
status = device.status().name
|
|
107
|
+
client.update_device(data={"qbraid_id": qbraid_id, "status": status})
|
|
108
|
+
except Exception: # pylint: disable=broad-except
|
|
109
|
+
pass
|
|
110
|
+
|
|
111
|
+
count += 1
|
|
112
|
+
update_progress_bar(1)
|
|
113
|
+
print()
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def get_devices(filters: Optional[Dict[str, Any]] = None, refresh: bool = False):
|
|
140
117
|
"""Displays a list of all supported devices matching given filters, tabulated by provider,
|
|
141
118
|
name, and qBraid ID. Each device also has a status given by a solid green bubble or a hollow
|
|
142
119
|
red bubble, indicating that the device is online or offline, respectively. You can narrow your
|
|
@@ -201,9 +178,25 @@ def get_devices(
|
|
|
201
178
|
|
|
202
179
|
"""
|
|
203
180
|
if refresh:
|
|
204
|
-
|
|
181
|
+
_refresh_devices()
|
|
182
|
+
|
|
183
|
+
session = QbraidSession()
|
|
205
184
|
query = {} if filters is None else filters
|
|
206
|
-
|
|
185
|
+
|
|
186
|
+
# forward compatibility for casing transition
|
|
187
|
+
if query.get("type") == "SIMULATOR":
|
|
188
|
+
query["type"] = "Simulator"
|
|
189
|
+
|
|
190
|
+
if len(query) == 0:
|
|
191
|
+
client = QuantumClient(session=session)
|
|
192
|
+
devices = client.search_devices()
|
|
193
|
+
else:
|
|
194
|
+
# get-devices must be a POST request with kwarg `json` (not `data`) to
|
|
195
|
+
# encode the query. This is because certain queries contain regular
|
|
196
|
+
# expressions which cannot be encoded in GET request `params`.
|
|
197
|
+
devices = session.post("/public/lab/get-devices", json=query).json()
|
|
198
|
+
|
|
199
|
+
device_data, msg = process_device_data(devices)
|
|
207
200
|
align = "center" if len(device_data) == 0 else "right"
|
|
208
201
|
|
|
209
202
|
if running_in_jupyter():
|
|
@@ -17,7 +17,7 @@ jobs submitted through the qBraid SDK.
|
|
|
17
17
|
"""
|
|
18
18
|
|
|
19
19
|
import warnings
|
|
20
|
-
from typing import Any, Dict, List, Optional
|
|
20
|
+
from typing import Any, Dict, List, Optional
|
|
21
21
|
|
|
22
22
|
try:
|
|
23
23
|
from IPython.display import HTML, clear_output, display
|
|
@@ -25,14 +25,14 @@ except ImportError:
|
|
|
25
25
|
pass
|
|
26
26
|
|
|
27
27
|
from qbraid_core import QbraidSession
|
|
28
|
-
from qbraid_core.services.quantum
|
|
28
|
+
from qbraid_core.services.quantum import QuantumClient, process_job_data
|
|
29
29
|
|
|
30
|
-
from
|
|
30
|
+
from ._display import running_in_jupyter, update_progress_bar
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
def
|
|
33
|
+
def _display_basic(data: List[str], message: str) -> None:
|
|
34
34
|
if len(data) == 0:
|
|
35
|
-
print(
|
|
35
|
+
print(message)
|
|
36
36
|
else:
|
|
37
37
|
headers = ["Job ID", "Submitted", "Status"]
|
|
38
38
|
|
|
@@ -43,7 +43,7 @@ def _display_jobs_basic(data, msg):
|
|
|
43
43
|
separator_format = "{:<" + str(max_job_id_length) + "} {:<25} {:<15}"
|
|
44
44
|
row_format = "{:<" + str(max_job_id_length) + "} {:<25} {:<15}"
|
|
45
45
|
|
|
46
|
-
print(f"{
|
|
46
|
+
print(f"{message}:\n")
|
|
47
47
|
print(header_format.format(*headers))
|
|
48
48
|
|
|
49
49
|
separators = ["-" * len(header) for header in headers]
|
|
@@ -53,7 +53,7 @@ def _display_jobs_basic(data, msg):
|
|
|
53
53
|
print(row_format.format(job_id, timestamp, status))
|
|
54
54
|
|
|
55
55
|
|
|
56
|
-
def
|
|
56
|
+
def _display_jupyter(data: List[str], message: Optional[str] = None, align: str = "right"):
|
|
57
57
|
clear_output(wait=True)
|
|
58
58
|
|
|
59
59
|
html = """<h3>Quantum Jobs</h3><table><tr>
|
|
@@ -87,43 +87,29 @@ def _display_jobs_jupyter(data, msg):
|
|
|
87
87
|
<td style='text-align:left'>{status}</td></tr>
|
|
88
88
|
"""
|
|
89
89
|
|
|
90
|
-
html += f"<tr><td colspan='4'; style='text-align:
|
|
90
|
+
html += f"<tr><td colspan='4'; style='text-align:{align}'>{message}</td></tr>"
|
|
91
91
|
|
|
92
92
|
html += "</table>"
|
|
93
93
|
|
|
94
94
|
return display(HTML(html))
|
|
95
95
|
|
|
96
96
|
|
|
97
|
-
def
|
|
98
|
-
|
|
99
|
-
refresh: bool = False,
|
|
100
|
-
session: Optional[QbraidSession] = None,
|
|
101
|
-
) -> Tuple[List[List[str]], str]:
|
|
97
|
+
def _refresh_jobs(job_data: List[str]) -> List[str]:
|
|
98
|
+
"""Refreshes the status of all quantum jobs in the list."""
|
|
102
99
|
from qbraid.providers import QuantumJob # pylint: disable=import-outside-toplevel
|
|
103
100
|
|
|
104
|
-
session = QbraidSession() if not session else session
|
|
105
|
-
jobs = session.post("/get-user-jobs", json=query).json()
|
|
106
101
|
count = 0
|
|
107
|
-
num_jobs = len(
|
|
108
|
-
|
|
109
|
-
for
|
|
102
|
+
num_jobs = len(job_data)
|
|
103
|
+
job_data_refresh = []
|
|
104
|
+
for job_id, created_at, status in job_data:
|
|
110
105
|
count += 1
|
|
111
106
|
progress = count / num_jobs
|
|
112
|
-
|
|
113
|
-
update_progress_bar(progress)
|
|
114
|
-
job_id = document.get("qbraidJobId", document.get("_id"))
|
|
115
|
-
if job_id is None:
|
|
116
|
-
continue
|
|
117
|
-
created_at = document.get("createdAt")
|
|
118
|
-
if created_at is None:
|
|
119
|
-
timestamps = document.get("timestamps", {})
|
|
120
|
-
created_at = timestamps.get("createdAt", timestamps.get("jobStarted"))
|
|
121
|
-
status = document.get("qbraidStatus", document.get("status", "UNKNOWN"))
|
|
107
|
+
update_progress_bar(progress)
|
|
122
108
|
try:
|
|
123
109
|
status_final = QuantumJob.status_final(status)
|
|
124
110
|
except Exception: # pylint: disable=broad-except
|
|
125
111
|
status_final = True
|
|
126
|
-
if
|
|
112
|
+
if not status_final:
|
|
127
113
|
try:
|
|
128
114
|
qbraid_job = QuantumJob.retrieve(job_id)
|
|
129
115
|
with warnings.catch_warnings():
|
|
@@ -132,19 +118,12 @@ def _get_jobs_data(
|
|
|
132
118
|
status = status_obj.name
|
|
133
119
|
except Exception: # pylint: disable=broad-except
|
|
134
120
|
pass
|
|
135
|
-
|
|
121
|
+
job_data_refresh.append([job_id, created_at, status])
|
|
136
122
|
|
|
137
|
-
|
|
123
|
+
return job_data_refresh
|
|
138
124
|
|
|
139
|
-
return job_data, msg
|
|
140
125
|
|
|
141
|
-
|
|
142
|
-
def get_jobs(
|
|
143
|
-
filters: Optional[dict] = None,
|
|
144
|
-
refresh: bool = False,
|
|
145
|
-
raw: bool = False,
|
|
146
|
-
session: Optional[QbraidSession] = None,
|
|
147
|
-
): # pylint: disable=too-many-statements
|
|
126
|
+
def get_jobs(filters: Optional[Dict[str, Any]] = None, refresh: bool = False, raw: bool = False):
|
|
148
127
|
"""Displays a list of quantum jobs submitted by user, tabulated by job ID,
|
|
149
128
|
the date/time it was submitted, and status. You can specify filters to
|
|
150
129
|
narrow the search by supplying a dictionary containing the desired criteria.
|
|
@@ -182,17 +161,28 @@ def get_jobs(
|
|
|
182
161
|
filters (dict): A dictionary containing any filters to be applied.
|
|
183
162
|
refresh (bool): If True, refreshes the status of all jobs before displaying them.
|
|
184
163
|
raw (bool): If True, returns a list of job IDs instead of displaying the jobs.
|
|
185
|
-
session (QbraidSession): A qBraid session object. If not provided, a new session will be created.
|
|
186
164
|
|
|
187
165
|
"""
|
|
188
166
|
filters = filters or {}
|
|
189
167
|
|
|
190
|
-
|
|
168
|
+
session = QbraidSession()
|
|
169
|
+
|
|
170
|
+
if len(filters) == 0:
|
|
171
|
+
client = QuantumClient(session=session)
|
|
172
|
+
jobs = client.search_jobs()
|
|
173
|
+
else:
|
|
174
|
+
jobs = session.post("/get-user-jobs", json=filters).json()
|
|
175
|
+
|
|
176
|
+
job_data, msg = process_job_data(jobs, filters)
|
|
177
|
+
|
|
178
|
+
if refresh:
|
|
179
|
+
job_data = _refresh_jobs(job_data)
|
|
191
180
|
|
|
192
181
|
if raw:
|
|
193
|
-
|
|
194
|
-
|
|
182
|
+
return [job[0] for job in job_data]
|
|
183
|
+
|
|
184
|
+
align = "center" if len(job_data) == 0 else "right"
|
|
195
185
|
|
|
196
186
|
if running_in_jupyter():
|
|
197
|
-
return
|
|
198
|
-
return
|
|
187
|
+
return _display_jupyter(job_data, msg, align=align)
|
|
188
|
+
return _display_basic(job_data, msg)
|
|
@@ -31,6 +31,11 @@ Functions
|
|
|
31
31
|
get_qasm_version
|
|
32
32
|
get_program_type
|
|
33
33
|
load_program
|
|
34
|
+
remove_qasm_barriers
|
|
35
|
+
unfold_qasm_gate_defs
|
|
36
|
+
flatten_qasm_program
|
|
37
|
+
decompose_qasm_qelib1
|
|
38
|
+
convert_qasm_pi_to_decimal
|
|
34
39
|
|
|
35
40
|
Classes
|
|
36
41
|
--------
|
|
@@ -56,3 +61,10 @@ from .abc_program import QuantumProgram
|
|
|
56
61
|
from .exceptions import PackageValueError, ProgramTypeError, QasmError
|
|
57
62
|
from .inspector import get_program_type, get_qasm_version
|
|
58
63
|
from .loader import load_program
|
|
64
|
+
from .qasm_passes import (
|
|
65
|
+
convert_qasm_pi_to_decimal,
|
|
66
|
+
flatten_qasm_program,
|
|
67
|
+
remove_qasm_barriers,
|
|
68
|
+
unfold_qasm_gate_defs,
|
|
69
|
+
)
|
|
70
|
+
from .qasm_qelib1 import decompose_qasm_qelib1
|
|
@@ -12,9 +12,26 @@
|
|
|
12
12
|
Module for preprocessing qasm string to before it is passed to parser.
|
|
13
13
|
|
|
14
14
|
"""
|
|
15
|
+
import math
|
|
15
16
|
import re
|
|
16
17
|
|
|
17
|
-
from
|
|
18
|
+
from .qasm_qelib1 import decompose_qasm_qelib1
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def convert_qasm_pi_to_decimal(qasm_str: str) -> str:
|
|
22
|
+
"""Convert all instances of 'pi' in the QASM string to their decimal value."""
|
|
23
|
+
|
|
24
|
+
pattern = r"(\d*\.?\d*\s*[*/+-]\s*)?pi(\s*[*/+-]\s*\d*\.?\d*)?"
|
|
25
|
+
|
|
26
|
+
def replace_with_decimal(match):
|
|
27
|
+
expr = match.group()
|
|
28
|
+
try:
|
|
29
|
+
value = eval(expr.replace("pi", str(math.pi))) # pylint: disable=eval-used
|
|
30
|
+
except SyntaxError:
|
|
31
|
+
return expr
|
|
32
|
+
return str(value)
|
|
33
|
+
|
|
34
|
+
return re.sub(pattern, replace_with_decimal, qasm_str)
|
|
18
35
|
|
|
19
36
|
|
|
20
37
|
def remove_qasm_barriers(qasm_str: str) -> str:
|
|
@@ -15,7 +15,7 @@ Module that implements qelib1.inc qasm gate definitions as python functions
|
|
|
15
15
|
import re
|
|
16
16
|
from typing import Optional
|
|
17
17
|
|
|
18
|
-
from
|
|
18
|
+
from .exceptions import QasmError
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def _get_param(instr: str) -> Optional[str]:
|