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,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 .flexqaoa 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,10 @@
1
+ import warnings
2
+
3
+ from luna_quantum.solve.parameters.algorithms.quantum_gate.flexqaoa import * # noqa: F403
4
+
5
+ warnings.warn(
6
+ "The module `flex_qaoa` is deprecated and will be removed in the future. "
7
+ "Use 'flexqaoa' instead.",
8
+ DeprecationWarning,
9
+ stacklevel=2,
10
+ )
@@ -0,0 +1,29 @@
1
+ from .config import CustomConfig
2
+ from .flexqaoa import FlexQAOA
3
+ from .optimizers import (
4
+ CombinedOptimizerParams,
5
+ InterpolateOptimizerParams,
6
+ )
7
+ from .pipeline import (
8
+ IndicatorFunctionConfig,
9
+ InequalityToEqualityConfig,
10
+ PenaltySetting,
11
+ PipelineParams,
12
+ QuadraticPenaltyConfig,
13
+ SetpackingAsOnehotConfig,
14
+ XYMixerConfig,
15
+ )
16
+
17
+ __all__ = [
18
+ "CombinedOptimizerParams",
19
+ "CustomConfig",
20
+ "FlexQAOA",
21
+ "IndicatorFunctionConfig",
22
+ "InequalityToEqualityConfig",
23
+ "InterpolateOptimizerParams",
24
+ "PenaltySetting",
25
+ "PipelineParams",
26
+ "QuadraticPenaltyConfig",
27
+ "SetpackingAsOnehotConfig",
28
+ "XYMixerConfig",
29
+ ]
@@ -0,0 +1,58 @@
1
+ from typing import Literal
2
+
3
+ from pydantic import BaseModel, Field, PositiveInt
4
+
5
+
6
+ class CustomConfig(BaseModel):
7
+ """Additional FlexQAOA circuit configuration.
8
+
9
+ Attributes
10
+ ----------
11
+ max_qubits : PositiveInt | None
12
+ Maximum number of qubits allowed for the circuit. If `None`, no limit is
13
+ applied. Default: `None`.
14
+ minimize_qubits : bool
15
+ Minimize the number of used qubits in the circuit if set to `True`. Otherwise,
16
+ minimize circuit depth. Default: `False`.
17
+ wstate : Literal["log", "bilinear", "linear"]
18
+ WState generation cricuit. Choice between:
19
+
20
+ - `"log"`: Logarithmic-depth binary tree circuit.
21
+ - `"linear"`: Linear circuit construction.
22
+ - `"bilinear"`: Bi-linear circuit construction, starts in the middle and
23
+ linearly constructs the circuit outwards.
24
+
25
+ Default: `"log"`
26
+ qft_synth : Literal["line", "full"]
27
+ QFT synthesis method. Choice between:
28
+
29
+ - `"full"`: Shorter circuit depth implementation that requires all-to-all
30
+ connectivity.
31
+ - `"line"`: Longer circuit depth implementation that requires linear
32
+ connectivity.
33
+
34
+ Default: `"full"`
35
+ """
36
+
37
+ max_qubits: PositiveInt | None = Field(
38
+ default=None,
39
+ description="Maximum number of qubits allowed for the circuit. If `None`, no "
40
+ "limit is applied.",
41
+ )
42
+ minimize_qubits: bool = Field(
43
+ default=False,
44
+ description="Minimize the number of used qubits in the circuit "
45
+ "if set to `True`. Otherwise, minimize circuit depth.",
46
+ )
47
+ wstate: Literal["log", "bilinear", "linear"] = Field(
48
+ default="log",
49
+ description="WState generation cricuit. Choice between: Logarithmic-depth (log)"
50
+ " binary tree circuit and linear or bilinear construction. bilinear places the "
51
+ "start in the middle and linearly constructs the circuit outwards.",
52
+ )
53
+ qft_synth: Literal["line", "full"] = Field(
54
+ default="full",
55
+ description="QFT synthesis method. Shorter depth (full) implementation requires"
56
+ " all-to-all connectivity. Longer (line) implementation requires only linear "
57
+ "connectivity.",
58
+ )
@@ -0,0 +1,188 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Literal
4
+
5
+ from pydantic import BaseModel, Field, model_validator
6
+
7
+ from luna_quantum.solve.domain.abstract.luna_algorithm import LunaAlgorithm
8
+ from luna_quantum.solve.parameters.algorithms.base_params.qaoa_circuit_params import (
9
+ BasicQAOAParams,
10
+ LinearQAOAParams,
11
+ RandomQAOAParams,
12
+ )
13
+ from luna_quantum.solve.parameters.algorithms.base_params.scipy_optimizer import (
14
+ ScipyOptimizerParams,
15
+ )
16
+ from luna_quantum.solve.parameters.backends.aqarios import Aqarios
17
+ from luna_quantum.solve.parameters.backends.aqarios_gpu import AqariosGpu
18
+ from luna_quantum.solve.parameters.errors import (
19
+ InterpolateOptimizerError,
20
+ QAOAParameterOptimizerError,
21
+ QAOAParameterRepsMismatchError,
22
+ )
23
+
24
+ from .config import CustomConfig
25
+ from .optimizers import CombinedOptimizerParams, InterpolateOptimizerParams
26
+ from .pipeline import PipelineParams
27
+
28
+
29
+ class FlexQAOA(LunaAlgorithm[Aqarios | AqariosGpu], BaseModel):
30
+ """The FlexQAOA algorithm for constrained quantum optimization.
31
+
32
+ The FlexQAOA is an extension to the default QAOA with the capabilities to encode
33
+ inequality constriants with indicator functions as well as one-hot constraints
34
+ through XY-mixers. This algorithm will dynamically extract all constraints from the
35
+ given constraint input optimization model, and construct an accoring QAOA circuit.
36
+ Currently only simulation of the circuit is supported. But due to the constrained
37
+ nature, the subspace of the Hilbertspace required for simulation is smaller,
38
+ depending on the problem instance. This allows for simulation of problems with
39
+ more qubits than ordinary state vector simulation allows. For now, the simulation
40
+ size is limited to Hilbertspaces with less <= 2**18 dimensions.
41
+
42
+ The FlexQAOA allows for a dynamic circuit construction depending on input paramters.
43
+ Central to this is the pipeline parameter which allows for different configurations.
44
+
45
+ For instance, if one likes to explore ordinary QUBO simulation with all constraints
46
+ represented as quadratic penalties, the `xy_mixers` and `indicator_function` options
47
+ need to be manually disabled
48
+ ```
49
+ pipeline.xy_mixer.enable = False
50
+ pipeline.indicator_function.enable = False
51
+ ```
52
+
53
+ Following the standard protocol for QAOA, a classical optimizer is required that
54
+ tunes the variational parameters of the circuit. Besides the classical
55
+ `ScipyOptimizer` other optimizers are also featured, allowing for optimizing only a
56
+ linear schedule, starting with optimizing for a linear schedule followed by
57
+ individual parameter fine tuning, and interpolating between different QAOA circuit
58
+ depts.
59
+
60
+ Attributes
61
+ ----------
62
+ shots: int
63
+ Number of sampled shots.
64
+ reps: int
65
+ Number of QAOA layer repetitions
66
+ pipeline: PipelineParams
67
+ The pipeline defines the selected features for QAOA circuit generation. By
68
+ default, all supported features are enabled (one-hot constraints, inequality
69
+ constraints and quadratic penalties).
70
+ optimizer: ScipyOptimizerParams | CombinedOptimizerParams |\
71
+ InterpolateOptimizerParams | None
72
+ The classical optimizer for parameter tuning. Setting
73
+ to `None` disables the optimization, leading to an evaluation of the initial
74
+ parameters.
75
+ initial_params: LinearQAOAParams | BasicQAOAParams | RandomQAOAParams | Dict
76
+ Custom QAOA variational circuit parameters. By default linear
77
+ increasing/decreasing parameters for the selected `reps` are generated.
78
+ param_conversion: None | Literal["basic"] = "basic"
79
+ Parameter conversion after initialization. This option set to `None` means the
80
+ parameters, as specified are used. This parameter set to `"basic"` means the
81
+ parameters are converted to basic parameters before optimization. This is useful
82
+ if one only wants to optimize the linear schedule of parameters: Then the option
83
+ `None` needs to be selected alongside LinearQAOAParams. This
84
+ option is ignored when CombinedOptimizer is also selected.
85
+ custom_config: CustomConfig
86
+ Additional options for the FlexQAOA circuit.
87
+ """
88
+
89
+ shots: int = Field(
90
+ default=1024, ge=1, lt=1 << 16, description="Number of sampled shots."
91
+ )
92
+ reps: int = Field(
93
+ default=1, ge=1, lt=1000, description="Number of QAOA layer repetitions"
94
+ )
95
+ pipeline: PipelineParams = Field(
96
+ default_factory=lambda: PipelineParams(),
97
+ description="The pipeline defines the selected features for QAOA circuit "
98
+ "generation. By default, all supported features are enabled "
99
+ "(one-hot constraints, inequality constraints and quadratic penalties).",
100
+ )
101
+ optimizer: (
102
+ ScipyOptimizerParams
103
+ | CombinedOptimizerParams
104
+ | InterpolateOptimizerParams
105
+ | None
106
+ ) = Field(
107
+ default_factory=lambda: ScipyOptimizerParams(),
108
+ description="The classical optimizer. Default: ScipyOptimizer",
109
+ )
110
+ initial_params: LinearQAOAParams | BasicQAOAParams | RandomQAOAParams = Field(
111
+ default_factory=lambda: LinearQAOAParams(delta_beta=0.5, delta_gamma=0.5),
112
+ description="Custom QAOA circuit parameters. By default linear "
113
+ "increasing/decreasing parameters for the selected `reps` are generated.",
114
+ )
115
+ param_conversion: None | Literal["basic"] = "basic"
116
+ custom_config: CustomConfig = Field(
117
+ default_factory=lambda: CustomConfig(),
118
+ description="Additional configuration options for the FlexQAOA circuit.",
119
+ )
120
+
121
+ @model_validator(mode="after")
122
+ def _check_param_type(self) -> FlexQAOA:
123
+ if isinstance(self.optimizer, CombinedOptimizerParams):
124
+ if isinstance(self.initial_params, (BasicQAOAParams, RandomQAOAParams)):
125
+ optim = self.optimizer.__class__.__name__
126
+ params = self.initial_params.__class__.__name__
127
+ raise QAOAParameterOptimizerError(optim, params)
128
+ self.param_conversion = None
129
+ if (
130
+ isinstance(self.optimizer, InterpolateOptimizerParams)
131
+ and self.optimizer.reps_end < self.reps
132
+ ):
133
+ raise InterpolateOptimizerError(self.optimizer.reps_end, self.reps)
134
+ return self
135
+
136
+ @model_validator(mode="after")
137
+ def _check_depth(self) -> FlexQAOA:
138
+ if (
139
+ isinstance(self.initial_params, BasicQAOAParams)
140
+ and self.initial_params.reps != self.reps
141
+ ):
142
+ raise QAOAParameterRepsMismatchError(self.initial_params.reps, self.reps)
143
+ return self
144
+
145
+ @property
146
+ def algorithm_name(self) -> str:
147
+ """
148
+ Returns the name of the algorithm.
149
+
150
+ This abstract property method is intended to be overridden by subclasses.
151
+ It should provide the name of the algorithm being implemented.
152
+
153
+ Returns
154
+ -------
155
+ str
156
+ The name of the algorithm.
157
+ """
158
+ return "FlexQAOA"
159
+
160
+ @classmethod
161
+ def get_default_backend(cls) -> Aqarios:
162
+ """
163
+ Return the default backend implementation.
164
+
165
+ This property must be implemented by subclasses to provide
166
+ the default backend instance to use when no specific backend
167
+ is specified.
168
+
169
+ Returns
170
+ -------
171
+ IBackend
172
+ An instance of a class implementing the IBackend interface that serves
173
+ as the default backend.
174
+ """
175
+ return Aqarios()
176
+
177
+ @classmethod
178
+ def get_compatible_backends(cls) -> tuple[type[Aqarios], type[AqariosGpu]]:
179
+ """
180
+ Check at runtime if the used backend is compatible with the solver.
181
+
182
+ Returns
183
+ -------
184
+ tuple[type[IBackend], ...]
185
+ True if the backend is compatible with the solver, False otherwise.
186
+
187
+ """
188
+ return (Aqarios, AqariosGpu)
@@ -0,0 +1,53 @@
1
+ from typing import Literal
2
+
3
+ from pydantic import BaseModel, Field
4
+
5
+ from luna_quantum.solve.parameters.algorithms.base_params.scipy_optimizer import (
6
+ ScipyOptimizerParams,
7
+ )
8
+
9
+
10
+ class CombinedOptimizerParams(BaseModel):
11
+ """Combination of LinearOptimizer and ScipyOptimizer.
12
+
13
+ Optimizer that first performs an optimization of the linear schedule and then
14
+ fine tunes individual parameters. Only works in conjunction with `LinearQAOAParams`.
15
+
16
+
17
+ Attributes
18
+ ----------
19
+ linear: ScipyOptimizerParams
20
+ Parameters of the linear optimizer.
21
+ fine_tune: ScipyOptimizerParams | None
22
+ Parameters of the fine tuning optimizer. If `None`, the same optimizer is used.
23
+ Default: `None`.
24
+ """
25
+
26
+ optimizer_type: Literal["combined"] = "combined"
27
+ linear: ScipyOptimizerParams = Field(default_factory=lambda: ScipyOptimizerParams())
28
+ fine_tune: ScipyOptimizerParams | None = None
29
+
30
+
31
+ class InterpolateOptimizerParams(BaseModel):
32
+ """Optimizer with sequentially increasing number of QAOA layers.
33
+
34
+ Optimizer that starts with `reps` iteration and interpolates sequentially in
35
+ `reps_step` steps to `reps_end`. In between it performs a full optimization routine
36
+ tunes individual parameters.
37
+
38
+ Attributes
39
+ ----------
40
+ optimizer: ScipyOptimizerParams
41
+ Parameters of the optimizer.
42
+ reps_step: int
43
+ Number of QAOA layers added for one interpolation.
44
+ reps_end: int
45
+ Final number of QAOA layers to be reached.
46
+ """
47
+
48
+ optimizer_type: Literal["interpolate"] = "interpolate"
49
+ optimizer: ScipyOptimizerParams = Field(
50
+ default_factory=lambda: ScipyOptimizerParams()
51
+ )
52
+ reps_step: int = Field(default=1, ge=1)
53
+ reps_end: int = Field(default=10, ge=1, lt=1000)
@@ -0,0 +1,164 @@
1
+ from typing import Literal
2
+
3
+ from pydantic import BaseModel, Field, PositiveFloat
4
+
5
+
6
+ class _EnableMixin:
7
+ enable: bool = True
8
+
9
+
10
+ class PenaltySetting(BaseModel):
11
+ """Penalty factor settings.
12
+
13
+ Attributes
14
+ ----------
15
+ override: PositiveFloat | None
16
+ Overrides the automatically evaluated penalty factor.
17
+ scaling: PositiveFloat
18
+ Scales the automatically evaluated penalty factor.
19
+ """
20
+
21
+ override: PositiveFloat | None = None
22
+ scaling: PositiveFloat = 1.0
23
+
24
+
25
+ class IndicatorFunctionConfig(BaseModel, _EnableMixin):
26
+ """Configuration for indicator functions to implement inequality constraints.
27
+
28
+ Attributes
29
+ ----------
30
+ penalty: PenaltySetting
31
+ Custom penalty setting for indicator functions.
32
+ method: Literal["const", "str"]
33
+ Indicator function implementation method. Default: `"const"`
34
+ Two options are available:
35
+
36
+ - `"const"`: Applies a constant penalty for every constraint violation.
37
+ - `"if"`: Applies the objective function only if all constraints are satisfied.
38
+ Automatically ensures objective to be negative.
39
+
40
+ enable : bool
41
+ Toggle to enable or disable this method. Default: True.
42
+ """
43
+
44
+ penalty: PenaltySetting = Field(
45
+ default_factory=lambda: PenaltySetting(scaling=1),
46
+ description="Penalty setting for indicator functions.",
47
+ )
48
+ method: Literal["if", "const"] = Field(
49
+ default="const",
50
+ description="Method of indicator function implementation. Constant Penalty "
51
+ "(const) or conditional application of cost function (if).",
52
+ )
53
+
54
+
55
+ class XYMixerConfig(BaseModel, _EnableMixin):
56
+ """Configuration for XY-mixers to implement one-hot constraints.
57
+
58
+ Attributes
59
+ ----------
60
+ trotter : int
61
+ Number of trotter steps for XY-mixer implementation. Default: 1.
62
+ types: list[Literal["even", "odd", "last"]]
63
+ Mixer types in XY-ring-mixer. Default: `["even", "odd", "last"]`.
64
+ enable : bool
65
+ Toggle to enable or disable this method. Default: True.
66
+ """
67
+
68
+ trotter: int = Field(
69
+ default=1,
70
+ lt=1000,
71
+ ge=1,
72
+ description="Number of trotter steps for XY-mixer implementation.",
73
+ )
74
+ types: list[Literal["even", "odd", "last"]] = Field(
75
+ default=["even", "odd", "last"],
76
+ description='Mixer types in XY-ring-mixer. Default: `["even", "odd", "last"]`',
77
+ )
78
+
79
+
80
+ class QuadraticPenaltyConfig(BaseModel, _EnableMixin):
81
+ """Configuration for quadratic penalties.
82
+
83
+ Adds penalty terms to the objective. Adds slack variables for inequality constraints
84
+ if neccessaray.
85
+
86
+ Attributes
87
+ ----------
88
+ penalty : PenaltySetting
89
+ Custom penalty setting for quadratic penalty terms.
90
+ enable : bool
91
+ Toggle to enable or disable this method. Default: True.
92
+ """
93
+
94
+ penalty: PenaltySetting = Field(
95
+ default_factory=lambda: PenaltySetting(scaling=2.0),
96
+ description="Penalty setting for quadratic penalties.",
97
+ )
98
+
99
+
100
+ class SetpackingAsOnehotConfig(BaseModel, _EnableMixin):
101
+ """Configuration for set-packing to one-hot constraint transformation.
102
+
103
+ Attributes
104
+ ----------
105
+ enable : bool
106
+ Toggle to enable or disable this method. Default: True.
107
+ """
108
+
109
+
110
+ class InequalityToEqualityConfig(BaseModel, _EnableMixin):
111
+ """Configuration for inequality to equality constraint transformation.
112
+
113
+ Attributes
114
+ ----------
115
+ max_slack : int
116
+ Maximum number of slack bits to add for each constraint. Default: 10.
117
+ enable : bool
118
+ Toggle to enable or disable this method. Default: True.
119
+ """
120
+
121
+ max_slack: int = Field(
122
+ default=10,
123
+ description="Maximum number of slack bits to add for each constraint.",
124
+ )
125
+
126
+
127
+ class PipelineParams(BaseModel):
128
+ """Define the modular FlexQAOA Pipeline.
129
+
130
+ Attributes
131
+ ----------
132
+ penalty : PenaltySetting
133
+ General penalty factor settings.
134
+ inequality_to_equality : InequalityToEqualityConfig
135
+ Configuration of the "inequality to equality" transformation.
136
+ setpacking_as_onehot : SetpackingAsOnehotConfig
137
+ Configuration of the "setpacking to onehot" transformation.
138
+ xy_mixer : XYMixerConfig
139
+ Configuration of the XY-mixers.
140
+ indicator_function : IndicatorFunctionConfig
141
+ Configuration of the indicator functions.
142
+ sp_quadratic_penalty : QuadraticPenaltyConfig
143
+ Configuration of the setpacking quadratic penalty function.
144
+ quadratic_penalty : QuadraticPenaltyConfig
145
+ Configuration of the general quadratic penalty function.
146
+ """
147
+
148
+ penalty: PenaltySetting = Field(default_factory=lambda: PenaltySetting(scaling=2.0))
149
+ inequality_to_equality: InequalityToEqualityConfig = Field(
150
+ default_factory=InequalityToEqualityConfig
151
+ )
152
+ setpacking_as_onehot: SetpackingAsOnehotConfig = Field(
153
+ default_factory=SetpackingAsOnehotConfig
154
+ )
155
+ xy_mixer: XYMixerConfig = Field(default_factory=XYMixerConfig)
156
+ indicator_function: IndicatorFunctionConfig = Field(
157
+ default_factory=IndicatorFunctionConfig
158
+ )
159
+ sp_quadratic_penalty: QuadraticPenaltyConfig = Field(
160
+ default_factory=QuadraticPenaltyConfig
161
+ )
162
+ quadratic_penalty: QuadraticPenaltyConfig = Field(
163
+ default_factory=QuadraticPenaltyConfig
164
+ )