qbraid 0.6.0__tar.gz → 0.6.0.dev20240404040745__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.
Files changed (146) hide show
  1. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/PKG-INFO +14 -18
  2. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/README.md +12 -16
  3. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/pyproject.toml +2 -3
  4. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/__init__.py +4 -1
  5. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/_about.py +1 -1
  6. qbraid-0.6.0.dev20240404040745/qbraid/_version.py +1 -0
  7. qbraid-0.6.0/qbraid/_compat.py → qbraid-0.6.0.dev20240404040745/qbraid/_warnings.py +14 -15
  8. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/get_devices.py +58 -51
  9. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/get_jobs.py +45 -35
  10. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/__init__.py +0 -6
  11. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/aws/job.py +1 -3
  12. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/device.py +9 -10
  13. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/ibm/job.py +1 -3
  14. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/ibm/provider.py +1 -2
  15. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/job.py +1 -3
  16. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/provider.py +1 -1
  17. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/__init__.py +14 -0
  18. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/braket/cirq_to_braket.py +3 -3
  19. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/cirq/conversions_qasm.py +5 -6
  20. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/openqasm3/convert_qasm.py +1 -1
  21. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/pyquil/conversions.py +2 -3
  22. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/pyquil/quil_output.py +3 -1
  23. {qbraid-0.6.0/qbraid/programs → qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions}/qasm_passes.py +1 -1
  24. {qbraid-0.6.0/qbraid/programs → qbraid-0.6.0.dev20240404040745/qbraid/transpiler/conversions}/qasm_qelib1.py +1 -1
  25. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/converter.py +8 -8
  26. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/graph.py +3 -3
  27. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid.egg-info/PKG-INFO +14 -18
  28. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid.egg-info/SOURCES.txt +3 -3
  29. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid.egg-info/requires.txt +1 -1
  30. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/requirements.txt +1 -1
  31. qbraid-0.6.0.dev20240404040745/tools/set_provider_configs.py +91 -0
  32. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/tox.ini +1 -4
  33. qbraid-0.6.0/qbraid/_version.py +0 -17
  34. qbraid-0.6.0/tools/set_provider_configs.py +0 -75
  35. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/CODE_OF_CONDUCT.md +0 -0
  36. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/CONTRIBUTING.md +0 -0
  37. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/LICENSE +0 -0
  38. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/MANIFEST.in +0 -0
  39. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/cards/jupyter.png +0 -0
  40. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/cards/python.png +0 -0
  41. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/cards/terminal.png +0 -0
  42. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/favicon.ico +0 -0
  43. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/logo.png +0 -0
  44. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/pkg-logos/braket.png +0 -0
  45. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/pkg-logos/cirq.png +0 -0
  46. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/pkg-logos/pennylane.png +0 -0
  47. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/pkg-logos/pyquil.png +0 -0
  48. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/pkg-logos/qasm.png +0 -0
  49. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/pkg-logos/qir.png +0 -0
  50. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/pkg-logos/qiskit.png +0 -0
  51. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/pkg-logos/quantinuum.png +0 -0
  52. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/sdk-files/batch_counts.png +0 -0
  53. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/sdk-files/conversion_graph.png +0 -0
  54. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/sdk-files/get_devices.png +0 -0
  55. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/sdk-files/hub_spokes.png +0 -0
  56. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/sdk-files/lab_jobs.png +0 -0
  57. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/_static/sdk-files/plot_counts.png +0 -0
  58. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/api/qbraid.compiler.rst +0 -0
  59. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/api/qbraid.interface.rst +0 -0
  60. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/api/qbraid.programs.rst +0 -0
  61. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/api/qbraid.providers.rst +0 -0
  62. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/api/qbraid.rst +0 -0
  63. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/api/qbraid.transpiler.rst +0 -0
  64. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/api/qbraid.visualization.rst +0 -0
  65. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/conf.py +0 -0
  66. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/index.rst +0 -0
  67. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/sdk/devices.rst +0 -0
  68. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/sdk/jobs.rst +0 -0
  69. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/sdk/overview.rst +0 -0
  70. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/sdk/programs.rst +0 -0
  71. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/sdk/providers.rst +0 -0
  72. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/sdk/results.rst +0 -0
  73. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/docs/sdk/transpiler.rst +0 -0
  74. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/_display.py +0 -0
  75. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/_import.py +0 -0
  76. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/compiler/__init__.py +0 -0
  77. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/compiler/braket/__init__.py +0 -0
  78. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/compiler/braket/ionq.py +0 -0
  79. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/compiler/exceptions.py +0 -0
  80. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/exceptions.py +0 -0
  81. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/interface/__init__.py +0 -0
  82. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/interface/circuit_equality.py +0 -0
  83. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/interface/random/__init__.py +0 -0
  84. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/interface/random/cirq_random.py +0 -0
  85. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/interface/random/qasm3_random.py +0 -0
  86. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/interface/random/qiskit_random.py +0 -0
  87. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/interface/random/random.py +0 -0
  88. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/_import.py +0 -0
  89. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/abc_program.py +0 -0
  90. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/exceptions.py +0 -0
  91. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/inspector.py +0 -0
  92. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/__init__.py +0 -0
  93. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/braket.py +0 -0
  94. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/cirq.py +0 -0
  95. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/pennylane.py +0 -0
  96. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/pyquil.py +0 -0
  97. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/pytket.py +0 -0
  98. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/qasm2.py +0 -0
  99. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/qasm3.py +0 -0
  100. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/libs/qiskit.py +0 -0
  101. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/programs/loader.py +0 -0
  102. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/__init__.py +0 -0
  103. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/_import.py +0 -0
  104. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/aws/__init__.py +0 -0
  105. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/aws/device.py +0 -0
  106. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/aws/provider.py +0 -0
  107. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/aws/result.py +0 -0
  108. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/aws/tracker.py +0 -0
  109. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/enums.py +0 -0
  110. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/exceptions.py +0 -0
  111. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/ibm/__init__.py +0 -0
  112. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/ibm/device.py +0 -0
  113. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/ibm/result.py +0 -0
  114. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/result.py +0 -0
  115. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/providers/status_maps.py +0 -0
  116. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/__init__.py +0 -0
  117. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/braket/__init__.py +0 -0
  118. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/braket/cirq_from_braket.py +0 -0
  119. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/braket/conversions_qasm.py +0 -0
  120. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/braket/custom_gates.py +0 -0
  121. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/cirq/__init__.py +0 -0
  122. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/cirq/cirq_gates.py +0 -0
  123. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/cirq/cirq_qasm_parser.py +0 -0
  124. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/openqasm3/__init__.py +0 -0
  125. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/pennylane/__init__.py +0 -0
  126. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/pennylane/conversions_qasm.py +0 -0
  127. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/pyquil/__init__.py +0 -0
  128. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/pyquil/quil_input.py +0 -0
  129. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/pytket/__init__.py +0 -0
  130. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/pytket/conversions_qasm.py +0 -0
  131. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/qiskit/__init__.py +0 -0
  132. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/conversions/qiskit/conversions_qasm.py +0 -0
  133. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/edge.py +0 -0
  134. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/transpiler/exceptions.py +0 -0
  135. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/visualization/__init__.py +0 -0
  136. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/visualization/draw_circuit.py +0 -0
  137. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/visualization/draw_qasm3.py +0 -0
  138. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/visualization/exceptions.py +0 -0
  139. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/visualization/plot_conversions.py +0 -0
  140. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid/visualization/plot_counts.py +0 -0
  141. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid.egg-info/dependency_links.txt +0 -0
  142. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid.egg-info/entry_points.txt +0 -0
  143. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/qbraid.egg-info/top_level.txt +0 -0
  144. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/requirements-dev.txt +0 -0
  145. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/setup.cfg +0 -0
  146. {qbraid-0.6.0 → qbraid-0.6.0.dev20240404040745}/tools/verify_headers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qbraid
