Source code for psipose.encoders._base

"""Base encoder class."""

import abc

import pennylane as qml


[docs] class BaseEncoder(abc.ABC): """Abstract base class for quantum encoders. Encoders map classical feature vectors onto quantum states. Parameters ---------- n_qubits : int, optional Number of qubits to encode into. If None, inferred from feature dimension. Attributes ---------- n_qubits_ : int The number of qubits used (determined during fit). """ def __init__(self, n_qubits=None): self.n_qubits = n_qubits self.n_qubits_ = None
[docs] @abc.abstractmethod def encode(self, x, wires): """Apply encoding circuit to the given wires. Parameters ---------- x : array-like Feature vector to encode. wires : Iterable[int] Qubit wires to apply the encoding to. """ pass
[docs] def fit(self, X): """Determine the number of qubits needed based on data. Parameters ---------- X : array-like, shape (n_samples, n_features) Training data. Returns ------- self : BaseEncoder Returns the fitted encoder. """ n_features = X.shape[1] if self.n_qubits is None: # Default: one qubit per feature, capped at reasonable size self.n_qubits_ = min(n_features, 10) else: self.n_qubits_ = self.n_qubits return self
[docs] def transform(self, X): """Encode the data into quantum states. Parameters ---------- X : array-like, shape (n_samples, n_features) Data to encode. Returns ------- quantum_states : list List of quantum state descriptions (implementation-specific). """ states = [] for x in X: with qml.tape.QuantumTape() as tape: self.encode(x, wires=range(self.n_qubits_)) states.append(tape) return states