luna-quantum 1.0.8rc2__cp314-cp314-macosx_11_0_arm64.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.

Potentially problematic release.


This version of luna-quantum might be problematic. Click here for more details.

Files changed (264) hide show
  1. luna_quantum/__init__.py +121 -0
  2. luna_quantum/__init__.pyi +85 -0
  3. luna_quantum/_core.cpython-314-darwin.so +0 -0
  4. luna_quantum/_core.pyi +4185 -0
  5. luna_quantum/algorithms/__init__.py +1 -0
  6. luna_quantum/aqm_overwrites/__init__.py +3 -0
  7. luna_quantum/aqm_overwrites/model.py +184 -0
  8. luna_quantum/backends/__init__.py +1 -0
  9. luna_quantum/client/__init__.py +0 -0
  10. luna_quantum/client/controllers/__init__.py +4 -0
  11. luna_quantum/client/controllers/luna_http_client.py +37 -0
  12. luna_quantum/client/controllers/luna_platform_client.py +256 -0
  13. luna_quantum/client/controllers/luna_q.py +67 -0
  14. luna_quantum/client/controllers/luna_solve.py +129 -0
  15. luna_quantum/client/error/__init__.py +0 -0
  16. luna_quantum/client/error/luna_api_key_invalid_error.py +10 -0
  17. luna_quantum/client/error/luna_api_key_missing_error.py +10 -0
  18. luna_quantum/client/error/luna_error.py +2 -0
  19. luna_quantum/client/error/luna_server_error.py +20 -0
  20. luna_quantum/client/error/timeout_error.py +12 -0
  21. luna_quantum/client/error/transformation_error.py +18 -0
  22. luna_quantum/client/error/utils/__init__.py +0 -0
  23. luna_quantum/client/error/utils/http_error_utils.py +112 -0
  24. luna_quantum/client/interfaces/__init__.py +4 -0
  25. luna_quantum/client/interfaces/clients/__init__.py +25 -0
  26. luna_quantum/client/interfaces/clients/circuit_rest_client_i.py +68 -0
  27. luna_quantum/client/interfaces/clients/info_rest_client_i.py +53 -0
  28. luna_quantum/client/interfaces/clients/model_rest_client_i.py +139 -0
  29. luna_quantum/client/interfaces/clients/qpu_token_rest_client_i.py +364 -0
  30. luna_quantum/client/interfaces/clients/rest_client_i.py +21 -0
  31. luna_quantum/client/interfaces/clients/solve_job_rest_client_i.py +201 -0
  32. luna_quantum/client/interfaces/clients/users_rest_client_i.py +29 -0
  33. luna_quantum/client/interfaces/services/__init__.py +0 -0
  34. luna_quantum/client/interfaces/services/luna_q_i.py +34 -0
  35. luna_quantum/client/interfaces/services/luna_solve_i.py +72 -0
  36. luna_quantum/client/interfaces/services/service_i.py +56 -0
  37. luna_quantum/client/rest_client/__init__.py +15 -0
  38. luna_quantum/client/rest_client/circuit_rest_client.py +107 -0
  39. luna_quantum/client/rest_client/info_rest_client.py +74 -0
  40. luna_quantum/client/rest_client/model_rest_client.py +216 -0
  41. luna_quantum/client/rest_client/qpu_token_rest_client.py +508 -0
  42. luna_quantum/client/rest_client/solve_job_rest_client.py +286 -0
  43. luna_quantum/client/rest_client/users_rest_client.py +35 -0
  44. luna_quantum/client/schemas/__init__.py +26 -0
  45. luna_quantum/client/schemas/circuit.py +48 -0
  46. luna_quantum/client/schemas/create/__init__.py +15 -0
  47. luna_quantum/client/schemas/create/circuit.py +30 -0
  48. luna_quantum/client/schemas/create/optimization.py +39 -0
  49. luna_quantum/client/schemas/create/qpu_token.py +22 -0
  50. luna_quantum/client/schemas/create/qpu_token_time_quota.py +35 -0
  51. luna_quantum/client/schemas/create/qpu_token_time_quota_update.py +24 -0
  52. luna_quantum/client/schemas/create/qubo.py +19 -0
  53. luna_quantum/client/schemas/create/solve_job_create.py +43 -0
  54. luna_quantum/client/schemas/enums/__init__.py +0 -0
  55. luna_quantum/client/schemas/enums/call_style.py +13 -0
  56. luna_quantum/client/schemas/enums/circuit.py +42 -0
  57. luna_quantum/client/schemas/enums/model_format.py +11 -0
  58. luna_quantum/client/schemas/enums/problem.py +50 -0
  59. luna_quantum/client/schemas/enums/qpu_token_type.py +20 -0
  60. luna_quantum/client/schemas/enums/sense.py +8 -0
  61. luna_quantum/client/schemas/enums/status.py +40 -0
  62. luna_quantum/client/schemas/enums/timeframe.py +11 -0
  63. luna_quantum/client/schemas/error_message.py +14 -0
  64. luna_quantum/client/schemas/model_metadata.py +35 -0
  65. luna_quantum/client/schemas/qpu_token/__init__.py +0 -0
  66. luna_quantum/client/schemas/qpu_token/qpu_token.py +154 -0
  67. luna_quantum/client/schemas/qpu_token/qpu_token_source.py +19 -0
  68. luna_quantum/client/schemas/qpu_token/qpu_token_time_quota.py +30 -0
  69. luna_quantum/client/schemas/qpu_token/token_provider.py +132 -0
  70. luna_quantum/client/schemas/representation.py +19 -0
  71. luna_quantum/client/schemas/solution.py +106 -0
  72. luna_quantum/client/schemas/solve_job.py +50 -0
  73. luna_quantum/client/schemas/solver_info.py +11 -0
  74. luna_quantum/client/schemas/user.py +11 -0
  75. luna_quantum/client/schemas/wrappers/__init__.py +5 -0
  76. luna_quantum/client/schemas/wrappers/datetime_wrapper.py +32 -0
  77. luna_quantum/client/utils/__init__.py +0 -0
  78. luna_quantum/client/utils/qpu_token_utils.py +147 -0
  79. luna_quantum/config.py +11 -0
  80. luna_quantum/decorators.py +248 -0
  81. luna_quantum/errors.py +34 -0
  82. luna_quantum/errors.pyi +287 -0
  83. luna_quantum/exceptions/__init__.py +0 -0
  84. luna_quantum/exceptions/base_luna_quantum_error.py +2 -0
  85. luna_quantum/exceptions/patch_class_field_exists_error.py +10 -0
  86. luna_quantum/factories/__init__.py +4 -0
  87. luna_quantum/factories/luna_solve_client_factory.py +100 -0
  88. luna_quantum/factories/usecase_factory.py +457 -0
  89. luna_quantum/py.typed +0 -0
  90. luna_quantum/solve/__init__.py +13 -0
  91. luna_quantum/solve/default_token.py +304 -0
  92. luna_quantum/solve/domain/__init__.py +0 -0
  93. luna_quantum/solve/domain/abstract/__init__.py +4 -0
  94. luna_quantum/solve/domain/abstract/luna_algorithm.py +205 -0
  95. luna_quantum/solve/domain/abstract/qpu_token_backend.py +34 -0
  96. luna_quantum/solve/domain/model_metadata.py +56 -0
  97. luna_quantum/solve/domain/solve_job.py +196 -0
  98. luna_quantum/solve/errors/__init__.py +0 -0
  99. luna_quantum/solve/errors/incompatible_backend_error.py +15 -0
  100. luna_quantum/solve/errors/model_metadata_missing_error.py +11 -0
  101. luna_quantum/solve/errors/solve_base_error.py +5 -0
  102. luna_quantum/solve/errors/token_missing_error.py +11 -0
  103. luna_quantum/solve/interfaces/__init__.py +0 -0
  104. luna_quantum/solve/interfaces/algorithm_i.py +49 -0
  105. luna_quantum/solve/interfaces/backend_i.py +28 -0
  106. luna_quantum/solve/interfaces/usecases/__init__.py +55 -0
  107. luna_quantum/solve/interfaces/usecases/model_delete_usecase_i.py +27 -0
  108. luna_quantum/solve/interfaces/usecases/model_fetch_metadata_usecase_i.py +33 -0
  109. luna_quantum/solve/interfaces/usecases/model_get_solutions_usecase_i.py +33 -0
  110. luna_quantum/solve/interfaces/usecases/model_get_solve_jobs_usecase_i.py +33 -0
  111. luna_quantum/solve/interfaces/usecases/model_load_by_id_usecase_i.py +32 -0
  112. luna_quantum/solve/interfaces/usecases/model_load_by_metadata_usecase_i.py +37 -0
  113. luna_quantum/solve/interfaces/usecases/model_load_metadata_by_hash_usecase_i.py +38 -0
  114. luna_quantum/solve/interfaces/usecases/model_save_usecase_i.py +36 -0
  115. luna_quantum/solve/interfaces/usecases/solve_job_cancel_usecase_i.py +33 -0
  116. luna_quantum/solve/interfaces/usecases/solve_job_create_usecase_i.py +44 -0
  117. luna_quantum/solve/interfaces/usecases/solve_job_delete_usecase_i.py +32 -0
  118. luna_quantum/solve/interfaces/usecases/solve_job_fetch_updates_usecase_i.py +38 -0
  119. luna_quantum/solve/interfaces/usecases/solve_job_get_result_usecase_i.py +63 -0
  120. luna_quantum/solve/parameters/__init__.py +0 -0
  121. luna_quantum/solve/parameters/algorithms/__init__.py +51 -0
  122. luna_quantum/solve/parameters/algorithms/base_params/__init__.py +24 -0
  123. luna_quantum/solve/parameters/algorithms/base_params/decomposer.py +57 -0
  124. luna_quantum/solve/parameters/algorithms/base_params/qaoa_circuit_params.py +95 -0
  125. luna_quantum/solve/parameters/algorithms/base_params/quantum_annealing_params.py +79 -0
  126. luna_quantum/solve/parameters/algorithms/base_params/scipy_optimizer.py +122 -0
  127. luna_quantum/solve/parameters/algorithms/base_params/simulated_annealing_params.py +106 -0
  128. luna_quantum/solve/parameters/algorithms/base_params/tabu_kerberos_params.py +39 -0
  129. luna_quantum/solve/parameters/algorithms/base_params/tabu_search_params.py +129 -0
  130. luna_quantum/solve/parameters/algorithms/flexible_parameter_algorithm.py +59 -0
  131. luna_quantum/solve/parameters/algorithms/genetic_algorithms/__init__.py +4 -0
  132. luna_quantum/solve/parameters/algorithms/genetic_algorithms/qaga.py +131 -0
  133. luna_quantum/solve/parameters/algorithms/genetic_algorithms/saga.py +139 -0
  134. luna_quantum/solve/parameters/algorithms/lq_fda/__init__.py +3 -0
  135. luna_quantum/solve/parameters/algorithms/lq_fda/fujits_da_base.py +85 -0
  136. luna_quantum/solve/parameters/algorithms/lq_fda/fujitsu_da_v3c.py +155 -0
  137. luna_quantum/solve/parameters/algorithms/optimization_solvers/__init__.py +3 -0
  138. luna_quantum/solve/parameters/algorithms/optimization_solvers/scip.py +51 -0
  139. luna_quantum/solve/parameters/algorithms/quantum_annealing/__init__.py +19 -0
  140. luna_quantum/solve/parameters/algorithms/quantum_annealing/kerberos.py +149 -0
  141. luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_bqm.py +75 -0
  142. luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_cqm.py +75 -0
  143. luna_quantum/solve/parameters/algorithms/quantum_annealing/parallel_tempering_qpu.py +139 -0
  144. luna_quantum/solve/parameters/algorithms/quantum_annealing/population_annealing_qpu.py +109 -0
  145. luna_quantum/solve/parameters/algorithms/quantum_annealing/qbsolv_like_qpu.py +111 -0
  146. luna_quantum/solve/parameters/algorithms/quantum_annealing/quantum_annealing.py +121 -0
  147. luna_quantum/solve/parameters/algorithms/quantum_annealing/repeated_reverse_quantum_annealing.py +174 -0
  148. luna_quantum/solve/parameters/algorithms/quantum_gate/__init__.py +6 -0
  149. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/__init__.py +26 -0
  150. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/config.py +80 -0
  151. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/flex_qaoa.py +226 -0
  152. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/optimizers.py +99 -0
  153. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/pipeline.py +87 -0
  154. luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa.py +102 -0
  155. luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa_fo.py +69 -0
  156. luna_quantum/solve/parameters/algorithms/quantum_gate/vqe.py +108 -0
  157. luna_quantum/solve/parameters/algorithms/search_algorithms/__init__.py +5 -0
  158. luna_quantum/solve/parameters/algorithms/search_algorithms/dialectic_search.py +136 -0
  159. luna_quantum/solve/parameters/algorithms/search_algorithms/qbsolv_like_tabu_search.py +117 -0
  160. luna_quantum/solve/parameters/algorithms/search_algorithms/tabu_search.py +126 -0
  161. luna_quantum/solve/parameters/algorithms/simulated_annealing/__init__.py +13 -0
  162. luna_quantum/solve/parameters/algorithms/simulated_annealing/parallel_tempering.py +131 -0
  163. luna_quantum/solve/parameters/algorithms/simulated_annealing/population_annealing.py +95 -0
  164. luna_quantum/solve/parameters/algorithms/simulated_annealing/qbsolv_like_simulated_annealing.py +141 -0
  165. luna_quantum/solve/parameters/algorithms/simulated_annealing/repeated_reverse_simulated_annealing.py +172 -0
  166. luna_quantum/solve/parameters/algorithms/simulated_annealing/simulated_annealing.py +126 -0
  167. luna_quantum/solve/parameters/backends/__init__.py +22 -0
  168. luna_quantum/solve/parameters/backends/aqarios.py +17 -0
  169. luna_quantum/solve/parameters/backends/aws/__init__.py +11 -0
  170. luna_quantum/solve/parameters/backends/aws/aws.py +36 -0
  171. luna_quantum/solve/parameters/backends/aws/aws_backend_base.py +74 -0
  172. luna_quantum/solve/parameters/backends/aws/ionq.py +43 -0
  173. luna_quantum/solve/parameters/backends/aws/iqm.py +31 -0
  174. luna_quantum/solve/parameters/backends/aws/rigetti.py +31 -0
  175. luna_quantum/solve/parameters/backends/dwave.py +17 -0
  176. luna_quantum/solve/parameters/backends/dwave_qpu.py +166 -0
  177. luna_quantum/solve/parameters/backends/fda.py +17 -0
  178. luna_quantum/solve/parameters/backends/ibm.py +138 -0
  179. luna_quantum/solve/parameters/backends/qctrl.py +103 -0
  180. luna_quantum/solve/parameters/backends/zib.py +17 -0
  181. luna_quantum/solve/parameters/constants.py +11 -0
  182. luna_quantum/solve/parameters/mixins/__init__.py +0 -0
  183. luna_quantum/solve/parameters/mixins/fujitsu_common_params_mixin.py +239 -0
  184. luna_quantum/solve/parameters/mixins/fujitsu_v2_mixin.py +70 -0
  185. luna_quantum/solve/parameters/mixins/qbsolv_like_mixin.py +60 -0
  186. luna_quantum/solve/use_cases/__init__.py +119 -0
  187. luna_quantum/solve/use_cases/arbitrage_edge_based.py +50 -0
  188. luna_quantum/solve/use_cases/arbitrage_node_based.py +55 -0
  189. luna_quantum/solve/use_cases/base.py +7 -0
  190. luna_quantum/solve/use_cases/binary_integer_linear_programming.py +54 -0
  191. luna_quantum/solve/use_cases/binary_paint_shop_problem.py +37 -0
  192. luna_quantum/solve/use_cases/credit_scoring_feature_selection.py +40 -0
  193. luna_quantum/solve/use_cases/dynamic_portfolio_optimization.py +64 -0
  194. luna_quantum/solve/use_cases/exact_cover.py +51 -0
  195. luna_quantum/solve/use_cases/flight_gate_assignment.py +79 -0
  196. luna_quantum/solve/use_cases/graph_coloring.py +42 -0
  197. luna_quantum/solve/use_cases/graph_isomorphism.py +52 -0
  198. luna_quantum/solve/use_cases/graph_partitioning.py +46 -0
  199. luna_quantum/solve/use_cases/hamiltonian_cycle.py +49 -0
  200. luna_quantum/solve/use_cases/induced_subgraph_isomorphism.py +50 -0
  201. luna_quantum/solve/use_cases/job_shop_scheduling.py +44 -0
  202. luna_quantum/solve/use_cases/k_medoids_clustering.py +49 -0
  203. luna_quantum/solve/use_cases/knapsack_integer_weights.py +56 -0
  204. luna_quantum/solve/use_cases/linear_regression.py +60 -0
  205. luna_quantum/solve/use_cases/lmwcs.py +84 -0
  206. luna_quantum/solve/use_cases/longest_path.py +50 -0
  207. luna_quantum/solve/use_cases/market_graph_clustering.py +61 -0
  208. luna_quantum/solve/use_cases/max2sat.py +54 -0
  209. luna_quantum/solve/use_cases/max3sat.py +55 -0
  210. luna_quantum/solve/use_cases/max_clique.py +60 -0
  211. luna_quantum/solve/use_cases/max_cut.py +48 -0
  212. luna_quantum/solve/use_cases/max_independent_set.py +37 -0
  213. luna_quantum/solve/use_cases/minimal_maximal_matching.py +54 -0
  214. luna_quantum/solve/use_cases/minimal_spanning_tree.py +90 -0
  215. luna_quantum/solve/use_cases/minimum_vertex_cover.py +45 -0
  216. luna_quantum/solve/use_cases/number_partitioning.py +32 -0
  217. luna_quantum/solve/use_cases/portfolio_optimization.py +46 -0
  218. luna_quantum/solve/use_cases/portfolio_optimization_ib_tv.py +63 -0
  219. luna_quantum/solve/use_cases/quadratic_assignment.py +49 -0
  220. luna_quantum/solve/use_cases/quadratic_knapsack.py +48 -0
  221. luna_quantum/solve/use_cases/satellite_scheduling.py +73 -0
  222. luna_quantum/solve/use_cases/sensor_placement.py +58 -0
  223. luna_quantum/solve/use_cases/set_cover.py +56 -0
  224. luna_quantum/solve/use_cases/set_packing.py +54 -0
  225. luna_quantum/solve/use_cases/set_partitioning.py +52 -0
  226. luna_quantum/solve/use_cases/subgraph_isomorphism.py +55 -0
  227. luna_quantum/solve/use_cases/subset_sum.py +37 -0
  228. luna_quantum/solve/use_cases/support_vector_machine.py +64 -0
  229. luna_quantum/solve/use_cases/traffic_flow.py +35 -0
  230. luna_quantum/solve/use_cases/travelling_salesman_problem.py +53 -0
  231. luna_quantum/solve/use_cases/type_aliases.py +9 -0
  232. luna_quantum/solve/use_cases/weighted_max_cut.py +37 -0
  233. luna_quantum/solve/usecases/__init__.py +45 -0
  234. luna_quantum/solve/usecases/model_delete_usecase.py +49 -0
  235. luna_quantum/solve/usecases/model_fetch_metadata_usecase.py +50 -0
  236. luna_quantum/solve/usecases/model_get_solution_usecase.py +59 -0
  237. luna_quantum/solve/usecases/model_get_solve_jobs_usecase.py +62 -0
  238. luna_quantum/solve/usecases/model_load_by_id_usecase.py +47 -0
  239. luna_quantum/solve/usecases/model_load_by_metadata_usecase.py +52 -0
  240. luna_quantum/solve/usecases/model_load_metadata_by_hash_usecase.py +51 -0
  241. luna_quantum/solve/usecases/model_save_usecase.py +63 -0
  242. luna_quantum/solve/usecases/solve_job_cancel_usecase.py +51 -0
  243. luna_quantum/solve/usecases/solve_job_create_usecase.py +112 -0
  244. luna_quantum/solve/usecases/solve_job_delete_usecase.py +38 -0
  245. luna_quantum/solve/usecases/solve_job_fetch_updates_usecase.py +49 -0
  246. luna_quantum/solve/usecases/solve_job_get_result_usecase.py +95 -0
  247. luna_quantum/transformations.py +18 -0
  248. luna_quantum/transformations.pyi +371 -0
  249. luna_quantum/translator.py +23 -0
  250. luna_quantum/translator.pyi +869 -0
  251. luna_quantum/util/__init__.py +0 -0
  252. luna_quantum/util/active_waiting.py +79 -0
  253. luna_quantum/util/class_patcher.py +164 -0
  254. luna_quantum/util/debug_info.py +52 -0
  255. luna_quantum/util/log_utils.py +187 -0
  256. luna_quantum/util/pretty_base.py +67 -0
  257. luna_quantum/util/pydantic_utils.py +38 -0
  258. luna_quantum/utils.py +3 -0
  259. luna_quantum/utils.pyi +67 -0
  260. luna_quantum-1.0.8rc2.dist-info/METADATA +36 -0
  261. luna_quantum-1.0.8rc2.dist-info/RECORD +264 -0
  262. luna_quantum-1.0.8rc2.dist-info/WHEEL +4 -0
  263. luna_quantum-1.0.8rc2.dist-info/licenses/LICENSE +176 -0
  264. luna_quantum-1.0.8rc2.dist-info/licenses/NOTICE +13 -0
