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,286 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any, ClassVar
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from luna_quantum._core import Solution
8
+ from luna_quantum.client.interfaces.clients.solve_job_rest_client_i import (
9
+ ISolveJobRestClient,
10
+ )
11
+ from luna_quantum.client.schemas import TokenProvider
12
+ from luna_quantum.client.schemas.create.solve_job_create import SolveJobCreate
13
+ from luna_quantum.client.schemas.enums.timeframe import TimeframeEnum
14
+ from luna_quantum.client.schemas.qpu_token.token_provider import RestAPITokenProvider
15
+ from luna_quantum.client.schemas.solution import (
16
+ UseCaseRepresentation,
17
+ UseCaseResult,
18
+ )
19
+ from luna_quantum.client.schemas.solve_job import SolveJobSchema
20
+ from luna_quantum.client.utils.qpu_token_utils import QpuTokenUtils
21
+ from luna_quantum.util.log_utils import Logging
22
+
23
+ if TYPE_CHECKING:
24
+ from logging import Logger
25
+
26
+
27
+ class SolveJobRestClient(ISolveJobRestClient):
28
+ """Impelentation of a solve job REST client."""
29
+
30
+ logger: ClassVar[Logger] = Logging.get_logger(__name__)
31
+
32
+ def get_solution(self, solve_job_id: str, **kwargs: Any) -> Solution:
33
+ """
34
+ Retrieve one solution by id.
35
+
36
+ Parameters
37
+ ----------
38
+ solve_job_id: str
39
+ Id of the solve job for which a solution should be retrieved.
40
+ **kwargs
41
+ Parameters to pass to `httpx.request`.
42
+
43
+ Returns
44
+ -------
45
+ Solution
46
+ Solution instance
47
+ """
48
+ response = self._client.get(f"{self._endpoint}/data/{solve_job_id}", **kwargs)
49
+
50
+ response.raise_for_status()
51
+
52
+ return Solution.deserialize(response.content)
53
+
54
+ def cancel(self, solve_job_id: str, **kwargs: Any) -> SolveJobSchema:
55
+ """
56
+ Cancel a solve job for an id.
57
+
58
+ Parameters
59
+ ----------
60
+ solve_job_id: str
61
+ The id of the solve job which should be canceled.
62
+ **kwargs
63
+ Parameters to pass to `httpx.request`.
64
+
65
+ Returns
66
+ -------
67
+ SolveJobSchema
68
+ The updated solve job, which can be used to retrieve the solution later.
69
+ """
70
+ response = self._client.post(
71
+ f"{self._endpoint}/metadata/{solve_job_id}/cancel", **kwargs
72
+ )
73
+
74
+ response.raise_for_status()
75
+
76
+ return SolveJobSchema.model_validate(response.json())
77
+
78
+ @property
79
+ def _endpoint(self) -> str:
80
+ return "/solve-jobs"
81
+
82
+ def get(self, solve_job_id: str, **kwargs: Any) -> SolveJobSchema:
83
+ """
84
+ Retrieve one SolveJob by id.
85
+
86
+ Parameters
87
+ ----------
88
+ solve_job_id: str
89
+ Id of the solve job that should be retrieved.
90
+ **kwargs
91
+ Parameters to pass to `httpx.request`.
92
+
93
+ Returns
94
+ -------
95
+ SolveJobSchema
96
+ Instance of SolveJob.
97
+ """
98
+ response = self._client.get(
99
+ f"{self._endpoint}/metadata/{solve_job_id}", **kwargs
100
+ )
101
+
102
+ response.raise_for_status()
103
+
104
+ return SolveJobSchema.model_validate(response.json())
105
+
106
+ def get_all(
107
+ self,
108
+ timeframe: TimeframeEnum | None = None,
109
+ limit: int = 50,
110
+ offset: int = 0,
111
+ model_id: str | None = None,
112
+ **kwargs: Any,
113
+ ) -> list[SolveJobSchema]:
114
+ """
115
+ Get list of available SolveJobs.
116
+
117
+ Parameters
118
+ ----------
119
+ timeframe: Optional[TimeframeEnum]
120
+ Only return SolveJobs created within a specified timeframe. Default None.
121
+ limit:
122
+ Limit the number of SolveJobs to be returned. Default value 10.
123
+ offset:
124
+ Offset the list of solve job by this amount. Default value 0.
125
+ model_id: Optional[str]
126
+ Show solve job for only this model id. Default None.
127
+ **kwargs
128
+ Parameters to pass to `httpx.request`.
129
+
130
+ Returns
131
+ -------
132
+ List[SolveJobSchema]
133
+ List of SolveJob instances.
134
+ """
135
+ params = {}
136
+ if timeframe and timeframe != TimeframeEnum.all_time: # no value == all_time
137
+ params["timeframe"] = timeframe.value
138
+
139
+ limit = max(limit, 1)
140
+
141
+ if model_id is not None:
142
+ params["model_id"] = str(model_id)
143
+
144
+ params["limit"] = str(limit)
145
+ params["offset"] = str(offset)
146
+ response = self._client.get(
147
+ f"{self._endpoint}/metadata", params=params, **kwargs
148
+ )
149
+
150
+ response.raise_for_status()
151
+
152
+ return [SolveJobSchema.model_validate(i) for i in response.json()]
153
+
154
+ def delete(self, solve_job_id: str, **kwargs: Any) -> None:
155
+ """
156
+ Delete one solution by id.
157
+
158
+ Parameters
159
+ ----------
160
+ solve_job_id: str
161
+ Id of the solve job that should be deleted.
162
+ **kwargs
163
+ Parameters to pass to `httpx.request`.
164
+ """
165
+ self._client.delete(f"{self._endpoint}/{solve_job_id}", **kwargs)
166
+
167
+ def create( # noqa: PLR0913
168
+ self,
169
+ model_id: str,
170
+ solver_name: str,
171
+ provider: str,
172
+ qpu_tokens: TokenProvider | None = None,
173
+ solver_parameters: dict[str, Any] | BaseModel | None = None,
174
+ name: str | None = None,
175
+ **kwargs: Any,
176
+ ) -> SolveJobSchema:
177
+ """
178
+ Create a solution for a model.
179
+
180
+ Parameters
181
+ ----------
182
+ model_id: str
183
+ The id of the model for which solution should be created.
184
+ solver_name: str
185
+ The name of the solver to use.
186
+ provider: str
187
+ The name of the provider to use.
188
+ qpu_tokens: Optional[TokenProvider]
189
+ The tokens to be used for the QPU.
190
+ solver_parameters: Optional[Union[Dict[str, Any], BaseModel]]
191
+ Parameters to be passed to the solver.
192
+ name: Optional[str]
193
+ Default: None, The name of the solution to create.
194
+ **kwargs
195
+ Parameters to pass to `httpx.request`.
196
+
197
+ Returns
198
+ -------
199
+ SolveJobSchema
200
+ The created solve job, which can be used to retrieve the solution later.
201
+ """
202
+ if qpu_tokens is not None:
203
+ rest_qpu_tokens = RestAPITokenProvider.from_sdk_token_provider(
204
+ TokenProvider.model_validate(qpu_tokens)
205
+ )
206
+ else:
207
+ rest_qpu_tokens = None
208
+ # try to retrieve qpu tokens from env variables
209
+
210
+ if rest_qpu_tokens is None:
211
+ qpu_tokens = QpuTokenUtils.patch_qpu_tokens_from_env()
212
+ if qpu_tokens is not None:
213
+ rest_qpu_tokens = RestAPITokenProvider.from_sdk_token_provider(
214
+ qpu_tokens
215
+ )
216
+ params: dict[str, Any]
217
+
218
+ if isinstance(solver_parameters, BaseModel):
219
+ params = solver_parameters.model_dump()
220
+ elif isinstance(solver_parameters, dict):
221
+ params = solver_parameters
222
+ else:
223
+ params = {}
224
+
225
+ solve_job_create = SolveJobCreate(
226
+ model_id=model_id,
227
+ solver_name=solver_name,
228
+ provider=provider,
229
+ parameters=params,
230
+ qpu_tokens=rest_qpu_tokens,
231
+ name=name,
232
+ )
233
+ SolveJobRestClient.logger.debug(
234
+ solve_job_create.model_dump_json(exclude={"qpu_tokens"})
235
+ )
236
+ response = self._client.post(
237
+ self._endpoint, content=solve_job_create.model_dump_json(), **kwargs
238
+ )
239
+ response.raise_for_status()
240
+
241
+ return SolveJobSchema.model_validate(response.json())
242
+
243
+ def get_use_case_representation(
244
+ self, solve_job_id: str, **kwargs: Any
245
+ ) -> UseCaseRepresentation:
246
+ """
247
+ Get the use-case-specific representation of a solution.
248
+
249
+ Parameters
250
+ ----------
251
+ solve_job_id: str
252
+ Id of the solve job that should be retrieved.
253
+ **kwargs
254
+ Parameters to pass to `httpx.request`.
255
+
256
+ Returns
257
+ -------
258
+ UseCaseRepresentation
259
+ The use-case-specific representation
260
+ """
261
+ response = self._client.get(
262
+ f"{self._endpoint}/use-case/{solve_job_id}/representation", **kwargs
263
+ )
264
+ response.raise_for_status()
265
+ return UseCaseRepresentation.model_validate(response.json())
266
+
267
+ def get_best_use_case_result(
268
+ self,
269
+ use_case_representation: UseCaseRepresentation, # noqa: ARG002
270
+ ) -> UseCaseResult | None:
271
+ """
272
+ Retrieve the best result from a solution's use case representation.
273
+
274
+ Parameters
275
+ ----------
276
+ use_case_representation : UseCaseRepresentation
277
+ A solution's use case representation.
278
+
279
+ Returns
280
+ -------
281
+ Optional[UseCaseResult]
282
+ The best result of the solution. If there are several best solve job with
283
+ the same objective value, return only the first. If the solution results are
284
+ not (yet) available or the solution sense is `None`, `None` is returned.
285
+ """
286
+ return None
@@ -0,0 +1,35 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from luna_quantum.client.interfaces.clients import IUsersRestClient
6
+ from luna_quantum.client.schemas.user import User
7
+
8
+ if TYPE_CHECKING:
9
+ from httpx import Response
10
+
11
+
12
+ class UsersRestClient(IUsersRestClient):
13
+ """UsersRestClient is a class for interacting with the Luna API's users endpoint."""
14
+
15
+ @property
16
+ def _endpoint(self) -> str:
17
+ return "/users"
18
+
19
+ def get_me(self, **kwargs: Any) -> User:
20
+ """
21
+ Retrieve information about user.
22
+
23
+ Parameters
24
+ ----------
25
+ **kwargs
26
+ Parameters to pass to `httpx.request`.
27
+
28
+ Returns
29
+ -------
30
+ User:
31
+ User data.
32
+ """
33
+ response: Response = self._client.get(f"{self._endpoint}/me", **kwargs)
34
+ response.raise_for_status()
35
+ return User.model_validate_json(response.text)
@@ -0,0 +1,26 @@
1
+ from luna_quantum.client.schemas.circuit import CircuitJob, CircuitResult
2
+ from luna_quantum.client.schemas.qpu_token.qpu_token import (
3
+ QpuToken,
4
+ QpuTokenOut,
5
+ QpuTokenSource,
6
+ TokenProvider,
7
+ )
8
+ from luna_quantum.client.schemas.solution import (
9
+ Result,
10
+ Runtime,
11
+ UseCaseRepresentation,
12
+ UseCaseResult,
13
+ )
14
+
15
+ __all__ = [
16
+ "CircuitJob",
17
+ "CircuitResult",
18
+ "QpuToken",
19
+ "QpuTokenOut",
20
+ "QpuTokenSource",
21
+ "Result",
22
+ "Runtime",
23
+ "TokenProvider",
24
+ "UseCaseRepresentation",
25
+ "UseCaseResult",
26
+ ]
@@ -0,0 +1,48 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from luna_quantum.client.schemas.enums.circuit import (
8
+ CircuitProviderEnum,
9
+ CircuitStatusEnum,
10
+ )
11
+
12
+
13
+ class CircuitJob(BaseModel):
14
+ """
15
+ Object responsible of retrieving a circuit solution.
16
+
17
+ Attributes
18
+ ----------
19
+ id: str
20
+ Id of the circuit job.
21
+ provider: CircuitProviderEnum
22
+ The provider used to solve this circuit.
23
+ params: Dict[str, Any]
24
+ Additional parameters that were used to create the circuit.
25
+ """
26
+
27
+ id: str
28
+ provider: CircuitProviderEnum
29
+ params: dict[str, Any] | None = None
30
+
31
+
32
+ class CircuitResult(BaseModel):
33
+ """
34
+ The result of solving the circuit.
35
+
36
+ Attributes
37
+ ----------
38
+ result: Optional[Dict[str, Any]]
39
+ The result if the job succeeded. Otherwise None
40
+ error: Optional[str]
41
+ The error message if the job failed. Otherwise None
42
+ status: CircuitStatusEnum
43
+ The job status.
44
+ """
45
+
46
+ status: CircuitStatusEnum
47
+ result: dict[str, Any] | None = None
48
+ error_message: str | None = None
@@ -0,0 +1,15 @@
1
+ from luna_quantum.client.schemas.create.circuit import CircuitIn
2
+ from luna_quantum.client.schemas.create.qpu_token import QpuTokenIn
3
+ from luna_quantum.client.schemas.create.qpu_token_time_quota import QpuTokenTimeQuotaIn
4
+ from luna_quantum.client.schemas.create.qpu_token_time_quota_update import (
5
+ QpuTokenTimeQuotaUpdate,
6
+ )
7
+ from luna_quantum.client.schemas.create.qubo import QUBOIn
8
+
9
+ __all__ = [
10
+ "CircuitIn",
11
+ "QUBOIn",
12
+ "QpuTokenIn",
13
+ "QpuTokenTimeQuotaIn",
14
+ "QpuTokenTimeQuotaUpdate",
15
+ ]
@@ -0,0 +1,30 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from luna_quantum.client.schemas.enums.circuit import CircuitProviderEnum
8
+ from luna_quantum.client.schemas.qpu_token.token_provider import (
9
+ RestAPITokenProvider,
10
+ )
11
+
12
+
13
+ class CircuitIn(BaseModel):
14
+ """
15
+ Pydantic model for creation of circuits.
16
+
17
+ Attributes
18
+ ----------
19
+ provider: str
20
+ The provider for circuit solving
21
+ provider: ProviderEnum
22
+ The QASM circuit
23
+ params: Dict[str, Any]
24
+ Additional parameters
25
+ """
26
+
27
+ provider: CircuitProviderEnum
28
+ circuit: str
29
+ params: dict[str, Any] = {}
30
+ qpu_tokens: RestAPITokenProvider | None = None
@@ -0,0 +1,39 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any, Generic, TypeVar
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from luna_quantum.solve.use_cases import UseCase
8
+
9
+ # This works but is kind of ugly.
10
+ # In the future, we should find another solution for "dumping" a child of UseCase
11
+ # with the name and params.
12
+ # OptimizationUseCaseIn can still be created like this:
13
+ # `opt = optimizationusecasein(name=name, use_case=use_case)`
14
+ # Somehow this tricks pydantic into accepting the child of UseCase and adding
15
+ # it to the model_dump_json. Without the Generic[UseCase] only the name will be
16
+ # added to the model_dump_json
17
+
18
+ _UseCase = TypeVar("_UseCase", bound=UseCase)
19
+
20
+
21
+ class OptimizationUseCaseIn(BaseModel, Generic[_UseCase]):
22
+ """
23
+ Input schema for creating an optimization use case.
24
+
25
+ Attributes
26
+ ----------
27
+ name : str
28
+ A name for the optimization use case.
29
+
30
+ use_case : _UseCase
31
+ The actual use case object containing the problem definition.
32
+
33
+ params : dict[str, Any] | None
34
+ Optional dictionary of additional parameters for the optimization.
35
+ """
36
+
37
+ name: str
38
+ use_case: _UseCase
39
+ params: dict[str, Any] | None
@@ -0,0 +1,22 @@
1
+ from pydantic import BaseModel, ConfigDict
2
+
3
+
4
+ class QpuTokenIn(BaseModel):
5
+ """
6
+ Pydantic model for creation QPU token.
7
+
8
+ Attributes
9
+ ----------
10
+ name: str
11
+ Name of the QPU token
12
+ provider: ProviderEnum
13
+ Name of provider
14
+ token: str
15
+ Token
16
+ """
17
+
18
+ name: str
19
+ provider: str
20
+ token: str
21
+
22
+ model_config = ConfigDict(extra="forbid")
@@ -0,0 +1,35 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Self
4
+
5
+ from pydantic import BaseModel, Field, model_validator
6
+
7
+ from luna_quantum.client.schemas.wrappers import PydanticDatetimeWrapper
8
+
9
+
10
+ class QpuTokenTimeQuotaIn(BaseModel):
11
+ """
12
+ Pydantic model for creating a time quota on a qpu token.
13
+
14
+ Attributes
15
+ ----------
16
+ quota: int
17
+ The amount of quota.
18
+ start: datetime | None
19
+ Effective start date of the time quota policy.
20
+ If None, policy will be in effect immediately.
21
+ end: datetime | None
22
+ Effective end date of the time quota policy.
23
+ If None, policy will be in effect until 365 days after the start date.
24
+ """
25
+
26
+ quota: int = Field(ge=0)
27
+ start: PydanticDatetimeWrapper | None
28
+ end: PydanticDatetimeWrapper | None
29
+
30
+ @model_validator(mode="after")
31
+ def check_start_end_dates(self) -> Self:
32
+ """Cheks that start date is befor end date if both provided."""
33
+ if self.start is not None and self.end is not None and self.start > self.end:
34
+ raise ValueError("Start date cannot be after end date.") # noqa: TRY003
35
+ return self
@@ -0,0 +1,24 @@
1
+ from typing import Self
2
+
3
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
4
+
5
+ from luna_quantum.client.schemas.wrappers.datetime_wrapper import (
6
+ PydanticDatetimeWrapper,
7
+ )
8
+
9
+
10
+ class QpuTokenTimeQuotaUpdate(BaseModel):
11
+ """Data structure to update the time quota of a qpu token."""
12
+
13
+ quota: int | None = Field(ge=0, default=None)
14
+ start: PydanticDatetimeWrapper | None = None
15
+ end: PydanticDatetimeWrapper | None = None
16
+
17
+ model_config = ConfigDict(extra="forbid")
18
+
19
+ @model_validator(mode="after")
20
+ def check_start_end_dates(self) -> Self:
21
+ """Cheks that start date is befor end date if both provided."""
22
+ if self.start is not None and self.end is not None and self.start > self.end:
23
+ raise ValueError("Start date cannot be after end date.") # noqa: TRY003
24
+ return self
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class QUBOIn(BaseModel):
7
+ """
8
+ Pydantic model for QUBO.
9
+
10
+ Attributes
11
+ ----------
12
+ name: str
13
+ Name of the Model
14
+ matrix: List[List[float]]
15
+ QUBO matrix
16
+ """
17
+
18
+ name: str
19
+ matrix: list[list[float]]
@@ -0,0 +1,43 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from luna_quantum.client.schemas.qpu_token.token_provider import (
8
+ RestAPITokenProvider,
9
+ )
10
+
11
+
12
+ class SolveJobCreate(BaseModel):
13
+ """
14
+ Schema for creating a new solve job.
15
+
16
+ Attributes
17
+ ----------
18
+ model_id : str
19
+ Unique identifier of the model to be solved.
20
+
21
+ solver_name : str
22
+ Name of the solver algorithm to be used for the computation.
23
+
24
+ provider : str
25
+ Name of the provider that will execute the job.
26
+
27
+ parameters : dict[str, Any]
28
+ Dictionary of solver-specific parameters options.
29
+
30
+ qpu_tokens : RestAPITokenProvider | None, optional
31
+ Authentication tokens for accessing QPU providers.
32
+ Contains provider-specific authentication credentials.
33
+
34
+ name : str | None, optional
35
+ Optional user-defined name for the solve job.
36
+ """
37
+
38
+ model_id: str # id of the model
39
+ solver_name: str
40
+ provider: str
41
+ parameters: dict[str, Any]
42
+ qpu_tokens: RestAPITokenProvider | None = None
43
+ name: str | None = None
File without changes
@@ -0,0 +1,13 @@
1
+ from enum import Enum
2
+
3
+
4
+ class CallStyle(str, Enum):
5
+ """
6
+ Enumeration of all supported call styles.
7
+
8
+ This enumeration is used to prevent FBT001.
9
+ https://docs.astral.sh/ruff/rules/boolean-type-hint-positional-argument/
10
+ """
11
+
12
+ ACTIVE_WAITING = "active_waiting"
13
+ SINGLE_FETCH = "single_fetch"
@@ -0,0 +1,42 @@
1
+ from enum import Enum
2
+
3
+
4
+ class CircuitProviderEnum(str, Enum):
5
+ """
6
+ Enumeration of supported quantum circuit execution providers.
7
+
8
+ Enum Values
9
+ ----------
10
+ IBM
11
+ IBM quantum computing services.
12
+ QCTRL
13
+ Q-CTRL quantum computing services.
14
+ AWS
15
+ AWS quantum computing services.
16
+ """
17
+
18
+ IBM = "ibm"
19
+ QCTRL = "qctrl"
20
+ AWS = "aws"
21
+
22
+
23
+ class CircuitStatusEnum(str, Enum):
24
+ """
25
+ Enumeration of possible status states for a circuit job.
26
+
27
+ Enum Values
28
+ ----------
29
+ IN_PROGRESS
30
+ The circuit job is currently being executed.
31
+ DONE
32
+ The circuit job has completed successfully.
33
+ FAILED
34
+ The circuit job encountered an error during execution.
35
+ CANCELED
36
+ The circuit job was explicitly canceled.
37
+ """
38
+
39
+ IN_PROGRESS = "IN_PROGRESS"
40
+ DONE = "DONE"
41
+ FAILED = "FAILED"
42
+ CANCELLED = "CANCELLED"