luna-quantum 1.1.0__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. luna_quantum/__init__.py +139 -0
  2. luna_quantum/__init__.pyi +98 -0
  3. luna_quantum/_core.cp312-win_amd64.pyd +0 -0
  4. luna_quantum/_core.pyi +4286 -0
  5. luna_quantum/_utility.py +148 -0
  6. luna_quantum/_utility.pyi +20 -0
  7. luna_quantum/algorithms/__init__.py +1 -0
  8. luna_quantum/aqm_overwrites/__init__.py +3 -0
  9. luna_quantum/aqm_overwrites/model.py +184 -0
  10. luna_quantum/backends/__init__.py +1 -0
  11. luna_quantum/client/__init__.py +0 -0
  12. luna_quantum/client/controllers/__init__.py +4 -0
  13. luna_quantum/client/controllers/luna_http_client.py +37 -0
  14. luna_quantum/client/controllers/luna_platform_client.py +256 -0
  15. luna_quantum/client/controllers/luna_q.py +67 -0
  16. luna_quantum/client/controllers/luna_solve.py +129 -0
  17. luna_quantum/client/error/__init__.py +0 -0
  18. luna_quantum/client/error/luna_api_key_invalid_error.py +10 -0
  19. luna_quantum/client/error/luna_api_key_missing_error.py +10 -0
  20. luna_quantum/client/error/luna_error.py +2 -0
  21. luna_quantum/client/error/luna_server_error.py +20 -0
  22. luna_quantum/client/error/timeout_error.py +12 -0
  23. luna_quantum/client/error/transformation_error.py +18 -0
  24. luna_quantum/client/error/utils/__init__.py +0 -0
  25. luna_quantum/client/error/utils/http_error_utils.py +112 -0
  26. luna_quantum/client/interfaces/__init__.py +4 -0
  27. luna_quantum/client/interfaces/clients/__init__.py +25 -0
  28. luna_quantum/client/interfaces/clients/circuit_rest_client_i.py +68 -0
  29. luna_quantum/client/interfaces/clients/info_rest_client_i.py +53 -0
  30. luna_quantum/client/interfaces/clients/model_rest_client_i.py +139 -0
  31. luna_quantum/client/interfaces/clients/qpu_token_rest_client_i.py +364 -0
  32. luna_quantum/client/interfaces/clients/rest_client_i.py +21 -0
  33. luna_quantum/client/interfaces/clients/solve_job_rest_client_i.py +201 -0
  34. luna_quantum/client/interfaces/clients/users_rest_client_i.py +29 -0
  35. luna_quantum/client/interfaces/services/__init__.py +0 -0
  36. luna_quantum/client/interfaces/services/luna_q_i.py +34 -0
  37. luna_quantum/client/interfaces/services/luna_solve_i.py +72 -0
  38. luna_quantum/client/interfaces/services/service_i.py +56 -0
  39. luna_quantum/client/rest_client/__init__.py +15 -0
  40. luna_quantum/client/rest_client/circuit_rest_client.py +107 -0
  41. luna_quantum/client/rest_client/info_rest_client.py +74 -0
  42. luna_quantum/client/rest_client/model_rest_client.py +216 -0
  43. luna_quantum/client/rest_client/qpu_token_rest_client.py +508 -0
  44. luna_quantum/client/rest_client/solve_job_rest_client.py +286 -0
  45. luna_quantum/client/rest_client/users_rest_client.py +35 -0
  46. luna_quantum/client/schemas/__init__.py +26 -0
  47. luna_quantum/client/schemas/circuit.py +48 -0
  48. luna_quantum/client/schemas/create/__init__.py +15 -0
  49. luna_quantum/client/schemas/create/circuit.py +30 -0
  50. luna_quantum/client/schemas/create/optimization.py +39 -0
  51. luna_quantum/client/schemas/create/qpu_token.py +22 -0
  52. luna_quantum/client/schemas/create/qpu_token_time_quota.py +35 -0
  53. luna_quantum/client/schemas/create/qpu_token_time_quota_update.py +24 -0
  54. luna_quantum/client/schemas/create/qubo.py +19 -0
  55. luna_quantum/client/schemas/create/solve_job_create.py +43 -0
  56. luna_quantum/client/schemas/enums/__init__.py +0 -0
  57. luna_quantum/client/schemas/enums/call_style.py +13 -0
  58. luna_quantum/client/schemas/enums/circuit.py +42 -0
  59. luna_quantum/client/schemas/enums/model_format.py +11 -0
  60. luna_quantum/client/schemas/enums/problem.py +50 -0
  61. luna_quantum/client/schemas/enums/qpu_token_type.py +20 -0
  62. luna_quantum/client/schemas/enums/sense.py +8 -0
  63. luna_quantum/client/schemas/enums/status.py +40 -0
  64. luna_quantum/client/schemas/enums/timeframe.py +11 -0
  65. luna_quantum/client/schemas/error_message.py +14 -0
  66. luna_quantum/client/schemas/model_metadata.py +35 -0
  67. luna_quantum/client/schemas/qpu_token/__init__.py +0 -0
  68. luna_quantum/client/schemas/qpu_token/qpu_token.py +154 -0
  69. luna_quantum/client/schemas/qpu_token/qpu_token_source.py +19 -0
  70. luna_quantum/client/schemas/qpu_token/qpu_token_time_quota.py +30 -0
  71. luna_quantum/client/schemas/qpu_token/token_provider.py +132 -0
  72. luna_quantum/client/schemas/representation.py +19 -0
  73. luna_quantum/client/schemas/solution.py +106 -0
  74. luna_quantum/client/schemas/solve_job.py +50 -0
  75. luna_quantum/client/schemas/solver_info.py +11 -0
  76. luna_quantum/client/schemas/user.py +11 -0
  77. luna_quantum/client/schemas/wrappers/__init__.py +5 -0
  78. luna_quantum/client/schemas/wrappers/datetime_wrapper.py +32 -0
  79. luna_quantum/client/utils/__init__.py +0 -0
  80. luna_quantum/client/utils/qpu_token_utils.py +147 -0
  81. luna_quantum/config.py +11 -0
  82. luna_quantum/decorators.py +248 -0
  83. luna_quantum/errors.py +34 -0
  84. luna_quantum/errors.pyi +287 -0
  85. luna_quantum/exceptions/__init__.py +0 -0
  86. luna_quantum/exceptions/base_luna_quantum_error.py +2 -0
  87. luna_quantum/exceptions/luna_quantum_call_type_error.py +9 -0
  88. luna_quantum/exceptions/patch_class_field_exists_error.py +10 -0
  89. luna_quantum/factories/__init__.py +4 -0
  90. luna_quantum/factories/luna_solve_client_factory.py +100 -0
  91. luna_quantum/factories/usecase_factory.py +489 -0
  92. luna_quantum/py.typed +0 -0
  93. luna_quantum/solve/__init__.py +13 -0
  94. luna_quantum/solve/default_token.py +304 -0
  95. luna_quantum/solve/domain/__init__.py +0 -0
  96. luna_quantum/solve/domain/abstract/__init__.py +4 -0
  97. luna_quantum/solve/domain/abstract/luna_algorithm.py +205 -0
  98. luna_quantum/solve/domain/abstract/qpu_token_backend.py +34 -0
  99. luna_quantum/solve/domain/model_metadata.py +56 -0
  100. luna_quantum/solve/domain/solve_job.py +230 -0
  101. luna_quantum/solve/errors/__init__.py +0 -0
  102. luna_quantum/solve/errors/incompatible_backend_error.py +15 -0
  103. luna_quantum/solve/errors/model_metadata_missing_error.py +11 -0
  104. luna_quantum/solve/errors/solve_base_error.py +5 -0
  105. luna_quantum/solve/errors/token_missing_error.py +11 -0
  106. luna_quantum/solve/interfaces/__init__.py +0 -0
  107. luna_quantum/solve/interfaces/algorithm_i.py +49 -0
  108. luna_quantum/solve/interfaces/backend_i.py +28 -0
  109. luna_quantum/solve/interfaces/usecases/__init__.py +59 -0
  110. luna_quantum/solve/interfaces/usecases/model_delete_usecase_i.py +27 -0
  111. luna_quantum/solve/interfaces/usecases/model_fetch_metadata_usecase_i.py +33 -0
  112. luna_quantum/solve/interfaces/usecases/model_get_solutions_usecase_i.py +33 -0
  113. luna_quantum/solve/interfaces/usecases/model_get_solve_jobs_usecase_i.py +33 -0
  114. luna_quantum/solve/interfaces/usecases/model_load_by_id_usecase_i.py +32 -0
  115. luna_quantum/solve/interfaces/usecases/model_load_by_metadata_usecase_i.py +37 -0
  116. luna_quantum/solve/interfaces/usecases/model_load_metadata_by_hash_usecase_i.py +38 -0
  117. luna_quantum/solve/interfaces/usecases/model_save_usecase_i.py +36 -0
  118. luna_quantum/solve/interfaces/usecases/solve_job_cancel_usecase_i.py +33 -0
  119. luna_quantum/solve/interfaces/usecases/solve_job_create_usecase_i.py +44 -0
  120. luna_quantum/solve/interfaces/usecases/solve_job_delete_usecase_i.py +32 -0
  121. luna_quantum/solve/interfaces/usecases/solve_job_fetch_updates_usecase_i.py +38 -0
  122. luna_quantum/solve/interfaces/usecases/solve_job_get_by_id_usecase_i.py +27 -0
  123. luna_quantum/solve/interfaces/usecases/solve_job_get_result_usecase_i.py +63 -0
  124. luna_quantum/solve/parameters/__init__.py +0 -0
  125. luna_quantum/solve/parameters/algorithms/__init__.py +51 -0
  126. luna_quantum/solve/parameters/algorithms/base_params/__init__.py +24 -0
  127. luna_quantum/solve/parameters/algorithms/base_params/decomposer.py +57 -0
  128. luna_quantum/solve/parameters/algorithms/base_params/qaoa_circuit_params.py +95 -0
  129. luna_quantum/solve/parameters/algorithms/base_params/quantum_annealing_params.py +79 -0
  130. luna_quantum/solve/parameters/algorithms/base_params/scipy_optimizer.py +122 -0
  131. luna_quantum/solve/parameters/algorithms/base_params/simulated_annealing_params.py +106 -0
  132. luna_quantum/solve/parameters/algorithms/base_params/tabu_kerberos_params.py +39 -0
  133. luna_quantum/solve/parameters/algorithms/base_params/tabu_search_params.py +129 -0
  134. luna_quantum/solve/parameters/algorithms/flexible_parameter_algorithm.py +59 -0
  135. luna_quantum/solve/parameters/algorithms/genetic_algorithms/__init__.py +4 -0
  136. luna_quantum/solve/parameters/algorithms/genetic_algorithms/qaga.py +131 -0
  137. luna_quantum/solve/parameters/algorithms/genetic_algorithms/saga.py +139 -0
  138. luna_quantum/solve/parameters/algorithms/lq_fda/__init__.py +3 -0
  139. luna_quantum/solve/parameters/algorithms/lq_fda/fujits_da_base.py +85 -0
  140. luna_quantum/solve/parameters/algorithms/lq_fda/fujitsu_da_v3c.py +155 -0
  141. luna_quantum/solve/parameters/algorithms/optimization_solvers/__init__.py +3 -0
  142. luna_quantum/solve/parameters/algorithms/optimization_solvers/scip.py +51 -0
  143. luna_quantum/solve/parameters/algorithms/quantum_annealing/__init__.py +19 -0
  144. luna_quantum/solve/parameters/algorithms/quantum_annealing/kerberos.py +149 -0
  145. luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_bqm.py +75 -0
  146. luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_cqm.py +75 -0
  147. luna_quantum/solve/parameters/algorithms/quantum_annealing/parallel_tempering_qpu.py +139 -0
  148. luna_quantum/solve/parameters/algorithms/quantum_annealing/population_annealing_qpu.py +109 -0
  149. luna_quantum/solve/parameters/algorithms/quantum_annealing/qbsolv_like_qpu.py +111 -0
  150. luna_quantum/solve/parameters/algorithms/quantum_annealing/quantum_annealing.py +121 -0
  151. luna_quantum/solve/parameters/algorithms/quantum_annealing/repeated_reverse_quantum_annealing.py +174 -0
  152. luna_quantum/solve/parameters/algorithms/quantum_gate/__init__.py +6 -0
  153. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/__init__.py +10 -0
  154. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/__init__.py +29 -0
  155. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/config.py +58 -0
  156. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/flexqaoa.py +188 -0
  157. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/optimizers.py +53 -0
  158. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/pipeline.py +164 -0
  159. luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa.py +112 -0
  160. luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa_fo.py +69 -0
  161. luna_quantum/solve/parameters/algorithms/quantum_gate/vqe.py +108 -0
  162. luna_quantum/solve/parameters/algorithms/search_algorithms/__init__.py +5 -0
  163. luna_quantum/solve/parameters/algorithms/search_algorithms/dialectic_search.py +136 -0
  164. luna_quantum/solve/parameters/algorithms/search_algorithms/qbsolv_like_tabu_search.py +117 -0
  165. luna_quantum/solve/parameters/algorithms/search_algorithms/tabu_search.py +126 -0
  166. luna_quantum/solve/parameters/algorithms/simulated_annealing/__init__.py +13 -0
  167. luna_quantum/solve/parameters/algorithms/simulated_annealing/parallel_tempering.py +131 -0
  168. luna_quantum/solve/parameters/algorithms/simulated_annealing/population_annealing.py +95 -0
  169. luna_quantum/solve/parameters/algorithms/simulated_annealing/qbsolv_like_simulated_annealing.py +141 -0
  170. luna_quantum/solve/parameters/algorithms/simulated_annealing/repeated_reverse_simulated_annealing.py +172 -0
  171. luna_quantum/solve/parameters/algorithms/simulated_annealing/simulated_annealing.py +126 -0
  172. luna_quantum/solve/parameters/backends/__init__.py +27 -0
  173. luna_quantum/solve/parameters/backends/aqarios.py +17 -0
  174. luna_quantum/solve/parameters/backends/aqarios_gpu.py +17 -0
  175. luna_quantum/solve/parameters/backends/aws/__init__.py +11 -0
  176. luna_quantum/solve/parameters/backends/aws/aws.py +36 -0
  177. luna_quantum/solve/parameters/backends/aws/aws_backend_base.py +74 -0
  178. luna_quantum/solve/parameters/backends/aws/ionq.py +43 -0
  179. luna_quantum/solve/parameters/backends/aws/iqm.py +31 -0
  180. luna_quantum/solve/parameters/backends/aws/rigetti.py +31 -0
  181. luna_quantum/solve/parameters/backends/cudaq/__init__.py +5 -0
  182. luna_quantum/solve/parameters/backends/cudaq/cudaq_base.py +16 -0
  183. luna_quantum/solve/parameters/backends/cudaq/cudaq_cpu.py +30 -0
  184. luna_quantum/solve/parameters/backends/cudaq/cudaq_gpu.py +32 -0
  185. luna_quantum/solve/parameters/backends/dwave.py +17 -0
  186. luna_quantum/solve/parameters/backends/dwave_qpu.py +166 -0
  187. luna_quantum/solve/parameters/backends/fda.py +17 -0
  188. luna_quantum/solve/parameters/backends/ibm.py +138 -0
  189. luna_quantum/solve/parameters/backends/qctrl.py +103 -0
  190. luna_quantum/solve/parameters/backends/zib.py +17 -0
  191. luna_quantum/solve/parameters/constants.py +11 -0
  192. luna_quantum/solve/parameters/errors.py +30 -0
  193. luna_quantum/solve/parameters/mixins/__init__.py +0 -0
  194. luna_quantum/solve/parameters/mixins/fujitsu_common_params_mixin.py +239 -0
  195. luna_quantum/solve/parameters/mixins/fujitsu_v2_mixin.py +70 -0
  196. luna_quantum/solve/parameters/mixins/qbsolv_like_mixin.py +60 -0
  197. luna_quantum/solve/use_cases/__init__.py +119 -0
  198. luna_quantum/solve/use_cases/arbitrage_edge_based.py +50 -0
  199. luna_quantum/solve/use_cases/arbitrage_node_based.py +55 -0
  200. luna_quantum/solve/use_cases/base.py +7 -0
  201. luna_quantum/solve/use_cases/binary_integer_linear_programming.py +54 -0
  202. luna_quantum/solve/use_cases/binary_paint_shop_problem.py +37 -0
  203. luna_quantum/solve/use_cases/credit_scoring_feature_selection.py +40 -0
  204. luna_quantum/solve/use_cases/dynamic_portfolio_optimization.py +64 -0
  205. luna_quantum/solve/use_cases/exact_cover.py +51 -0
  206. luna_quantum/solve/use_cases/flight_gate_assignment.py +79 -0
  207. luna_quantum/solve/use_cases/graph_coloring.py +42 -0
  208. luna_quantum/solve/use_cases/graph_isomorphism.py +52 -0
  209. luna_quantum/solve/use_cases/graph_partitioning.py +46 -0
  210. luna_quantum/solve/use_cases/hamiltonian_cycle.py +49 -0
  211. luna_quantum/solve/use_cases/induced_subgraph_isomorphism.py +50 -0
  212. luna_quantum/solve/use_cases/job_shop_scheduling.py +44 -0
  213. luna_quantum/solve/use_cases/k_medoids_clustering.py +49 -0
  214. luna_quantum/solve/use_cases/knapsack_integer_weights.py +56 -0
  215. luna_quantum/solve/use_cases/linear_regression.py +60 -0
  216. luna_quantum/solve/use_cases/lmwcs.py +84 -0
  217. luna_quantum/solve/use_cases/longest_path.py +50 -0
  218. luna_quantum/solve/use_cases/market_graph_clustering.py +61 -0
  219. luna_quantum/solve/use_cases/max2sat.py +54 -0
  220. luna_quantum/solve/use_cases/max3sat.py +55 -0
  221. luna_quantum/solve/use_cases/max_clique.py +60 -0
  222. luna_quantum/solve/use_cases/max_cut.py +48 -0
  223. luna_quantum/solve/use_cases/max_independent_set.py +37 -0
  224. luna_quantum/solve/use_cases/minimal_maximal_matching.py +54 -0
  225. luna_quantum/solve/use_cases/minimal_spanning_tree.py +90 -0
  226. luna_quantum/solve/use_cases/minimum_vertex_cover.py +45 -0
  227. luna_quantum/solve/use_cases/number_partitioning.py +32 -0
  228. luna_quantum/solve/use_cases/portfolio_optimization.py +46 -0
  229. luna_quantum/solve/use_cases/portfolio_optimization_ib_tv.py +63 -0
  230. luna_quantum/solve/use_cases/quadratic_assignment.py +49 -0
  231. luna_quantum/solve/use_cases/quadratic_knapsack.py +48 -0
  232. luna_quantum/solve/use_cases/satellite_scheduling.py +73 -0
  233. luna_quantum/solve/use_cases/sensor_placement.py +58 -0
  234. luna_quantum/solve/use_cases/set_cover.py +56 -0
  235. luna_quantum/solve/use_cases/set_packing.py +54 -0
  236. luna_quantum/solve/use_cases/set_partitioning.py +52 -0
  237. luna_quantum/solve/use_cases/subgraph_isomorphism.py +55 -0
  238. luna_quantum/solve/use_cases/subset_sum.py +37 -0
  239. luna_quantum/solve/use_cases/support_vector_machine.py +64 -0
  240. luna_quantum/solve/use_cases/traffic_flow.py +35 -0
  241. luna_quantum/solve/use_cases/travelling_salesman_problem.py +53 -0
  242. luna_quantum/solve/use_cases/type_aliases.py +9 -0
  243. luna_quantum/solve/use_cases/weighted_max_cut.py +37 -0
  244. luna_quantum/solve/usecases/__init__.py +45 -0
  245. luna_quantum/solve/usecases/model_delete_usecase.py +49 -0
  246. luna_quantum/solve/usecases/model_fetch_metadata_usecase.py +50 -0
  247. luna_quantum/solve/usecases/model_get_solution_usecase.py +59 -0
  248. luna_quantum/solve/usecases/model_get_solve_jobs_usecase.py +62 -0
  249. luna_quantum/solve/usecases/model_load_by_id_usecase.py +47 -0
  250. luna_quantum/solve/usecases/model_load_by_metadata_usecase.py +52 -0
  251. luna_quantum/solve/usecases/model_load_metadata_by_hash_usecase.py +51 -0
  252. luna_quantum/solve/usecases/model_save_usecase.py +63 -0
  253. luna_quantum/solve/usecases/solve_job_cancel_usecase.py +51 -0
  254. luna_quantum/solve/usecases/solve_job_create_usecase.py +112 -0
  255. luna_quantum/solve/usecases/solve_job_delete_usecase.py +38 -0
  256. luna_quantum/solve/usecases/solve_job_fetch_updates_usecase.py +49 -0
  257. luna_quantum/solve/usecases/solve_job_get_by_id_usecase.py +44 -0
  258. luna_quantum/solve/usecases/solve_job_get_result_usecase.py +105 -0
  259. luna_quantum/transformations.py +18 -0
  260. luna_quantum/transformations.pyi +371 -0
  261. luna_quantum/translator.py +23 -0
  262. luna_quantum/translator.pyi +869 -0
  263. luna_quantum/util/__init__.py +0 -0
  264. luna_quantum/util/active_waiting.py +79 -0
  265. luna_quantum/util/class_patcher.py +164 -0
  266. luna_quantum/util/debug_info.py +52 -0
  267. luna_quantum/util/log_utils.py +187 -0
  268. luna_quantum/util/pretty_base.py +67 -0
  269. luna_quantum/util/pydantic_utils.py +38 -0
  270. luna_quantum/utils.py +3 -0
  271. luna_quantum/utils.pyi +67 -0
  272. luna_quantum-1.1.0.dist-info/METADATA +36 -0
  273. luna_quantum-1.1.0.dist-info/RECORD +276 -0
  274. luna_quantum-1.1.0.dist-info/WHEEL +4 -0
  275. luna_quantum-1.1.0.dist-info/licenses/LICENSE +176 -0
  276. luna_quantum-1.1.0.dist-info/licenses/NOTICE +13 -0
