Source code for qailab.circuit.utils

 1"""Utility functions for circuits."""
 2from collections.abc import Sequence
 3from typing import Literal
 4
 5import numpy as np
 6
 7from qiskit import QuantumCircuit
 8from qiskit.circuit import Parameter
 9
10
[docs] 11def param_map(params: Sequence[Parameter], values: Sequence[float] | np.ndarray) -> dict[Parameter, float]: 12 """ 13 Map values to params. 14 15 Args: 16 params (Sequence[Parameter]): Circuit parameters. 17 values (Sequence[float]): Values for each parameter. 18 19 Returns: 20 dict[Parameter,float]: Param mapping. 21 """ 22 return dict(zip(params, values))
23 24
[docs] 25def filter_params(circuit: QuantumCircuit, param_type: Literal['input', 'weight']) -> Sequence[Parameter]: 26 """ 27 Get params of a circuit that match a given type. 28 29 Args: 30 circuit (QuantumCircuit): Parameterized circuit. 31 param_type (Literal['input', 'weight']): Parameter type. 32 33 Returns: 34 Sequence[Parameter]: Parameters of type param_type. 35 """ 36 return [p for p in circuit.parameters if p.name.startswith(param_type)]
37 38
[docs] 39def assign_input_weight( 40 circuit: QuantumCircuit, 41 inputs: Sequence[float] | np.ndarray, 42 weights: Sequence[float] | np.ndarray 43) -> dict[Parameter, float]: 44 """ 45 Generate assignment of input and weight parameters for a given circuit. 46 47 Args: 48 circuit (QuantumCircuit): Parameterized circuit. 49 inputs (Sequence[float] | np.ndarray): Input values. 50 weights (Sequence[float] | np.ndarray): Weight values. 51 52 Returns: 53 dict[Parameter, float]: Combined parameter assignment. 54 """ 55 return { 56 **param_map(filter_params(circuit, 'input'), inputs), 57 **param_map(filter_params(circuit, 'weight'), weights), 58 }