Source code for qailab.circuit.encoding_blocks.amplitude
1"""Blocks encoding values as initial state for a quantum circuit"""
2from typing import Literal
3from qiskit.circuit import QuantumCircuit, ParameterVector
4from qiskit_machine_learning.circuit.library import RawFeatureVector
5
6from qailab.circuit.base import EncodingBlock, NonGateBlock
7
8
[docs]
9class TypedRawFeatureVector(RawFeatureVector):
10 """Extension of RawFeatureVector that renames the parameters."""
11
12 def __init__(self, feature_dimension: int | None, block_type: Literal['input'] | Literal['weight'] = 'input') -> None:
13 super().__init__(feature_dimension)
14 self._ordered_parameters = ParameterVector(f"{block_type}_Amp_Encoder_Params_{hex(id(super()))}")
15
16
[docs]
17class AmplitudeEncoder(NonGateBlock, EncodingBlock):
18 """
19 Encode input as initial state of the circuit.
20 """
21
22 def __init__(self, block_type: Literal['input'] | Literal['weight'] = 'input') -> None:
23 super().__init__("AmplitudeEncoder", block_type)
24
25 def _build_circuit(self, num_qubits: int) -> QuantumCircuit:
26 circuit = TypedRawFeatureVector(2**num_qubits, self.block_type)
27 self._parameters = list(circuit.parameters)
28 return circuit