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.
- luna_quantum/__init__.py +139 -0
- luna_quantum/__init__.pyi +98 -0
- luna_quantum/_core.cp312-win_amd64.pyd +0 -0
- luna_quantum/_core.pyi +4286 -0
- luna_quantum/_utility.py +148 -0
- luna_quantum/_utility.pyi +20 -0
- luna_quantum/algorithms/__init__.py +1 -0
- luna_quantum/aqm_overwrites/__init__.py +3 -0
- luna_quantum/aqm_overwrites/model.py +184 -0
- luna_quantum/backends/__init__.py +1 -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 +256 -0
- luna_quantum/client/controllers/luna_q.py +67 -0
- luna_quantum/client/controllers/luna_solve.py +129 -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 +56 -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 +74 -0
- luna_quantum/client/rest_client/model_rest_client.py +216 -0
- luna_quantum/client/rest_client/qpu_token_rest_client.py +508 -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 +48 -0
- luna_quantum/client/schemas/create/__init__.py +15 -0
- luna_quantum/client/schemas/create/circuit.py +30 -0
- luna_quantum/client/schemas/create/optimization.py +39 -0
- luna_quantum/client/schemas/create/qpu_token.py +22 -0
- luna_quantum/client/schemas/create/qpu_token_time_quota.py +35 -0
- luna_quantum/client/schemas/create/qpu_token_time_quota_update.py +24 -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 +154 -0
- luna_quantum/client/schemas/qpu_token/qpu_token_source.py +19 -0
- luna_quantum/client/schemas/qpu_token/qpu_token_time_quota.py +30 -0
- luna_quantum/client/schemas/qpu_token/token_provider.py +132 -0
- luna_quantum/client/schemas/representation.py +19 -0
- luna_quantum/client/schemas/solution.py +106 -0
- luna_quantum/client/schemas/solve_job.py +50 -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/config.py +11 -0
- luna_quantum/decorators.py +248 -0
- luna_quantum/errors.py +34 -0
- luna_quantum/errors.pyi +287 -0
- luna_quantum/exceptions/__init__.py +0 -0
- luna_quantum/exceptions/base_luna_quantum_error.py +2 -0
- luna_quantum/exceptions/luna_quantum_call_type_error.py +9 -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 +100 -0
- luna_quantum/factories/usecase_factory.py +489 -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 +205 -0
- luna_quantum/solve/domain/abstract/qpu_token_backend.py +34 -0
- luna_quantum/solve/domain/model_metadata.py +56 -0
- luna_quantum/solve/domain/solve_job.py +230 -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 +49 -0
- luna_quantum/solve/interfaces/backend_i.py +28 -0
- luna_quantum/solve/interfaces/usecases/__init__.py +59 -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_by_id_usecase_i.py +27 -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 +51 -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 +79 -0
- luna_quantum/solve/parameters/algorithms/base_params/scipy_optimizer.py +122 -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/lq_fda/__init__.py +3 -0
- luna_quantum/solve/parameters/algorithms/lq_fda/fujits_da_base.py +85 -0
- luna_quantum/solve/parameters/algorithms/lq_fda/fujitsu_da_v3c.py +155 -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 +121 -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 +10 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/__init__.py +29 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/config.py +58 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/flexqaoa.py +188 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/optimizers.py +53 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flexqaoa/pipeline.py +164 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa.py +112 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa_fo.py +69 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/vqe.py +108 -0
- luna_quantum/solve/parameters/algorithms/search_algorithms/__init__.py +5 -0
- luna_quantum/solve/parameters/algorithms/search_algorithms/dialectic_search.py +136 -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 +27 -0
- luna_quantum/solve/parameters/backends/aqarios.py +17 -0
- luna_quantum/solve/parameters/backends/aqarios_gpu.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/cudaq/__init__.py +5 -0
- luna_quantum/solve/parameters/backends/cudaq/cudaq_base.py +16 -0
- luna_quantum/solve/parameters/backends/cudaq/cudaq_cpu.py +30 -0
- luna_quantum/solve/parameters/backends/cudaq/cudaq_gpu.py +32 -0
- luna_quantum/solve/parameters/backends/dwave.py +17 -0
- luna_quantum/solve/parameters/backends/dwave_qpu.py +166 -0
- luna_quantum/solve/parameters/backends/fda.py +17 -0
- luna_quantum/solve/parameters/backends/ibm.py +138 -0
- luna_quantum/solve/parameters/backends/qctrl.py +103 -0
- luna_quantum/solve/parameters/backends/zib.py +17 -0
- luna_quantum/solve/parameters/constants.py +11 -0
- luna_quantum/solve/parameters/errors.py +30 -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 +59 -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_by_id_usecase.py +44 -0
- luna_quantum/solve/usecases/solve_job_get_result_usecase.py +105 -0
- luna_quantum/transformations.py +18 -0
- luna_quantum/transformations.pyi +371 -0
- luna_quantum/translator.py +23 -0
- luna_quantum/translator.pyi +869 -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/debug_info.py +52 -0
- luna_quantum/util/log_utils.py +187 -0
- luna_quantum/util/pretty_base.py +67 -0
- luna_quantum/util/pydantic_utils.py +38 -0
- luna_quantum/utils.py +3 -0
- luna_quantum/utils.pyi +67 -0
- luna_quantum-1.1.0.dist-info/METADATA +36 -0
- luna_quantum-1.1.0.dist-info/RECORD +276 -0
- luna_quantum-1.1.0.dist-info/WHEEL +4 -0
- luna_quantum-1.1.0.dist-info/licenses/LICENSE +176 -0
- luna_quantum-1.1.0.dist-info/licenses/NOTICE +13 -0
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,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
|
+
)
|