def estimate_gradient(f_h, precision, n_measurements=50, cxn=False): """ Estimate the gradient from point of evaluation to point of perturbation, h :param float f_h: Oracle output at perturbation h. :param int precision: Bit precision of gradient. :param Connection cxn: connection to the QPU or QVM :param int n_measurements: Number of times to measure system. """ # enumerate input and ancilla qubits input_qubits = list(range(precision)) ancilla_qubit = precision # generate gradient program perturbation_sign = np.sign(f_h) p_gradient = gradient_estimator(abs(f_h), ancilla_qubit) # run gradient program if not cxn: from pyquil.api import SyncConnection cxn = SyncConnection() measurements = cxn.run(p_gradient, input_qubits, n_measurements) # summarize measurements bf_estimate = perturbation_sign * measurements_to_bf(measurements) bf_explicit = '{0:.16f}'.format(bf_estimate) deci_estimate = binary_to_real(bf_explicit) return deci_estimate
from pyquil.api import SyncConnection from pyquil.api import QVMConnection from pyquil.gates import * p = Program() p.inst(H(0)) p.inst(CNOT(0, 1)) qvm = SyncConnection() result = qvm.wavefunction(p) print('result', result) qvm = QVMConnection() p = Program() p.inst(H(0), CNOT(0, 1), MEASURE(0, 0), MEASURE(1, 1)) print(p) x = qvm.run(p, [0, 1], 10) print(x) import numpy as np from pyquil.quil import Program from pyquil.api import QVMConnection quantum_simulator = QVMConnection() # pyQuil is based around operations (or gates) so we will start with the most # basic one: the identity operation, called I. I takes one argument, the index # of the qubit that it should be applied to. from pyquil.gates import I p = Program(I(0)) # Quantum states are called wavefunctions for historical reasons. # We can run this basic program on our connection to the simulator. # This call will return the state of our qubits after we run program p.