Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

VQE on QVM with noise model not compatible #222

Open
pacobontenbal opened this issue Feb 12, 2021 · 0 comments
Open

VQE on QVM with noise model not compatible #222

pacobontenbal opened this issue Feb 12, 2021 · 0 comments

Comments

@pacobontenbal
Copy link

I am using Grove's VQE to run on a QVM with a noise model but I get a TypeError when I run it. Below is an example of how one would use the VQE on a QVM with a noise model:

from pyquil import get_qc
from pyquil.quil import Program
from pyquil.gates import *
from pyquil.paulis import PauliTerm, PauliSum
from grove.pyvqe.vqe import VQE
from scipy.optimize import minimize
import numpy as np
from functools import partial 

noisy_qvm = get_qc("Aspen-8", as_qvm=True, noisy=True)

def ansatz(thetas):
    bell_singlet = Program()
    bell_singlet += Program(X(0), XY(thetas[0], 0, 1), RZ(thetas[1], 0))
    
    return bell_singlet

def hamiltonian():
    pauliTerms = []
    pXX = PauliTerm('X', 0) * PauliTerm ('X', 1)
    pYY = PauliTerm('Y', 0) * PauliTerm ('Y', 1)

    pauliTerms.append(pXX)
    pauliTerms.append(pYY)
    
    return PauliSum(pauliTerms)

def vqe_run(thetas):
        dispList = []
        
        vqe_inst = VQE(minimizer=minimize, minimizer_kwargs={'method': "Powell"})
        vqe_run = vqe_inst.vqe_run(partial(ansatz), hamiltonian(), thetas, disp=dispList.append, samples=10000, qvm=noisy_qvm.qam)
                
        return vqe_run

vqe_run([np.pi/2, -np.pi/2])

Running this gives the error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-a5e26cfc1196> in <module>
----> 1 vqe_run([np.pi/2, -np.pi/2])

<ipython-input-18-8e6da3871d03> in vqe_run(thetas)
      3 
      4         vqe_inst = VQE(minimizer=minimize, minimizer_kwargs={'method': "Powell"})
----> 5         vqe_run = vqe_inst.vqe_run(partial(ansatz), hamiltonian(), thetas, disp=dispList.append, samples=10000, qvm=noisy_qvm.qam)
      6 
      7         return vqe_run

/opt/conda/lib/python3.8/site-packages/grove/pyvqe/vqe.py in vqe_run(self, variational_state_evolve, hamiltonian, initial_params, gate_noise, measurement_noise, jacobian, qvm, disp, samples, return_all)
    170             self.minimizer_kwargs['jac'] = jacobian
    171 
--> 172         result = self.minimizer(*args, **self.minimizer_kwargs)
    173 
    174         if hasattr(result, 'status'):

/opt/conda/lib/python3.8/site-packages/scipy/optimize/_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    606         return _minimize_neldermead(fun, x0, args, callback, **options)
    607     elif meth == 'powell':
--> 608         return _minimize_powell(fun, x0, args, callback, bounds, **options)
    609     elif meth == 'cg':
    610         return _minimize_cg(fun, x0, args, jac, callback, **options)

/opt/conda/lib/python3.8/site-packages/scipy/optimize/optimize.py in _minimize_powell(func, x0, args, callback, bounds, xtol, ftol, maxiter, maxfev, disp, direc, return_all, **unknown_options)
   2919                           OptimizeWarning, 3)
   2920 
-> 2921     fval = squeeze(func(x))
   2922     x1 = x.copy()
   2923     iter = 0

/opt/conda/lib/python3.8/site-packages/scipy/optimize/optimize.py in function_wrapper(*wrapper_args)
    425     def function_wrapper(*wrapper_args):
    426         ncalls[0] += 1
--> 427         return function(*(wrapper_args + args))
    428 
    429     return ncalls, function_wrapper

/opt/conda/lib/python3.8/site-packages/grove/pyvqe/vqe.py in objective_function(params)
    143             """
    144             pyquil_prog = variational_state_evolve(params)
--> 145             mean_value = self.expectation(pyquil_prog, hamiltonian, samples, qvm)
    146             self._current_expectation = mean_value  # store for printing
    147             return mean_value

/opt/conda/lib/python3.8/site-packages/grove/pyvqe/vqe.py in expectation(pyquil_prog, pauli_sum, samples, qvm)
    265 
    266                             meas_outcome = \
--> 267                                 expectation_from_sampling(pyquil_prog + meas_basis_change,
    268                                                           qubits_to_measure,
    269                                                           qvm,

/opt/conda/lib/python3.8/site-packages/grove/pyvqe/vqe.py in expectation_from_sampling(pyquil_program, marked_qubits, qvm, samples)
    313         pyquil_program.measure(qindex, qindex)
    314 
--> 315     bitstring_samples = qvm.run(pyquil_program, range(max(marked_qubits) + 1), trials=samples)
    316     bitstring_tuples = list(map(tuple, bitstring_samples))
    317 

/opt/conda/lib/python3.8/site-packages/pyquil/api/_error_reporting.py in wrapper(*args, **kwargs)
    249             global_error_context.log[key] = pre_entry
    250 
--> 251         val = func(*args, **kwargs)
    252 
    253         # poke the return value of that call in

TypeError: run() got an unexpected keyword argument 'trials'

Is there a way to run a VQE with a noise model on a QVM?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant