luna-quantum 1.0.0__cp313-cp313-manylinux_2_34_x86_64.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 (252) hide show
  1. luna_quantum/__init__.py +96 -0
  2. luna_quantum/__init__.pyi +68 -0
  3. luna_quantum/_core.cpython-313-x86_64-linux-gnu.so +0 -0
  4. luna_quantum/_core.pyi +3017 -0
  5. luna_quantum/aqm_overwrites/__init__.py +3 -0
  6. luna_quantum/aqm_overwrites/model.py +184 -0
  7. luna_quantum/client/__init__.py +0 -0
  8. luna_quantum/client/controllers/__init__.py +4 -0
  9. luna_quantum/client/controllers/luna_http_client.py +37 -0
  10. luna_quantum/client/controllers/luna_platform_client.py +153 -0
  11. luna_quantum/client/controllers/luna_q.py +62 -0
  12. luna_quantum/client/controllers/luna_solve.py +125 -0
  13. luna_quantum/client/error/__init__.py +0 -0
  14. luna_quantum/client/error/luna_api_key_invalid_error.py +10 -0
  15. luna_quantum/client/error/luna_api_key_missing_error.py +10 -0
  16. luna_quantum/client/error/luna_error.py +2 -0
  17. luna_quantum/client/error/luna_server_error.py +20 -0
  18. luna_quantum/client/error/timeout_error.py +12 -0
  19. luna_quantum/client/error/transformation_error.py +18 -0
  20. luna_quantum/client/error/utils/__init__.py +0 -0
  21. luna_quantum/client/error/utils/http_error_utils.py +112 -0
  22. luna_quantum/client/interfaces/__init__.py +4 -0
  23. luna_quantum/client/interfaces/clients/__init__.py +25 -0
  24. luna_quantum/client/interfaces/clients/circuit_rest_client_i.py +68 -0
  25. luna_quantum/client/interfaces/clients/info_rest_client_i.py +53 -0
  26. luna_quantum/client/interfaces/clients/model_rest_client_i.py +139 -0
  27. luna_quantum/client/interfaces/clients/qpu_token_rest_client_i.py +364 -0
  28. luna_quantum/client/interfaces/clients/rest_client_i.py +21 -0
  29. luna_quantum/client/interfaces/clients/solve_job_rest_client_i.py +201 -0
  30. luna_quantum/client/interfaces/clients/users_rest_client_i.py +29 -0
  31. luna_quantum/client/interfaces/services/__init__.py +0 -0
  32. luna_quantum/client/interfaces/services/luna_q_i.py +34 -0
  33. luna_quantum/client/interfaces/services/luna_solve_i.py +72 -0
  34. luna_quantum/client/interfaces/services/service_i.py +36 -0
  35. luna_quantum/client/rest_client/__init__.py +15 -0
  36. luna_quantum/client/rest_client/circuit_rest_client.py +107 -0
  37. luna_quantum/client/rest_client/info_rest_client.py +76 -0
  38. luna_quantum/client/rest_client/model_rest_client.py +216 -0
  39. luna_quantum/client/rest_client/qpu_token_rest_client.py +504 -0
  40. luna_quantum/client/rest_client/solve_job_rest_client.py +286 -0
  41. luna_quantum/client/rest_client/users_rest_client.py +35 -0
  42. luna_quantum/client/schemas/__init__.py +26 -0
  43. luna_quantum/client/schemas/circuit.py +49 -0
  44. luna_quantum/client/schemas/create/__init__.py +6 -0
  45. luna_quantum/client/schemas/create/circuit.py +31 -0
  46. luna_quantum/client/schemas/create/optimization.py +39 -0
  47. luna_quantum/client/schemas/create/qpu_token.py +25 -0
  48. luna_quantum/client/schemas/create/qpu_token_time_quota.py +29 -0
  49. luna_quantum/client/schemas/create/qubo.py +19 -0
  50. luna_quantum/client/schemas/create/solve_job_create.py +43 -0
  51. luna_quantum/client/schemas/enums/__init__.py +0 -0
  52. luna_quantum/client/schemas/enums/call_style.py +13 -0
  53. luna_quantum/client/schemas/enums/circuit.py +42 -0
  54. luna_quantum/client/schemas/enums/model_format.py +11 -0
  55. luna_quantum/client/schemas/enums/problem.py +50 -0
  56. luna_quantum/client/schemas/enums/qpu_token_type.py +20 -0
  57. luna_quantum/client/schemas/enums/sense.py +8 -0
  58. luna_quantum/client/schemas/enums/status.py +40 -0
  59. luna_quantum/client/schemas/enums/timeframe.py +11 -0
  60. luna_quantum/client/schemas/error_message.py +14 -0
  61. luna_quantum/client/schemas/model_metadata.py +35 -0
  62. luna_quantum/client/schemas/qpu_token/__init__.py +0 -0
  63. luna_quantum/client/schemas/qpu_token/qpu_token.py +161 -0
  64. luna_quantum/client/schemas/qpu_token/qpu_token_source.py +19 -0
  65. luna_quantum/client/schemas/qpu_token/qpu_token_time_quota.py +28 -0
  66. luna_quantum/client/schemas/qpu_token/token_provider.py +135 -0
  67. luna_quantum/client/schemas/representation.py +19 -0
  68. luna_quantum/client/schemas/solution.py +106 -0
  69. luna_quantum/client/schemas/solve_job.py +47 -0
  70. luna_quantum/client/schemas/solver_info.py +11 -0
  71. luna_quantum/client/schemas/user.py +11 -0
  72. luna_quantum/client/schemas/wrappers/__init__.py +5 -0
  73. luna_quantum/client/schemas/wrappers/datetime_wrapper.py +32 -0
  74. luna_quantum/client/utils/__init__.py +0 -0
  75. luna_quantum/client/utils/qpu_token_utils.py +147 -0
  76. luna_quantum/errors.py +1 -0
  77. luna_quantum/errors.pyi +202 -0
  78. luna_quantum/exceptions/__init__.py +0 -0
  79. luna_quantum/exceptions/base_luna_quantum_error.py +2 -0
  80. luna_quantum/exceptions/patch_class_field_exists_error.py +10 -0
  81. luna_quantum/factories/__init__.py +4 -0
  82. luna_quantum/factories/luna_solve_client_factory.py +75 -0
  83. luna_quantum/factories/usecase_factory.py +457 -0
  84. luna_quantum/py.typed +0 -0
  85. luna_quantum/solve/__init__.py +13 -0
  86. luna_quantum/solve/default_token.py +304 -0
  87. luna_quantum/solve/domain/__init__.py +0 -0
  88. luna_quantum/solve/domain/abstract/__init__.py +4 -0
  89. luna_quantum/solve/domain/abstract/luna_algorithm.py +203 -0
  90. luna_quantum/solve/domain/abstract/qpu_token_backend.py +34 -0
  91. luna_quantum/solve/domain/model_metadata.py +54 -0
  92. luna_quantum/solve/domain/solve_job.py +187 -0
  93. luna_quantum/solve/errors/__init__.py +0 -0
  94. luna_quantum/solve/errors/incompatible_backend_error.py +15 -0
  95. luna_quantum/solve/errors/model_metadata_missing_error.py +11 -0
  96. luna_quantum/solve/errors/solve_base_error.py +5 -0
  97. luna_quantum/solve/errors/token_missing_error.py +11 -0
  98. luna_quantum/solve/interfaces/__init__.py +0 -0
  99. luna_quantum/solve/interfaces/algorithm_i.py +47 -0
  100. luna_quantum/solve/interfaces/backend_i.py +28 -0
  101. luna_quantum/solve/interfaces/usecases/__init__.py +55 -0
  102. luna_quantum/solve/interfaces/usecases/model_delete_usecase_i.py +27 -0
  103. luna_quantum/solve/interfaces/usecases/model_fetch_metadata_usecase_i.py +33 -0
  104. luna_quantum/solve/interfaces/usecases/model_get_solutions_usecase_i.py +33 -0
  105. luna_quantum/solve/interfaces/usecases/model_get_solve_jobs_usecase_i.py +33 -0
  106. luna_quantum/solve/interfaces/usecases/model_load_by_id_usecase_i.py +32 -0
  107. luna_quantum/solve/interfaces/usecases/model_load_by_metadata_usecase_i.py +37 -0
  108. luna_quantum/solve/interfaces/usecases/model_load_metadata_by_hash_usecase_i.py +38 -0
  109. luna_quantum/solve/interfaces/usecases/model_save_usecase_i.py +36 -0
  110. luna_quantum/solve/interfaces/usecases/solve_job_cancel_usecase_i.py +33 -0
  111. luna_quantum/solve/interfaces/usecases/solve_job_create_usecase_i.py +44 -0
  112. luna_quantum/solve/interfaces/usecases/solve_job_delete_usecase_i.py +32 -0
  113. luna_quantum/solve/interfaces/usecases/solve_job_fetch_updates_usecase_i.py +38 -0
  114. luna_quantum/solve/interfaces/usecases/solve_job_get_result_usecase_i.py +63 -0
  115. luna_quantum/solve/parameters/__init__.py +0 -0
  116. luna_quantum/solve/parameters/algorithms/__init__.py +49 -0
  117. luna_quantum/solve/parameters/algorithms/base_params/__init__.py +24 -0
  118. luna_quantum/solve/parameters/algorithms/base_params/decomposer.py +57 -0
  119. luna_quantum/solve/parameters/algorithms/base_params/qaoa_circuit_params.py +95 -0
  120. luna_quantum/solve/parameters/algorithms/base_params/quantum_annealing_params.py +78 -0
  121. luna_quantum/solve/parameters/algorithms/base_params/scipy_optimizer.py +120 -0
  122. luna_quantum/solve/parameters/algorithms/base_params/simulated_annealing_params.py +106 -0
  123. luna_quantum/solve/parameters/algorithms/base_params/tabu_kerberos_params.py +39 -0
  124. luna_quantum/solve/parameters/algorithms/base_params/tabu_search_params.py +129 -0
  125. luna_quantum/solve/parameters/algorithms/flexible_parameter_algorithm.py +59 -0
  126. luna_quantum/solve/parameters/algorithms/genetic_algorithms/__init__.py +4 -0
  127. luna_quantum/solve/parameters/algorithms/genetic_algorithms/qaga.py +131 -0
  128. luna_quantum/solve/parameters/algorithms/genetic_algorithms/saga.py +139 -0
  129. luna_quantum/solve/parameters/algorithms/optimization_solvers/__init__.py +3 -0
  130. luna_quantum/solve/parameters/algorithms/optimization_solvers/scip.py +51 -0
  131. luna_quantum/solve/parameters/algorithms/quantum_annealing/__init__.py +19 -0
  132. luna_quantum/solve/parameters/algorithms/quantum_annealing/kerberos.py +149 -0
  133. luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_bqm.py +75 -0
  134. luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_cqm.py +75 -0
  135. luna_quantum/solve/parameters/algorithms/quantum_annealing/parallel_tempering_qpu.py +139 -0
  136. luna_quantum/solve/parameters/algorithms/quantum_annealing/population_annealing_qpu.py +109 -0
  137. luna_quantum/solve/parameters/algorithms/quantum_annealing/qbsolv_like_qpu.py +111 -0
  138. luna_quantum/solve/parameters/algorithms/quantum_annealing/quantum_annealing.py +105 -0
  139. luna_quantum/solve/parameters/algorithms/quantum_annealing/repeated_reverse_quantum_annealing.py +174 -0
  140. luna_quantum/solve/parameters/algorithms/quantum_gate/__init__.py +6 -0
  141. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/__init__.py +26 -0
  142. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/config.py +80 -0
  143. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/flex_qaoa.py +226 -0
  144. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/optimizers.py +97 -0
  145. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/pipeline.py +87 -0
  146. luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa.py +104 -0
  147. luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa_fo.py +69 -0
  148. luna_quantum/solve/parameters/algorithms/quantum_gate/vqe.py +109 -0
  149. luna_quantum/solve/parameters/algorithms/search_algorithms/__init__.py +5 -0
  150. luna_quantum/solve/parameters/algorithms/search_algorithms/dialectic_search.py +152 -0
  151. luna_quantum/solve/parameters/algorithms/search_algorithms/qbsolv_like_tabu_search.py +117 -0
  152. luna_quantum/solve/parameters/algorithms/search_algorithms/tabu_search.py +126 -0
  153. luna_quantum/solve/parameters/algorithms/simulated_annealing/__init__.py +13 -0
  154. luna_quantum/solve/parameters/algorithms/simulated_annealing/parallel_tempering.py +131 -0
  155. luna_quantum/solve/parameters/algorithms/simulated_annealing/population_annealing.py +95 -0
  156. luna_quantum/solve/parameters/algorithms/simulated_annealing/qbsolv_like_simulated_annealing.py +141 -0
  157. luna_quantum/solve/parameters/algorithms/simulated_annealing/repeated_reverse_simulated_annealing.py +172 -0
  158. luna_quantum/solve/parameters/algorithms/simulated_annealing/simulated_annealing.py +126 -0
  159. luna_quantum/solve/parameters/backends/__init__.py +20 -0
  160. luna_quantum/solve/parameters/backends/aqarios.py +17 -0
  161. luna_quantum/solve/parameters/backends/aws/__init__.py +11 -0
  162. luna_quantum/solve/parameters/backends/aws/aws.py +36 -0
  163. luna_quantum/solve/parameters/backends/aws/aws_backend_base.py +74 -0
  164. luna_quantum/solve/parameters/backends/aws/ionq.py +43 -0
  165. luna_quantum/solve/parameters/backends/aws/iqm.py +31 -0
  166. luna_quantum/solve/parameters/backends/aws/rigetti.py +31 -0
  167. luna_quantum/solve/parameters/backends/dwave.py +17 -0
  168. luna_quantum/solve/parameters/backends/dwave_qpu.py +164 -0
  169. luna_quantum/solve/parameters/backends/ibm.py +132 -0
  170. luna_quantum/solve/parameters/backends/qctrl.py +130 -0
  171. luna_quantum/solve/parameters/backends/zib.py +17 -0
  172. luna_quantum/solve/parameters/constants.py +11 -0
  173. luna_quantum/solve/parameters/mixins/__init__.py +0 -0
  174. luna_quantum/solve/parameters/mixins/fujitsu_common_params_mixin.py +239 -0
  175. luna_quantum/solve/parameters/mixins/fujitsu_v2_mixin.py +70 -0
  176. luna_quantum/solve/parameters/mixins/qbsolv_like_mixin.py +60 -0
  177. luna_quantum/solve/use_cases/__init__.py +119 -0
  178. luna_quantum/solve/use_cases/arbitrage_edge_based.py +50 -0
  179. luna_quantum/solve/use_cases/arbitrage_node_based.py +55 -0
  180. luna_quantum/solve/use_cases/base.py +7 -0
  181. luna_quantum/solve/use_cases/binary_integer_linear_programming.py +54 -0
  182. luna_quantum/solve/use_cases/binary_paint_shop_problem.py +37 -0
  183. luna_quantum/solve/use_cases/credit_scoring_feature_selection.py +40 -0
  184. luna_quantum/solve/use_cases/dynamic_portfolio_optimization.py +64 -0
  185. luna_quantum/solve/use_cases/exact_cover.py +51 -0
  186. luna_quantum/solve/use_cases/flight_gate_assignment.py +79 -0
  187. luna_quantum/solve/use_cases/graph_coloring.py +42 -0
  188. luna_quantum/solve/use_cases/graph_isomorphism.py +52 -0
  189. luna_quantum/solve/use_cases/graph_partitioning.py +46 -0
  190. luna_quantum/solve/use_cases/hamiltonian_cycle.py +49 -0
  191. luna_quantum/solve/use_cases/induced_subgraph_isomorphism.py +50 -0
  192. luna_quantum/solve/use_cases/job_shop_scheduling.py +44 -0
  193. luna_quantum/solve/use_cases/k_medoids_clustering.py +49 -0
  194. luna_quantum/solve/use_cases/knapsack_integer_weights.py +56 -0
  195. luna_quantum/solve/use_cases/linear_regression.py +60 -0
  196. luna_quantum/solve/use_cases/lmwcs.py +84 -0
  197. luna_quantum/solve/use_cases/longest_path.py +50 -0
  198. luna_quantum/solve/use_cases/market_graph_clustering.py +61 -0
  199. luna_quantum/solve/use_cases/max2sat.py +54 -0
  200. luna_quantum/solve/use_cases/max3sat.py +55 -0
  201. luna_quantum/solve/use_cases/max_clique.py +60 -0
  202. luna_quantum/solve/use_cases/max_cut.py +48 -0
  203. luna_quantum/solve/use_cases/max_independent_set.py +37 -0
  204. luna_quantum/solve/use_cases/minimal_maximal_matching.py +54 -0
  205. luna_quantum/solve/use_cases/minimal_spanning_tree.py +90 -0
  206. luna_quantum/solve/use_cases/minimum_vertex_cover.py +45 -0
  207. luna_quantum/solve/use_cases/number_partitioning.py +32 -0
  208. luna_quantum/solve/use_cases/portfolio_optimization.py +46 -0
  209. luna_quantum/solve/use_cases/portfolio_optimization_ib_tv.py +63 -0
  210. luna_quantum/solve/use_cases/quadratic_assignment.py +49 -0
  211. luna_quantum/solve/use_cases/quadratic_knapsack.py +48 -0
  212. luna_quantum/solve/use_cases/satellite_scheduling.py +73 -0
  213. luna_quantum/solve/use_cases/sensor_placement.py +58 -0
  214. luna_quantum/solve/use_cases/set_cover.py +56 -0
  215. luna_quantum/solve/use_cases/set_packing.py +54 -0
  216. luna_quantum/solve/use_cases/set_partitioning.py +52 -0
  217. luna_quantum/solve/use_cases/subgraph_isomorphism.py +55 -0
  218. luna_quantum/solve/use_cases/subset_sum.py +37 -0
  219. luna_quantum/solve/use_cases/support_vector_machine.py +64 -0
  220. luna_quantum/solve/use_cases/traffic_flow.py +35 -0
  221. luna_quantum/solve/use_cases/travelling_salesman_problem.py +53 -0
  222. luna_quantum/solve/use_cases/type_aliases.py +9 -0
  223. luna_quantum/solve/use_cases/weighted_max_cut.py +37 -0
  224. luna_quantum/solve/usecases/__init__.py +45 -0
  225. luna_quantum/solve/usecases/model_delete_usecase.py +49 -0
  226. luna_quantum/solve/usecases/model_fetch_metadata_usecase.py +50 -0
  227. luna_quantum/solve/usecases/model_get_solution_usecase.py +56 -0
  228. luna_quantum/solve/usecases/model_get_solve_jobs_usecase.py +62 -0
  229. luna_quantum/solve/usecases/model_load_by_id_usecase.py +47 -0
  230. luna_quantum/solve/usecases/model_load_by_metadata_usecase.py +52 -0
  231. luna_quantum/solve/usecases/model_load_metadata_by_hash_usecase.py +51 -0
  232. luna_quantum/solve/usecases/model_save_usecase.py +63 -0
  233. luna_quantum/solve/usecases/solve_job_cancel_usecase.py +51 -0
  234. luna_quantum/solve/usecases/solve_job_create_usecase.py +112 -0
  235. luna_quantum/solve/usecases/solve_job_delete_usecase.py +38 -0
  236. luna_quantum/solve/usecases/solve_job_fetch_updates_usecase.py +49 -0
  237. luna_quantum/solve/usecases/solve_job_get_result_usecase.py +97 -0
  238. luna_quantum/translator.py +1 -0
  239. luna_quantum/translator.pyi +833 -0
  240. luna_quantum/util/__init__.py +0 -0
  241. luna_quantum/util/active_waiting.py +79 -0
  242. luna_quantum/util/class_patcher.py +164 -0
  243. luna_quantum/util/log_utils.py +167 -0
  244. luna_quantum/util/pretty_base.py +67 -0
  245. luna_quantum/util/pydantic_utils.py +38 -0
  246. luna_quantum/utils.py +54 -0
  247. luna_quantum/utils.pyi +35 -0
  248. luna_quantum-1.0.0.dist-info/METADATA +37 -0
  249. luna_quantum-1.0.0.dist-info/RECORD +252 -0
  250. luna_quantum-1.0.0.dist-info/WHEEL +4 -0
  251. luna_quantum-1.0.0.dist-info/licenses/LICENSE +176 -0
  252. luna_quantum-1.0.0.dist-info/licenses/NOTICE +13 -0
