Source code for qplex.model.execution_config
from dataclasses import dataclass, field
from typing import Optional, Callable, Dict, Any
import numpy as np
from qplex.commons.optimization_callback import OptimizationCallback
from qplex.model.constants import ALLOWED_OPTIMIZERS
[docs]
@dataclass
class ExecutionConfig:
"""Configuration for quantum optimization execution."""
# Execution method
method: str = "classical"
verbose: bool = False
# Provider configuration
provider: Optional[str] = None
workflow: str = "default"
backend: Optional[str] = None
provider_options: Dict[str, Any] = field(default_factory=dict)
# Algorithm configuration
algorithm: str = "qaoa"
ansatz: Optional[str] = None
p: int = 2
mixer: Optional[Any] = None
layers: int = 2
# Optimization configuration
optimizer: str = "COBYLA"
callback: Optional[Callable[[np.ndarray], None]] = None
tolerance: float = 1e-10
max_iter: int = 1000
penalty: Optional[float] = None
# Execution parameters
shots: int = 1024
seed: int = 1
def __post_init__(self):
self._validate_optimizer()
# Set default callback if None
if self.callback is None:
self.callback = OptimizationCallback()
def _validate_optimizer(self):
"""Validate optimizer configuration."""
if not (isinstance(self.optimizer, str) and
self.optimizer in ALLOWED_OPTIMIZERS) and not \
callable(self.optimizer):
raise ValueError(
f"Invalid optimizer: {self.optimizer}. Must be one of "
f"{ALLOWED_OPTIMIZERS} or a callable."
)
[docs]
def to_dict(self) -> Dict[str, Any]: # pragma: no cover
"""Convert configuration to dictionary."""
return {k: v for k, v in self.__dict__.items() if
not k.startswith('_')}