luna-quantum 1.0.8rc2__cp314-cp314-manylinux_2_34_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 +121 -0
- luna_quantum/__init__.pyi +85 -0
- luna_quantum/_core.cpython-314-x86_64-linux-gnu.so +0 -0
- luna_quantum/_core.pyi +4185 -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/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 +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 +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 +196 -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 +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 +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 +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 +99 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/flex_qaoa/pipeline.py +87 -0
- luna_quantum/solve/parameters/algorithms/quantum_gate/qaoa.py +102 -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 +22 -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 +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/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_result_usecase.py +95 -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.0.8rc2.dist-info/METADATA +36 -0
- luna_quantum-1.0.8rc2.dist-info/RECORD +264 -0
- luna_quantum-1.0.8rc2.dist-info/WHEEL +4 -0
- luna_quantum-1.0.8rc2.dist-info/licenses/LICENSE +176 -0
- luna_quantum-1.0.8rc2.dist-info/licenses/NOTICE +13 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
|
|
2
|
+
from luna_quantum.solve.domain.solve_job import SolveJob
|
|
3
|
+
from luna_quantum.solve.interfaces.usecases.solve_job_cancel_usecase_i import (
|
|
4
|
+
ISolveJobCancelUseCase,
|
|
5
|
+
)
|
|
6
|
+
from luna_quantum.util.log_utils import progress
|
|
7
|
+
from luna_quantum.util.pydantic_utils import PydanticUtils
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SolveJobCancelUseCase(ISolveJobCancelUseCase):
|
|
11
|
+
"""
|
|
12
|
+
Handles the cancellation of a solve job through the provided client.
|
|
13
|
+
|
|
14
|
+
This class is responsible for interfacing with the given ILunaSolve client to
|
|
15
|
+
cancel an existing solve job by utilizing its `solution.cancel` method. It
|
|
16
|
+
validates and updates the solve job model after the cancellation.
|
|
17
|
+
|
|
18
|
+
Attributes
|
|
19
|
+
----------
|
|
20
|
+
client : ILunaSolve
|
|
21
|
+
The client interface responsible for communicating with the backend
|
|
22
|
+
solve services.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
client: ILunaSolve
|
|
26
|
+
|
|
27
|
+
def __init__(self, client: ILunaSolve) -> None:
|
|
28
|
+
self.client = client
|
|
29
|
+
|
|
30
|
+
@progress(total=None, desc="Canceling solve job...")
|
|
31
|
+
def __call__(self, solve_job: SolveJob) -> None:
|
|
32
|
+
"""
|
|
33
|
+
Call method to process a given SolveJob.
|
|
34
|
+
|
|
35
|
+
This method interacts with an API client to process cancellation of a solution
|
|
36
|
+
related to the input SolveJob, updates the SolveJob model, and modifies it
|
|
37
|
+
using updated data.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
solve_job : SolveJob
|
|
42
|
+
The job instance that needs to be processed, updated, and validated.
|
|
43
|
+
|
|
44
|
+
Returns
|
|
45
|
+
-------
|
|
46
|
+
None
|
|
47
|
+
"""
|
|
48
|
+
solve_job_schema = self.client.solve_job.cancel(solve_job_id=solve_job.id)
|
|
49
|
+
|
|
50
|
+
updated_solve_job = SolveJob.model_validate(solve_job_schema.model_dump())
|
|
51
|
+
PydanticUtils.update_model(solve_job, updated_solve_job)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Any
|
|
2
|
+
|
|
3
|
+
from luna_quantum.aqm_overwrites.model import Model
|
|
4
|
+
from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
|
|
5
|
+
from luna_quantum.factories.usecase_factory import UseCaseFactory
|
|
6
|
+
from luna_quantum.solve.domain.abstract.luna_algorithm import LunaAlgorithm
|
|
7
|
+
from luna_quantum.solve.domain.abstract.qpu_token_backend import QpuTokenBackend
|
|
8
|
+
from luna_quantum.solve.domain.solve_job import SolveJob
|
|
9
|
+
from luna_quantum.solve.errors.model_metadata_missing_error import (
|
|
10
|
+
ModelMetadataMissingError,
|
|
11
|
+
)
|
|
12
|
+
from luna_quantum.solve.interfaces.algorithm_i import BACKEND_TYPE
|
|
13
|
+
from luna_quantum.solve.interfaces.usecases.solve_job_create_usecase_i import (
|
|
14
|
+
ISolveJobCreateUseCase,
|
|
15
|
+
)
|
|
16
|
+
from luna_quantum.util.log_utils import progress
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from luna_quantum.client.schemas.solve_job import SolveJobSchema
|
|
20
|
+
from luna_quantum.solve.domain.model_metadata import ModelMetadata
|
|
21
|
+
from luna_quantum.solve.interfaces.usecases import IModelLoadByIdUseCase
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class SolveJobCreateUseCase(ISolveJobCreateUseCase):
|
|
25
|
+
"""
|
|
26
|
+
Create a solve job.
|
|
27
|
+
|
|
28
|
+
This class is responsible for creating a job through a specified client interface.
|
|
29
|
+
|
|
30
|
+
Attributes
|
|
31
|
+
----------
|
|
32
|
+
client : ILunaSolve
|
|
33
|
+
The client implementation used to handle the job creation process.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
client: ILunaSolve
|
|
37
|
+
|
|
38
|
+
def __init__(self, client: ILunaSolve) -> None:
|
|
39
|
+
self.client = client
|
|
40
|
+
|
|
41
|
+
@progress(total=None, desc="Scheduling solve job...")
|
|
42
|
+
def __call__(
|
|
43
|
+
self,
|
|
44
|
+
model: Model | str,
|
|
45
|
+
luna_solver: LunaAlgorithm[BACKEND_TYPE],
|
|
46
|
+
backend: BACKEND_TYPE,
|
|
47
|
+
name: str | None,
|
|
48
|
+
) -> SolveJob:
|
|
49
|
+
"""
|
|
50
|
+
Solve a model using the specified solver.
|
|
51
|
+
|
|
52
|
+
The function solves a given model using the provided LunaSolver instance. If a
|
|
53
|
+
string is given as the model, it fetches the model's metadata using a use-case.
|
|
54
|
+
If the model metadata is missing, an exception is raised. The function finally
|
|
55
|
+
creates a solve job using the solver and model information and returns it.
|
|
56
|
+
|
|
57
|
+
Parameters
|
|
58
|
+
----------
|
|
59
|
+
model : Union[Model, str]
|
|
60
|
+
The model to be solved. It can either be an instance of `Model` or a
|
|
61
|
+
string representing the model ID.
|
|
62
|
+
luna_solver : LunaAlgorithm
|
|
63
|
+
The solver to be used for solving the model.
|
|
64
|
+
name: Optional[str]
|
|
65
|
+
The name of the solve job. Can be None.
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
SolveJob
|
|
70
|
+
The job containing the results of the solving process.
|
|
71
|
+
|
|
72
|
+
Raises
|
|
73
|
+
------
|
|
74
|
+
ModelMetadataMissingError
|
|
75
|
+
Raised when the metadata for the given model is missing.
|
|
76
|
+
"""
|
|
77
|
+
metadata: ModelMetadata | None
|
|
78
|
+
if isinstance(model, str):
|
|
79
|
+
load_uc: IModelLoadByIdUseCase = UseCaseFactory.model_load_by_id(
|
|
80
|
+
client=self.client
|
|
81
|
+
)
|
|
82
|
+
metadata = load_uc(model_id=model).metadata
|
|
83
|
+
else:
|
|
84
|
+
model.save_luna(client=self.client)
|
|
85
|
+
metadata = model.metadata
|
|
86
|
+
|
|
87
|
+
if not metadata:
|
|
88
|
+
raise ModelMetadataMissingError
|
|
89
|
+
|
|
90
|
+
if isinstance(model, str):
|
|
91
|
+
model = Model.load_luna(model_id=model, client=self.client)
|
|
92
|
+
|
|
93
|
+
solver_parameters: dict[str, Any] = luna_solver.model_dump()
|
|
94
|
+
solver_parameters.update(backend.model_dump())
|
|
95
|
+
|
|
96
|
+
qpu_tokens = None
|
|
97
|
+
if isinstance(backend, QpuTokenBackend):
|
|
98
|
+
qpu_tokens = backend.get_qpu_tokens()
|
|
99
|
+
|
|
100
|
+
solve_job: SolveJobSchema = self.client.solve_job.create(
|
|
101
|
+
model_id=metadata.id,
|
|
102
|
+
solver_name=luna_solver.algorithm_name,
|
|
103
|
+
solver_parameters=solver_parameters,
|
|
104
|
+
provider=backend.provider,
|
|
105
|
+
qpu_tokens=qpu_tokens,
|
|
106
|
+
name=name,
|
|
107
|
+
)
|
|
108
|
+
sj = SolveJob.model_validate(solve_job.model_dump())
|
|
109
|
+
|
|
110
|
+
sj.set_evaluation_model(model)
|
|
111
|
+
|
|
112
|
+
return sj
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
|
|
2
|
+
from luna_quantum.solve.interfaces.usecases.solve_job_delete_usecase_i import (
|
|
3
|
+
ISolveJobDeleteUseCase,
|
|
4
|
+
)
|
|
5
|
+
from luna_quantum.util.log_utils import progress
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SolveJobDeleteUseCase(ISolveJobDeleteUseCase):
|
|
9
|
+
"""
|
|
10
|
+
Delete a solve job through the provided client interface.
|
|
11
|
+
|
|
12
|
+
Attributes
|
|
13
|
+
----------
|
|
14
|
+
client : ILunaSolve
|
|
15
|
+
Client implementing the `ILunaSolve` interface responsible for interacting
|
|
16
|
+
with the solve service.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
client: ILunaSolve
|
|
20
|
+
|
|
21
|
+
def __init__(self, client: ILunaSolve) -> None:
|
|
22
|
+
self.client = client
|
|
23
|
+
|
|
24
|
+
@progress(total=None, desc="Deleting solve job...")
|
|
25
|
+
def __call__(self, solve_job_id: str) -> None:
|
|
26
|
+
"""
|
|
27
|
+
Delete a solve_job with the specified job ID.
|
|
28
|
+
|
|
29
|
+
This callable method is used to delete a solve_job given its unique job
|
|
30
|
+
identifier.
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
solve_job_id : str
|
|
35
|
+
The unique identifier of the solve job to be deleted.
|
|
36
|
+
|
|
37
|
+
"""
|
|
38
|
+
self.client.solve_job.delete(solve_job_id=solve_job_id)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
|
|
2
|
+
from luna_quantum.solve.domain.solve_job import SolveJob
|
|
3
|
+
from luna_quantum.solve.interfaces.usecases.solve_job_fetch_updates_usecase_i import (
|
|
4
|
+
ISolveJobFetchUpdatesUseCase,
|
|
5
|
+
)
|
|
6
|
+
from luna_quantum.util.log_utils import progress
|
|
7
|
+
from luna_quantum.util.pydantic_utils import PydanticUtils
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SolveJobFetchUpdatesUseCase(ISolveJobFetchUpdatesUseCase):
|
|
11
|
+
"""
|
|
12
|
+
Fetches and applies updates to a solve job using a client.
|
|
13
|
+
|
|
14
|
+
This class is responsible for retrieving the latest updates for a solve job
|
|
15
|
+
from the client and applying them to the given solve job instance.
|
|
16
|
+
|
|
17
|
+
Attributes
|
|
18
|
+
----------
|
|
19
|
+
client : ILunaSolve
|
|
20
|
+
Client used to fetch updates for solve jobs.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
client: ILunaSolve
|
|
24
|
+
|
|
25
|
+
def __init__(self, client: ILunaSolve) -> None:
|
|
26
|
+
self.client = client
|
|
27
|
+
|
|
28
|
+
@progress(total=None, desc="Fetching solve job...")
|
|
29
|
+
def __call__(self, solve_job: SolveJob) -> None:
|
|
30
|
+
"""
|
|
31
|
+
Execute fetch the updates of a specific `SolveJob` instance.
|
|
32
|
+
|
|
33
|
+
This callable validates and updates a `SolveJob` instance using data fetched
|
|
34
|
+
from the client. The fetched data is used to synchronize the job model with
|
|
35
|
+
the server's definition.
|
|
36
|
+
|
|
37
|
+
Parameters
|
|
38
|
+
----------
|
|
39
|
+
solve_job : SolveJob
|
|
40
|
+
The job to be processed, validated, and updated.
|
|
41
|
+
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
None
|
|
45
|
+
"""
|
|
46
|
+
solve_job_schema = self.client.solve_job.get(solve_job_id=solve_job.id)
|
|
47
|
+
solve_job_updated = SolveJob.model_validate(solve_job_schema.model_dump())
|
|
48
|
+
|
|
49
|
+
PydanticUtils.update_model(solve_job, solve_job_updated)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
from luna_quantum._core import Solution
|
|
2
|
+
from luna_quantum.client.interfaces.services.luna_solve_i import ILunaSolve
|
|
3
|
+
from luna_quantum.client.schemas.enums.call_style import CallStyle
|
|
4
|
+
from luna_quantum.client.schemas.enums.status import StatusEnum
|
|
5
|
+
from luna_quantum.solve.domain.solve_job import SolveJob
|
|
6
|
+
from luna_quantum.solve.interfaces.usecases.solve_job_get_result_usecase_i import (
|
|
7
|
+
ISolveJobGetResultUseCase,
|
|
8
|
+
)
|
|
9
|
+
from luna_quantum.util.active_waiting import ActiveWaiting
|
|
10
|
+
from luna_quantum.util.log_utils import Logging, progress
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class SolveJobGetResultUseCase(ISolveJobGetResultUseCase):
|
|
14
|
+
"""
|
|
15
|
+
Handle the process of retrieving and interacting with a solve job's result.
|
|
16
|
+
|
|
17
|
+
This class interacts with a backend client to manage fetching and handling
|
|
18
|
+
results for a solve job, using different strategies for waiting and polling
|
|
19
|
+
depending on the specified call style.
|
|
20
|
+
|
|
21
|
+
Attributes
|
|
22
|
+
----------
|
|
23
|
+
client : ILunaSolve
|
|
24
|
+
Client used to interact with the solve job and retrieve its results.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
client: ILunaSolve
|
|
28
|
+
logger = Logging.get_logger(__name__)
|
|
29
|
+
|
|
30
|
+
def __init__(self, client: ILunaSolve) -> None:
|
|
31
|
+
self.client = client
|
|
32
|
+
|
|
33
|
+
@progress(total=None, desc="Retrieving solve job...")
|
|
34
|
+
def __call__(
|
|
35
|
+
self,
|
|
36
|
+
solve_job: SolveJob,
|
|
37
|
+
sleep_time_max: float,
|
|
38
|
+
sleep_time_increment: float,
|
|
39
|
+
sleep_time_initial: float,
|
|
40
|
+
call_style: CallStyle,
|
|
41
|
+
) -> Solution | None:
|
|
42
|
+
"""
|
|
43
|
+
Execute the given solve job with specified waiting strategy.
|
|
44
|
+
|
|
45
|
+
Parameters
|
|
46
|
+
----------
|
|
47
|
+
solve_job : SolveJob
|
|
48
|
+
The job that needs to be solved.
|
|
49
|
+
sleep_time_max : float
|
|
50
|
+
The maximum amount of time to wait between checks.
|
|
51
|
+
sleep_time_increment : float
|
|
52
|
+
The incremental step to increase sleep time during active waiting.
|
|
53
|
+
sleep_time_initial : float
|
|
54
|
+
The initial sleep time for the waiting strategy.
|
|
55
|
+
call_style : CallStyle
|
|
56
|
+
The style of waiting (e.g., active waiting) to use when processing the job.
|
|
57
|
+
|
|
58
|
+
Returns
|
|
59
|
+
-------
|
|
60
|
+
Optional[Solution]
|
|
61
|
+
The solution for the given solve job if successfully processed, otherwise
|
|
62
|
+
None.
|
|
63
|
+
"""
|
|
64
|
+
if call_style is CallStyle.ACTIVE_WAITING:
|
|
65
|
+
final_states = StatusEnum.CANCELED, StatusEnum.DONE, StatusEnum.FAILED
|
|
66
|
+
|
|
67
|
+
ActiveWaiting.run(
|
|
68
|
+
loop_check=lambda: solve_job.get_status(
|
|
69
|
+
client=self.client, status_source="remote"
|
|
70
|
+
)
|
|
71
|
+
not in final_states,
|
|
72
|
+
loop_call=None,
|
|
73
|
+
sleep_time_max=sleep_time_max,
|
|
74
|
+
sleep_time_increment=sleep_time_increment,
|
|
75
|
+
sleep_time_initial=sleep_time_initial,
|
|
76
|
+
)
|
|
77
|
+
try:
|
|
78
|
+
if solve_job.status == StatusEnum.CANCELED:
|
|
79
|
+
self.logger.warning(
|
|
80
|
+
"Solve job is cancelled. Result cannot be retrieved."
|
|
81
|
+
)
|
|
82
|
+
return None
|
|
83
|
+
if solve_job.status == StatusEnum.FAILED:
|
|
84
|
+
self.logger.error(
|
|
85
|
+
f"Solve job failed with the error '{solve_job.error_message}'."
|
|
86
|
+
)
|
|
87
|
+
return None
|
|
88
|
+
aq_solution: Solution = self.client.solve_job.get_solution(
|
|
89
|
+
solve_job_id=solve_job.id
|
|
90
|
+
)
|
|
91
|
+
except Exception:
|
|
92
|
+
# TODO(Llewellyn) more fine grained exception handling # noqa: FIX002, TD004
|
|
93
|
+
return None
|
|
94
|
+
|
|
95
|
+
return aq_solution
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Transformations collection.
|
|
2
|
+
|
|
3
|
+
The `transformations` module provides a collection of transformations for converting
|
|
4
|
+
between various representations of optimization problems and their solutions.
|
|
5
|
+
|
|
6
|
+
Transformations generally convert between different representations of an optimization
|
|
7
|
+
model. For example, changing the Sense of a model.
|
|
8
|
+
|
|
9
|
+
Each transformation encapsulates the logic needed for transforming a model to a desired
|
|
10
|
+
output model with changed properties and the logic to convert a solution of the output
|
|
11
|
+
model back to a solution representation matching the input model.
|
|
12
|
+
|
|
13
|
+
In addition to the predefined transformations contained in this module.
|
|
14
|
+
One can implement their own transformations by implementing the `TransformationPass`
|
|
15
|
+
and `AnalysisPass` abstract classes. See the examples for further details.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from ._core.transformations import * # type: ignore[reportMissingImports] # noqa: F403
|