Source code for qc_executor.qiskit.qiskit_operator

"""Qiskit operator wrapper for use with QiskitExecutor."""

from __future__ import annotations

from collections import OrderedDict
from typing import List

from qc_executor.qiskit._param_binding import build_params_dict


[docs] class QiskitOperator: """ Wrapper for Qiskit operators (SparsePauliOp) used by QiskitExecutor. Handles parameter management for parametrized operators. """ def __init__(self, operator): """ Initialize QiskitOperator wrapper. Args: operator: QuantumOperator object (from qc_executor.quantum_operator) """ # Extract the internal qiskit operator self._qiskit_operator = getattr(operator, "qiskit_operator", operator) self._num_qubits = self._qiskit_operator.num_qubits # Group parameters by ParameterVector name self._parameter_dimensions = OrderedDict() self._free_parameters = set() for p in self._qiskit_operator.parameters: self._free_parameters.add(p) name = p.vector.name self._parameter_dimensions[name] = self._parameter_dimensions.get(name, 0) + 1
[docs] @classmethod def from_quantum_operator(cls, operator): """Create a native Qiskit operator wrapper from a generic operator.""" return cls(operator)
@property def num_qubits(self) -> int: """Number of qubits the operator acts on.""" return self._num_qubits @property def hash(self) -> int: """Hash of the operator for caching.""" return hash(str(self._qiskit_operator)) @property def parameter_names(self) -> List[str]: """List of parameter vector names.""" return list(self._parameter_dimensions.keys()) @property def parameter_dimensions(self) -> dict: """Dictionary mapping parameter names to their dimensions.""" return dict(self._parameter_dimensions) @property def qiskit_operator(self): """Access to the underlying Qiskit SparsePauliOp.""" return self._qiskit_operator @property def free_parameters(self) -> set: """Set of all free parameters in the operator.""" return self._free_parameters
[docs] def bind_parameters(self, parameter_values: dict): """ Bind parameter values to the operator. Args: parameter_values: Dictionary mapping parameter names to values Returns: Bound Qiskit SparsePauliOp """ params_dict = build_params_dict(self._free_parameters, parameter_values) # Bind parameters to operator if params_dict: return self._qiskit_operator.assign_parameters(params_dict) return self._qiskit_operator
[docs] def copy(self): """Return a copy of the operator wrapper.""" return QiskitOperator(self._qiskit_operator.copy())
def __str__(self): return str(self._qiskit_operator) def __repr__(self): return f"QiskitOperator({self.num_qubits} qubits, {len(self._free_parameters)} parameters)"