luna-quantum 1.1.0__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. luna_quantum/__init__.py +139 -0
  2. luna_quantum/__init__.pyi +98 -0
  3. luna_quantum/_core.cp312-win_amd64.pyd +0 -0
  4. luna_quantum/_core.pyi +4286 -0
  5. luna_quantum/_utility.py +148 -0
  6. luna_quantum/_utility.pyi +20 -0
  7. luna_quantum/algorithms/__init__.py +1 -0
  8. luna_quantum/aqm_overwrites/__init__.py +3 -0
  9. luna_quantum/aqm_overwrites/model.py +184 -0
  10. luna_quantum/backends/__init__.py +1 -0
  11. luna_quantum/client/__init__.py +0 -0
  12. luna_quantum/client/controllers/__init__.py +4 -0
  13. luna_quantum/client/controllers/luna_http_client.py +37 -0
  14. luna_quantum/client/controllers/luna_platform_client.py +256 -0
  15. luna_quantum/client/controllers/luna_q.py +67 -0
  16. luna_quantum/client/controllers/luna_solve.py +129 -0
  17. luna_quantum/client/error/__init__.py +0 -0
  18. luna_quantum/client/error/luna_api_key_invalid_error.py +10 -0
  19. luna_quantum/client/error/luna_api_key_missing_error.py +10 -0
  20. luna_quantum/client/error/luna_error.py +2 -0
  21. luna_quantum/client/error/luna_server_error.py +20 -0
  22. luna_quantum/client/error/timeout_error.py +12 -0
  23. luna_quantum/client/error/transformation_error.py +18 -0
  24. luna_quantum/client/error/utils/__init__.py +0 -0
  25. luna_quantum/client/error/utils/http_error_utils.py +112 -0
  26. luna_quantum/client/interfaces/__init__.py +4 -0
  27. luna_quantum/client/interfaces/clients/__init__.py +25 -0
  28. luna_quantum/client/interfaces/clients/circuit_rest_client_i.py +68 -0
  29. luna_quantum/client/interfaces/clients/info_rest_client_i.py +53 -0
  30. luna_quantum/client/interfaces/clients/model_rest_client_i.py +139 -0
  31. luna_quantum/client/interfaces/clients/qpu_token_rest_client_i.py +364 -0
  32. luna_quantum/client/interfaces/clients/rest_client_i.py +21 -0
  33. luna_quantum/client/interfaces/clients/solve_job_rest_client_i.py +201 -0
  34. luna_quantum/client/interfaces/clients/users_rest_client_i.py +29 -0
  35. luna_quantum/client/interfaces/services/__init__.py +0 -0
  36. luna_quantum/client/interfaces/services/luna_q_i.py +34 -0
  37. luna_quantum/client/interfaces/services/luna_solve_i.py +72 -0
  38. luna_quantum/client/interfaces/services/service_i.py +56 -0
  39. luna_quantum/client/rest_client/__init__.py +15 -0
  40. luna_quantum/client/rest_client/circuit_rest_client.py +107 -0
  41. luna_quantum/client/rest_client/info_rest_client.py +74 -0
  42. luna_quantum/client/rest_client/model_rest_client.py +216 -0
  43. luna_quantum/client/rest_client/qpu_token_rest_client.py +508 -0
  44. luna_quantum/client/rest_client/solve_job_rest_client.py +286 -0
  45. luna_quantum/client/rest_client/users_rest_client.py +35 -0
  46. luna_quantum/client/schemas/__init__.py +26 -0
  47. luna_quantum/client/schemas/circuit.py +48 -0
  48. luna_quantum/client/schemas/create/__init__.py +15 -0
  49. luna_quantum/client/schemas/create/circuit.py +30 -0
  50. luna_quantum/client/schemas/create/optimization.py +39 -0
  51. luna_quantum/client/schemas/create/qpu_token.py +22 -0
  52. luna_quantum/client/schemas/create/qpu_token_time_quota.py +35 -0
  53. luna_quantum/client/schemas/create/qpu_token_time_quota_update.py +24 -0
  54. luna_quantum/client/schemas/create/qubo.py +19 -0
  55. luna_quantum/client/schemas/create/solve_job_create.py +43 -0
  56. luna_quantum/client/schemas/enums/__init__.py +0 -0
  57. luna_quantum/client/schemas/enums/call_style.py +13 -0
  58. luna_quantum/client/schemas/enums/circuit.py +42 -0
  59. luna_quantum/client/schemas/enums/model_format.py +11 -0
  60. luna_quantum/client/schemas/enums/problem.py +50 -0
  61. luna_quantum/client/schemas/enums/qpu_token_type.py +20 -0
  62. luna_quantum/client/schemas/enums/sense.py +8 -0
  63. luna_quantum/client/schemas/enums/status.py +40 -0
  64. luna_quantum/client/schemas/enums/timeframe.py +11 -0
  65. luna_quantum/client/schemas/error_message.py +14 -0
  66. luna_quantum/client/schemas/model_metadata.py +35 -0
  67. luna_quantum/client/schemas/qpu_token/__init__.py +0 -0
  68. luna_quantum/client/schemas/qpu_token/qpu_token.py +154 -0
  69. luna_quantum/client/schemas/qpu_token/qpu_token_source.py +19 -0
  70. luna_quantum/client/schemas/qpu_token/qpu_token_time_quota.py +30 -0
  71. luna_quantum/client/schemas/qpu_token/token_provider.py +132 -0
  72. luna_quantum/client/schemas/representation.py +19 -0
  73. luna_quantum/client/schemas/solution.py +106 -0
  74. luna_quantum/client/schemas/solve_job.py +50 -0
  75. luna_quantum/client/schemas/solver_info.py +11 -0
  76. luna_quantum/client/schemas/user.py +11 -0
  77. luna_quantum/client/schemas/wrappers/__init__.py +5 -0
  78. luna_quantum/client/schemas/wrappers/datetime_wrapper.py +32 -0
  79. luna_quantum/client/utils/__init__.py +0 -0
  80. luna_quantum/client/utils/qpu_token_utils.py +147 -0
  81. luna_quantum/config.py +11 -0
  82. luna_quantum/decorators.py +248 -0
  83. luna_quantum/errors.py +34 -0
  84. luna_quantum/errors.pyi +287 -0
  85. luna_quantum/exceptions/__init__.py +0 -0
  86. luna_quantum/exceptions/base_luna_quantum_error.py +2 -0
  87. luna_quantum/exceptions/luna_quantum_call_type_error.py +9 -0
  88. luna_quantum/exceptions/patch_class_field_exists_error.py +10 -0
  89. luna_quantum/factories/__init__.py +4 -0
  90. luna_quantum/factories/luna_solve_client_factory.py +100 -0
  91. luna_quantum/factories/usecase_factory.py +489 -0
  92. luna_quantum/py.typed +0 -0
  93. luna_quantum/solve/__init__.py +13 -0
  94. luna_quantum/solve/default_token.py +304 -0
  95. luna_quantum/solve/domain/__init__.py +0 -0
  96. luna_quantum/solve/domain/abstract/__init__.py +4 -0
  97. luna_quantum/solve/domain/abstract/luna_algorithm.py +205 -0
  98. luna_quantum/solve/domain/abstract/qpu_token_backend.py +34 -0
  99. luna_quantum/solve/domain/model_metadata.py +56 -0
  100. luna_quantum/solve/domain/solve_job.py +230 -0
  101. luna_quantum/solve/errors/__init__.py +0 -0
  102. luna_quantum/solve/errors/incompatible_backend_error.py +15 -0
  103. luna_quantum/solve/errors/model_metadata_missing_error.py +11 -0
  104. luna_quantum/solve/errors/solve_base_error.py +5 -0
  105. luna_quantum/solve/errors/token_missing_error.py +11 -0
  106. luna_quantum/solve/interfaces/__init__.py +0 -0
  107. luna_quantum/solve/interfaces/algorithm_i.py +49 -0
  108. luna_quantum/solve/interfaces/backend_i.py +28 -0
  109. luna_quantum/solve/interfaces/usecases/__init__.py +59 -0
  110. luna_quantum/solve/interfaces/usecases/model_delete_usecase_i.py +27 -0
  111. luna_quantum/solve/interfaces/usecases/model_fetch_metadata_usecase_i.py +33 -0
  112. luna_quantum/solve/interfaces/usecases/model_get_solutions_usecase_i.py +33 -0
  113. luna_quantum/solve/interfaces/usecases/model_get_solve_jobs_usecase_i.py +33 -0
  114. luna_quantum/solve/interfaces/usecases/model_load_by_id_usecase_i.py +32 -0
  115. luna_quantum/solve/interfaces/usecases/model_load_by_metadata_usecase_i.py +37 -0
  116. luna_quantum/solve/interfaces/usecases/model_load_metadata_by_hash_usecase_i.py +38 -0
  117. luna_quantum/solve/interfaces/usecases/model_save_usecase_i.py +36 -0
  118. luna_quantum/solve/interfaces/usecases/solve_job_cancel_usecase_i.py +33 -0
  119. luna_quantum/solve/interfaces/usecases/solve_job_create_usecase_i.py +44 -0
  120. luna_quantum/solve/interfaces/usecases/solve_job_delete_usecase_i.py +32 -0
  121. luna_quantum/solve/interfaces/usecases/solve_job_fetch_updates_usecase_i.py +38 -0
  122. luna_quantum/solve/interfaces/usecases/solve_job_get_by_id_usecase_i.py +27 -0
  123. luna_quantum/solve/interfaces/usecases/solve_job_get_result_usecase_i.py +63 -0
  124. luna_quantum/solve/parameters/__init__.py +0 -0
  125. luna_quantum/solve/parameters/algorithms/__init__.py +51 -0
  126. luna_quantum/solve/parameters/algorithms/base_params/__init__.py +24 -0
  127. luna_quantum/solve/parameters/algorithms/base_params/decomposer.py +57 -0
  128. luna_quantum/solve/parameters/algorithms/base_params/qaoa_circuit_params.py +95 -0
  129. luna_quantum/solve/parameters/algorithms/base_params/quantum_annealing_params.py +79 -0
  130. luna_quantum/solve/parameters/algorithms/base_params/scipy_optimizer.py +122 -0
  131. luna_quantum/solve/parameters/algorithms/base_params/simulated_annealing_params.py +106 -0
  132. luna_quantum/solve/parameters/algorithms/base_params/tabu_kerberos_params.py +39 -0
  133. luna_quantum/solve/parameters/algorithms/base_params/tabu_search_params.py +129 -0
  134. luna_quantum/solve/parameters/algorithms/flexible_parameter_algorithm.py +59 -0
  135. luna_quantum/solve/parameters/algorithms/genetic_algorithms/__init__.py +4 -0
  136. luna_quantum/solve/parameters/algorithms/genetic_algorithms/qaga.py +131 -0
  137. luna_quantum/solve/parameters/algorithms/genetic_algorithms/saga.py +139 -0
  138. luna_quantum/solve/parameters/algorithms/lq_fda/__init__.py +3 -0
  139. luna_quantum/solve/parameters/algorithms/lq_fda/fujits_da_base.py +85 -0
  140. luna_quantum/solve/parameters/algorithms/lq_fda/fujitsu_da_v3c.py +155 -0
  141. luna_quantum/solve/parameters/algorithms/optimization_solvers/__init__.py +3 -0
  142. luna_quantum/solve/parameters/algorithms/optimization_solvers/scip.py +51 -0
  143. luna_quantum/solve/parameters/algorithms/quantum_annealing/__init__.py +19 -0
  144. luna_quantum/solve/parameters/algorithms/quantum_annealing/kerberos.py +149 -0
  145. luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_bqm.py +75 -0
  146. luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_cqm.py +75 -0
  147. luna_quantum/solve/parameters/algorithms/quantum_annealing/parallel_tempering_qpu.py +139 -0
  148. luna_quantum/solve/parameters/algorithms/quantum_annealing/population_annealing_qpu.py +109 -0
  149. luna_quantum/solve/parameters/algorithms/quantum_annealing/qbsolv_like_qpu.py +111 -0
  150. luna_quantum/solve/parameters/algorithms/quantum_annealing/quantum_annealing.py +121 -0
  151. luna_quantum/solve/parameters/algorithms/quantum_annealing/repeated_reverse_quantum_annealing.py +174 -0
  152. luna_quantum/solve/parameters/algorithms/quantum_gate/__init__.py +6 -0
  153. luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/__init__.py +10 -0
  154. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/__init__.py +29 -0
  155. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/config.py +58 -0
  156. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/flexqaoa.py +188 -0
  157. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/optimizers.py +53 -0
  158. luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/pipeline.py +164 -0
  159. luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa.py +112 -0
  160. luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa_fo.py +69 -0
  161. luna_quantum/solve/parameters/algorithms/quantum_gate/vqe.py +108 -0
  162. luna_quantum/solve/parameters/algorithms/search_algorithms/__init__.py +5 -0
  163. luna_quantum/solve/parameters/algorithms/search_algorithms/dialectic_search.py +136 -0
  164. luna_quantum/solve/parameters/algorithms/search_algorithms/qbsolv_like_tabu_search.py +117 -0
  165. luna_quantum/solve/parameters/algorithms/search_algorithms/tabu_search.py +126 -0
  166. luna_quantum/solve/parameters/algorithms/simulated_annealing/__init__.py +13 -0
  167. luna_quantum/solve/parameters/algorithms/simulated_annealing/parallel_tempering.py +131 -0
  168. luna_quantum/solve/parameters/algorithms/simulated_annealing/population_annealing.py +95 -0
  169. luna_quantum/solve/parameters/algorithms/simulated_annealing/qbsolv_like_simulated_annealing.py +141 -0
  170. luna_quantum/solve/parameters/algorithms/simulated_annealing/repeated_reverse_simulated_annealing.py +172 -0
  171. luna_quantum/solve/parameters/algorithms/simulated_annealing/simulated_annealing.py +126 -0
  172. luna_quantum/solve/parameters/backends/__init__.py +27 -0
  173. luna_quantum/solve/parameters/backends/aqarios.py +17 -0
  174. luna_quantum/solve/parameters/backends/aqarios_gpu.py +17 -0
  175. luna_quantum/solve/parameters/backends/aws/__init__.py +11 -0
  176. luna_quantum/solve/parameters/backends/aws/aws.py +36 -0
  177. luna_quantum/solve/parameters/backends/aws/aws_backend_base.py +74 -0
  178. luna_quantum/solve/parameters/backends/aws/ionq.py +43 -0
  179. luna_quantum/solve/parameters/backends/aws/iqm.py +31 -0
  180. luna_quantum/solve/parameters/backends/aws/rigetti.py +31 -0
  181. luna_quantum/solve/parameters/backends/cudaq/__init__.py +5 -0
  182. luna_quantum/solve/parameters/backends/cudaq/cudaq_base.py +16 -0
  183. luna_quantum/solve/parameters/backends/cudaq/cudaq_cpu.py +30 -0
  184. luna_quantum/solve/parameters/backends/cudaq/cudaq_gpu.py +32 -0
  185. luna_quantum/solve/parameters/backends/dwave.py +17 -0
  186. luna_quantum/solve/parameters/backends/dwave_qpu.py +166 -0
  187. luna_quantum/solve/parameters/backends/fda.py +17 -0
  188. luna_quantum/solve/parameters/backends/ibm.py +138 -0
  189. luna_quantum/solve/parameters/backends/qctrl.py +103 -0
  190. luna_quantum/solve/parameters/backends/zib.py +17 -0
  191. luna_quantum/solve/parameters/constants.py +11 -0
  192. luna_quantum/solve/parameters/errors.py +30 -0
  193. luna_quantum/solve/parameters/mixins/__init__.py +0 -0
  194. luna_quantum/solve/parameters/mixins/fujitsu_common_params_mixin.py +239 -0
  195. luna_quantum/solve/parameters/mixins/fujitsu_v2_mixin.py +70 -0
  196. luna_quantum/solve/parameters/mixins/qbsolv_like_mixin.py +60 -0
  197. luna_quantum/solve/use_cases/__init__.py +119 -0
  198. luna_quantum/solve/use_cases/arbitrage_edge_based.py +50 -0
  199. luna_quantum/solve/use_cases/arbitrage_node_based.py +55 -0
  200. luna_quantum/solve/use_cases/base.py +7 -0
  201. luna_quantum/solve/use_cases/binary_integer_linear_programming.py +54 -0
  202. luna_quantum/solve/use_cases/binary_paint_shop_problem.py +37 -0
  203. luna_quantum/solve/use_cases/credit_scoring_feature_selection.py +40 -0
  204. luna_quantum/solve/use_cases/dynamic_portfolio_optimization.py +64 -0
  205. luna_quantum/solve/use_cases/exact_cover.py +51 -0
  206. luna_quantum/solve/use_cases/flight_gate_assignment.py +79 -0
  207. luna_quantum/solve/use_cases/graph_coloring.py +42 -0
  208. luna_quantum/solve/use_cases/graph_isomorphism.py +52 -0
  209. luna_quantum/solve/use_cases/graph_partitioning.py +46 -0
  210. luna_quantum/solve/use_cases/hamiltonian_cycle.py +49 -0
  211. luna_quantum/solve/use_cases/induced_subgraph_isomorphism.py +50 -0
  212. luna_quantum/solve/use_cases/job_shop_scheduling.py +44 -0
  213. luna_quantum/solve/use_cases/k_medoids_clustering.py +49 -0
  214. luna_quantum/solve/use_cases/knapsack_integer_weights.py +56 -0
  215. luna_quantum/solve/use_cases/linear_regression.py +60 -0
  216. luna_quantum/solve/use_cases/lmwcs.py +84 -0
  217. luna_quantum/solve/use_cases/longest_path.py +50 -0
  218. luna_quantum/solve/use_cases/market_graph_clustering.py +61 -0
  219. luna_quantum/solve/use_cases/max2sat.py +54 -0
  220. luna_quantum/solve/use_cases/max3sat.py +55 -0
  221. luna_quantum/solve/use_cases/max_clique.py +60 -0
  222. luna_quantum/solve/use_cases/max_cut.py +48 -0
  223. luna_quantum/solve/use_cases/max_independent_set.py +37 -0
  224. luna_quantum/solve/use_cases/minimal_maximal_matching.py +54 -0
  225. luna_quantum/solve/use_cases/minimal_spanning_tree.py +90 -0
  226. luna_quantum/solve/use_cases/minimum_vertex_cover.py +45 -0
  227. luna_quantum/solve/use_cases/number_partitioning.py +32 -0
  228. luna_quantum/solve/use_cases/portfolio_optimization.py +46 -0
  229. luna_quantum/solve/use_cases/portfolio_optimization_ib_tv.py +63 -0
  230. luna_quantum/solve/use_cases/quadratic_assignment.py +49 -0
  231. luna_quantum/solve/use_cases/quadratic_knapsack.py +48 -0
  232. luna_quantum/solve/use_cases/satellite_scheduling.py +73 -0
  233. luna_quantum/solve/use_cases/sensor_placement.py +58 -0
  234. luna_quantum/solve/use_cases/set_cover.py +56 -0
  235. luna_quantum/solve/use_cases/set_packing.py +54 -0
  236. luna_quantum/solve/use_cases/set_partitioning.py +52 -0
  237. luna_quantum/solve/use_cases/subgraph_isomorphism.py +55 -0
  238. luna_quantum/solve/use_cases/subset_sum.py +37 -0
  239. luna_quantum/solve/use_cases/support_vector_machine.py +64 -0
  240. luna_quantum/solve/use_cases/traffic_flow.py +35 -0
  241. luna_quantum/solve/use_cases/travelling_salesman_problem.py +53 -0
  242. luna_quantum/solve/use_cases/type_aliases.py +9 -0
  243. luna_quantum/solve/use_cases/weighted_max_cut.py +37 -0
  244. luna_quantum/solve/usecases/__init__.py +45 -0
  245. luna_quantum/solve/usecases/model_delete_usecase.py +49 -0
  246. luna_quantum/solve/usecases/model_fetch_metadata_usecase.py +50 -0
  247. luna_quantum/solve/usecases/model_get_solution_usecase.py +59 -0
  248. luna_quantum/solve/usecases/model_get_solve_jobs_usecase.py +62 -0
  249. luna_quantum/solve/usecases/model_load_by_id_usecase.py +47 -0
  250. luna_quantum/solve/usecases/model_load_by_metadata_usecase.py +52 -0
  251. luna_quantum/solve/usecases/model_load_metadata_by_hash_usecase.py +51 -0
  252. luna_quantum/solve/usecases/model_save_usecase.py +63 -0
  253. luna_quantum/solve/usecases/solve_job_cancel_usecase.py +51 -0
  254. luna_quantum/solve/usecases/solve_job_create_usecase.py +112 -0
  255. luna_quantum/solve/usecases/solve_job_delete_usecase.py +38 -0
  256. luna_quantum/solve/usecases/solve_job_fetch_updates_usecase.py +49 -0
  257. luna_quantum/solve/usecases/solve_job_get_by_id_usecase.py +44 -0
  258. luna_quantum/solve/usecases/solve_job_get_result_usecase.py +105 -0
  259. luna_quantum/transformations.py +18 -0
  260. luna_quantum/transformations.pyi +371 -0
  261. luna_quantum/translator.py +23 -0
  262. luna_quantum/translator.pyi +869 -0
  263. luna_quantum/util/__init__.py +0 -0
  264. luna_quantum/util/active_waiting.py +79 -0
  265. luna_quantum/util/class_patcher.py +164 -0
  266. luna_quantum/util/debug_info.py +52 -0
  267. luna_quantum/util/log_utils.py +187 -0
  268. luna_quantum/util/pretty_base.py +67 -0
  269. luna_quantum/util/pydantic_utils.py +38 -0
  270. luna_quantum/utils.py +3 -0
  271. luna_quantum/utils.pyi +67 -0
  272. luna_quantum-1.1.0.dist-info/METADATA +36 -0
  273. luna_quantum-1.1.0.dist-info/RECORD +276 -0
  274. luna_quantum-1.1.0.dist-info/WHEEL +4 -0
  275. luna_quantum-1.1.0.dist-info/licenses/LICENSE +176 -0
  276. luna_quantum-1.1.0.dist-info/licenses/NOTICE +13 -0
