Source code for qplex.algorithms.mixers.mixer_factory

from enum import Enum
from typing import List

from qplex.algorithms.mixers.standard_mixer import StandardMixer
from qplex.algorithms.mixers.cardinality_mixer import CardinalityMixer
from qplex.algorithms.mixers.partition_mixer import PartitionMixer
from qplex.algorithms.mixers.inequality_mixer import InequalityMixer
from qplex.algorithms.mixers.quantum_mixer import QuantumMixer
from qplex.algorithms.mixers.composite_mixer import CompositeMixer
from qplex.utils.model_utils import ConstraintInfo


[docs] class ConstraintType(Enum): UNCONSTRAINED = "unconstrained" CARDINALITY = "cardinality" PARTITION = "partition" INEQUALITY = "inequality" MULTIPLE = "multiple"
[docs] class MixerFactory: """Factory class for creating appropriate quantum mixers. Creates mixer instances based on problem constraints, supporting single constraint types and composite mixers for multiple constraints. """ @classmethod def _get_mixer_for_type(cls, constraint_type): """Look up the appropriate mixer class for the constraint type.""" if constraint_type == ConstraintType.CARDINALITY: return CardinalityMixer elif constraint_type == ConstraintType.PARTITION: return PartitionMixer elif constraint_type == ConstraintType.INEQUALITY: return InequalityMixer else: return StandardMixer
[docs] @classmethod def get_mixer(cls, constraint_info: ConstraintInfo) -> QuantumMixer: """Create appropriate mixer based on constraint information. Parameters ---------- constraint_info : ConstraintInfo Problem constraint metadata Returns ------- QuantumMixer Appropriate mixer instance for given constraints """ if not constraint_info.type: return StandardMixer() constraints = cls._get_all_constraints(constraint_info) if len(constraints) > 1: return cls._create_composite_mixer(constraints) mixer_class = cls._get_mixer_for_type(constraint_info.type) return mixer_class()
@classmethod def _get_all_constraints(cls, constraint_info: ConstraintInfo) -> List[ ConstraintType]: """Extract all constraint types from constraint info. Parameters ---------- constraint_info : ConstraintInfo Problem constraint metadata Returns ------- List[ConstraintType] List of unique constraint types """ constraints = [] if constraint_info.type != ConstraintType.UNCONSTRAINED: constraints.append(constraint_info.type) if constraint_info.parameters: if 'additional_constraints' in constraint_info.parameters: constraints.extend( constraint_info.parameters['additional_constraints']) return list(set(constraints)) @classmethod def _create_composite_mixer(cls, constraints: List[ ConstraintType]) -> QuantumMixer: """Create composite mixer for multiple constraint types. Parameters ---------- constraints : List[ConstraintType] List of constraints to handle Returns ------- QuantumMixer CompositeMixer instance combining appropriate mixers """ mixers_arr = [] for constraint in constraints: mixer_class = cls._get_mixer_for_type(constraint) if mixer_class: mixers_arr.append(mixer_class()) return CompositeMixer(mixers_arr)