luna-quantum 1.0.0__cp312-cp312-macosx_10_12_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of luna-quantum might be problematic. Click here for more details.
- luna_quantum/__init__.py +96 -0
- luna_quantum/__init__.pyi +68 -0
- luna_quantum/_core.cpython-312-darwin.so +0 -0
- luna_quantum/_core.pyi +3017 -0
- luna_quantum/aqm_overwrites/__init__.py +3 -0
- luna_quantum/aqm_overwrites/model.py +184 -0
- luna_quantum/client/__init__.py +0 -0
- luna_quantum/client/controllers/__init__.py +4 -0
- luna_quantum/client/controllers/luna_http_client.py +37 -0
- luna_quantum/client/controllers/luna_platform_client.py +153 -0
- luna_quantum/client/controllers/luna_q.py +62 -0
- luna_quantum/client/controllers/luna_solve.py +125 -0
- luna_quantum/client/error/__init__.py +0 -0
- luna_quantum/client/error/luna_api_key_invalid_error.py +10 -0
- luna_quantum/client/error/luna_api_key_missing_error.py +10 -0
- luna_quantum/client/error/luna_error.py +2 -0
- luna_quantum/client/error/luna_server_error.py +20 -0
- luna_quantum/client/error/timeout_error.py +12 -0
- luna_quantum/client/error/transformation_error.py +18 -0
- luna_quantum/client/error/utils/__init__.py +0 -0
- luna_quantum/client/error/utils/http_error_utils.py +112 -0
- luna_quantum/client/interfaces/__init__.py +4 -0
- luna_quantum/client/interfaces/clients/__init__.py +25 -0
- luna_quantum/client/interfaces/clients/circuit_rest_client_i.py +68 -0
- luna_quantum/client/interfaces/clients/info_rest_client_i.py +53 -0
- luna_quantum/client/interfaces/clients/model_rest_client_i.py +139 -0
- luna_quantum/client/interfaces/clients/qpu_token_rest_client_i.py +364 -0
- luna_quantum/client/interfaces/clients/rest_client_i.py +21 -0
- luna_quantum/client/interfaces/clients/solve_job_rest_client_i.py +201 -0
- luna_quantum/client/interfaces/clients/users_rest_client_i.py +29 -0
- luna_quantum/client/interfaces/services/__init__.py +0 -0
- luna_quantum/client/interfaces/services/luna_q_i.py +34 -0
- luna_quantum/client/interfaces/services/luna_solve_i.py +72 -0
- luna_quantum/client/interfaces/services/service_i.py +36 -0
- luna_quantum/client/rest_client/__init__.py +15 -0
- luna_quantum/client/rest_client/circuit_rest_client.py +107 -0
- luna_quantum/client/rest_client/info_rest_client.py +76 -0
- luna_quantum/client/rest_client/model_rest_client.py +216 -0
- luna_quantum/client/rest_client/qpu_token_rest_client.py +504 -0
- luna_quantum/client/rest_client/solve_job_rest_client.py +286 -0
- luna_quantum/client/rest_client/users_rest_client.py +35 -0
- luna_quantum/client/schemas/__init__.py +26 -0
- luna_quantum/client/schemas/circuit.py +49 -0
- luna_quantum/client/schemas/create/__init__.py +6 -0
- luna_quantum/client/schemas/create/circuit.py +31 -0
- luna_quantum/client/schemas/create/optimization.py +39 -0
- luna_quantum/client/schemas/create/qpu_token.py +25 -0
- luna_quantum/client/schemas/create/qpu_token_time_quota.py +29 -0
- luna_quantum/client/schemas/create/qubo.py +19 -0
- luna_quantum/client/schemas/create/solve_job_create.py +43 -0
- luna_quantum/client/schemas/enums/__init__.py +0 -0
- luna_quantum/client/schemas/enums/call_style.py +13 -0
- luna_quantum/client/schemas/enums/circuit.py +42 -0
- luna_quantum/client/schemas/enums/model_format.py +11 -0
- luna_quantum/client/schemas/enums/problem.py +50 -0
- luna_quantum/client/schemas/enums/qpu_token_type.py +20 -0
- luna_quantum/client/schemas/enums/sense.py +8 -0
- luna_quantum/client/schemas/enums/status.py +40 -0
- luna_quantum/client/schemas/enums/timeframe.py +11 -0
- luna_quantum/client/schemas/error_message.py +14 -0
- luna_quantum/client/schemas/model_metadata.py +35 -0
- luna_quantum/client/schemas/qpu_token/__init__.py +0 -0
- luna_quantum/client/schemas/qpu_token/qpu_token.py +161 -0
- luna_quantum/client/schemas/qpu_token/qpu_token_source.py +19 -0
- luna_quantum/client/schemas/qpu_token/qpu_token_time_quota.py +28 -0
- luna_quantum/client/schemas/qpu_token/token_provider.py +135 -0
- luna_quantum/client/schemas/representation.py +19 -0
- luna_quantum/client/schemas/solution.py +106 -0
- luna_quantum/client/schemas/solve_job.py +47 -0
- luna_quantum/client/schemas/solver_info.py +11 -0
- luna_quantum/client/schemas/user.py +11 -0
- luna_quantum/client/schemas/wrappers/__init__.py +5 -0
- luna_quantum/client/schemas/wrappers/datetime_wrapper.py +32 -0
- luna_quantum/client/utils/__init__.py +0 -0
- luna_quantum/client/utils/qpu_token_utils.py +147 -0
- luna_quantum/errors.py +1 -0
- luna_quantum/errors.pyi +202 -0
- luna_quantum/exceptions/__init__.py +0 -0
- luna_quantum/exceptions/base_luna_quantum_error.py +2 -0
- luna_quantum/exceptions/patch_class_field_exists_error.py +10 -0
- luna_quantum/factories/__init__.py +4 -0
- luna_quantum/factories/luna_solve_client_factory.py +75 -0
- luna_quantum/factories/usecase_factory.py +457 -0
- luna_quantum/py.typed +0 -0
- luna_quantum/solve/__init__.py +13 -0
- luna_quantum/solve/default_token.py +304 -0
- luna_quantum/solve/domain/__init__.py +0 -0
- luna_quantum/solve/domain/abstract/__init__.py +4 -0
- luna_quantum/solve/domain/abstract/luna_algorithm.py +203 -0
- luna_quantum/solve/domain/abstract/qpu_token_backend.py +34 -0
- luna_quantum/solve/domain/model_metadata.py +54 -0
- luna_quantum/solve/domain/solve_job.py +187 -0
- luna_quantum/solve/errors/__init__.py +0 -0
- luna_quantum/solve/errors/incompatible_backend_error.py +15 -0
- luna_quantum/solve/errors/model_metadata_missing_error.py +11 -0
- luna_quantum/solve/errors/solve_base_error.py +5 -0
- luna_quantum/solve/errors/token_missing_error.py +11 -0
- luna_quantum/solve/interfaces/__init__.py +0 -0
- luna_quantum/solve/interfaces/algorithm_i.py +47 -0
- luna_quantum/solve/interfaces/backend_i.py +28 -0
- luna_quantum/solve/interfaces/usecases/__init__.py +55 -0
- luna_quantum/solve/interfaces/usecases/model_delete_usecase_i.py +27 -0
- luna_quantum/solve/interfaces/usecases/model_fetch_metadata_usecase_i.py +33 -0
- luna_quantum/solve/interfaces/usecases/model_get_solutions_usecase_i.py +33 -0
- luna_quantum/solve/interfaces/usecases/model_get_solve_jobs_usecase_i.py +33 -0
- luna_quantum/solve/interfaces/usecases/model_load_by_id_usecase_i.py +32 -0
- luna_quantum/solve/interfaces/usecases/model_load_by_metadata_usecase_i.py +37 -0
- luna_quantum/solve/interfaces/usecases/model_load_metadata_by_hash_usecase_i.py +38 -0
- luna_quantum/solve/interfaces/usecases/model_save_usecase_i.py +36 -0
- luna_quantum/solve/interfaces/usecases/solve_job_cancel_usecase_i.py +33 -0
- luna_quantum/solve/interfaces/usecases/solve_job_create_usecase_i.py +44 -0
- luna_quantum/solve/interfaces/usecases/solve_job_delete_usecase_i.py +32 -0
- luna_quantum/solve/interfaces/usecases/solve_job_fetch_updates_usecase_i.py +38 -0
- luna_quantum/solve/interfaces/usecases/solve_job_get_result_usecase_i.py +63 -0
- luna_quantum/solve/parameters/__init__.py +0 -0
- luna_quantum/solve/parameters/algorithms/__init__.py +49 -0
- luna_quantum/solve/parameters/algorithms/base_params/__init__.py +24 -0
- luna_quantum/solve/parameters/algorithms/base_params/decomposer.py +57 -0
- luna_quantum/solve/parameters/algorithms/base_params/qaoa_circuit_params.py +95 -0
- luna_quantum/solve/parameters/algorithms/base_params/quantum_annealing_params.py +78 -0
- luna_quantum/solve/parameters/algorithms/base_params/scipy_optimizer.py +120 -0
- luna_quantum/solve/parameters/algorithms/base_params/simulated_annealing_params.py +106 -0
- luna_quantum/solve/parameters/algorithms/base_params/tabu_kerberos_params.py +39 -0
- luna_quantum/solve/parameters/algorithms/base_params/tabu_search_params.py +129 -0
- luna_quantum/solve/parameters/algorithms/flexible_parameter_algorithm.py +59 -0
- luna_quantum/solve/parameters/algorithms/genetic_algorithms/__init__.py +4 -0
- luna_quantum/solve/parameters/algorithms/genetic_algorithms/qaga.py +131 -0
- luna_quantum/solve/parameters/algorithms/genetic_algorithms/saga.py +139 -0
- luna_quantum/solve/parameters/algorithms/optimization_solvers/__init__.py +3 -0
- luna_quantum/solve/parameters/algorithms/optimization_solvers/scip.py +51 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/__init__.py +19 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/kerberos.py +149 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_bqm.py +75 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/leap_hybrid_cqm.py +75 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/parallel_tempering_qpu.py +139 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/population_annealing_qpu.py +109 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/qbsolv_like_qpu.py +111 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/quantum_annealing.py +105 -0
- luna_quantum/solve/parameters/algorithms/quantum_annealing/repeated_reverse_quantum_annealing.py +174 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/__init__.py +6 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/__init__.py +26 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/config.py +80 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/flex_qaoa.py +226 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/optimizers.py +97 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/pipeline.py +87 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa.py +104 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa_fo.py +69 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/vqe.py +109 -0
- luna_quantum/solve/parameters/algorithms/search_algorithms/__init__.py +5 -0
- luna_quantum/solve/parameters/algorithms/search_algorithms/dialectic_search.py +152 -0
- luna_quantum/solve/parameters/algorithms/search_algorithms/qbsolv_like_tabu_search.py +117 -0
- luna_quantum/solve/parameters/algorithms/search_algorithms/tabu_search.py +126 -0
- luna_quantum/solve/parameters/algorithms/simulated_annealing/__init__.py +13 -0
- luna_quantum/solve/parameters/algorithms/simulated_annealing/parallel_tempering.py +131 -0
- luna_quantum/solve/parameters/algorithms/simulated_annealing/population_annealing.py +95 -0
- luna_quantum/solve/parameters/algorithms/simulated_annealing/qbsolv_like_simulated_annealing.py +141 -0
- luna_quantum/solve/parameters/algorithms/simulated_annealing/repeated_reverse_simulated_annealing.py +172 -0
- luna_quantum/solve/parameters/algorithms/simulated_annealing/simulated_annealing.py +126 -0
- luna_quantum/solve/parameters/backends/__init__.py +20 -0
- luna_quantum/solve/parameters/backends/aqarios.py +17 -0
- luna_quantum/solve/parameters/backends/aws/__init__.py +11 -0
- luna_quantum/solve/parameters/backends/aws/aws.py +36 -0
- luna_quantum/solve/parameters/backends/aws/aws_backend_base.py +74 -0
- luna_quantum/solve/parameters/backends/aws/ionq.py +43 -0
- luna_quantum/solve/parameters/backends/aws/iqm.py +31 -0
- luna_quantum/solve/parameters/backends/aws/rigetti.py +31 -0
- luna_quantum/solve/parameters/backends/dwave.py +17 -0
- luna_quantum/solve/parameters/backends/dwave_qpu.py +164 -0
- luna_quantum/solve/parameters/backends/ibm.py +132 -0
- luna_quantum/solve/parameters/backends/qctrl.py +130 -0
- luna_quantum/solve/parameters/backends/zib.py +17 -0
- luna_quantum/solve/parameters/constants.py +11 -0
- luna_quantum/solve/parameters/mixins/__init__.py +0 -0
- luna_quantum/solve/parameters/mixins/fujitsu_common_params_mixin.py +239 -0
- luna_quantum/solve/parameters/mixins/fujitsu_v2_mixin.py +70 -0
- luna_quantum/solve/parameters/mixins/qbsolv_like_mixin.py +60 -0
- luna_quantum/solve/use_cases/__init__.py +119 -0
- luna_quantum/solve/use_cases/arbitrage_edge_based.py +50 -0
- luna_quantum/solve/use_cases/arbitrage_node_based.py +55 -0
- luna_quantum/solve/use_cases/base.py +7 -0
- luna_quantum/solve/use_cases/binary_integer_linear_programming.py +54 -0
- luna_quantum/solve/use_cases/binary_paint_shop_problem.py +37 -0
- luna_quantum/solve/use_cases/credit_scoring_feature_selection.py +40 -0
- luna_quantum/solve/use_cases/dynamic_portfolio_optimization.py +64 -0
- luna_quantum/solve/use_cases/exact_cover.py +51 -0
- luna_quantum/solve/use_cases/flight_gate_assignment.py +79 -0
- luna_quantum/solve/use_cases/graph_coloring.py +42 -0
- luna_quantum/solve/use_cases/graph_isomorphism.py +52 -0
- luna_quantum/solve/use_cases/graph_partitioning.py +46 -0
- luna_quantum/solve/use_cases/hamiltonian_cycle.py +49 -0
- luna_quantum/solve/use_cases/induced_subgraph_isomorphism.py +50 -0
- luna_quantum/solve/use_cases/job_shop_scheduling.py +44 -0
- luna_quantum/solve/use_cases/k_medoids_clustering.py +49 -0
- luna_quantum/solve/use_cases/knapsack_integer_weights.py +56 -0
- luna_quantum/solve/use_cases/linear_regression.py +60 -0
- luna_quantum/solve/use_cases/lmwcs.py +84 -0
- luna_quantum/solve/use_cases/longest_path.py +50 -0
- luna_quantum/solve/use_cases/market_graph_clustering.py +61 -0
- luna_quantum/solve/use_cases/max2sat.py +54 -0
- luna_quantum/solve/use_cases/max3sat.py +55 -0
- luna_quantum/solve/use_cases/max_clique.py +60 -0
- luna_quantum/solve/use_cases/max_cut.py +48 -0
- luna_quantum/solve/use_cases/max_independent_set.py +37 -0
- luna_quantum/solve/use_cases/minimal_maximal_matching.py +54 -0
- luna_quantum/solve/use_cases/minimal_spanning_tree.py +90 -0
- luna_quantum/solve/use_cases/minimum_vertex_cover.py +45 -0
- luna_quantum/solve/use_cases/number_partitioning.py +32 -0
- luna_quantum/solve/use_cases/portfolio_optimization.py +46 -0
- luna_quantum/solve/use_cases/portfolio_optimization_ib_tv.py +63 -0
- luna_quantum/solve/use_cases/quadratic_assignment.py +49 -0
- luna_quantum/solve/use_cases/quadratic_knapsack.py +48 -0
- luna_quantum/solve/use_cases/satellite_scheduling.py +73 -0
- luna_quantum/solve/use_cases/sensor_placement.py +58 -0
- luna_quantum/solve/use_cases/set_cover.py +56 -0
- luna_quantum/solve/use_cases/set_packing.py +54 -0
- luna_quantum/solve/use_cases/set_partitioning.py +52 -0
- luna_quantum/solve/use_cases/subgraph_isomorphism.py +55 -0
- luna_quantum/solve/use_cases/subset_sum.py +37 -0
- luna_quantum/solve/use_cases/support_vector_machine.py +64 -0
- luna_quantum/solve/use_cases/traffic_flow.py +35 -0
- luna_quantum/solve/use_cases/travelling_salesman_problem.py +53 -0
- luna_quantum/solve/use_cases/type_aliases.py +9 -0
- luna_quantum/solve/use_cases/weighted_max_cut.py +37 -0
- luna_quantum/solve/usecases/__init__.py +45 -0
- luna_quantum/solve/usecases/model_delete_usecase.py +49 -0
- luna_quantum/solve/usecases/model_fetch_metadata_usecase.py +50 -0
- luna_quantum/solve/usecases/model_get_solution_usecase.py +56 -0
- luna_quantum/solve/usecases/model_get_solve_jobs_usecase.py +62 -0
- luna_quantum/solve/usecases/model_load_by_id_usecase.py +47 -0
- luna_quantum/solve/usecases/model_load_by_metadata_usecase.py +52 -0
- luna_quantum/solve/usecases/model_load_metadata_by_hash_usecase.py +51 -0
- luna_quantum/solve/usecases/model_save_usecase.py +63 -0
- luna_quantum/solve/usecases/solve_job_cancel_usecase.py +51 -0
- luna_quantum/solve/usecases/solve_job_create_usecase.py +112 -0
- luna_quantum/solve/usecases/solve_job_delete_usecase.py +38 -0
- luna_quantum/solve/usecases/solve_job_fetch_updates_usecase.py +49 -0
- luna_quantum/solve/usecases/solve_job_get_result_usecase.py +97 -0
- luna_quantum/translator.py +1 -0
- luna_quantum/translator.pyi +833 -0
- luna_quantum/util/__init__.py +0 -0
- luna_quantum/util/active_waiting.py +79 -0
- luna_quantum/util/class_patcher.py +164 -0
- luna_quantum/util/log_utils.py +167 -0
- luna_quantum/util/pretty_base.py +67 -0
- luna_quantum/util/pydantic_utils.py +38 -0
- luna_quantum/utils.py +54 -0
- luna_quantum/utils.pyi +35 -0
- luna_quantum-1.0.0.dist-info/METADATA +37 -0
- luna_quantum-1.0.0.dist-info/RECORD +252 -0
- luna_quantum-1.0.0.dist-info/WHEEL +4 -0
- luna_quantum-1.0.0.dist-info/licenses/LICENSE +176 -0
- 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,)
|
luna_quantum/solve/parameters/algorithms/quantum_annealing/repeated_reverse_quantum_annealing.py
ADDED
|
@@ -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,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,)
|