@@ -0,0 +1,230 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any, ClassVar, Literal
4
+
5
+ from pydantic import BaseModel, PrivateAttr
6
+
7
+ from luna_quantum.client.schemas.enums.call_style import CallStyle
8
+ from luna_quantum.client.schemas.enums.model_format import ModelFormat # noqa: TC001
9
+ from luna_quantum.client.schemas.enums.status import StatusEnum # noqa: TC001
10
+ from luna_quantum.client.schemas.wrappers import PydanticDatetimeWrapper # noqa: TC001
11
+ from luna_quantum.factories.luna_solve_client_factory import LunaSolveClientFactory
12
+ from luna_quantum.util.log_utils import Logging
13
+
14
+ if TYPE_CHECKING:
15
+ from logging import Logger
16
+
17
+ from luna_quantum._core import Solution
18
+ from luna_quantum.aqm_overwrites.model import Model
19
+ from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
20
+
21
+
22
+ class SolveJob(BaseModel):
23
+ """A model to represent a job for solving model problems."""
24
+
25
+ _logger: ClassVar[Logger] = Logging.get_logger(__name__)
26
+ id: str
27
+ status: StatusEnum
28
+ status_timeline: dict[StatusEnum, PydanticDatetimeWrapper]
29
+ error_message: str | None = None
30
+ solver_job_info: str | None = None
31
+ used_format: ModelFormat | None = None
32
+ provider: str | None = None
33
+ is_cancelable: bool = True
34
+ is_cancellation_requested: bool = False
35
+
36
+ metadata: dict[str, Any] | None = None
37
+ _result: Solution | None = PrivateAttr(default=None)
38
+
39
+ _model: Model | None = PrivateAttr(default=None)
40
+
41
+ def set_evaluation_model(self, model: Model | None) -> None:
42
+ """
43
+ Set the evaluation model for the solved job.
44
+
45
+ This will be done automatically. Normally there is no need to call this method.
46
+
47
+ Parameters
48
+ ----------
49
+ model: Model|None
50
+
51
+ """
52
+ self._model = model
53
+
54
+ def get_status(
55
+ self,
56
+ client: ILunaSolve | None = None,
57
+ status_source: Literal["cached", "remote"] = "cached",
58
+ ) -> StatusEnum:
59
+ """
60
+ Retrieve the current status of the solve job.
61
+
62
+ Parameters
63
+ ----------
64
+ status_source : Literal["cached", "remote"], optional
65
+ If "cached", the status is retrieved from the cached status. If "remote",
66
+ the status is retrieved from the remote service.
67
+
68
+ client : Optional[ILunaSolve], optional
69
+ The client to be used. If not provided, a new client is created using
70
+
71
+ Returns
72
+ -------
73
+ StatusEnum
74
+ The current status of the solve job, represented as a value
75
+ from the `StatusEnum` enumeration.
76
+
77
+ """
78
+ if status_source == "remote":
79
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
80
+
81
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
82
+ UseCaseFactory,
83
+ )
84
+
85
+ UseCaseFactory.solve_job_fetch_update(client=c).__call__(solve_job=self)
86
+
87
+ return self.status
88
+
89
+ def result(
90
+ self,
91
+ client: ILunaSolve | None = None,
92
+ sleep_time_max: float = 60.0,
93
+ sleep_time_increment: float = 5.0,
94
+ sleep_time_initial: float = 5.0,
95
+ call_style: CallStyle = CallStyle.ACTIVE_WAITING,
96
+ ) -> Solution | None:
97
+ """
98
+ Get the result of the solve job.
99
+
100
+ This function uses the provided client or creates a new one to retrieve
101
+ and the result of this solve job. Depending on the call style, it can
102
+ actively wait for the result or return immediately.
103
+
104
+ Parameters
105
+ ----------
106
+ client : Optional[ILunaSolve], optional
107
+ The client to be used. If not provided, a new client is created using
108
+ ClientFactory.
109
+ sleep_time_max : float, optional
110
+ Maximum sleep time in seconds between consecutive active waiting checks.
111
+ sleep_time_increment : float, optional
112
+ Increment value for the sleep time between checks during active waiting.
113
+ sleep_time_initial : float, optional
114
+ Initial sleep time in seconds for the active waiting process.
115
+ call_style : CallStyle, optional
116
+ Determines if this function will actively wait for the result or return
117
+ immediately.
118
+
119
+ Returns
120
+ -------
121
+ Optional[Solution]
122
+ The result of the solve job or None if not available.
123
+
124
+ Raises
125
+ ------
126
+ Any exceptions raised by the use case's solve job call will propagate.
127
+ """
128
+ if self._result:
129
+ return self._result
130
+
131
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
132
+
133
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
134
+ UseCaseFactory,
135
+ )
136
+
137
+ self._result = UseCaseFactory.solve_job_get_result(client=c).__call__(
138
+ solve_job=self,
139
+ sleep_time_max=sleep_time_max,
140
+ sleep_time_increment=sleep_time_increment,
141
+ sleep_time_initial=sleep_time_initial,
142
+ call_style=call_style,
143
+ )
144
+
145
+ if self._result is None:
146
+ return None
147
+ if self._model is None:
148
+ SolveJob._logger.info(
149
+ "The solve job object does not contain a model. "
150
+ "This solution is not evaluated."
151
+ )
152
+ else:
153
+ self._result = self._model.evaluate(self._result)
154
+
155
+ return self._result
156
+
157
+ def cancel(self, client: ILunaSolve | None = None) -> None:
158
+ """
159
+ Cancel a solve job.
160
+
161
+ This method cancels an already initiated solve job using the provided client
162
+ or a default one if no client is specified.
163
+
164
+ Parameters
165
+ ----------
166
+ client : Optional[ILunaSolve], optional
167
+ The client instance used to perform the cancel operation. If None, the
168
+ client is obtained via the ClientFactory.
169
+
170
+ Returns
171
+ -------
172
+ None
173
+ """
174
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
175
+
176
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
177
+ UseCaseFactory,
178
+ )
179
+
180
+ UseCaseFactory.solve_job_cancel(client=c).__call__(self)
181
+
182
+ def delete(self, client: ILunaSolve | None = None) -> None:
183
+ """
184
+ Delete a job using the specified or default client.
185
+
186
+ This method deletes this job and solution. A client can optionally be provided
187
+ otherwise, a default client is obtained through the factory.
188
+
189
+ Parameters
190
+ ----------
191
+ client : Optional[ILunaSolve], optional
192
+ The client to be used for job deletion. If not provided, a default client
193
+ is retrieved using `ClientFactory`.
194
+ """
195
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
196
+
197
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
198
+ UseCaseFactory,
199
+ )
200
+
201
+ UseCaseFactory.solve_job_delete(client=c).__call__(solve_job_id=self.id)
202
+
203
+ @staticmethod
204
+ def get_by_id(solve_job_id: str, client: ILunaSolve | None = None) -> SolveJob:
205
+ """
206
+ Retrieve a solve-job by its ID.
207
+
208
+ Para>meters
209
+ ----------
210
+ solve_job_id: str
211
+ Get the solve-job id for which a SolveJob should be retrieved.
212
+ client : Optional[ILunaSolve], optional
213
+ The client to be used for job deletion. If not provided, a default client
214
+ is retrieved using `ClientFactory`.
215
+
216
+ Returns
217
+ -------
218
+ SolveJob
219
+ The solve-job object.
220
+
221
+
222
+ """
223
+ c: ILunaSolve = LunaSolveClientFactory.get_client(client)
224
+ from luna_quantum.factories.usecase_factory import ( # noqa: PLC0415
225
+ UseCaseFactory,
226
+ )
227
+
228
+ return UseCaseFactory.solve_job_get_by_id(client=c).__call__(
229
+ solve_job_id=solve_job_id
230
+ )
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,59 @@
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_by_id_usecase_i import (
38
+ ISolveJobGetByIdUseCase,
39
+ )
40
+ from .solve_job_get_result_usecase_i import (
41
+ ISolveJobGetResultUseCase,
42
+ )
43
+
44
+ __all__ = [
45
+ "IModelDeleteUseCase",
46
+ "IModelFetchMetadataUseCase",
47
+ "IModelGetSolutionUseCase",
48
+ "IModelGetSolveJobUseCase",
49
+ "IModelLoadByIdUseCase",
50
+ "IModelLoadByMetadataUseCase",
51
+ "IModelLoadMetadataByHashUseCase",
52
+ "IModelSaveUseCase",
53
+ "ISolveJobCancelUseCase",
54
+ "ISolveJobCreateUseCase",
55
+ "ISolveJobDeleteUseCase",
56
+ "ISolveJobFetchUpdatesUseCase",
57
+ "ISolveJobGetByIdUseCase",
58
+ "ISolveJobGetResultUseCase",
59
+ ]
@@ -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
+ """