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,59 @@
1
+ from luna_quantum._core import Solution
2
+ from luna_quantum.aqm_overwrites import Model
3
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
4
+ from luna_quantum.client.schemas.enums.status import StatusEnum
5
+ from luna_quantum.solve.interfaces.usecases.model_get_solutions_usecase_i import (
6
+ IModelGetSolutionUseCase,
7
+ )
8
+ from luna_quantum.util.log_utils import progress
9
+
10
+
11
+ class ModelGetSolutionUseCase(IModelGetSolutionUseCase):
12
+ """
13
+ Use case for retrieving solutions of a model.
14
+
15
+ Handles the process of interacting with the client to get all solutions
16
+ for a specific AQ model based on its metadata and associated ID.
17
+
18
+ Attributes
19
+ ----------
20
+ client : ILunaSolve
21
+ The client responsible for fetching solutions from the external source.
22
+ """
23
+
24
+ client: ILunaSolve
25
+
26
+ def __init__(self, client: ILunaSolve) -> None:
27
+ self.client = client
28
+
29
+ @progress(total=None, desc="Loading solution...")
30
+ def __call__(self, model: Model) -> list[Solution]:
31
+ """
32
+ Load solutions of the given Model input.
33
+
34
+ This function retrieves and returns a list of ISolution instances for the
35
+ given Model. If the Model does not have metadata, an empty list is returned.
36
+
37
+ Parameters
38
+ ----------
39
+ model : Model
40
+ The input Model object whose associated solutions are to be retrieved.
41
+
42
+ Returns
43
+ -------
44
+ list[Solution]
45
+ A list of Solution objects associated with the given Model.
46
+ """
47
+ if model.metadata is None:
48
+ return []
49
+
50
+ model_id = model.metadata.id
51
+
52
+ solve_jobs = self.client.solve_job.get_all(model_id=model_id)
53
+
54
+ # TODO THIS IS SUPER INEFFICIENT # noqa: FIX002, TD002, TD004
55
+ return [
56
+ self.client.solve_job.get_solution(solve_job_id=s.id)
57
+ for s in solve_jobs
58
+ if s.status is StatusEnum.DONE
59
+ ]
@@ -0,0 +1,62 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from luna_quantum.aqm_overwrites import Model
4
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
5
+ from luna_quantum.solve.domain.solve_job import SolveJob
6
+ from luna_quantum.solve.interfaces.usecases.model_get_solve_jobs_usecase_i import (
7
+ IModelGetSolveJobUseCase,
8
+ )
9
+ from luna_quantum.util.log_utils import progress
10
+
11
+ if TYPE_CHECKING:
12
+ from luna_quantum.client.schemas.solve_job import SolveJobSchema
13
+
14
+
15
+ class ModelGetSolveJobsUseCase(IModelGetSolveJobUseCase):
16
+ """
17
+ Handle the retrieval of solve jobs for a given Model.
18
+
19
+ This class is responsible for interacting with the client to fetch solve jobs
20
+ related to a given Model. It ensures that the required metadata is present
21
+ before performing operations with the client.
22
+
23
+ Attributes
24
+ ----------
25
+ client : ILunaSolve
26
+ The client used to communicate with the solve job backend or service.
27
+ """
28
+
29
+ client: ILunaSolve
30
+
31
+ def __init__(self, client: ILunaSolve) -> None:
32
+ self.client = client
33
+
34
+ @progress(total=None, desc="Loading solve job...")
35
+ def __call__(self, model: Model) -> list[SolveJob]:
36
+ """
37
+ Load solve jobs from the given Model instance.
38
+
39
+ Fetches and validates all solve jobs associated with the given Model's
40
+ metadata and returns them as a list of SolveJob objects. If metadata is
41
+ missing in the Model, an empty list is returned.
42
+
43
+ Parameters
44
+ ----------
45
+ model : Model
46
+ The Model instance whose associated solve jobs are to be fetched.
47
+
48
+ Returns
49
+ -------
50
+ List[SolveJob]
51
+ A list of SolveJob objects derived from the fetched solve jobs..
52
+ """
53
+ if model.metadata is None:
54
+ return []
55
+
56
+ model_id = model.metadata.id
57
+
58
+ solutions: list[SolveJobSchema] = self.client.solve_job.get_all(
59
+ model_id=model_id
60
+ )
61
+
62
+ return [SolveJob.model_validate(s.model_dump()) for s in solutions]
@@ -0,0 +1,47 @@
1
+ from luna_quantum.aqm_overwrites import Model
2
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
3
+ from luna_quantum.solve.interfaces.usecases.model_load_by_id_usecase_i import (
4
+ IModelLoadByIdUseCase,
5
+ )
6
+ from luna_quantum.util.log_utils import progress
7
+
8
+
9
+ class ModelLoadByIdUseCase(IModelLoadByIdUseCase):
10
+ """
11
+ Load an Model by its identifier.
12
+
13
+ This class interacts with a client implementing ILunaSolve to fetch and load
14
+ model models, providing their metadata and content.
15
+
16
+ Attributes
17
+ ----------
18
+ client : ILunaSolve
19
+ The client used for fetching the model models.
20
+ """
21
+
22
+ client: ILunaSolve
23
+
24
+ def __init__(self, client: ILunaSolve) -> None:
25
+ self.client = client
26
+
27
+ @progress(total=None, desc="Retrieving model...")
28
+ def __call__(self, model_id: str) -> Model:
29
+ """
30
+ Retrieve a Model object based on the given model id.
31
+
32
+ This method fetches a model schema using the provided model identifier, converts
33
+ it to a Model object, and validates its metadata before returning it.
34
+
35
+ Parameters
36
+ ----------
37
+ model_id : str
38
+ The unique identifier of the model to retrieve.
39
+
40
+ Returns
41
+ -------
42
+ Model
43
+ The retrieved model, with associated metadata validated and populated.
44
+ """
45
+ aq_model: Model = self.client.model.get_model(model_id=model_id)
46
+
47
+ return aq_model
@@ -0,0 +1,52 @@
1
+ from luna_quantum.aqm_overwrites import Model
2
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
3
+ from luna_quantum.solve.domain.model_metadata import ModelMetadata
4
+ from luna_quantum.solve.interfaces.usecases.model_load_by_metadata_usecase_i import (
5
+ IModelLoadByMetadataUseCase,
6
+ )
7
+ from luna_quantum.util.log_utils import progress
8
+
9
+
10
+ class ModelLoadByMetadataUseCase(IModelLoadByMetadataUseCase):
11
+ """
12
+ Loads an model model using metadata.
13
+
14
+ The purpose of this class is to load an model model from a given metadata
15
+ object using the specified client. It retrieves the model and attaches the metadata
16
+ to it.
17
+
18
+ Attributes
19
+ ----------
20
+ client : ILunaSolve
21
+ The client responsible for interacting with the model backend.
22
+ """
23
+
24
+ client: ILunaSolve
25
+
26
+ def __init__(self, client: ILunaSolve) -> None:
27
+ self.client = client
28
+
29
+ @progress(total=None, desc="Retrieving model...")
30
+ def __call__(self, model_metadata: ModelMetadata) -> Model:
31
+ """
32
+ Callable to retrieve and update an Model instance.
33
+
34
+ This method interacts with the client to fetch an Model based on the
35
+ provided ModelMetadata, updates the model's metadata, and then returns
36
+ the updated Model instance.
37
+
38
+ Parameters
39
+ ----------
40
+ model_metadata : ModelMetadata
41
+ The metadata object containing the ID and relevant data for fetching
42
+ the corresponding Model.
43
+
44
+ Returns
45
+ -------
46
+ Model
47
+ The fetched and updated Model instance.
48
+
49
+ """
50
+ aq_model: Model = self.client.model.get_model(model_id=model_metadata.id)
51
+
52
+ return aq_model
@@ -0,0 +1,51 @@
1
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
2
+ from luna_quantum.solve.domain.model_metadata import ModelMetadata
3
+ from luna_quantum.solve.interfaces.usecases import (
4
+ IModelLoadMetadataByHashUseCase,
5
+ )
6
+ from luna_quantum.util.log_utils import progress
7
+
8
+
9
+ class ModelLoadMetadataByHashUseCase(IModelLoadMetadataByHashUseCase):
10
+ """
11
+ Load metadata for an AQ model using a hash.
12
+
13
+ This class interacts with the client to retrieve and validate the metadata
14
+ of an AQ model by providing its unique hash value.
15
+
16
+ Attributes
17
+ ----------
18
+ client : ILunaSolve
19
+ The client used to retrieve AQ model metadata.
20
+ """
21
+
22
+ client: ILunaSolve
23
+
24
+ def __init__(self, client: ILunaSolve) -> None:
25
+ self.client = client
26
+
27
+ @progress(total=None, desc="Retrieving model metadata...")
28
+ def __call__(self, model_hash: int) -> ModelMetadata:
29
+ """
30
+ Retrieve the metadata for a specific model using its unique hash.
31
+
32
+ This callable retrieves the model metadata by communicating with a client
33
+ based on the provided model hash. It validates the
34
+ retrieved metadata against the ModelMetadata schema and returns a
35
+ validated object.
36
+
37
+ Parameters
38
+ ----------
39
+ model_hash : int
40
+ The unique hash identifier for the model whose metadata is to be
41
+ retrieved.
42
+
43
+ Returns
44
+ -------
45
+ ModelMetadata
46
+ A validated object containing metadata information about the model.
47
+
48
+ """
49
+ aq_model_schema = self.client.model.get_metadata_by_hash(model_hash=model_hash)
50
+
51
+ return ModelMetadata.model_validate(aq_model_schema.model_dump())
@@ -0,0 +1,63 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from luna_quantum.aqm_overwrites import Model
4
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
5
+ from luna_quantum.solve.domain.model_metadata import ModelMetadata
6
+ from luna_quantum.solve.interfaces.usecases.model_save_usecase_i import (
7
+ IModelSaveUseCase,
8
+ )
9
+ from luna_quantum.util.log_utils import progress
10
+
11
+ if TYPE_CHECKING:
12
+ from luna_quantum.client.schemas.model_metadata import ModelMetadataSchema
13
+
14
+
15
+ class ModelSaveUseCase(IModelSaveUseCase):
16
+ """
17
+ Represents a use case for saving an Model instance.
18
+
19
+ Provides functionality to interface with a client implementation for
20
+ retrieving or creating model metadata and saving model information. The
21
+ metadata retrieved is not written to the model instance.
22
+
23
+ Attributes
24
+ ----------
25
+ client : ILunaSolve
26
+ The client used to perform operations related to saving and retrieving
27
+ Model metadata, such as fetching metadata by hash or creating new
28
+ metadata.
29
+ """
30
+
31
+ client: ILunaSolve
32
+
33
+ def __init__(self, client: ILunaSolve) -> None:
34
+ self.client = client
35
+
36
+ @progress(total=None, desc="Saving model...")
37
+ def __call__(self, model: Model) -> ModelMetadata:
38
+ """
39
+ Retrieve model metadata, if the model does not exist create and retrieve it.
40
+
41
+ This function attempts to fetch the metadata of the given `Model` instance
42
+ from the model client. If the metadata is not found, the model is saved
43
+ with the client and the metadata is retrieved again.
44
+
45
+ Parameters
46
+ ----------
47
+ model : Model
48
+ The model instance for which metadata is being retrieved or created.
49
+
50
+ Returns
51
+ -------
52
+ ModelMetadata
53
+ The validated metadata associated with the given model instance.
54
+ """
55
+ metadata: ModelMetadataSchema
56
+ try:
57
+ metadata = self.client.model.get_metadata_by_hash(
58
+ model_hash=model.__hash__()
59
+ )
60
+ except Exception: # TODO(Llewellyn): make more specific to # noqa: FIX002
61
+ # Not found exception
62
+ metadata = self.client.model.create(model=model)
63
+ return ModelMetadata.model_validate(metadata.model_dump())
@@ -0,0 +1,51 @@
1
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
2
+ from luna_quantum.solve.domain.solve_job import SolveJob
3
+ from luna_quantum.solve.interfaces.usecases.solve_job_cancel_usecase_i import (
4
+ ISolveJobCancelUseCase,
5
+ )
6
+ from luna_quantum.util.log_utils import progress
7
+ from luna_quantum.util.pydantic_utils import PydanticUtils
8
+
9
+
10
+ class SolveJobCancelUseCase(ISolveJobCancelUseCase):
11
+ """
12
+ Handles the cancellation of a solve job through the provided client.
13
+
14
+ This class is responsible for interfacing with the given ILunaSolve client to
15
+ cancel an existing solve job by utilizing its `solution.cancel` method. It
16
+ validates and updates the solve job model after the cancellation.
17
+
18
+ Attributes
19
+ ----------
20
+ client : ILunaSolve
21
+ The client interface responsible for communicating with the backend
22
+ solve services.
23
+ """
24
+
25
+ client: ILunaSolve
26
+
27
+ def __init__(self, client: ILunaSolve) -> None:
28
+ self.client = client
29
+
30
+ @progress(total=None, desc="Canceling solve job...")
31
+ def __call__(self, solve_job: SolveJob) -> None:
32
+ """
33
+ Call method to process a given SolveJob.
34
+
35
+ This method interacts with an API client to process cancellation of a solution
36
+ related to the input SolveJob, updates the SolveJob model, and modifies it
37
+ using updated data.
38
+
39
+ Parameters
40
+ ----------
41
+ solve_job : SolveJob
42
+ The job instance that needs to be processed, updated, and validated.
43
+
44
+ Returns
45
+ -------
46
+ None
47
+ """
48
+ solve_job_schema = self.client.solve_job.cancel(solve_job_id=solve_job.id)
49
+
50
+ updated_solve_job = SolveJob.model_validate(solve_job_schema.model_dump())
51
+ PydanticUtils.update_model(solve_job, updated_solve_job)
@@ -0,0 +1,112 @@
1
+ from typing import TYPE_CHECKING, Any
2
+
3
+ from luna_quantum.aqm_overwrites.model import Model
4
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
5
+ from luna_quantum.factories.usecase_factory import UseCaseFactory
6
+ from luna_quantum.solve.domain.abstract.luna_algorithm import LunaAlgorithm
7
+ from luna_quantum.solve.domain.abstract.qpu_token_backend import QpuTokenBackend
8
+ from luna_quantum.solve.domain.solve_job import SolveJob
9
+ from luna_quantum.solve.errors.model_metadata_missing_error import (
10
+ ModelMetadataMissingError,
11
+ )
12
+ from luna_quantum.solve.interfaces.algorithm_i import BACKEND_TYPE
13
+ from luna_quantum.solve.interfaces.usecases.solve_job_create_usecase_i import (
14
+ ISolveJobCreateUseCase,
15
+ )
16
+ from luna_quantum.util.log_utils import progress
17
+
18
+ if TYPE_CHECKING:
19
+ from luna_quantum.client.schemas.solve_job import SolveJobSchema
20
+ from luna_quantum.solve.domain.model_metadata import ModelMetadata
21
+ from luna_quantum.solve.interfaces.usecases import IModelLoadByIdUseCase
22
+
23
+
24
+ class SolveJobCreateUseCase(ISolveJobCreateUseCase):
25
+ """
26
+ Create a solve job.
27
+
28
+ This class is responsible for creating a job through a specified client interface.
29
+
30
+ Attributes
31
+ ----------
32
+ client : ILunaSolve
33
+ The client implementation used to handle the job creation process.
34
+ """
35
+
36
+ client: ILunaSolve
37
+
38
+ def __init__(self, client: ILunaSolve) -> None:
39
+ self.client = client
40
+
41
+ @progress(total=None, desc="Scheduling solve job...")
42
+ def __call__(
43
+ self,
44
+ model: Model | str,
45
+ luna_solver: LunaAlgorithm[BACKEND_TYPE],
46
+ backend: BACKEND_TYPE,
47
+ name: str | None,
48
+ ) -> SolveJob:
49
+ """
50
+ Solve a model using the specified solver.
51
+
52
+ The function solves a given model using the provided LunaSolver instance. If a
53
+ string is given as the model, it fetches the model's metadata using a use-case.
54
+ If the model metadata is missing, an exception is raised. The function finally
55
+ creates a solve job using the solver and model information and returns it.
56
+
57
+ Parameters
58
+ ----------
59
+ model : Union[Model, str]
60
+ The model to be solved. It can either be an instance of `Model` or a
61
+ string representing the model ID.
62
+ luna_solver : LunaAlgorithm
63
+ The solver to be used for solving the model.
64
+ name: Optional[str]
65
+ The name of the solve job. Can be None.
66
+
67
+ Returns
68
+ -------
69
+ SolveJob
70
+ The job containing the results of the solving process.
71
+
72
+ Raises
73
+ ------
74
+ ModelMetadataMissingError
75
+ Raised when the metadata for the given model is missing.
76
+ """
77
+ metadata: ModelMetadata | None
78
+ if isinstance(model, str):
79
+ load_uc: IModelLoadByIdUseCase = UseCaseFactory.model_load_by_id(
80
+ client=self.client
81
+ )
82
+ metadata = load_uc(model_id=model).metadata
83
+ else:
84
+ model.save_luna(client=self.client)
85
+ metadata = model.metadata
86
+
87
+ if not metadata:
88
+ raise ModelMetadataMissingError
89
+
90
+ if isinstance(model, str):
91
+ model = Model.load_luna(model_id=model, client=self.client)
92
+
93
+ solver_parameters: dict[str, Any] = luna_solver.model_dump()
94
+ solver_parameters.update(backend.model_dump())
95
+
96
+ qpu_tokens = None
97
+ if isinstance(backend, QpuTokenBackend):
98
+ qpu_tokens = backend.get_qpu_tokens()
99
+
100
+ solve_job: SolveJobSchema = self.client.solve_job.create(
101
+ model_id=metadata.id,
102
+ solver_name=luna_solver.algorithm_name,
103
+ solver_parameters=solver_parameters,
104
+ provider=backend.provider,
105
+ qpu_tokens=qpu_tokens,
106
+ name=name,
107
+ )
108
+ sj = SolveJob.model_validate(solve_job.model_dump())
109
+
110
+ sj.set_evaluation_model(model)
111
+
112
+ return sj
@@ -0,0 +1,38 @@
1
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
2
+ from luna_quantum.solve.interfaces.usecases.solve_job_delete_usecase_i import (
3
+ ISolveJobDeleteUseCase,
4
+ )
5
+ from luna_quantum.util.log_utils import progress
6
+
7
+
8
+ class SolveJobDeleteUseCase(ISolveJobDeleteUseCase):
9
+ """
10
+ Delete a solve job through the provided client interface.
11
+
12
+ Attributes
13
+ ----------
14
+ client : ILunaSolve
15
+ Client implementing the `ILunaSolve` interface responsible for interacting
16
+ with the solve service.
17
+ """
18
+
19
+ client: ILunaSolve
20
+
21
+ def __init__(self, client: ILunaSolve) -> None:
22
+ self.client = client
23
+
24
+ @progress(total=None, desc="Deleting solve job...")
25
+ def __call__(self, solve_job_id: str) -> None:
26
+ """
27
+ Delete a solve_job with the specified job ID.
28
+
29
+ This callable method is used to delete a solve_job given its unique job
30
+ identifier.
31
+
32
+ Parameters
33
+ ----------
34
+ solve_job_id : str
35
+ The unique identifier of the solve job to be deleted.
36
+
37
+ """
38
+ self.client.solve_job.delete(solve_job_id=solve_job_id)
@@ -0,0 +1,49 @@
1
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
2
+ from luna_quantum.solve.domain.solve_job import SolveJob
3
+ from luna_quantum.solve.interfaces.usecases.solve_job_fetch_updates_usecase_i import (
4
+ ISolveJobFetchUpdatesUseCase,
5
+ )
6
+ from luna_quantum.util.log_utils import progress
7
+ from luna_quantum.util.pydantic_utils import PydanticUtils
8
+
9
+
10
+ class SolveJobFetchUpdatesUseCase(ISolveJobFetchUpdatesUseCase):
11
+ """
12
+ Fetches and applies updates to a solve job using a client.
13
+
14
+ This class is responsible for retrieving the latest updates for a solve job
15
+ from the client and applying them to the given solve job instance.
16
+
17
+ Attributes
18
+ ----------
19
+ client : ILunaSolve
20
+ Client used to fetch updates for solve jobs.
21
+ """
22
+
23
+ client: ILunaSolve
24
+
25
+ def __init__(self, client: ILunaSolve) -> None:
26
+ self.client = client
27
+
28
+ @progress(total=None, desc="Fetching solve job...")
29
+ def __call__(self, solve_job: SolveJob) -> None:
30
+ """
31
+ Execute fetch the updates of a specific `SolveJob` instance.
32
+
33
+ This callable validates and updates a `SolveJob` instance using data fetched
34
+ from the client. The fetched data is used to synchronize the job model with
35
+ the server's definition.
36
+
37
+ Parameters
38
+ ----------
39
+ solve_job : SolveJob
40
+ The job to be processed, validated, and updated.
41
+
42
+ Returns
43
+ -------
44
+ None
45
+ """
46
+ solve_job_schema = self.client.solve_job.get(solve_job_id=solve_job.id)
47
+ solve_job_updated = SolveJob.model_validate(solve_job_schema.model_dump())
48
+
49
+ PydanticUtils.update_model(solve_job, solve_job_updated)
@@ -0,0 +1,44 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
4
+ from luna_quantum.solve.domain.solve_job import SolveJob
5
+ from luna_quantum.solve.interfaces.usecases.solve_job_get_by_id_usecase_i import (
6
+ ISolveJobGetByIdUseCase,
7
+ )
8
+ from luna_quantum.util.log_utils import Logging, progress
9
+
10
+ if TYPE_CHECKING:
11
+ from luna_quantum.client.schemas.solve_job import SolveJobSchema
12
+
13
+
14
+ class SolveJobGetByIdUseCase(ISolveJobGetByIdUseCase):
15
+ """
16
+ Represent an abstract base to retrieve a solve-job by its id.
17
+
18
+ This class interacts with a backend client to retrieve a solve job by its id.
19
+
20
+ Attributes
21
+ ----------
22
+ client : ILunaSolve
23
+ Client used to retrieve the solve job.
24
+ """
25
+
26
+ client: ILunaSolve
27
+ logger = Logging.get_logger(__name__)
28
+
29
+ def __init__(self, client: ILunaSolve) -> None:
30
+ self.client = client
31
+
32
+ @progress(total=None, desc="Retrieving solve job by id...")
33
+ def __call__(self, solve_job_id: str) -> SolveJob:
34
+ """
35
+ Retive a solve-job by its id.
36
+
37
+ Parameters
38
+ ----------
39
+ solve_job_id : str
40
+ The id of the solve-job to retrieve.
41
+ """
42
+ solve_job: SolveJobSchema = self.client.solve_job.get(solve_job_id=solve_job_id)
43
+
44
+ return SolveJob.model_validate(solve_job.model_dump())