3
- Version: 0.6.0
3
+ Version: 0.6.0.dev20240404040745
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<0.2.0,>=0.1.0
706
+ Requires-Dist: qbraid-core==0.1.0.dev3
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
@@ -794,7 +794,11 @@ For the best experience, install the qBraid-SDK environment on
794
794
  [create an account](https://account.qbraid.com)) and follow the steps to
795
795
  [install an environment](https://docs.qbraid.com/projects/lab/en/latest/lab/environments.html#install-environment).
796
796
 
797
- 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.
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.
798
802
 
799
803
  ### Local install
800
804
 
@@ -898,24 +902,12 @@ from qbraid.transpiler import ConversionGraph
898
902
  from qbraid.visualization import plot_conversion_graph
899
903
 
900
904
  graph = ConversionGraph()
901
-
902
- graph.plot()
905
+ plot_conversion_graph(graph)
903
906
  ```
904
907
 
905
908
  <img align="middle" width="full" alt="conversion_graph" src="https://qbraid-static.s3.amazonaws.com/conversion_graph.png">
906
909
 
907
- 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):
908
-
909
- ```python
910
- from qbraid_qir.qasm3 import qasm3_to_qir
911
- from qbraid.transpiler import Conversion
912
-
913
- conversion = Conversion("qasm3", "qir", qasm3_to_qir)
914
-
915
- graph.add_conversion(conversion)
916
-
917
- graph.plot()
918
- ```
910
+ You can use the native conversions supported by qBraid, or define your own custom nodes and/or edges. See [example](https://github.com/qBraid/qbraid-lab-demo/blob/main/qbraid_sdk/qbraid_sdk_transpiler_braket_qiskit.ipynb).
919
911
 
920
912
  ### Devices & Jobs
921
913
 
@@ -1049,10 +1041,14 @@ Use the badge in your project's `README.rst`:
1049
1041
  [CONTRIBUTING.md](CONTRIBUTING.md)
1050
1042
  - For feature requests and bug reports:
1051
1043
  [Submit an issue](https://github.com/qBraid/qBraid/issues)
1052
- - For discussions, and specific questions about the qBraid-SDK [join our discord community](https://discord.gg/TPBU2sa8Et)
1044
+ - For discussions, and specific questions about the qBraid SDK, qBraid Lab, or
1045
+ other topics, [join our discord community](https://discord.gg/TPBU2sa8Et)
1053
1046
  - For questions that are more suited for a forum, post to
1054
1047
  [Quantum Computing Stack Exchange](https://quantumcomputing.stackexchange.com/)
1055
1048
  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)
1056
1052
 
1057
1053
  ## License
1058
1054
 
@@ -49,7 +49,11 @@ 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](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.
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.
53
57
 
54
58
  ### Local install
55
59
 
@@ -153,24 +157,12 @@ from qbraid.transpiler import ConversionGraph
153
157
  from qbraid.visualization import plot_conversion_graph
154
158
 
155
159
  graph = ConversionGraph()
156
-
157
- graph.plot()
160
+ plot_conversion_graph(graph)
158
161
  ```
159
162
 
160
163
  <img align="middle" width="full" alt="conversion_graph" src="https://qbraid-static.s3.amazonaws.com/conversion_graph.png">
161
164
 
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
- ```
165
+ You can use the native conversions supported by qBraid, or define your own custom nodes and/or edges. See [example](https://github.com/qBraid/qbraid-lab-demo/blob/main/qbraid_sdk/qbraid_sdk_transpiler_braket_qiskit.ipynb).
174
166
 
175
167
  ### Devices & Jobs
176
168
 
@@ -304,10 +296,14 @@ Use the badge in your project's `README.rst`:
304
296
  [CONTRIBUTING.md](CONTRIBUTING.md)
305
297
  - For feature requests and bug reports:
306
298
  [Submit an issue](https://github.com/qBraid/qBraid/issues)
307
- - For discussions, and specific questions about the qBraid-SDK [join our discord community](https://discord.gg/TPBU2sa8Et)
299
+ - For discussions, and specific questions about the qBraid SDK, qBraid Lab, or
300
+ other topics, [join our discord community](https://discord.gg/TPBU2sa8Et)
308
301
  - For questions that are more suited for a forum, post to
309
302
  [Quantum Computing Stack Exchange](https://quantumcomputing.stackexchange.com/)
310
303
  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)
311
307
 
312
308
  ## License
313
309
 
@@ -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>=0.1.0,<0.2.0"
31
+ "qbraid-core==0.1.0.dev3"
32
32
  ]
33
33
  requires-python = ">= 3.9"
34
34
 
@@ -100,8 +100,7 @@ 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",
104
- "**/qbraid/_compat.py",
103
+ "**/qbraid/visualization/draw_circuit.py.py"
105
104
  ]
106
105
 
107
106
  [tool.coverage.paths]
@@ -21,6 +21,7 @@ Functions
21
21
 
22
22
  about
23
23
  get_devices
24
+ refresh_devices
24
25
  get_jobs
25
26
 
26
27
 
@@ -44,11 +45,12 @@ Exceptions
44
45
  """
45
46
  import sys
46
47
 
48
+ from . import _warnings
47
49
  from ._about import about
48
50
  from ._import import LazyLoader
49
51
  from ._version import __version__
50
52
  from .exceptions import QbraidError
51
- from .get_devices import get_devices
53
+ from .get_devices import get_devices, refresh_devices
52
54
  from .get_jobs import get_jobs
53
55
 
54
56
  if "sphinx" in sys.modules:
@@ -72,6 +74,7 @@ __all__ = [
72
74
  "programs",
73
75
  "providers",
74
76
  "QbraidError",
77
+ "refresh_devices",
75
78
  "transpiler",
76
79
  "visualization",
77
80
  ]
@@ -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 import __version__ as qbraid_core_version
25
+ from qbraid_core._version import __version__ as qbraid_core_version
26
26
 
27
27
  from ._version import __version__ as qbraid_version
28
28
 
@@ -0,0 +1 @@
1
+ __version__ = "0.6.0.dev20240404040745"
@@ -9,35 +9,34 @@
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 configuring warnings and logging at top level.
12
+ Module for emitting and disabling warnings at top level.
13
13
 
14
14
  """
15
15
  import logging
16
- import os
17
16
  import warnings
18
17
 
19
- from qbraid_core._compat import check_version
18
+ from qbraid_core._warnings import _check_version
20
19
 
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
- )
20
+ # Set up logging configuration to suppress INFO messages
21
+ logging.basicConfig(level=logging.WARNING)
22
+ logging.getLogger("qiskit").setLevel(logging.WARNING)
29
23
 
30
24
 
31
- def filterwarnings():
25
+ def _filterwarnings():
32
26
  """Filter out warnings that are not relevant to the user."""
33
27
  warnings.filterwarnings("ignore", category=SyntaxWarning)
34
28
  warnings.filterwarnings(
35
29
  "ignore", category=UserWarning, message="Setuptools is replacing distutils"
36
30
  )
37
31
  warnings.filterwarnings("ignore", category=DeprecationWarning)
32
+ # warnings.filterwarnings("ignore", category=PendingDeprecationWarning)
38
33
  warnings.filterwarnings("ignore", category=RuntimeWarning, module="numpy")
39
34
 
40
35
 
41
- def check_warn_version_update():
42
- """Emit a warning if updated package version exists."""
43
- check_version("qbraid")
36
+ def _warn_version():
37
+ """Emit a warning."""
38
+ _check_version("qbraid")
39
+
40
+
41
+ _warn_version()
42
+ _filterwarnings()
@@ -15,20 +15,68 @@ Module to retrieve, update, and display information about devices
15
15
  supported by the qBraid SDK.
16
16
 
17
17
  """
18
- from typing import Any, Dict, List, Optional
18
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
19
+
20
+ from qbraid_core import QbraidSession
21
+ from qbraid_core.services.quantum import QuantumClient, process_device_data
19
22
 
20
23
  try:
21
24
  from IPython.display import HTML, clear_output, display
22
25
  except ImportError:
23
26
  pass
24
27
 
25
- from qbraid_core import QbraidSession
26
- from qbraid_core.services.quantum import QuantumClient, process_device_data
27
-
28
28
  from ._display import running_in_jupyter, update_progress_bar
29
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
30
38
 
31
- def _display_basic(data: List[str], message: str):
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"
71
+
72
+ # get-devices must be a POST request with kwarg `json` (not `data`) to
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)
77
+
78
+
79
+ def _display_basic(data: List[str], message: str) -> None:
32
80
  if len(data) == 0:
33
81
  print(message)
34
82
  else:
@@ -86,34 +134,9 @@ def _display_jupyter(data: List[str], message: Optional[str] = None, align: str
86
134
  return display(HTML(html))
87
135
 
88
136
 
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):
137
+ def get_devices(
138
+ filters: Optional[Dict[str, Any]] = None, refresh: bool = False
139
+ ) -> "Optional[Union[DisplayHandle, Any]]":
117
140
  """Displays a list of all supported devices matching given filters, tabulated by provider,
118
141
  name, and qBraid ID. Each device also has a status given by a solid green bubble or a hollow
119
142
  red bubble, indicating that the device is online or offline, respectively. You can narrow your
@@ -178,25 +201,9 @@ def get_devices(filters: Optional[Dict[str, Any]] = None, refresh: bool = False)
178
201
 
179
202
  """
180
203
  if refresh:
181
- _refresh_devices()
182
-
183
- session = QbraidSession()
204
+ refresh_devices()
184
205
  query = {} if filters is None else filters
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)
206
+ device_data, msg = _get_device_data(query)
200
207
  align = "center" if len(device_data) == 0 else "right"
201
208
 
202
209
  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, Tuple
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 import QuantumClient, process_job_data
28
+ from qbraid_core.services.quantum.adapter import _job_status_msg
29
29
 
30
- from ._display import running_in_jupyter, update_progress_bar
30
+ from qbraid._display import running_in_jupyter, update_progress_bar
31
31
 
32
32
 
33
- def _display_basic(data: List[str], message: str) -> None:
33
+ def _display_jobs_basic(data, msg):
34
34
  if len(data) == 0:
35
- print(message)
35
+ print(msg)
36
36
  else:
37
37
  headers = ["Job ID", "Submitted", "Status"]
38
38
 
@@ -43,7 +43,7 @@ def _display_basic(data: List[str], message: str) -> None:
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"{message}:\n")
46
+ print(f"{msg}:\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_basic(data: List[str], message: str) -> None:
53
53
  print(row_format.format(job_id, timestamp, status))
54
54
 
55
55
 
56
- def _display_jupyter(data: List[str], message: Optional[str] = None, align: str = "right"):
56
+ def _display_jobs_jupyter(data, msg):
57
57
  clear_output(wait=True)
58
58
 
59
59
  html = """<h3>Quantum Jobs</h3><table><tr>
@@ -87,29 +87,43 @@ def _display_jupyter(data: List[str], message: Optional[str] = None, align: str
87
87
  <td style='text-align:left'>{status}</td></tr>
88
88
  """
89
89
 
90
- html += f"<tr><td colspan='4'; style='text-align:{align}'>{message}</td></tr>"
90
+ html += f"<tr><td colspan='4'; style='text-align:right'>{msg}</td></tr>"
91
91
 
92
92
  html += "</table>"
93
93
 
94
94
  return display(HTML(html))
95
95
 
96
96
 
97
- def _refresh_jobs(job_data: List[str]) -> List[str]:
98
- """Refreshes the status of all quantum jobs in the list."""
97
+ def _get_jobs_data(
98
+ query: Dict[str, Any],
99
+ refresh: bool = False,
100
+ session: Optional[QbraidSession] = None,
101
+ ) -> Tuple[List[List[str]], str]:
99
102
  from qbraid.providers import QuantumJob # pylint: disable=import-outside-toplevel
100
103
 
104
+ session = QbraidSession() if not session else session
105
+ jobs = session.post("/get-user-jobs", json=query).json()
101
106
  count = 0
102
- num_jobs = len(job_data)
103
- job_data_refresh = []
104
- for job_id, created_at, status in job_data:
107
+ num_jobs = len(jobs)
108
+ job_data = []
109
+ for document in jobs:
105
110
  count += 1
106
111
  progress = count / num_jobs
107
- update_progress_bar(progress)
112
+ if refresh:
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"))
108
122
  try:
109
123
  status_final = QuantumJob.status_final(status)
110
124
  except Exception: # pylint: disable=broad-except
111
125
  status_final = True
112
- if not status_final:
126
+ if refresh and not status_final:
113
127
  try:
114
128
  qbraid_job = QuantumJob.retrieve(job_id)
115
129
  with warnings.catch_warnings():
@@ -118,12 +132,19 @@ def _refresh_jobs(job_data: List[str]) -> List[str]:
118
132
  status = status_obj.name
119
133
  except Exception: # pylint: disable=broad-except
120
134
  pass
121
- job_data_refresh.append([job_id, created_at, status])
135
+ job_data.append([job_id, created_at, status])
122
136
 
123
- return job_data_refresh
137
+ msg = _job_status_msg(num_jobs, query)
124
138
 
139
+ return job_data, msg
125
140
 
126
- def get_jobs(filters: Optional[Dict[str, Any]] = None, refresh: bool = False, raw: bool = False):
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
127
148
  """Displays a list of quantum jobs submitted by user, tabulated by job ID,
128
149
  the date/time it was submitted, and status. You can specify filters to
129
150
  narrow the search by supplying a dictionary containing the desired criteria.
@@ -161,28 +182,17 @@ def get_jobs(filters: Optional[Dict[str, Any]] = None, refresh: bool = False, ra
161
182
  filters (dict): A dictionary containing any filters to be applied.
162
183
  refresh (bool): If True, refreshes the status of all jobs before displaying them.
163
184
  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.
164
186
 
165
187
  """
166
188
  filters = filters or {}
167
189
 
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)
190
+ job_data, msg = _get_jobs_data(filters, refresh, session)
180
191
 
181
192
  if raw:
182
- return [job[0] for job in job_data]
183
-
184
- align = "center" if len(job_data) == 0 else "right"
193
+ job_ids = [job[0] for job in job_data]
194
+ return job_ids
185
195
 
186
196
  if running_in_jupyter():
187
- return _display_jupyter(job_data, msg, align=align)
188
- return _display_basic(job_data, msg)
197
+ return _display_jobs_jupyter(job_data, msg)
198
+ return _display_jobs_basic(job_data, msg)
@@ -31,10 +31,6 @@ 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
34
 
39
35
  Classes
40
36
  --------
@@ -60,5 +56,3 @@ from .abc_program import QuantumProgram
60
56
  from .exceptions import PackageValueError, ProgramTypeError, QasmError
61
57
  from .inspector import get_program_type, get_qasm_version
62
58
  from .loader import load_program
63
- from .qasm_passes import flatten_qasm_program, remove_qasm_barriers, unfold_qasm_gate_defs
64
- from .qasm_qelib1 import decompose_qasm_qelib1
@@ -24,8 +24,6 @@ from qbraid.providers.job import QuantumJob
24
24
  from .result import BraketGateModelResult
25
25
  from .tracker import get_quantum_task_cost
26
26
 
27
- logger = logging.getLogger(__name__)
28
-
29
27
 
30
28
  class AmazonBraketVersionError(Exception):
31
29
  """Exception raised for Amazon Braket SDK errors due to versioning."""
@@ -65,7 +63,7 @@ class BraketQuantumTask(QuantumJob):
65
63
  def result(self) -> BraketGateModelResult:
66
64
  """Return the results of the job."""
67
65
  if self.status() not in JOB_FINAL:
68
- logger.info("Result will be available when job has reached final state.")
66
+ logging.info("Result will be available when job has reached final state.")
69
67
  return BraketGateModelResult(self._job.result())
70
68
 
71
69
  def cancel(self) -> None:
@@ -23,9 +23,10 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
23
23
  from qbraid_core.services.quantum import QuantumClient, quantum_lib_proxy_state
24
24
 
25
25
  from qbraid.programs import get_program_type, load_program
26
- from qbraid.transpiler import CircuitConversionError, transpile
26
+ from qbraid.providers.enums import DeviceType
27
+ from qbraid.transpiler import transpile
28
+ from qbraid.transpiler.exceptions import CircuitConversionError
27
29
 
28
- from .enums import DeviceType
29
30
  from .exceptions import ProgramValidationError, QbraidRuntimeError
30
31
  from .job import QuantumJob
31
32
 
@@ -35,9 +36,6 @@ if TYPE_CHECKING:
35
36
  import qbraid.transpiler
36
37
 
37
38
 
38
- logger = logging.getLogger(__name__)
39
-
40
-
41
39
  class QuantumDevice(ABC):
42
40
  """Abstract interface for device-like classes."""
43
41
 
@@ -69,7 +67,7 @@ class QuantumDevice(ABC):
69
67
  device = client.get_device(vendor_id=self._vendor_id)
70
68
  self._id = device["qbraid_id"]
71
69
  except Exception as err: # pylint: disable=broad-exception-caught
72
- logger.info(
70
+ logging.info(
73
71
  "Error retrieving device ID from qBraid API: %s. "
74
72
  "Field will be ommited in job metadata",
75
73
  err,
@@ -196,7 +194,7 @@ class QuantumDevice(ABC):
196
194
  except Exception as err: # pylint: disable=broad-exception-caught
197
195
  if not safe_mode:
198
196
  raise
199
- logger.info("Error verifying run input: %s.", err)
197
+ logging.info("Error verifying run input: %s.", err)
200
198
  return None
201
199
 
202
200
  def transpile(
@@ -242,6 +240,7 @@ class QuantumDevice(ABC):
242
240
  run_input: "qbraid.programs.QPROGRAM",
243
241
  auto_compile: bool = False,
244
242
  conversion_graph: "Optional[qbraid.transpiler.ConversionGraph]" = None,
243
+ log_level=logging.INFO,
245
244
  ) -> Tuple[Any, Dict[str, Any]]:
246
245
  """Process quantum program before passing to device run method.
247
246
 
@@ -265,13 +264,13 @@ class QuantumDevice(ABC):
265
264
  except Exception as err: # pylint: disable=broad-exception-caught
266
265
  if not safe_mode:
267
266
  raise
268
- logger.info("Error loading run input: %s", err)
267
+ logging.log(log_level, "Error loading run input: %s", err)
269
268
 
270
269
  def try_extracting_info(lambda_expression, error_message):
271
270
  try:
272
271
  return lambda_expression()
273
- except Exception: # pylint: disable=broad-exception-caught
274
- logger.info(error_message)
272
+ except Exception as err: # pylint: disable=broad-exception-caught
273
+ logging.log(log_level, error_message, err)
275
274
  return None
276
275
 
277
276
  num_qubits = try_extracting_info(
@@ -23,8 +23,6 @@ from qbraid.providers.job import QuantumJob
23
23
 
24
24
  from .result import QiskitResult
25
25
 
26
- logger = logging.getLogger(__name__)
27
-
28
26
 
29
27
  class QiskitJob(QuantumJob):
30
28
  """Wrapper class for IBM Qiskit ``Job`` objects."""
@@ -52,7 +50,7 @@ class QiskitJob(QuantumJob):
52
50
  def result(self):
53
51
  """Return the results of the job."""
54
52
  if self.status() not in JOB_FINAL:
55
- logger.info("Result will be available when job has reached final state.")
53
+ logging.info("Result will be available when job has reached final state.")
56
54
  return QiskitResult(self._job.result())
57
55
 
58
56
  def cancel(self):
@@ -91,8 +91,7 @@ class QiskitProvider(QiskitRemoteService):
91
91
 
92
92
  def save_config(self):
93
93
  """Save the current configuration."""
94
- provider = self._get_ibm_provider()
95
- provider.save_account(token=self.qiskit_ibm_token, overwrite=True)
94
+ raise NotImplementedError
96
95
 
97
96
  def _get_ibm_provider(self, **kwargs) -> "qiskit_ibm_provider.IBMProvider":
98
97
  """Returns the IBM Quantum provider."""