@@ -0,0 +1,187 @@
1
+ from datetime import datetime
2
+ from logging import Logger
3
+ from typing import ClassVar, Literal
4
+
5
+ from pydantic import BaseModel, PrivateAttr
6
+
7
+ from luna_quantum._core import Solution
8
+ from luna_quantum.aqm_overwrites.model import Model
9
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
10
+ from luna_quantum.client.schemas.enums.call_style import CallStyle
11
+ from luna_quantum.client.schemas.enums.model_format import ModelFormat
12
+ from luna_quantum.client.schemas.enums.status import StatusEnum
13
+ from luna_quantum.factories.luna_solve_client_factory import LunaSolveClientFactory
14
+ from luna_quantum.util.log_utils import Logging
15
+
16
+
17
+ class SolveJob(BaseModel):
18
+ """A model to represent a job for solving model problems."""
19
+
20
+ _logger: ClassVar[Logger] = Logging.get_logger(__name__)
21
+ id: str
22
+ status: StatusEnum
23
+ status_timeline: dict[StatusEnum, datetime]
24
+ error_message: str | None = None
25
+ solver_job_info: str | None = None
26
+ used_format: ModelFormat | None = None
27
+ provider: str | None = None
28
+ is_cancelable: bool = True
29
+ is_cancellation_requested: bool = False
30
+
31
+ _result: Solution | None = PrivateAttr(default=None)
32
+
33
+ _model: Model | None = PrivateAttr(default=None)
34
+
35
+ def set_evaluation_model(self, model: Model | None) -> None:
36
+ """
37
+ Set the evaluation model for the solved job.
38
+
39
+ This will be done automatically. Normally there is no need to call this method.
40
+
41
+ Parameters
42
+ ----------
43
+ model: Model|None
44
+
45
+ """
46
+ self._model = model
47
+
48
+ def get_status(
49
+ self,
50
+ client: ILunaSolve | None = None,
51
+ status_source: Literal["cached", "remote"] = "cached",
52
+ ) -> StatusEnum:
53
+ """
54
+ Retrieve the current status of the solve job.
55
+
56
+ Parameters
57
+ ----------
58
+ status_source : Literal["cached", "remote"], optional
59
+ If "cached", the status is retrieved from the cached status. If "remote",
60
+ the status is retrieved from the remote service.
61
+
62
+ client : Optional[ILunaSolve], optional
63
+ The client to be used. If not provided, a new client is created using
64
+
65
+ Returns
66
+ -------
67
+ StatusEnum
68
+ The current status of the solve job, represented as a value
69
+ from the `StatusEnum` enumeration.
70
+
71
+ """
72
+ if status_source == "remote":
73
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
74
+
75
+ from luna_quantum.factories.usecase_factory import UseCaseFactory
76
+
77
+ UseCaseFactory.solve_job_fetch_update(client=c).__call__(solve_job=self)
78
+
79
+ return self.status
80
+
81
+ def result(
82
+ self,
83
+ client: ILunaSolve | None = None,
84
+ sleep_time_max: float = 60.0,
85
+ sleep_time_increment: float = 5.0,
86
+ sleep_time_initial: float = 5.0,
87
+ call_style: CallStyle = CallStyle.ACTIVE_WAITING,
88
+ ) -> Solution | None:
89
+ """
90
+ Get the result of the solve job.
91
+
92
+ This function uses the provided client or creates a new one to retrieve
93
+ and the result of this solve job. Depending on the call style, it can
94
+ actively wait for the result or return immediately.
95
+
96
+ Parameters
97
+ ----------
98
+ client : Optional[ILunaSolve], optional
99
+ The client to be used. If not provided, a new client is created using
100
+ ClientFactory.
101
+ sleep_time_max : float, optional
102
+ Maximum sleep time in seconds between consecutive active waiting checks.
103
+ sleep_time_increment : float, optional
104
+ Increment value for the sleep time between checks during active waiting.
105
+ sleep_time_initial : float, optional
106
+ Initial sleep time in seconds for the active waiting process.
107
+ call_style : CallStyle, optional
108
+ Determines if this function will actively wait for the result or return
109
+ immediately.
110
+
111
+ Returns
112
+ -------
113
+ Optional[Solution]
114
+ The result of the solve job or None if not available.
115
+
116
+ Raises
117
+ ------
118
+ Any exceptions raised by the use case's solve job call will propagate.
119
+ """
120
+ if self._result:
121
+ return self._result
122
+
123
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
124
+
125
+ from luna_quantum.factories.usecase_factory import UseCaseFactory
126
+
127
+ self._result = UseCaseFactory.solve_job_get_result(client=c).__call__(
128
+ solve_job=self,
129
+ sleep_time_max=sleep_time_max,
130
+ sleep_time_increment=sleep_time_increment,
131
+ sleep_time_initial=sleep_time_initial,
132
+ call_style=call_style,
133
+ )
134
+
135
+ if self._result is None:
136
+ return None
137
+ if self._model is None:
138
+ SolveJob._logger.info(
139
+ "The solve job object does not contain a model. "
140
+ "This solution is not evaluated."
141
+ )
142
+ else:
143
+ self._result = self._model.evaluate(self._result)
144
+
145
+ return self._result
146
+
147
+ def cancel(self, client: ILunaSolve | None = None) -> None:
148
+ """
149
+ Cancel a solve job.
150
+
151
+ This method cancels an already initiated solve job using the provided client
152
+ or a default one if no client is specified.
153
+
154
+ Parameters
155
+ ----------
156
+ client : Optional[ILunaSolve], optional
157
+ The client instance used to perform the cancel operation. If None, the
158
+ client is obtained via the ClientFactory.
159
+
160
+ Returns
161
+ -------
162
+ None
163
+ """
164
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
165
+
166
+ from luna_quantum.factories.usecase_factory import UseCaseFactory
167
+
168
+ UseCaseFactory.solve_job_cancel(client=c).__call__(self)
169
+
170
+ def delete(self, client: ILunaSolve | None = None) -> None:
171
+ """
172
+ Delete a job using the specified or default client.
173
+
174
+ This method deletes this job and solution. A client can optionally be provided
175
+ otherwise, a default client is obtained through the factory.
176
+
177
+ Parameters
178
+ ----------
179
+ client : Optional[ILunaSolve], optional
180
+ The client to be used for job deletion. If not provided, a default client
181
+ is retrieved using `ClientFactory`.
182
+ """
183
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
184
+
185
+ from luna_quantum.factories.usecase_factory import UseCaseFactory
186
+
187
+ UseCaseFactory.solve_job_delete(client=c).__call__(solve_job_id=self.id)
File without changes
@@ -0,0 +1,15 @@
1
+ from luna_quantum.solve.errors.solve_base_error import SolveBaseError
2
+ from luna_quantum.solve.interfaces.algorithm_i import BACKEND_TYPE, IAlgorithm
3
+ from luna_quantum.solve.interfaces.backend_i import IBackend
4
+
5
+
6
+ class IncompatibleBackendError(SolveBaseError):
7
+ """Exception raised if the backend is incompatible with the algorithm."""
8
+
9
+ def __init__(
10
+ self, backend: IBackend, algorithm: type[IAlgorithm[BACKEND_TYPE]]
11
+ ) -> None:
12
+ super().__init__(
13
+ f"Backend {backend.__class__.__name__} is incompatible "
14
+ f"with algorithm {algorithm.__name__}."
15
+ )
@@ -0,0 +1,11 @@
1
+ from luna_quantum.solve.errors.solve_base_error import SolveBaseError
2
+
3
+
4
+ class ModelMetadataMissingError(SolveBaseError):
5
+ """Exception raised for errors in the input."""
6
+
7
+ def __init__(self) -> None:
8
+ self.message = (
9
+ "Model metadata is required to complete this action. "
10
+ "Make sure that the model has been saved."
11
+ )
@@ -0,0 +1,5 @@
1
+ from luna_quantum.exceptions.base_luna_quantum_error import BaseLunaQuantumError
2
+
3
+
4
+ class SolveBaseError(BaseLunaQuantumError):
5
+ """Base class for all solve errors."""
@@ -0,0 +1,11 @@
1
+ from luna_quantum.solve.errors.solve_base_error import SolveBaseError
2
+
3
+
4
+ class TokenMissingError(SolveBaseError):
5
+ """Exception raised, when token is missing."""
6
+
7
+ def __init__(self) -> None:
8
+ self.message = (
9
+ "To complete this action, a token is required. "
10
+ "Make sure that the token has been set."
11
+ )
File without changes
@@ -0,0 +1,47 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Any, Generic, TypeVar
3
+
4
+ from luna_quantum.aqm_overwrites.model import Model
5
+ from luna_quantum.solve.domain.solve_job import SolveJob
6
+ from luna_quantum.solve.interfaces.backend_i import IBackend
7
+
8
+ BACKEND_TYPE = TypeVar("BACKEND_TYPE", bound=IBackend)
9
+
10
+
11
+ class IAlgorithm(ABC, Generic[BACKEND_TYPE]):
12
+ """
13
+ Interface for an algorithm that performs solve tasks based on a given model.
14
+
15
+ This interface defines the structure expected for any solver implementation
16
+ that can solve model problems and return results in the form of a `SolveJob`.
17
+ """
18
+
19
+ @abstractmethod
20
+ def run(
21
+ self,
22
+ model: Model | str,
23
+ name: str | None = None,
24
+ backend: BACKEND_TYPE | None = None,
25
+ *args: Any | None,
26
+ **kwargs: Any | None,
27
+ ) -> SolveJob:
28
+ """
29
+ Solve the given model problem and return the resulting job.
30
+
31
+ Parameters
32
+ ----------
33
+ model: Optimization
34
+ An instance of the `Optimization` class representing the problem
35
+ to be solved, including any constraints or objectives.
36
+ name: Optional[str]
37
+ If provided, the name of the job. Defaults to None.
38
+ backend: Optional[BACKEND_TYPE]
39
+ If provided, the backend to use for the solver. If no backend is provided,
40
+ the default backend for the solver will be used.
41
+
42
+ Returns
43
+ -------
44
+ SolveJob
45
+ A `SolveJob` object representing the results of the solve_job process,
46
+ including the solve_job state and related metadata.
47
+ """
@@ -0,0 +1,28 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from pydantic import BaseModel, ConfigDict
4
+
5
+
6
+ class IBackend(BaseModel, ABC):
7
+ """
8
+ Base interface for backend providers.
9
+
10
+ Defines an abstract interface for backend providers. This is used as a
11
+ base class for implementing and configuring specific backend providers.
12
+ """
13
+
14
+ @property
15
+ @abstractmethod
16
+ def provider(self) -> str:
17
+ """
18
+ Retrieve the name of the provider.
19
+
20
+ Returns
21
+ -------
22
+ str
23
+ The name of the provider.
24
+ """
25
+
26
+ model_config = ConfigDict(
27
+ extra="forbid",
28
+ )
@@ -0,0 +1,55 @@
1
+ from .model_delete_usecase_i import (
2
+ IModelDeleteUseCase,
3
+ )
4
+ from .model_fetch_metadata_usecase_i import (
5
+ IModelFetchMetadataUseCase,
6
+ )
7
+ from .model_get_solutions_usecase_i import (
8
+ IModelGetSolutionUseCase,
9
+ )
10
+ from .model_get_solve_jobs_usecase_i import (
11
+ IModelGetSolveJobUseCase,
12
+ )
13
+ from .model_load_by_id_usecase_i import (
14
+ IModelLoadByIdUseCase,
15
+ )
16
+ from .model_load_by_metadata_usecase_i import (
17
+ IModelLoadByMetadataUseCase,
18
+ )
19
+ from .model_load_metadata_by_hash_usecase_i import (
20
+ IModelLoadMetadataByHashUseCase,
21
+ )
22
+ from .model_save_usecase_i import (
23
+ IModelSaveUseCase,
24
+ )
25
+ from .solve_job_cancel_usecase_i import (
26
+ ISolveJobCancelUseCase,
27
+ )
28
+ from .solve_job_create_usecase_i import (
29
+ ISolveJobCreateUseCase,
30
+ )
31
+ from .solve_job_delete_usecase_i import (
32
+ ISolveJobDeleteUseCase,
33
+ )
34
+ from .solve_job_fetch_updates_usecase_i import (
35
+ ISolveJobFetchUpdatesUseCase,
36
+ )
37
+ from .solve_job_get_result_usecase_i import (
38
+ ISolveJobGetResultUseCase,
39
+ )
40
+
41
+ __all__ = [
42
+ "IModelDeleteUseCase",
43
+ "IModelFetchMetadataUseCase",
44
+ "IModelGetSolutionUseCase",
45
+ "IModelGetSolveJobUseCase",
46
+ "IModelLoadByIdUseCase",
47
+ "IModelLoadByMetadataUseCase",
48
+ "IModelLoadMetadataByHashUseCase",
49
+ "IModelSaveUseCase",
50
+ "ISolveJobCancelUseCase",
51
+ "ISolveJobCreateUseCase",
52
+ "ISolveJobDeleteUseCase",
53
+ "ISolveJobFetchUpdatesUseCase",
54
+ "ISolveJobGetResultUseCase",
55
+ ]
@@ -0,0 +1,27 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum.aqm_overwrites import Model
8
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
9
+
10
+
11
+ class IModelDeleteUseCase(ABC):
12
+ """Interface for deleting a models."""
13
+
14
+ @abstractmethod
15
+ def __init__(self, client: ILunaSolve) -> None:
16
+ pass
17
+
18
+ @abstractmethod
19
+ def __call__(self, model: Model) -> None:
20
+ """
21
+ Abstract method for deleting a model.
22
+
23
+ Parameters
24
+ ----------
25
+ model : Model
26
+ Model to be deleted.
27
+ """
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum.aqm_overwrites import Model
8
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
9
+ from luna_quantum.solve.domain.model_metadata import ModelMetadata
10
+
11
+
12
+ class IModelFetchMetadataUseCase(ABC):
13
+ """Abstract base class for fetching metadata of models."""
14
+
15
+ @abstractmethod
16
+ def __init__(self, client: ILunaSolve) -> None:
17
+ pass
18
+
19
+ @abstractmethod
20
+ def __call__(self, model: Model) -> ModelMetadata:
21
+ """
22
+ Abstract method for fetching metadata of an AQ model.
23
+
24
+ Parameters
25
+ ----------
26
+ model : Model
27
+ The model for which metadata is to be fetched.
28
+
29
+ Returns
30
+ -------
31
+ ModelMetadata
32
+ Metadata of the AQ model.
33
+ """
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum import Model, Solution
8
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
9
+
10
+
11
+ class IModelGetSolutionUseCase(ABC):
12
+ """Interface to retrieve solutions for a specific Model."""
13
+
14
+ @abstractmethod
15
+ def __init__(self, client: ILunaSolve) -> None:
16
+ pass
17
+
18
+ @abstractmethod
19
+ def __call__(self, model: Model) -> list[Solution]:
20
+ """
21
+ Abstract method to retrieve solutions for a specific Model.
22
+
23
+ Parameters
24
+ ----------
25
+ model : Model
26
+ The model to be processed.
27
+
28
+ Returns
29
+ -------
30
+ list[Solution]
31
+ A list of solutions generated after processing the query model.
32
+
33
+ """
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum.aqm_overwrites import Model
8
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
9
+ from luna_quantum.solve.domain.solve_job import SolveJob
10
+
11
+
12
+ class IModelGetSolveJobUseCase(ABC):
13
+ """Interface for obtaining and solving Model jobs."""
14
+
15
+ @abstractmethod
16
+ def __init__(self, client: ILunaSolve) -> None:
17
+ pass
18
+
19
+ @abstractmethod
20
+ def __call__(self, model: Model) -> list[SolveJob]:
21
+ """
22
+ Abstract function to retrieve list of SolveJob objects from a given client.
23
+
24
+ Parameters
25
+ ----------
26
+ model : Model
27
+ The model for which SolveJob objects are to be retrieved.
28
+
29
+ Returns
30
+ -------
31
+ List[SolveJob]
32
+ A list of SolveJob objects.
33
+ """
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum.aqm_overwrites import Model
8
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
9
+
10
+
11
+ class IModelLoadByIdUseCase(ABC):
12
+ """Interface for loading an AQ Model by its ID."""
13
+
14
+ @abstractmethod
15
+ def __init__(self, client: ILunaSolve) -> None:
16
+ pass
17
+
18
+ @abstractmethod
19
+ def __call__(self, model_id: str) -> Model:
20
+ """
21
+ Abstract method that retrieves a model instance by its identifier.
22
+
23
+ Parameters
24
+ ----------
25
+ model_id : str
26
+ A unique identifier of the model to be retrieved.
27
+
28
+ Returns
29
+ -------
30
+ Model
31
+ The model instance corresponding to the given identifier.
32
+ """
@@ -0,0 +1,37 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum.aqm_overwrites import Model
8
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
9
+ from luna_quantum.solve.domain.model_metadata import ModelMetadata
10
+
11
+
12
+ class IModelLoadByMetadataUseCase(ABC):
13
+ """Interface for loading an AQ model using metadata."""
14
+
15
+ @abstractmethod
16
+ def __init__(self, client: ILunaSolve) -> None:
17
+ pass
18
+
19
+ @abstractmethod
20
+ def __call__(self, model_metadata: ModelMetadata) -> Model:
21
+ """
22
+ Abstract method for loading the model by the metadata.
23
+
24
+ This method acts as an interface for running a specific AQ Model based on the
25
+ provided metadata and returning the constructed AQ model instance.
26
+
27
+ Parameters
28
+ ----------
29
+ model_metadata : ModelMetadata
30
+ Metadata required for constructing or running the AQ Model.
31
+
32
+ Returns
33
+ -------
34
+ Model
35
+ The constructed AQ Model instance.
36
+
37
+ """
@@ -0,0 +1,38 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
8
+ from luna_quantum.solve.domain.model_metadata import ModelMetadata
9
+
10
+
11
+ class IModelLoadMetadataByHashUseCase(ABC):
12
+ """Interface for loading model metadata by hash."""
13
+
14
+ @abstractmethod
15
+ def __init__(self, client: ILunaSolve) -> None:
16
+ pass
17
+
18
+ @abstractmethod
19
+ def __call__(self, model_hash: int) -> ModelMetadata:
20
+ """
21
+ Abstract base class for callable objects that provide Model metadata.
22
+
23
+ This class defines a contract for objects that, when called, return
24
+ metadata associated with a particular Model specified by a unique
25
+ hash value.
26
+
27
+ Parameters
28
+ ----------
29
+ model_hash : int
30
+ A hash value uniquely identifying the Model for which metadata
31
+ is requested.
32
+
33
+ Returns
34
+ -------
35
+ ModelMetadata
36
+ Metadata associated with the specified Model.
37
+
38
+ """
@@ -0,0 +1,36 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum.aqm_overwrites import Model
8
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
9
+ from luna_quantum.solve.domain.model_metadata import ModelMetadata
10
+
11
+
12
+ class IModelSaveUseCase(ABC):
13
+ """Define an interface for handling Model saving use cases."""
14
+
15
+ @abstractmethod
16
+ def __init__(self, client: ILunaSolve) -> None:
17
+ pass
18
+
19
+ @abstractmethod
20
+ def __call__(self, model: Model) -> ModelMetadata:
21
+ """
22
+ Evaluate and retrieve metadata from an acquisition model.
23
+
24
+ This abstract method is intended to be implemented to process a given
25
+ acquisition model and derive specific metadata from it.
26
+
27
+ Parameters
28
+ ----------
29
+ model : Model
30
+ The acquisition model to be processed.
31
+
32
+ Returns
33
+ -------
34
+ ModelMetadata
35
+ The metadata derived from the acquisition model.
36
+ """
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
8
+ from luna_quantum.solve.domain.solve_job import SolveJob
9
+
10
+
11
+ class ISolveJobCancelUseCase(ABC):
12
+ """
13
+ Represent an abstract base for solving job cancellation use case.
14
+
15
+ This class defines the structure for a use case that allows canceling of solve
16
+ jobs. It acts as an interface specifying methods to be implemented by
17
+ concrete subclasses.
18
+ """
19
+
20
+ @abstractmethod
21
+ def __init__(self, client: ILunaSolve) -> None:
22
+ pass
23
+
24
+ @abstractmethod
25
+ def __call__(self, solve_job: SolveJob) -> None:
26
+ """
27
+ Represent an abstract base for callable objects handling solve jobs.
28
+
29
+ Parameters
30
+ ----------
31
+ solve_job : SolveJob
32
+ The input job to process or solve.
33
+ """