コード例 #1
0
def create_random_isingop(nqubits, nterms, seed=None):
    """Generates random ising operator acting on nqubits with nterms for testing
        purposes.

    Args:
        nqubits: integer
            The number of qubits in the qubit operator
        nterms: integer
            The number of terms in the qubit operator

        *** OPTIONAL ***
        seed: integer
            The see for the random number generator

    Returns:
        an Ising Operator (openfermion.IsingOperator) object
    """
    NUM_QUBITS = range(0, nqubits)

    if seed is not None:
        random.seed(seed)

    # Initialize empty qubit operator
    isingop = IsingOperator()

    # Loop over number of separate terms in qubit operator
    for i in range(0, nterms):
        # Choose number of paulis to measure in term
        num_paulis = random.choice(range(nqubits + 1))

        # Create empty list of qubits
        qubits = []

        # Create empty term
        full_term = ""

        # Loop over paulis
        for j in range(0, num_paulis):
            # Choose random qubit
            qubit_index = random.choice(NUM_QUBITS)
            while qubit_index in qubits:
                # Ensure qubit not already being measured in this term
                qubit_index = random.choice(NUM_QUBITS)
            qubits.append(qubit_index)

            # Choose pauli
            pauli_gate = "Z"
            # Construct string
            full_term += pauli_gate + str(qubit_index) + " "
        # Add full term to qubit operator
        isingop += IsingOperator(full_term)

    return isingop
コード例 #2
0
    def test_get_expectation_values_from_measurements(self):
        # Given
        measurements = Measurements([(0, 1, 0), (0, 1, 0), (0, 0, 0),
                                     (1, 0, 0), (1, 1, 1)])
        ising_operator = IsingOperator("10[] + [Z0 Z1] - 15[Z1 Z2]")
        target_expectation_values = np.array([10, -0.2, -3])
        target_correlations = np.array([[100, -2, -30], [-2, 1, -9],
                                        [-30, -9, 225]])
        denominator = len(measurements.bitstrings)
        covariance_11 = (target_correlations[1, 1] -
                         target_expectation_values[1]**2) / denominator
        covariance_12 = (target_correlations[1, 2] -
                         target_expectation_values[1] *
                         target_expectation_values[2]) / denominator
        covariance_22 = (target_correlations[2, 2] -
                         target_expectation_values[2]**2) / denominator

        target_covariances = np.array([
            [0, 0, 0],
            [0, covariance_11, covariance_12],
            [0, covariance_12, covariance_22],
        ])

        # When
        expectation_values = measurements.get_expectation_values(
            ising_operator, False)
        # Then
        np.testing.assert_allclose(expectation_values.values,
                                   target_expectation_values)
        assert len(expectation_values.correlations) == 1
        np.testing.assert_allclose(expectation_values.correlations[0],
                                   target_correlations)
        assert len(expectation_values.estimator_covariances) == 1
        np.testing.assert_allclose(expectation_values.estimator_covariances[0],
                                   target_covariances)
コード例 #3
0
ファイル: simulator_test.py プロジェクト: wugaxp/qe-forest
 def test_get_expectation_values(self):
     # Given
     circuit = Circuit(Program(H(0), CNOT(0, 1), CNOT(1, 2)))
     qubit_operator = IsingOperator('[] + [Z0 Z1] + [Z0 Z2] ')
     target_expectation_values = np.array([1, 1, 1])
     # When
     expectation_values = self.sampling_simulator.get_expectation_values(
         circuit, qubit_operator)
     # Then
     np.testing.assert_array_equal(expectation_values.values,
                                   target_expectation_values)
コード例 #4
0
 def test_get_expectation_values_from_measurements(self):
     # Given
     measurements = [(0, 1, 0), (0, 1, 0), (0, 0, 0), (0, 0, 0), (1, 1, 1)]
     ising_operator = IsingOperator('10[] + [Z0 Z1] - 10[Z1 Z2]')
     target_expectation_values = np.array([10, 0.2, -2])
     # When
     expectation_values = get_expectation_values_from_measurements(
         measurements, ising_operator)
     # Then
     np.testing.assert_array_equal(expectation_values.values,
                                   target_expectation_values)
コード例 #5
0
def test_parities_io():
    measurements = [(1, 0), (1, 0), (0, 1), (0, 0)]
    op = IsingOperator("[Z0] + [Z1] + [Z0 Z1]")
    parities = get_parities_from_measurements(measurements, op)
    save_parities(parities, "parities.json")
    loaded_parities = load_parities("parities.json")
    assert np.allclose(parities.values, loaded_parities.values)
    assert len(parities.correlations) == len(loaded_parities.correlations)
    for i in range(len(parities.correlations)):
        assert np.allclose(parities.correlations[i],
                           loaded_parities.correlations[i])
    remove_file_if_exists("parities.json")
コード例 #6
0
 def test_parities_io(self):
     measurements = [(1, 0), (1, 0), (0, 1), (0, 0)]
     op = IsingOperator("[Z0] + [Z1] + [Z0 Z1]")
     parities = get_parities_from_measurements(measurements, op)
     save_parities(parities, "parities.json")
     loaded_parities = load_parities("parities.json")
     self.assertTrue(np.allclose(parities.values, loaded_parities.values))
     self.assertEqual(len(parities.correlations), len(loaded_parities.correlations))
     for i in range(len(parities.correlations)):
         self.assertTrue(
             np.allclose(parities.correlations[i], loaded_parities.correlations[i])
         )
     os.remove("parities.json")