@@ -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,95 @@
1
+ from luna_quantum._core import Solution
2
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
3
+ from luna_quantum.client.schemas.enums.call_style import CallStyle
4
+ from luna_quantum.client.schemas.enums.status import StatusEnum
5
+ from luna_quantum.solve.domain.solve_job import SolveJob
6
+ from luna_quantum.solve.interfaces.usecases.solve_job_get_result_usecase_i import (
7
+ ISolveJobGetResultUseCase,
8
+ )
9
+ from luna_quantum.util.active_waiting import ActiveWaiting
10
+ from luna_quantum.util.log_utils import Logging, progress
11
+
12
+
13
+ class SolveJobGetResultUseCase(ISolveJobGetResultUseCase):
14
+ """
15
+ Handle the process of retrieving and interacting with a solve job's result.
16
+
17
+ This class interacts with a backend client to manage fetching and handling
18
+ results for a solve job, using different strategies for waiting and polling
19
+ depending on the specified call style.
20
+
21
+ Attributes
22
+ ----------
23
+ client : ILunaSolve
24
+ Client used to interact with the solve job and retrieve its results.
25
+ """
26
+
27
+ client: ILunaSolve
28
+ logger = Logging.get_logger(__name__)
29
+
30
+ def __init__(self, client: ILunaSolve) -> None:
31
+ self.client = client
32
+
33
+ @progress(total=None, desc="Retrieving solve job...")
34
+ def __call__(
35
+ self,
36
+ solve_job: SolveJob,
37
+ sleep_time_max: float,
38
+ sleep_time_increment: float,
39
+ sleep_time_initial: float,
40
+ call_style: CallStyle,
41
+ ) -> Solution | None:
42
+ """
43
+ Execute the given solve job with specified waiting strategy.
44
+
45
+ Parameters
46
+ ----------
47
+ solve_job : SolveJob
48
+ The job that needs to be solved.
49
+ sleep_time_max : float
50
+ The maximum amount of time to wait between checks.
51
+ sleep_time_increment : float
52
+ The incremental step to increase sleep time during active waiting.
53
+ sleep_time_initial : float
54
+ The initial sleep time for the waiting strategy.
55
+ call_style : CallStyle
56
+ The style of waiting (e.g., active waiting) to use when processing the job.
57
+
58
+ Returns
59
+ -------
60
+ Optional[Solution]
61
+ The solution for the given solve job if successfully processed, otherwise
62
+ None.
63
+ """
64
+ if call_style is CallStyle.ACTIVE_WAITING:
65
+ final_states = StatusEnum.CANCELED, StatusEnum.DONE, StatusEnum.FAILED
66
+
67
+ ActiveWaiting.run(
68
+ loop_check=lambda: solve_job.get_status(
69
+ client=self.client, status_source="remote"
70
+ )
71
+ not in final_states,
72
+ loop_call=None,
73
+ sleep_time_max=sleep_time_max,
74
+ sleep_time_increment=sleep_time_increment,
75
+ sleep_time_initial=sleep_time_initial,
76
+ )
77
+ try:
78
+ if solve_job.status == StatusEnum.CANCELED:
79
+ self.logger.warning(
80
+ "Solve job is cancelled. Result cannot be retrieved."
81
+ )
82
+ return None
83
+ if solve_job.status == StatusEnum.FAILED:
84
+ self.logger.error(
85
+ f"Solve job failed with the error '{solve_job.error_message}'."
86
+ )
87
+ return None
88
+ aq_solution: Solution = self.client.solve_job.get_solution(
89
+ solve_job_id=solve_job.id
90
+ )
91
+ except Exception:
92
+ # TODO(Llewellyn) more fine grained exception handling # noqa: FIX002, TD004
93
+ return None
94
+
95
+ return aq_solution
@@ -0,0 +1,18 @@
1
+ """Transformations collection.
2
+
3
+ The `transformations` module provides a collection of transformations for converting
4
+ between various representations of optimization problems and their solutions.
5
+
6
+ Transformations generally convert between different representations of an optimization
7
+ model. For example, changing the Sense of a model.
8
+
9
+ Each transformation encapsulates the logic needed for transforming a model to a desired
10
+ output model with changed properties and the logic to convert a solution of the output
11
+ model back to a solution representation matching the input model.
12
+
13
+ In addition to the predefined transformations contained in this module.
14
+ One can implement their own transformations by implementing the `TransformationPass`
15
+ and `AnalysisPass` abstract classes. See the examples for further details.
16
+ """
17
+
18
+ from ._core.transformations import * # type: ignore[reportMissingImports] # noqa: F403