braket.experimental.algorithms.quantum_circuit_born_machine.qcbm module

class braket.experimental.algorithms.quantum_circuit_born_machine.qcbm.QCBM(device: Device, n_qubits: int, n_layers: int, target_probabilities: ndarray, shots: int = 10000)[source]

Bases: object

Quantum circuit Born machine.

Example: n_layers = 1, n_qubits = 2

T  : |    0    |    1    |    2    |3|4|Result Types|

q0 : -Rx(0.667)-Rz(0.783)-Rx(0.257)-C-X-Probability--
                                | | |
q1 : -Rx(0.549)-Rz(0.878)-Rx(0.913)-X-C-Probability--

T  : |    0    |    1    |    2    |3|4|Result Types|

Quantum circuit Born machine.

Consists of n_layers, where each layer is a rotation layer (rx, rz, rx) followed by an entangling layer of cnot gates.

Parameters:
  • device (Device) – Amazon Braket device to use

  • n_qubits (int) – Number of qubits

  • n_layers (int) – Number of layers

  • target_probabilities (ndarray) – Target probabilities.

  • shots (int) – Number of shots. Defaults to 10_000.

get_probabilities(values: ndarray) ndarray[source]

Run and get probability results.

Parameters:

values (np.ndarray) – Values for free parameters.

Returns:

np.ndarray – Probabilities vector.

bound_circuit(values: ndarray) ndarray[source]

Get probabilities from the current parameters.

Parameters:

values (ndarray) – Parameters for QCBM.

Returns:

ndarray – Probabilities.

gradient(params: ndarray) ndarray[source]

Gradient for QCBM via:

Liu, Jin-Guo, and Lei Wang. “Differentiable Learning of Quantum Circuit Born Machine.” Physical Review A 98, no. 6 (December 19, 2018): 062324. https://doi.org/10.1103/PhysRevA.98.062324.

Parameters:

params (ndarray) – Parameters for the rotation gates in the QCBM

Returns:

ndarray – Gradient vector

braket.experimental.algorithms.quantum_circuit_born_machine.qcbm.mmd_loss(px: ndarray, py: ndarray, sigma_list: List[float] = [0.1, 1]) float[source]

Maximum Mean Discrepancy loss (MMD).

MMD determines if two distributions are equal by looking at the difference between their means in feature space.

\[MMD(x, y) = | \sum_{j=1}^N \phi(y_j) - \sum_{i=1}^N \phi(x_i) |_2^2\]

With a RBF kernel, we apply the kernel trick to expand MMD to

\[MMD(x, y) = \sum_{j=1}^N \sum_{j'=1}^N k(y_j, y_{j'}) + \sum_{i=1}^N \sum_{i'=1}^N k(x_i, x_{i'}) - 2 \sum_{j=1}^N \sum_{i=1}^N k(y_j, x_i)\]

For the RBF kernel, MMD is zero if and only if the distributions are identical.

Parameters:
  • px (ndarray) – Probability distribution

  • py (ndarray) – Target probability distribution

  • sigma_list (List[float]) – Standard deviations of distribution. Defaults to [0.1, 1].

Returns:

float – Value of the MMD loss

braket.experimental.algorithms.quantum_circuit_born_machine.qcbm.qcbm_layers(neighbors: List[Tuple[int, int]], parameters: List[List[List[FreeParameter]]]) Circuit[source]

QCBM layers.

Parameters:
  • neighbors (List[Tuple[int,int]]) – List of qubit pairs.

  • parameters (List[List[List[FreeParameter]]]) – List of FreeParameters. First index is n_layers, second is n_qubits, and third is [0,1,2]

Returns:

Circuit – QCBM circuit.

braket.experimental.algorithms.quantum_circuit_born_machine.qcbm.entangler(neighbors: List[Tuple[int, int]]) Circuit[source]

Add CNot gates to circuit.

Parameters:

neighbors (List[Tuple[int,int]]) – Neighbors for CNots to connect

Returns:

Circuit – CNot entangling layer

braket.experimental.algorithms.quantum_circuit_born_machine.qcbm.rotation_layer(parameters: List[List[FreeParameter]]) Circuit[source]

Add rotation layers to circuit.

Parameters:

parameters (List[List[FreeParameter]]) – Parameters for rotation layers.

Returns:

Circuit – Rotation layer