@@ -0,0 +1,67 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from luna_quantum.client.controllers.luna_platform_client import (
6
+ LunaPlatformClient,
7
+ LunaPrefixEnum,
8
+ )
9
+ from luna_quantum.client.interfaces.services.luna_q_i import ILunaQ
10
+ from luna_quantum.client.rest_client import CircuitRestClient, QpuTokenRestClient
11
+
12
+ if TYPE_CHECKING:
13
+ from luna_quantum.client.interfaces.clients import ICircuitRestClient
14
+ from luna_quantum.client.interfaces.clients.qpu_token_rest_client_i import (
15
+ IQpuTokenRestClient,
16
+ )
17
+
18
+
19
+ class LunaQ(LunaPlatformClient, ILunaQ):
20
+ """Implementation of LunaQ service."""
21
+
22
+ qpu_token: IQpuTokenRestClient = None # type: ignore[assignment]
23
+ circuit: ICircuitRestClient = None # type: ignore[assignment]
24
+
25
+ def __init__(
26
+ self, api_key: str | None = None, timeout: float | None = 240.0
27
+ ) -> None:
28
+ """
29
+ LunaQ is the main entrypoint for all LunaQ related tasks.
30
+
31
+ Parameters
32
+ ----------
33
+ api_key: str
34
+ User's API key
35
+ timeout: float
36
+ Default timeout in seconds for the requests via the LunaQ client. `None`
37
+ means that the SDK uses no timeouts. Note that either way the Luna platform
38
+ itself will time out after 240 seconds.
39
+ Default: 240.0
40
+ """
41
+ super().__init__(api_key=api_key, timeout=timeout)
42
+
43
+ self.circuit = CircuitRestClient(self)
44
+ self.qpu_token = QpuTokenRestClient(self)
45
+
46
+ @classmethod
47
+ def get_api(cls) -> LunaPrefixEnum:
48
+ """Return the api of the client."""
49
+ return LunaPrefixEnum.LUNA_Q
50
+
51
+ @classmethod
52
+ def authenticate(cls, api_key: str) -> None:
53
+ """
54
+ Authenticate the client with the given API key.
55
+
56
+ Parameters
57
+ ----------
58
+ api_key : str
59
+ The API key used to authenticate the client.
60
+
61
+ Returns
62
+ -------
63
+ None
64
+ This method does not return any value.
65
+ """
66
+ cls(api_key=api_key)
67
+ cls._api_key = api_key
@@ -0,0 +1,129 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from luna_quantum.client.controllers.luna_platform_client import (
6
+ LunaPlatformClient,
7
+ LunaPrefixEnum,
8
+ )
9
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
10
+ from luna_quantum.client.rest_client.info_rest_client import InfoRestClient
11
+ from luna_quantum.client.rest_client.model_rest_client import (
12
+ ModelRestClient,
13
+ )
14
+ from luna_quantum.client.rest_client.qpu_token_rest_client import QpuTokenRestClient
15
+ from luna_quantum.client.rest_client.solve_job_rest_client import SolveJobRestClient
16
+
17
+ if TYPE_CHECKING:
18
+ from luna_quantum.client.interfaces.clients import ISolveJobRestClient
19
+ from luna_quantum.client.interfaces.clients.info_rest_client_i import (
20
+ IInfoRestClient,
21
+ )
22
+ from luna_quantum.client.interfaces.clients.model_rest_client_i import (
23
+ IModelRestClient,
24
+ )
25
+ from luna_quantum.client.interfaces.clients.qpu_token_rest_client_i import (
26
+ IQpuTokenRestClient,
27
+ )
28
+
29
+
30
+ class LunaSolve(LunaPlatformClient, ILunaSolve):
31
+ """Implementation of LunaSolve service."""
32
+
33
+ _model: IModelRestClient
34
+ _solve_job: ISolveJobRestClient
35
+ _qpu_token: IQpuTokenRestClient
36
+ _info: IInfoRestClient
37
+
38
+ def __init__(
39
+ self, api_key: str | None = None, timeout: float | None = 240.0
40
+ ) -> None:
41
+ """
42
+ LunaSolve is the main entrypoint for all LunaSolve related tasks.
43
+
44
+ Parameters
45
+ ----------
46
+ api_key: str
47
+ User's API key
48
+ timeout: float
49
+ Default timeout in seconds for the requests via the LunaQ client. `None`
50
+ means that the SDK uses no timeouts. Note that either way the Luna platform
51
+ itself will time out after 240 seconds.
52
+ Default: 240.0
53
+ """
54
+ super().__init__(
55
+ api_key=api_key,
56
+ timeout=timeout,
57
+ )
58
+
59
+ self._model = ModelRestClient(self)
60
+ self._solve_job = SolveJobRestClient(self)
61
+ self._qpu_token = QpuTokenRestClient(self)
62
+ self._info = InfoRestClient(self)
63
+
64
+ @classmethod
65
+ def get_api(cls) -> LunaPrefixEnum:
66
+ """Return the api of the client."""
67
+ return LunaPrefixEnum.LUNA_SOLVE
68
+
69
+ @classmethod
70
+ def authenticate(cls, api_key: str) -> None:
71
+ """
72
+ Authenticate the client with the given API key.
73
+
74
+ Parameters
75
+ ----------
76
+ api_key : str
77
+ The API key used to authenticate the client.
78
+
79
+ Returns
80
+ -------
81
+ None
82
+ This method does not return any value.
83
+ """
84
+ cls(api_key=api_key)
85
+ cls._api_key = api_key
86
+
87
+ @property
88
+ def model(self) -> IModelRestClient:
89
+ """
90
+ Returns a model rest client.
91
+
92
+ Returns
93
+ -------
94
+ IModelRestClient
95
+ """
96
+ return self._model
97
+
98
+ @property
99
+ def solve_job(self) -> ISolveJobRestClient:
100
+ """
101
+ Returns a solve job rest client.
102
+
103
+ Returns
104
+ -------
105
+ ISolveJobRestClient
106
+ """
107
+ return self._solve_job
108
+
109
+ @property
110
+ def qpu_token(self) -> IQpuTokenRestClient:
111
+ """
112
+ Returns a qpu token rest client.
113
+
114
+ Returns
115
+ -------
116
+ IQpuTokenRestClient
117
+ """
118
+ return self._qpu_token
119
+
120
+ @property
121
+ def info(self) -> IInfoRestClient:
122
+ """
123
+ Returns an info rest client.
124
+
125
+ Returns
126
+ -------
127
+ IInfoRestClient
128
+ """
129
+ return self._info
File without changes
@@ -0,0 +1,10 @@
1
+ from luna_quantum.client.error.luna_error import LunaError
2
+
3
+
4
+ class LunaApiKeyInvalidError(LunaError):
5
+ """Raised when the Luna API key is invalid."""
6
+
7
+ def __init__(self) -> None:
8
+ super().__init__(
9
+ "Luna API key is invalid. Please provide a valid Luna API key."
10
+ )
@@ -0,0 +1,10 @@
1
+ from luna_quantum.client.error.luna_error import LunaError
2
+
3
+
4
+ class LunaApiKeyMissingError(LunaError):
5
+ """Raised when the Luna API key is missing."""
6
+
7
+ def __init__(self) -> None:
8
+ super().__init__(
9
+ "Luna API key is missing. Please set the LUNA_API_KEY environment variable."
10
+ )
@@ -0,0 +1,2 @@
1
+ class LunaError(Exception):
2
+ """Base exception for all exceptions in the Luna SDK."""
@@ -0,0 +1,20 @@
1
+ from luna_quantum.client.error.luna_error import LunaError
2
+ from luna_quantum.client.schemas.error_message import ErrorMessage
3
+
4
+
5
+ class LunaServerError(LunaError):
6
+ """Luna HTTP server error."""
7
+
8
+ http_status_code: int
9
+ error_message: ErrorMessage
10
+
11
+ def __init__(self, http_status_code: int, error_message: ErrorMessage) -> None:
12
+ self.http_status_code = http_status_code
13
+ self.error_message = error_message
14
+ super().__init__(error_message.message)
15
+
16
+ def __str__(self) -> str: # noqa: D105
17
+ return (
18
+ f"The Luna-Server reported the error '{self.error_message.internal_code}' "
19
+ f"with the message:\n {self.error_message.message}"
20
+ )
@@ -0,0 +1,12 @@
1
+ from luna_quantum.client.error.luna_error import LunaError
2
+
3
+
4
+ class LunaTimeoutError(LunaError):
5
+ """Luna timeout error."""
6
+
7
+ def __init__(self) -> None:
8
+ super().__init__(
9
+ "Luna Timeout. The request took too long to complete."
10
+ " Please increase timeout value or try again later."
11
+ " If the problem persists, please contact our support team."
12
+ )
@@ -0,0 +1,18 @@
1
+ from luna_quantum.client.error.luna_error import LunaError
2
+
3
+
4
+ class TransformationError(LunaError):
5
+ """Luna transformation error."""
6
+
7
+ def __str__(self) -> str: # noqa: D105
8
+ return (
9
+ "An unexpected error occurred during transformation,"
10
+ " please contact support or open an issue."
11
+ )
12
+
13
+
14
+ class WeightedConstraintError(LunaError):
15
+ """Error if weighted constraints provided in CQM."""
16
+
17
+ def __str__(self) -> str: # noqa: D105
18
+ return "Weighted constraints for CQM are not supported"
File without changes
@@ -0,0 +1,112 @@
1
+ from __future__ import annotations
2
+
3
+ from http import HTTPStatus
4
+
5
+ import httpx
6
+ from httpx import RequestError, Response
7
+
8
+ from luna_quantum.client.error.luna_server_error import LunaServerError
9
+ from luna_quantum.client.schemas.error_message import ErrorMessage
10
+ from luna_quantum.util.log_utils import Logging
11
+
12
+ logger = Logging.get_logger(__name__)
13
+
14
+
15
+ class HttpErrorUtils:
16
+ """Class for handling Luna HTTP errors."""
17
+
18
+ @staticmethod
19
+ def __sdk_custom_request_errors(
20
+ response: Response,
21
+ ) -> LunaServerError | None:
22
+ """
23
+ Check if the response needs a custom error message from the SDK.
24
+
25
+ This is the place to add other custom error messages.
26
+ It's helpful then the default http error messages are not enough for the user.
27
+
28
+ Parameters
29
+ ----------
30
+ response:
31
+ Response object from the request
32
+
33
+ Returns
34
+ -------
35
+ Optional[LunaServerError]
36
+ If the response needs a custom error message, return the exception.
37
+ Otherwise, return None.
38
+ """
39
+ exception: LunaServerError | None = None
40
+
41
+ def create_error_message(internal_code: str, message: str) -> LunaServerError:
42
+ return LunaServerError(
43
+ response.status_code,
44
+ ErrorMessage(
45
+ internal_code=f"SDK-{internal_code}",
46
+ message=message,
47
+ ),
48
+ )
49
+
50
+ if response.status_code == HTTPStatus.BAD_GATEWAY:
51
+ # Catch error when upload was too long
52
+ exception = create_error_message(
53
+ "LUNA_GATEWAY_TIMEOUT",
54
+ "The Luna server did not respond within time,"
55
+ " leading to a timeout. Try reducing the size of the model.",
56
+ )
57
+
58
+ elif response.status_code == HTTPStatus.FORBIDDEN:
59
+ exception = create_error_message(
60
+ "FORBIDDEN",
61
+ response.text,
62
+ )
63
+
64
+ return exception
65
+
66
+ @staticmethod
67
+ def check_for_error(response: Response) -> None:
68
+ """
69
+ Check if an error occurred and rais the error if so.
70
+
71
+ Parameters
72
+ ----------
73
+ response: Response
74
+ Response object from the request
75
+
76
+ Raises
77
+ ------
78
+ LunaServerException
79
+ If an error occurred with the request.
80
+ The error message is in the exception.
81
+ RequestError
82
+ If an error occurred with the request outside the http status codes
83
+ 4xx and 5xx.
84
+ """
85
+ try:
86
+ response.read()
87
+ response.raise_for_status()
88
+ except httpx.HTTPStatusError:
89
+ exception: LunaServerError | None
90
+
91
+ try:
92
+ error_msg: ErrorMessage = ErrorMessage.model_validate_json(
93
+ response.text
94
+ )
95
+ # Convert the error message to the correct exception
96
+ exception = LunaServerError(response.status_code, error_msg)
97
+
98
+ except ValueError:
99
+ # The server can generate errors that are in a different format, and we
100
+ # have less to no control how they look like.
101
+ # In this case, we will try to create a custom error messages.
102
+ exception = HttpErrorUtils.__sdk_custom_request_errors(response)
103
+
104
+ if exception:
105
+ logger.exception(exception, exc_info=False)
106
+ raise exception from None
107
+ logger.error(exception, exc_info=True)
108
+ raise
109
+
110
+ except RequestError as e:
111
+ logger.error(e, exc_info=True)
112
+ raise
@@ -0,0 +1,4 @@
1
+ from luna_quantum.client.interfaces.clients.rest_client_i import IRestClient
2
+ from luna_quantum.client.interfaces.services.service_i import IService
3
+
4
+ __all__ = ["IRestClient", "IService"]
@@ -0,0 +1,25 @@
1
+ from luna_quantum.client.interfaces.clients.circuit_rest_client_i import (
2
+ ICircuitRestClient,
3
+ )
4
+ from luna_quantum.client.interfaces.clients.info_rest_client_i import IInfoRestClient
5
+ from luna_quantum.client.interfaces.clients.model_rest_client_i import (
6
+ IModelRestClient,
7
+ )
8
+ from luna_quantum.client.interfaces.clients.qpu_token_rest_client_i import (
9
+ IQpuTokenRestClient,
10
+ )
11
+ from luna_quantum.client.interfaces.clients.rest_client_i import IRestClient
12
+ from luna_quantum.client.interfaces.clients.solve_job_rest_client_i import (
13
+ ISolveJobRestClient,
14
+ )
15
+ from luna_quantum.client.interfaces.clients.users_rest_client_i import IUsersRestClient
16
+
17
+ __all__ = [
18
+ "ICircuitRestClient",
19
+ "IInfoRestClient",
20
+ "IModelRestClient",
21
+ "IQpuTokenRestClient",
22
+ "IRestClient",
23
+ "ISolveJobRestClient",
24
+ "IUsersRestClient",
25
+ ]
@@ -0,0 +1,68 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from luna_quantum.client.interfaces.clients.rest_client_i import IRestClient
7
+
8
+ if TYPE_CHECKING:
9
+ from luna_quantum.client.schemas.circuit import CircuitJob, CircuitResult
10
+ from luna_quantum.client.schemas.enums.circuit import CircuitProviderEnum
11
+ from luna_quantum.client.schemas.qpu_token.qpu_token import TokenProvider
12
+
13
+
14
+ class ICircuitRestClient(IRestClient, ABC):
15
+ """Interface for circuit rest client."""
16
+
17
+ @abstractmethod
18
+ def create(
19
+ self,
20
+ circuit: str,
21
+ provider: CircuitProviderEnum,
22
+ params: dict[str, Any] | None = None,
23
+ qpu_tokens: TokenProvider | None = None,
24
+ **kwargs: Any,
25
+ ) -> CircuitJob:
26
+ """
27
+ Create a circuit solution.
28
+
29
+ Parameters
30
+ ----------
31
+ circuit: str
32
+ The circuit which to create a solution for.
33
+ provider: CircuitProviderEnum
34
+ Which provider to use to solve the circuit.
35
+ params: Dict[str, Any]
36
+ Additional parameters of the circuit.
37
+ qpu_tokens: Optional[TokenProvider]
38
+ The tokens to be used for the QPU.
39
+ **kwargs
40
+ Parameters to pass to `httpx.request`.
41
+
42
+ Returns
43
+ -------
44
+ CircuitJob
45
+ The created circuit job.
46
+ """
47
+ raise NotImplementedError
48
+
49
+ @abstractmethod
50
+ def get(
51
+ self,
52
+ job: CircuitJob,
53
+ **kwargs: Any,
54
+ ) -> CircuitResult:
55
+ """
56
+ Get the result of a circuit.
57
+
58
+ Parameters
59
+ ----------
60
+ **kwargs
61
+ Parameters to pass to `httpx.request`.
62
+
63
+ Returns
64
+ -------
65
+ CircuitResult
66
+ The result of solving the circuit.
67
+ """
68
+ raise NotImplementedError
@@ -0,0 +1,53 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from luna_quantum.client.interfaces.clients.rest_client_i import IRestClient
7
+
8
+ if TYPE_CHECKING:
9
+ from luna_quantum.client.schemas.solver_info import SolverInfo
10
+
11
+
12
+ class IInfoRestClient(IRestClient, ABC):
13
+ """Interface of the info rest client."""
14
+
15
+ @abstractmethod
16
+ def solvers_available(
17
+ self, solver_name: str | None = None, **kwargs: dict[str, Any]
18
+ ) -> dict[str, dict[str, SolverInfo]]:
19
+ """
20
+ Get list of available solvers.
21
+
22
+ Parameters
23
+ ----------
24
+ solver_name: Optional[str]
25
+ Name of the solver that should be retrieved. If not specified, all solvers
26
+ will be returned.
27
+ **kwargs
28
+ Parameters to pass to `httpx.request`.
29
+
30
+ Returns
31
+ -------
32
+ Dict[str, Dict[str, SolverInfo]]
33
+ Dictionary containing the provider name as the key, and a dictionary of
34
+ the solver name and solver-specific information as the value.
35
+ """
36
+ raise NotImplementedError
37
+
38
+ @abstractmethod
39
+ def providers_available(self, **kwargs: dict[str, Any]) -> list[str]:
40
+ """
41
+ Get list of available providers.
42
+
43
+ Parameters
44
+ ----------
45
+ **kwargs
46
+ Parameters to pass to `httpx.request`.
47
+
48
+ Returns
49
+ -------
50
+ List[str]
51
+ List of available QPU providers.
52
+ """
53
+ raise NotImplementedError
@@ -0,0 +1,139 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from luna_quantum.client.interfaces.clients.rest_client_i import IRestClient
7
+
8
+ if TYPE_CHECKING:
9
+ from luna_quantum.aqm_overwrites.model import Model
10
+ from luna_quantum.client.schemas.enums.timeframe import TimeframeEnum
11
+ from luna_quantum.client.schemas.model_metadata import ModelMetadataSchema
12
+ from luna_quantum.solve.use_cases import UseCase
13
+
14
+
15
+ class IModelRestClient(IRestClient, ABC):
16
+ """Interface for model rest client."""
17
+
18
+ @abstractmethod
19
+ def get(self, model_id: str, **kwargs: dict[str, Any]) -> ModelMetadataSchema:
20
+ """
21
+ Retrieve the model metadata by its id.
22
+
23
+ Parameters
24
+ ----------
25
+ model_id: str
26
+ Id of the model to be retrieved.
27
+ **kwargs
28
+ Parameters to pass to `httpx.request`.
29
+
30
+ Returns
31
+ -------
32
+ ModelMetadataSchema:
33
+ Metadata of the model.
34
+ """
35
+
36
+ @abstractmethod
37
+ def get_model(self, model_id: str, **kwargs: dict[str, Any]) -> Model:
38
+ """
39
+ Retrieve a model by the id.
40
+
41
+ Parameters
42
+ ----------
43
+ model_id: str
44
+ Id of the model to be retrieved.
45
+ **kwargs
46
+ Parameters to pass to `httpx.request`.
47
+
48
+ Returns
49
+ -------
50
+ Model:
51
+ The model.
52
+
53
+ """
54
+
55
+ @abstractmethod
56
+ def get_metadata_by_hash(self, model_hash: int) -> ModelMetadataSchema:
57
+ """
58
+ Retrieve metadata for a model using its hash.
59
+
60
+ This method fetches metadata associated with a given model hash.
61
+
62
+ Parameters
63
+ ----------
64
+ model_hash : int
65
+ The hash identifier of the model.
66
+
67
+ Returns
68
+ -------
69
+ ModelMetadataSchema
70
+ Metadata information of the model.
71
+ """
72
+
73
+ @abstractmethod
74
+ def get_all(
75
+ self,
76
+ timeframe: TimeframeEnum | None = None,
77
+ limit: int = 50,
78
+ offset: int = 0,
79
+ **kwargs: dict[str, Any],
80
+ ) -> list[ModelMetadataSchema]:
81
+ """
82
+ Retrieve a list of model metadata.
83
+
84
+ Parameters
85
+ ----------
86
+ timeframe: Optional[TimeframeEnum]
87
+ Only return optimizations created within a specified timeframe.
88
+ Default None.
89
+ limit:
90
+ Limit the number of optimizations to be returned. Default value 50.
91
+ offset:
92
+ Offset the list of optimizations by this amount. Default value 0.
93
+ **kwargs
94
+ Parameters to pass to `httpx.request`.
95
+
96
+ Returns
97
+ -------
98
+ List[ModelMetadataSchema]:
99
+ List of model metadata.
100
+ """
101
+
102
+ @abstractmethod
103
+ def create(self, model: Model) -> ModelMetadataSchema:
104
+ """
105
+ Create a model based on the provided Model instance.
106
+
107
+ This function saves the model and returns metadata about it.
108
+
109
+ Parameters
110
+ ----------
111
+ model : Model
112
+ Instance of the Model which should be saved.
113
+
114
+ Returns
115
+ -------
116
+ ModelMetadataSchema
117
+ Metadata of the created model containing information about its
118
+ configuration and properties.
119
+
120
+ """
121
+
122
+ @abstractmethod
123
+ def create_from_use_case(
124
+ self, name: str, use_case: UseCase, **kwargs: Any
125
+ ) -> ModelMetadataSchema:
126
+ """Create a model from a use case."""
127
+
128
+ @abstractmethod
129
+ def delete(self, model_id: str, **kwargs: dict[str, Any]) -> None:
130
+ """
131
+ Delete a model and the model metadata by its id.
132
+
133
+ Parameters
134
+ ----------
135
+ model_id: str
136
+ Id of the model to be deleted.
137
+ **kwargs
138
+ Parameters to pass to `httpx.request`.
139
+ """