QNN Model
This module implements the QNN models.
QNN(circuit, observable, backend=BackendName.PYQTORCH, diff_mode=DiffMode.AD, measurement=None, noise=None, configuration=None, inputs=None, input_diff_mode=InputDiffMode.AD)
Bases: QuantumModel
Quantum neural network model for n-dimensional inputs.
Examples:
import torch
from qadence import QuantumCircuit, QNN, Z
from qadence import hea, feature_map, hamiltonian_factory, kron
# create the circuit
n_qubits, depth = 2, 4
fm = kron(
feature_map(1, support=(0,), param="x"),
feature_map(1, support=(1,), param="y")
)
ansatz = hea(n_qubits=n_qubits, depth=depth)
circuit = QuantumCircuit(n_qubits, fm, ansatz)
obs_base = hamiltonian_factory(n_qubits, detuning=Z)
# the QNN will yield two outputs
obs = [2.0 * obs_base, 4.0 * obs_base]
# initialize and use the model
qnn = QNN(circuit, obs, inputs=["x", "y"])
y = qnn(torch.rand(3, 2))
Initialize the QNN.
The number of inputs is determined by the feature parameters in the input quantum circuit while the number of outputs is determined by how many observables are provided as input
PARAMETER | DESCRIPTION |
---|---|
circuit
|
The quantum circuit to use for the QNN.
TYPE:
|
observable
|
The observable.
TYPE:
|
backend
|
The chosen quantum backend.
TYPE:
|
diff_mode
|
The differentiation engine to use. Choices 'gpsr' or 'ad'.
TYPE:
|
measurement
|
optional measurement protocol. If None, use exact expectation value with a statevector simulator
TYPE:
|
noise
|
A noise model to use.
TYPE:
|
configuration
|
optional configuration for the backend
TYPE:
|
inputs
|
List that indicates the order of variables of the tensors that are passed
to the model. Given input tensors
TYPE:
|
input_diff_mode
|
The differentiation mode for the input tensor.
TYPE:
|
Source code in qadence_model/models/qnn_model.py
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
|
__str__()
Return a string representation of a QNN.
When creating a QNN from a set of configurations, we print the configurations used. Otherwise, we use the default printing.
RETURNS | DESCRIPTION |
---|---|
str | Any
|
str | Any: A string representation of a QNN. |
Example:
from qadence import QNN
from qadence.constructors.hamiltonians import Interaction
from qadence.ml_tools.config import AnsatzConfig, FeatureMapConfig
from qadence.ml_tools.constructors import (
ObservableConfig,
)
from qadence.operations import Z
from qadence.types import BackendName
backend = BackendName.PYQTORCH
fm_config = FeatureMapConfig(num_features=1)
ansatz_config = AnsatzConfig()
observable_config = ObservableConfig(detuning=Z, interaction=Interaction.ZZ, scale=2)
qnn = QNN.from_configs(
register=2,
obs_config=observable_config,
fm_config=fm_config,
ansatz_config=ansatz_config,
backend=backend,
)
QNN(
ansatz_config = AnsatzConfig(depth=1, ansatz_type=<AnsatzType.HEA: 'hea'>, ansatz_strategy=<Strategy.DIGITAL: 'Digital'>, strategy_args={}, m_block_qubits=None, param_prefix='theta', tag=None)
fm_config = FeatureMapConfig(num_features=1, basis_set={'x': <BasisSet.FOURIER: 'Fourier'>}, reupload_scaling={'x': <ReuploadScaling.CONSTANT: 'Constant'>}, feature_range={'x': None}, target_range={'x': None}, multivariate_strategy=<MultivariateStrategy.PARALLEL: 'Parallel'>, feature_map_strategy=<Strategy.DIGITAL: 'Digital'>, param_prefix=None, num_repeats={'x': 0}, operation=<class 'qadence.operations.parametric.RX'>, inputs=['x'], tag=None)
register = 2
observable_config = {'Obs.': '(2 * (Z(0) + Z(1) + (Z(0) ⊗ Z(1))))'}
)
Source code in qadence_model/models/qnn_model.py
forward(values=None, state=None, measurement=None, noise=None, endianness=Endianness.BIG)
Forward pass of the model.
This returns the (differentiable) expectation value of the given observable
operator defined in the constructor. Differently from the base QuantumModel
class, the QNN accepts also a tensor as input for the forward pass. The
tensor is expected to have shape: n_batches x in_features
where n_batches
is the number of data points and in_features
is the dimensionality of the problem
The output of the forward pass is the expectation value of the input
observable(s). If a single observable is given, the output shape is
n_batches
while if multiple observables are given the output shape
is instead n_batches x n_observables
PARAMETER | DESCRIPTION |
---|---|
values
|
the values of the feature parameters
TYPE:
|
state
|
Initial state.
TYPE:
|
measurement
|
optional measurement protocol. If None, use exact expectation value with a statevector simulator
TYPE:
|
noise
|
A noise model to use.
TYPE:
|
endianness
|
Endianness of the resulting bit strings.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
Tensor
|
a tensor with the expectation value of the observables passed in the constructor of the model
TYPE:
|
Source code in qadence_model/models/qnn_model.py
from_configs(register, obs_config, fm_config=FeatureMapConfig(), ansatz_config=AnsatzConfig(), backend=BackendName.PYQTORCH, diff_mode=DiffMode.AD, measurement=None, noise=None, configuration=None, input_diff_mode=InputDiffMode.AD)
classmethod
Create a QNN from a set of configurations.
PARAMETER | DESCRIPTION |
---|---|
register
|
The number of qubits or a register object.
TYPE:
|
obs_config
|
The configuration(s) for the observable(s).
TYPE:
|
fm_config
|
The configuration for the feature map. Defaults to no feature encoding block.
TYPE:
|
ansatz_config
|
The configuration for the ansatz. Defaults to a single layer of hardware efficient ansatz.
TYPE:
|
backend
|
The chosen quantum backend.
TYPE:
|
diff_mode
|
The differentiation engine to use. Choices are 'gpsr' or 'ad'.
TYPE:
|
measurement
|
Optional measurement protocol. If None, use exact expectation value with a statevector simulator.
TYPE:
|
noise
|
A noise model to use.
TYPE:
|
configuration
|
Optional backend configuration.
TYPE:
|
input_diff_mode
|
The differentiation mode for the input tensor.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
QNN
|
A QNN object. |
RAISES | DESCRIPTION |
---|---|
ValueError
|
If the observable configuration is not provided. |
Example:
import torch
from qadence.ml_tools.config import AnsatzConfig, FeatureMapConfig
from qadence.ml_tools import QNN
from qadence.constructors import ObservableConfig
from qadence.operations import Z
from qadence.types import (
AnsatzType, BackendName, BasisSet, ReuploadScaling, Strategy
)
register = 4
obs_config = ObservableConfig(
detuning=Z,
scale=5.0,
shift=0.0,
trainable_transform=None,
)
fm_config = FeatureMapConfig(
num_features=2,
inputs=["x", "y"],
basis_set=BasisSet.FOURIER,
reupload_scaling=ReuploadScaling.CONSTANT,
feature_range={
"x": (-1.0, 1.0),
"y": (0.0, 1.0),
},
)
ansatz_config = AnsatzConfig(
depth=2,
ansatz_type=AnsatzType.HEA,
ansatz_strategy=Strategy.DIGITAL,
)
qnn = QNN.from_configs(
register, obs_config, fm_config, ansatz_config, backend=BackendName.PYQTORCH
)
x = torch.rand(2, 2)
y = qnn(x)
Source code in qadence_model/models/qnn_model.py
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
|
derivative(ufa, x, derivative_indices)
Compute derivatives w.r.t.
inputs of a UFA with a single output. The
derivative_indices
specify which derivative(s) are computed. E.g.
derivative_indices=(1,2)
would compute the a second order derivative w.r.t
to the indices 1
and 2
of the input tensor.
PARAMETER | DESCRIPTION |
---|---|
ufa
|
The model for which we want to compute the derivative.
TYPE:
|
x
|
(batch_size, input_size) input tensor.
TYPE:
|
derivative_indices
|
Define which derivatives to compute.
TYPE:
|
Examples:
If we create a UFA with three inputs and denote the first, second, and third
input with x
, y
, and z
we can compute the following derivatives w.r.t
to those inputs:
import torch
from qadence.ml_tools.models import derivative, QNN
from qadence.ml_tools.config import FeatureMapConfig, AnsatzConfig
from qadence.constructors.hamiltonians import ObservableConfig
from qadence.operations import Z
fm_config = FeatureMapConfig(num_features=3, inputs=["x", "y", "z"])
ansatz_config = AnsatzConfig()
obs_config = ObservableConfig(detuning=Z)
f = QNN.from_configs(
register=3, obs_config=obs_config, fm_config=fm_config, ansatz_config=ansatz_config,
)
inputs = torch.rand(5,3,requires_grad=True)
# df_dx
derivative(f, inputs, (0,))
# d2f_dydz
derivative(f, inputs, (1,2))
# d3fdy2dx
derivative(f, inputs, (1,1,0))
Source code in qadence_model/models/qnn_model.py
format_to_dict_fn(inputs=[])
Format an input tensor into the format required by the forward pass.
The tensor is assumed to have dimensions: n_batches x in_features where in_features corresponds to the number of input features of the QNN