Source code for pyriemann_qiskit.utils.utils
from pyriemann_qiskit.optimization.docplex import (
ClassicalOptimizer,
NaiveQAOAOptimizer,
QAOACVAngleOptimizer,
QAOACVOptimizer,
)
from ..optimization.distance import distance_functions
from ..optimization.mean import mean_functions
[docs]
def is_qfunction(string):
"""Indicates if the function is a mean or a distance introduced in this library.
Return True is "string" represents a
mean or a distance introduced in this library.
Parameters
----------
string: str
A string representation of the mean/distance.
Returns
-------
is_qfunction : boolean
True if "string" represents a mean or a distance introduced in this library.
Notes
-----
.. versionadded:: 0.2.0
"""
return string[0] == "q" and (
(string in mean_functions) or (string in distance_functions)
)
[docs]
def get_docplex_optimizer_from_params_bag(
logger,
quantum,
quantum_instance,
upper_bound,
qaoa_optimizer,
classical_optimizer,
create_mixer,
n_reps,
qaoa_initial_points,
qaoacv_implementation,
):
"""Factory function to create optimizer based on parameters.
Creates and returns the appropriate optimizer instance (quantum or classical)
based on the provided parameters. Selects between NaiveQAOAOptimizer,
QAOACVAngleOptimizer, QAOACVOptimizer, or ClassicalOptimizer depending on
the configuration.
Parameters
----------
logger : object
Logger object with _log method for logging optimizer selection.
quantum : bool
If True, creates a quantum optimizer. If False, creates a classical optimizer.
quantum_instance : QuantumInstance or None
Quantum instance for running quantum circuits. Required when quantum=True.
upper_bound : int
Upper bound for integer variables in NaiveQAOAOptimizer.
qaoa_optimizer : Optimizer
Classical optimizer for QAOA parameter optimization.
classical_optimizer : Optimizer
Classical optimizer instance used when quantum=False.
create_mixer : callable or None
Function to create custom mixer for QAOA-CV. If None and quantum is True,
uses NaiveQAOAOptimizer.
n_reps : int
Number of repetitions for QAOA ansatz layers.
qaoa_initial_points : array-like
Initial parameter values for QAOA optimization.
qaoacv_implementation : str
QAOA-CV implementation variant. "ulvi" selects QAOACVAngleOptimizer,
"luna" or other values select QAOACVOptimizer.
If not quantum or create_mixer is undefined, then does nothing.
Returns
-------
optimizer : ClassicalOptimizer, NaiveQAOAOptimizer, QAOACVAngleOptimizer,
or QAOACVOptimizer
Configured optimizer instance based on the provided parameters.
Notes
-----
The function selects the optimizer according to the following logic:
- If quantum=False: returns ClassicalOptimizer
- If quantum=True and create_mixer is None: returns NaiveQAOAOptimizer
- If quantum=True and create_mixer is provided:
- If "ulvi" in qaoacv_implementation: returns QAOACVAngleOptimizer
- Otherwise: returns QAOACVOptimizer
.. versionadded:: 0.4.1
.. versionchanged:: 0.5.0
add qaoacv_implementation parameter
"""
if quantum:
if create_mixer:
if qaoacv_implementation and "ulvi" in qaoacv_implementation:
logger._log("Using QAOACVAngleOptimizer")
return QAOACVAngleOptimizer(
create_mixer=create_mixer,
n_reps=n_reps,
quantum_instance=quantum_instance,
optimizer=qaoa_optimizer,
)
else:
if qaoacv_implementation and "luna" not in qaoacv_implementation:
logger._log("No valid QAOA-CV implementation found.")
logger._log("Using QAOACVOptimizer")
return QAOACVOptimizer(
create_mixer=create_mixer,
n_reps=n_reps,
quantum_instance=quantum_instance,
optimizer=qaoa_optimizer,
)
else:
logger._log("Using NaiveQAOAOptimizer")
return NaiveQAOAOptimizer(
quantum_instance=quantum_instance,
upper_bound=upper_bound,
optimizer=qaoa_optimizer,
initial_points=qaoa_initial_points,
)
else:
logger._log(f"Using ClassicalOptimizer ({type(classical_optimizer).__name__})")
return ClassicalOptimizer(classical_optimizer)