luna-quantum 1.0.8rc2__cp314-cp314-musllinux_1_2_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 (265) hide show
  1. luna_quantum/__init__.py +121 -0
  2. luna_quantum/__init__.pyi +85 -0
  3. luna_quantum/_core.cpython-314-x86_64-linux-musl.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 +265 -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
  265. luna_quantum.libs/libgcc_s-02f3f192.so.1 +0 -0
@@ -0,0 +1,196 @@
1
+ from logging import Logger
2
+ from typing import Any, ClassVar, Literal
3
+
4
+ from pydantic import BaseModel, PrivateAttr
5
+
6
+ from luna_quantum._core import Solution
7
+ from luna_quantum.aqm_overwrites.model import Model
8
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
9
+ from luna_quantum.client.schemas.enums.call_style import CallStyle
10
+ from luna_quantum.client.schemas.enums.model_format import ModelFormat
11
+ from luna_quantum.client.schemas.enums.status import StatusEnum
12
+ from luna_quantum.client.schemas.wrappers import PydanticDatetimeWrapper
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, PydanticDatetimeWrapper]
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
+ metadata: dict[str, Any] | None = None
32
+ _result: Solution | None = PrivateAttr(default=None)
33
+
34
+ _model: Model | None = PrivateAttr(default=None)
35
+
36
+ def set_evaluation_model(self, model: Model | None) -> None:
37
+ """
38
+ Set the evaluation model for the solved job.
39
+
40
+ This will be done automatically. Normally there is no need to call this method.
41
+
42
+ Parameters
43
+ ----------
44
+ model: Model|None
45
+
46
+ """
47
+ self._model = model
48
+
49
+ def get_status(
50
+ self,
51
+ client: ILunaSolve | None = None,
52
+ status_source: Literal["cached", "remote"] = "cached",
53
+ ) -> StatusEnum:
54
+ """
55
+ Retrieve the current status of the solve job.
56
+
57
+ Parameters
58
+ ----------
59
+ status_source : Literal["cached", "remote"], optional
60
+ If "cached", the status is retrieved from the cached status. If "remote",
61
+ the status is retrieved from the remote service.
62
+
63
+ client : Optional[ILunaSolve], optional
64
+ The client to be used. If not provided, a new client is created using
65
+
66
+ Returns
67
+ -------
68
+ StatusEnum
69
+ The current status of the solve job, represented as a value
70
+ from the `StatusEnum` enumeration.
71
+
72
+ """
73
+ if status_source == "remote":
74
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
75
+
76
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
77
+ UseCaseFactory,
78
+ )
79
+
80
+ UseCaseFactory.solve_job_fetch_update(client=c).__call__(solve_job=self)
81
+
82
+ return self.status
83
+
84
+ def result(
85
+ self,
86
+ client: ILunaSolve | None = None,
87
+ sleep_time_max: float = 60.0,
88
+ sleep_time_increment: float = 5.0,
89
+ sleep_time_initial: float = 5.0,
90
+ call_style: CallStyle = CallStyle.ACTIVE_WAITING,
91
+ ) -> Solution | None:
92
+ """
93
+ Get the result of the solve job.
94
+
95
+ This function uses the provided client or creates a new one to retrieve
96
+ and the result of this solve job. Depending on the call style, it can
97
+ actively wait for the result or return immediately.
98
+
99
+ Parameters
100
+ ----------
101
+ client : Optional[ILunaSolve], optional
102
+ The client to be used. If not provided, a new client is created using
103
+ ClientFactory.
104
+ sleep_time_max : float, optional
105
+ Maximum sleep time in seconds between consecutive active waiting checks.
106
+ sleep_time_increment : float, optional
107
+ Increment value for the sleep time between checks during active waiting.
108
+ sleep_time_initial : float, optional
109
+ Initial sleep time in seconds for the active waiting process.
110
+ call_style : CallStyle, optional
111
+ Determines if this function will actively wait for the result or return
112
+ immediately.
113
+
114
+ Returns
115
+ -------
116
+ Optional[Solution]
117
+ The result of the solve job or None if not available.
118
+
119
+ Raises
120
+ ------
121
+ Any exceptions raised by the use case's solve job call will propagate.
122
+ """
123
+ if self._result:
124
+ return self._result
125
+
126
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
127
+
128
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
129
+ UseCaseFactory,
130
+ )
131
+
132
+ self._result = UseCaseFactory.solve_job_get_result(client=c).__call__(
133
+ solve_job=self,
134
+ sleep_time_max=sleep_time_max,
135
+ sleep_time_increment=sleep_time_increment,
136
+ sleep_time_initial=sleep_time_initial,
137
+ call_style=call_style,
138
+ )
139
+
140
+ if self._result is None:
141
+ return None
142
+ if self._model is None:
143
+ SolveJob._logger.info(
144
+ "The solve job object does not contain a model. "
145
+ "This solution is not evaluated."
146
+ )
147
+ else:
148
+ self._result = self._model.evaluate(self._result)
149
+
150
+ return self._result
151
+
152
+ def cancel(self, client: ILunaSolve | None = None) -> None:
153
+ """
154
+ Cancel a solve job.
155
+
156
+ This method cancels an already initiated solve job using the provided client
157
+ or a default one if no client is specified.
158
+
159
+ Parameters
160
+ ----------
161
+ client : Optional[ILunaSolve], optional
162
+ The client instance used to perform the cancel operation. If None, the
163
+ client is obtained via the ClientFactory.
164
+
165
+ Returns
166
+ -------
167
+ None
168
+ """
169
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
170
+
171
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
172
+ UseCaseFactory,
173
+ )
174
+
175
+ UseCaseFactory.solve_job_cancel(client=c).__call__(self)
176
+
177
+ def delete(self, client: ILunaSolve | None = None) -> None:
178
+ """
179
+ Delete a job using the specified or default client.
180
+
181
+ This method deletes this job and solution. A client can optionally be provided
182
+ otherwise, a default client is obtained through the factory.
183
+
184
+ Parameters
185
+ ----------
186
+ client : Optional[ILunaSolve], optional
187
+ The client to be used for job deletion. If not provided, a default client
188
+ is retrieved using `ClientFactory`.
189
+ """
190
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
191
+
192
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
193
+ UseCaseFactory,
194
+ )
195
+
196
+ 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,49 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Any, Generic, TypeVar
3
+
4
+ from pydantic import BaseModel
5
+
6
+ from luna_quantum.aqm_overwrites.model import Model
7
+ from luna_quantum.solve.domain.solve_job import SolveJob
8
+ from luna_quantum.solve.interfaces.backend_i import IBackend
9
+
10
+ BACKEND_TYPE = TypeVar("BACKEND_TYPE", bound=IBackend)
11
+
12
+
13
+ class IAlgorithm(ABC, BaseModel, Generic[BACKEND_TYPE]):
14
+ """
15
+ Interface for an algorithm that performs solve tasks based on a given model.
16
+
17
+ This interface defines the structure expected for any solver implementation
18
+ that can solve model problems and return results in the form of a `SolveJob`.
19
+ """
20
+
21
+ @abstractmethod
22
+ def run(
23
+ self,
24
+ model: Model | str,
25
+ name: str | None = None,
26
+ backend: BACKEND_TYPE | None = None,
27
+ *args: Any | None,
28
+ **kwargs: Any | None,
29
+ ) -> SolveJob:
30
+ """
31
+ Solve the given model problem and return the resulting job.
32
+
33
+ Parameters
34
+ ----------
35
+ model: Optimization
36
+ An instance of the `Optimization` class representing the problem
37
+ to be solved, including any constraints or objectives.
38
+ name: Optional[str]
39
+ If provided, the name of the job. Defaults to None.
40
+ backend: Optional[BACKEND_TYPE]
41
+ If provided, the backend to use for the solver. If no backend is provided,
42
+ the default backend for the solver will be used.
43
+
44
+ Returns
45
+ -------
46
+ SolveJob
47
+ A `SolveJob` object representing the results of the solve_job process,
48
+ including the solve_job state and related metadata.
49
+ """
@@ -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
+ """