luna-quantum 1.0.0__cp311-cp311-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.

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.cp311-win_amd64.pyd +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,105 @@
1
+ from luna_quantum.solve.domain.abstract import LunaAlgorithm
2
+ from luna_quantum.solve.parameters.algorithms.base_params import (
3
+ QuantumAnnealingParams,
4
+ )
5
+ from luna_quantum.solve.parameters.backends import DWaveQpu
6
+
7
+
8
+ class QuantumAnnealing(QuantumAnnealingParams, LunaAlgorithm[DWaveQpu]):
9
+ """
10
+ Quantum Annealing algorithm for physical quantum processors (QPUs).
11
+
12
+ Quantum Annealing is a metaheuristic that leverages quantum effects to find the
13
+ ground state of a system, corresponding to the optimal solution of an optimization
14
+ problem.
15
+
16
+ The process starts in a quantum superposition of all possible states, and gradually
17
+ evolves the system according to a time-dependent Hamiltonian, exploiting quantum
18
+ tunneling to potentially escape local minima more effectively than classical
19
+ methods.
20
+
21
+ This implementation is specifically for D-Wave quantum annealers or similar
22
+ hardware.
23
+
24
+ This class inherits all parameters from QuantumAnnealingParams, providing
25
+ a complete set of controls for the quantum annealing process on hardware devices.
26
+
27
+ Attributes
28
+ ----------
29
+ anneal_offsets: Any | None
30
+ Per-qubit time offsets for the annealing path. Default is None.
31
+ anneal_schedule: Any | None
32
+ Custom schedule for the annealing process. Default is None.
33
+ annealing_time: Any | None
34
+ Duration of the annealing process in microseconds. Default is None.
35
+ auto_scale: Any | None
36
+ Whether to automatically normalize the problem energy range.
37
+ Default is None.
38
+ fast_anneal: bool
39
+ Use accelerated annealing protocol. Default is False.
40
+ flux_biases: Any | None
41
+ Custom flux bias offsets for each qubit. Default is None.
42
+ flux_drift_compensation: bool
43
+ Whether to compensate for drift in qubit flux over time. Default is True.
44
+ h_gain_schedule: Any | None
45
+ Schedule for h-gain during annealing. Default is None.
46
+ initial_state: Any | None
47
+ Starting state for the annealing process. Default is None.
48
+ max_answers: int | None
49
+ Maximum number of unique answer states to return. Default is None.
50
+ num_reads: int
51
+ Number of annealing cycles to perform. Default is 1.
52
+ programming_thermalization: float | None
53
+ Wait time after programming the QPU. Default is None.
54
+ readout_thermalization: float | None
55
+ Wait time after each anneal before reading results. Default is None.
56
+ reduce_intersample_correlation: bool
57
+ Whether to add delay between samples. Default is False.
58
+ reinitialize_state: bool | None
59
+ Whether to reset to a new initial state between reads. Default is None.
60
+ """
61
+
62
+ @property
63
+ def algorithm_name(self) -> str:
64
+ """
65
+ Returns the name of the algorithm.
66
+
67
+ This abstract property method is intended to be overridden by subclasses.
68
+ It should provide the name of the algorithm being implemented.
69
+
70
+ Returns
71
+ -------
72
+ str
73
+ The name of the algorithm.
74
+ """
75
+ return "QA"
76
+
77
+ @classmethod
78
+ def get_default_backend(cls) -> DWaveQpu:
79
+ """
80
+ Return the default backend implementation.
81
+
82
+ This property must be implemented by subclasses to provide
83
+ the default backend instance to use when no specific backend
84
+ is specified.
85
+
86
+ Returns
87
+ -------
88
+ IBackend
89
+ An instance of a class implementing the IBackend interface that serves
90
+ as the default backend.
91
+ """
92
+ return DWaveQpu()
93
+
94
+ @classmethod
95
+ def get_compatible_backends(cls) -> tuple[type[DWaveQpu], ...]:
96
+ """
97
+ Check at runtime if the used backend is compatible with the solver.
98
+
99
+ Returns
100
+ -------
101
+ tuple[type[IBackend], ...]
102
+ True if the backend is compatible with the solver, False otherwise.
103
+
104
+ """
105
+ return (DWaveQpu,)
@@ -0,0 +1,174 @@
1
+ from typing import Any
2
+
3
+ from pydantic import Field
4
+
5
+ from luna_quantum.solve.domain.abstract import LunaAlgorithm
6
+ from luna_quantum.solve.parameters.backends import DWaveQpu
7
+
8
+
9
+ class RepeatedReverseQuantumAnnealing(LunaAlgorithm[DWaveQpu]):
10
+ """
11
+ Parameters for the Repeated Reverse Quantum Annealing algorithm.
12
+
13
+ This approach combines reverse annealing (starting from a classical state) with
14
+ repetition to refine solutions iteratively. It's particularly useful for:
15
+ 1. Local refinement of solutions found by classical methods
16
+ 2. Escaping local minima by temporarily increasing quantum fluctuations
17
+ 3. Improving solutions through multiple rounds of quantum optimization
18
+
19
+ The process involves:
20
+ - Starting with classical initial states
21
+ - Partially "unsolving" them by increasing quantum fluctuations
22
+ - Re-annealing to find potentially better nearby solutions
23
+ - Repeating with the best solutions found
24
+
25
+ Attributes
26
+ ----------
27
+ anneal_offsets: Any | None
28
+ Per-qubit time offsets for the annealing path, allowing qubits to anneal at
29
+ different rates. Useful for problems with varying energy scales or when certain
30
+ qubits need different annealing trajectories. Default is None, which uses
31
+ standard annealing for all qubits.
32
+ annealing_time: Any | None
33
+ Duration of the annealing process in microseconds. Longer times can improve
34
+ solution quality for problems with small energy gaps but increase runtime.
35
+ Default is None, which uses the QPU's default annealing time.
36
+ auto_scale: Any | None
37
+ Whether to automatically normalize the problem energy range to match hardware
38
+ capabilities, preventing precision issues in the physical implementation.
39
+ Default is None, which uses the D-Wave system's default setting.
40
+ flux_biases: Any | None
41
+ Custom flux bias offsets for each qubit to compensate for manufacturing
42
+ variations in the QPU hardware or to intentionally bias certain qubits.
43
+ Default is None, using standard calibration values.
44
+ flux_drift_compensation: bool
45
+ Whether to compensate for drift in qubit flux over time, improving the
46
+ reliability and consistency of results across multiple runs.
47
+ Default is True, which is recommended for most applications.
48
+ h_gain_schedule: Any | None
49
+ Schedule for h-gain (linear coefficient strength) during annealing,
50
+ allowing dynamic adjustment of problem coefficients throughout the process.
51
+ Default is None, using standard gain settings.
52
+ max_answers: int | None
53
+ Maximum number of unique answer states to return from the quantum hardware.
54
+ Useful for collecting diverse solutions while filtering out duplicates.
55
+ Must be greater than or equal to 1 if specified. Default is None, which returns
56
+ all unique solutions found.
57
+ programming_thermalization: float | None
58
+ Wait time (in microseconds) after programming the QPU, allowing it to
59
+ reach thermal equilibrium before starting the annealing process.
60
+ Must be positive if specified. Default is None, using system default.
61
+ readout_thermalization: float | None
62
+ Wait time (in microseconds) after each anneal before reading results.
63
+ Helps ensure the qubits have settled into their final states before measurement.
64
+ Must be positive if specified. Default is None, using system default.
65
+ reduce_intersample_correlation: bool
66
+ Whether to add delay between samples to reduce temporal correlations
67
+ that might bias results across multiple runs. Default is False to minimize
68
+ runtime, but can be set to True when sample independence is critical.
69
+ initial_states: list[dict[str, int]] | None
70
+ Initial classical states to start the reverse annealing from, specified as
71
+ dictionaries mapping variable names to binary values (0 or 1). For each state,
72
+ one call to the sampler with parameter `initial_state=state` will be made
73
+ in the first iteration. Default is None, in which case random or specified
74
+ states are generated according to n_initial_states.
75
+ n_initial_states: int
76
+ Number of initial states to create when `initial_states` is None.
77
+ Controls the diversity of starting points for the algorithm.
78
+ Ignored if `initial_states` is provided. Default is 1. Must be ≥1.
79
+ samples_per_state: int
80
+ How many samples to create per state in each iteration after the first.
81
+ More samples increase the chance of finding improvements but use more QPU time.
82
+ Controls the breadth of exploration around each promising solution.
83
+ Default is 1. Must be ≥1.
84
+ beta_schedule: list[float]
85
+ Beta schedule controlling the quantum fluctuation strength during reverse
86
+ annealing. Beta is the inverse temperature (1/T), with lower values allowing
87
+ more thermal excitation to explore the energy landscape more widely.
88
+ Default [0.5, 3] provides moderate initial fluctuation followed by cooling,
89
+ balancing exploration and exploitation.
90
+ timeout: float
91
+ Maximum runtime in seconds before the solver stops, regardless of convergence.
92
+ Provides a hard time limit to ensure the algorithm completes within a reasonable
93
+ timeframe. Default is 300 seconds (5 minutes), balancing solution quality with
94
+ timeliness.
95
+ max_iter: int
96
+ Maximum number of iterations (reverse annealing cycles) to perform.
97
+ Each iteration refines the solutions from the previous round, potentially
98
+ discovering better solutions in the neighborhood of good candidates.
99
+ Default is 10, providing good refinement without excessive QPU usage.
100
+ target: Any | None
101
+ Target energy value that, if reached, causes the algorithm to terminate early.
102
+ Allows for early stopping when a sufficiently good solution is found.
103
+ Default is None (run until other stopping criteria are met).
104
+ check_trivial: bool
105
+ Whether to check for and handle trivial variables (those without interactions)
106
+ before sending the problem to the QPU. Adds some computational overhead but
107
+ prevents potential runtime errors and improves embedding efficiency.
108
+ Default is True, which is recommended for robust operation.
109
+ """
110
+
111
+ anneal_offsets: Any | None = None
112
+ annealing_time: Any | None = None
113
+ auto_scale: Any | None = None
114
+ flux_biases: Any | None = None
115
+ flux_drift_compensation: bool = True
116
+ h_gain_schedule: Any | None = None
117
+ max_answers: int | None = Field(default=None, ge=1)
118
+ programming_thermalization: float | None = Field(default=None, gt=0)
119
+ readout_thermalization: float | None = Field(default=None, gt=0)
120
+ reduce_intersample_correlation: bool = False
121
+
122
+ initial_states: list[dict[str, int]] | None = None
123
+ n_initial_states: int = Field(default=1, ge=1)
124
+ samples_per_state: int = Field(default=1, ge=1)
125
+ beta_schedule: list[float] = Field(default_factory=lambda: [0.5, 3])
126
+ timeout: float = 300
127
+ max_iter: int = 10
128
+ target: Any | None = None
129
+ check_trivial: bool = True
130
+
131
+ @property
132
+ def algorithm_name(self) -> str:
133
+ """
134
+ Returns the name of the algorithm.
135
+
136
+ This abstract property method is intended to be overridden by subclasses.
137
+ It should provide the name of the algorithm being implemented.
138
+
139
+ Returns
140
+ -------
141
+ str
142
+ The name of the algorithm.
143
+ """
144
+ return "RRQA"
145
+
146
+ @classmethod
147
+ def get_default_backend(cls) -> DWaveQpu:
148
+ """
149
+ Return the default backend implementation.
150
+
151
+ This property must be implemented by subclasses to provide
152
+ the default backend instance to use when no specific backend
153
+ is specified.
154
+
155
+ Returns
156
+ -------
157
+ IBackend
158
+ An instance of a class implementing the IBackend interface that serves
159
+ as the default backend.
160
+ """
161
+ return DWaveQpu()
162
+
163
+ @classmethod
164
+ def get_compatible_backends(cls) -> tuple[type[DWaveQpu], ...]:
165
+ """
166
+ Check at runtime if the used backend is compatible with the solver.
167
+
168
+ Returns
169
+ -------
170
+ tuple[type[IBackend], ...]
171
+ True if the backend is compatible with the solver, False otherwise.
172
+
173
+ """
174
+ return (DWaveQpu,)
@@ -0,0 +1,6 @@
1
+ from .flex_qaoa import FlexQAOA
2
+ from .qaoa import QAOA
3
+ from .qaoa_fo import QAOA_FO
4
+ from .vqe import VQE
5
+
6
+ __all__ = ["QAOA", "QAOA_FO", "VQE", "FlexQAOA"]
@@ -0,0 +1,26 @@
1
+ from .config import AdvancedConfig, XYMixer
2
+ from .flex_qaoa import FlexQAOA
3
+ from .optimizers import (
4
+ CombinedOptimizerParams,
5
+ InterpolateOptimizerParams,
6
+ LinearOptimizerParams,
7
+ )
8
+ from .pipeline import (
9
+ IndicatorFunctionParams,
10
+ OneHotParams,
11
+ PipelineParams,
12
+ QuadraticPenaltyParams,
13
+ )
14
+
15
+ __all__ = [
16
+ "AdvancedConfig",
17
+ "CombinedOptimizerParams",
18
+ "FlexQAOA",
19
+ "IndicatorFunctionParams",
20
+ "InterpolateOptimizerParams",
21
+ "LinearOptimizerParams",
22
+ "OneHotParams",
23
+ "PipelineParams",
24
+ "QuadraticPenaltyParams",
25
+ "XYMixer",
26
+ ]
@@ -0,0 +1,80 @@
1
+ from typing import Literal
2
+
3
+ from pydantic import BaseModel, Field, field_validator
4
+
5
+ from luna_quantum.solve.errors.solve_base_error import SolveBaseError
6
+
7
+
8
+ class MixerTypeError(SolveBaseError):
9
+ """Custom Mixer type exception."""
10
+
11
+ def __init__(self) -> None:
12
+ super().__init__("XY-mixer type can only occur once.")
13
+
14
+
15
+ class XYMixer(BaseModel):
16
+ """XY-mixer configuration.
17
+
18
+ Attributes
19
+ ----------
20
+ types: list[Literal["even", "odd", "last"]]
21
+ XY-ring-mixer pipeline
22
+ """
23
+
24
+ types: list[Literal["even", "odd", "last"]] = Field(
25
+ default=["even", "odd", "last"],
26
+ description="XY-ring-mixer types and order.",
27
+ )
28
+
29
+ @field_validator("types")
30
+ @classmethod
31
+ def _validate_type_once(
32
+ cls, v: list[Literal["even", "odd", "last"]]
33
+ ) -> list[Literal["even", "odd", "last"]]:
34
+ if len(set(v)) < len(v):
35
+ raise MixerTypeError
36
+ return v
37
+
38
+
39
+ class AdvancedConfig(BaseModel):
40
+ """Additional FlexQAOA algorithm configuration.
41
+
42
+ Attributes
43
+ ----------
44
+ mixer: XYMixer | Dict
45
+ Mixer types in XY-ring-mixer. Default: `["even", "odd", "last"]`
46
+ parallel_indicators: bool
47
+ Toggle to apply indicator functions in parallel. Does not affect sampling
48
+ performance of QAOA, but only circuit metrics, like number of qubits and
49
+ circuit depth.
50
+ discard_slack: bool
51
+ Discard slack qubits in evaluation, i.e. only measure on the binary variables of
52
+ the initial problem. This requires an auxilary cost function that penalizes
53
+ infeasible solutions.
54
+ infeas_penalty: float | None
55
+ Penalty for infeasible solutions if `discard_slack` is activated. By defalt,
56
+ 10 times the max absolute intial bias is chosen.
57
+ """
58
+
59
+ mixer: XYMixer = Field(
60
+ default_factory=lambda: XYMixer(),
61
+ description='Mixer types in XY-ring-mixer. Default: `["even", "odd", "last"]`',
62
+ )
63
+ parallel_indicators: bool = Field(
64
+ default=True,
65
+ description="Toggle to apply indicator functions in parallel. Does not affect "
66
+ "sampling performance of QAOA, but only circuit metrics, "
67
+ "like number of qubits and circuit depth.",
68
+ )
69
+ discard_slack: bool = Field(
70
+ default=False,
71
+ description="Discard slack qubits in evaluation, i.e. only measure on the "
72
+ "binary variables of the initial problem. This requires an auxilary cost "
73
+ "function that penalizes infeasible solutions.",
74
+ )
75
+ infeas_penalty: float | None = Field(
76
+ default=None,
77
+ ge=0,
78
+ description="Penalty for infeasible solutions if `discard_slack` is activated."
79
+ "By defalt, 10 times the max absolute intial bias is chosen.",
80
+ )
@@ -0,0 +1,226 @@
1
+ from __future__ import annotations
2
+
3
+ from pydantic import BaseModel, Field, model_validator
4
+
5
+ from luna_quantum.solve.domain.abstract.luna_algorithm import LunaAlgorithm
6
+ from luna_quantum.solve.errors.solve_base_error import SolveBaseError
7
+ from luna_quantum.solve.parameters.algorithms.base_params.qaoa_circuit_params import (
8
+ BasicQAOAParams,
9
+ LinearQAOAParams,
10
+ RandomQAOAParams,
11
+ )
12
+ from luna_quantum.solve.parameters.algorithms.base_params.scipy_optimizer import (
13
+ ScipyOptimizerParams,
14
+ )
15
+ from luna_quantum.solve.parameters.backends.aqarios import Aqarios
16
+
17
+ from .config import AdvancedConfig
18
+ from .optimizers import (
19
+ CombinedOptimizerParams,
20
+ InterpolateOptimizerParams,
21
+ LinearOptimizerParams,
22
+ )
23
+ from .pipeline import PipelineParams
24
+
25
+
26
+ class QAOAParameterOptimizerError(SolveBaseError):
27
+ """QAOA cirucit parameters mismatch with optimizer exception."""
28
+
29
+ def __init__(
30
+ self,
31
+ optimizer: ScipyOptimizerParams
32
+ | LinearOptimizerParams
33
+ | CombinedOptimizerParams
34
+ | InterpolateOptimizerParams
35
+ | None,
36
+ params: BasicQAOAParams | LinearQAOAParams | RandomQAOAParams,
37
+ extra: str = "",
38
+ ) -> None:
39
+ super().__init__(
40
+ f"Parameter Mismatch of {optimizer.__class__} and {params.__class__}"
41
+ + ((". " + extra) if extra else "")
42
+ )
43
+
44
+
45
+ class InterpolateOptimizerError(SolveBaseError):
46
+ """Interpolate optimizer error when final number of reps is too small."""
47
+
48
+ def __init__(self, reps_end: int, reps_start: int) -> None:
49
+ super().__init__(f"{reps_end=} needs to be larger than {reps_start=}.")
50
+
51
+
52
+ class QAOAParameterDepthMismatchError(SolveBaseError):
53
+ """QAOA circuit params mismatch the specified reps."""
54
+
55
+ def __init__(self, params_reps: int, reps: int) -> None:
56
+ super().__init__(f"{params_reps=} needs to match {reps=}.")
57
+
58
+
59
+ class FlexQAOA(LunaAlgorithm[Aqarios], BaseModel):
60
+ """The FlexQAOA Algorithm for constrained quantum optimization.
61
+
62
+ The FlexQAOA is an extension to the default QAOA with the capabilities to encode
63
+ inequality constriants with indicator functions as well as one-hot constraints
64
+ through XY-mixers. This algorithm will dynamically extract all constraints from the
65
+ given constraint input optimization model, and construct an accoring QAOA circuit.
66
+ Currently only simulation of the circuit is supported. But due to the constrained
67
+ nature, the subspace of the Hilbertspace required for simulation is smaller,
68
+ depending on the problem instance. This allows for simulation of problems with
69
+ more qubits than ordinary state vector simulation allows. For now, the simulation
70
+ size is limited to Hilbertspaces with less <= 2**18 dimensions.
71
+
72
+ The FlexQAOA allows for a dynamic circuit construction depending on input paramters.
73
+ Central to this is the pipeline parameter which allows for different configurations.
74
+
75
+ For instance, if one likes to explore ordinary QUBO simulation with all constraints
76
+ represented as quadratic penalties, the `one_hot` and `indicator_function` options
77
+ need to be manually disabled
78
+ ```
79
+ pipeline = {"one_hot": None, "indicator_function": None}
80
+ ```
81
+
82
+ If no indicator function is employed, but the input problem contains inequality
83
+ constraints, slack variables are added to the optimization problem. FlexQAOA allows
84
+ for a configuration that discards slack variables as their assignment is not
85
+ necessarily of interest. This option can be enbled by setting
86
+ ```
87
+ qaoa_config = {"discard_slack": True}
88
+ ```
89
+
90
+ Following the standard protocol for QAOA, a classical optimizer is required that
91
+ tunes the variational parameters of the circuit. Besides the classical
92
+ `ScipyOptimizer` other optimizers are also featured, allowing for optimizing only a
93
+ linear schedule, starting with optimizing for a linear schedule followed by
94
+ individual parameter fine tuning, and interpolating between different QAOA circuit
95
+ depts.
96
+
97
+ Attributes
98
+ ----------
99
+ shots: int
100
+ Number of sampled shots.
101
+ reps: int
102
+ Number of QAOA layer repetitions
103
+ pipeline: PipelineParams | Dict
104
+ The pipeline defines the selected features for QAOA circuit generation. By
105
+ default, all supported features are enabled (one-hot constraints, inequality
106
+ constraints and quadratic penalties).
107
+ optimizer: ScipyOptimizerParams | LinearOptimizerParams | CombinedOptimizerParams |\
108
+ InterpolateOptimizerParams | None | Dict
109
+ The classical optimizer for parameter tuning. Default: ScipyOptimizer. Setting
110
+ to `None` disables the optimization, leading to an evaluation of the initial
111
+ parameters.
112
+ qaoa_config: AdvancedConfig | Dict
113
+ Additional options for the QAOA circuit and evalutation
114
+ initial_params: LinearQAOAParams | BasicQAOAParams | RandomQAOAParams | Dict
115
+ Custom QAOA variational circuit parameters. By default linear
116
+ increasing/decreasing parameters for the selected `reps` are generated.
117
+ """
118
+
119
+ shots: int = Field(default=1024, ge=1, description="Number of sampled shots.")
120
+ reps: int = Field(default=1, ge=1, description="Number of QAOA layer repetitions")
121
+ pipeline: PipelineParams = Field(
122
+ default_factory=lambda: PipelineParams(),
123
+ description="The pipeline defines the selected features for QAOA circuit "
124
+ "generation. By default, all supported features are enabled "
125
+ "(one-hot constraints, inequality constraints and quadratic penalties).",
126
+ )
127
+ optimizer: (
128
+ ScipyOptimizerParams
129
+ | LinearOptimizerParams
130
+ | CombinedOptimizerParams
131
+ | InterpolateOptimizerParams
132
+ | None
133
+ ) = Field(
134
+ default_factory=lambda: ScipyOptimizerParams(),
135
+ description="The classical optimizer. Default: ScipyOptimizer",
136
+ )
137
+ qaoa_config: AdvancedConfig = Field(
138
+ default_factory=lambda: AdvancedConfig(),
139
+ description="Additional options for the QAOA circuit and evalutation",
140
+ )
141
+ initial_params: LinearQAOAParams | BasicQAOAParams | RandomQAOAParams = Field(
142
+ default_factory=lambda: LinearQAOAParams(delta_beta=0.5, delta_gamma=0.5),
143
+ description="Custom QAOA circuit parameters. By default linear "
144
+ "increasing/decreasing parameters for the selected `reps` are generated.",
145
+ )
146
+
147
+ @model_validator(mode="after")
148
+ def _check_param_type(self) -> FlexQAOA:
149
+ if isinstance(self.optimizer, LinearOptimizerParams) and isinstance(
150
+ self.initial_params, BasicQAOAParams
151
+ ):
152
+ raise QAOAParameterOptimizerError(self.optimizer, self.initial_params)
153
+ if isinstance(self.optimizer, CombinedOptimizerParams) and isinstance(
154
+ self.initial_params, BasicQAOAParams
155
+ ):
156
+ raise QAOAParameterOptimizerError(self.optimizer, self.initial_params)
157
+ if (
158
+ isinstance(self.optimizer, InterpolateOptimizerParams)
159
+ and isinstance(self.optimizer.optimizer, LinearOptimizerParams)
160
+ and isinstance(self.initial_params, BasicQAOAParams)
161
+ ):
162
+ raise QAOAParameterOptimizerError(
163
+ self.optimizer,
164
+ self.initial_params,
165
+ extra="LinearOptimizer used in InterpolateOptimizer.",
166
+ )
167
+ if (
168
+ isinstance(self.optimizer, InterpolateOptimizerParams)
169
+ and self.optimizer.reps_end < self.reps
170
+ ):
171
+ raise InterpolateOptimizerError(self.optimizer.reps_end, self.reps)
172
+ return self
173
+
174
+ @model_validator(mode="after")
175
+ def _check_depth(self) -> FlexQAOA:
176
+ if (
177
+ isinstance(self.initial_params, BasicQAOAParams)
178
+ and self.initial_params.reps != self.reps
179
+ ):
180
+ raise QAOAParameterDepthMismatchError(self.initial_params.reps, self.reps)
181
+ return self
182
+
183
+ @property
184
+ def algorithm_name(self) -> str:
185
+ """
186
+ Returns the name of the algorithm.
187
+
188
+ This abstract property method is intended to be overridden by subclasses.
189
+ It should provide the name of the algorithm being implemented.
190
+
191
+ Returns
192
+ -------
193
+ str
194
+ The name of the algorithm.
195
+ """
196
+ return "FlexQAOA"
197
+
198
+ @classmethod
199
+ def get_default_backend(cls) -> Aqarios:
200
+ """
201
+ Return the default backend implementation.
202
+
203
+ This property must be implemented by subclasses to provide
204
+ the default backend instance to use when no specific backend
205
+ is specified.
206
+
207
+ Returns
208
+ -------
209
+ IBackend
210
+ An instance of a class implementing the IBackend interface that serves
211
+ as the default backend.
212
+ """
213
+ return Aqarios()
214
+
215
+ @classmethod
216
+ def get_compatible_backends(cls) -> tuple[type[Aqarios]]:
217
+ """
218
+ Check at runtime if the used backend is compatible with the solver.
219
+
220
+ Returns
221
+ -------
222
+ tuple[type[IBackend], ...]
223
+ True if the backend is compatible with the solver, False otherwise.
224
+
225
+ """
226
+ return (Aqarios,)