Parametric states and parametric estimators
This tutorial aims to introduce parametric states and parametric estimators, which are also important building blocks of variational algorithms.
Parametric state
In QURI Parts, there are 2 types of parametric states:
ParametricCircuitQuantumState
: A state with parametric circuit acting on a zero state.ParametricQuantumStateVector
: A state with parametric circuit acting on a fixed state vector.
Here, parametric circuit can be either an UnboundParametricQuantumCircuit
or a LinearMappedUnboundParametricQuantumCircuit
. The parametric state can be created with the quantum_state
function. Let's first create a parametric circuit.
import numpy as np
from quri_parts.circuit import LinearMappedUnboundParametricQuantumCircuit, CONST
linear_param_circuit = LinearMappedUnboundParametricQuantumCircuit(2)
theta, phi = linear_param_circuit.add_parameters("theta", "phi")
linear_param_circuit.add_H_gate(0)
linear_param_circuit.add_CNOT_gate(0, 1)
linear_param_circuit.add_ParametricRX_gate(0, {theta: 1/2, phi: 1/3, CONST: np.pi/2})
linear_param_circuit.add_ParametricRY_gate(0, {theta: -1/2, phi: 1/3})
linear_param_circuit.add_ParametricRZ_gate(1, {theta: 1/3, phi: -1/2, CONST: -np.pi/2})
Now, we create parametric state with it.
from quri_parts.core.state import quantum_state
# ParametricCircuitQuantumState
param_circuit_state = quantum_state(n_qubits=2, circuit=linear_param_circuit)
print(param_circuit_state)
# ParametricQuantumStateVector
param_state_vector = quantum_state(n_qubits=2, circuit=linear_param_circuit, vector=np.array([0.5, -0.5, 0.5j, -0.5j]))
print(param_state_vector)
ParametricCircuitQuantumState(n_qubits=2, circuit=<quri_parts.circuit.circuit_linear_mapped.ImmutableLinearMappedParametricQuantumCircuit object at 0x7f681408d250>)
ParametricQuantumStateVector(n_qubits=2, circuit=<quri_parts.circuit.circuit_linear_mapped.ImmutableLinearMappedParametricQuantumCircuit object at 0x7f6814072450>, vector=[ 0.5+0.j -0.5+0.j 0. +0.5j -0. -0.5j])
We can assign concrete values to the circuit inside the parametric states with the .bind_parameters
state. After binding the parameters, ParametricCircuitQuantumState
becomes a GeneralCircuitQuantumState
and ParametricQuantumStateVector
becomes a QuantumStateVector
.
params = [0.1, 0.2]
# ParametricCircuitQuantumState -> GeneralCircuitQuantumState
circuit_state = param_circuit_state.bind_parameters(params)
# ParametricQuantumStateVector -> QuantumStateVector
vector_state = param_state_vector.bind_parameters(params)