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
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)
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)
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)
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")
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")