Source code for jarvis.core.circuits

"""Module to design quantum circuits with qiskit."""
from qiskit.circuit import QuantumCircuit, ParameterVector

from qiskit.circuit.library import EfficientSU2, PauliTwoDesign, RealAmplitudes


[docs]class QuantumCircuitLibrary(object): """Module for storing various quantum circuits.""" def __init__(self, n_qubits=3, reps=1): """Initialize class.""" self.n_qubits = n_qubits self.reps = reps
[docs] def circuit1(self): """Generate tight-binding ansatz.""" reps = self.reps n_qubits = self.n_qubits circ = QuantumCircuit(n_qubits) params = ParameterVector("θ", reps * 1 * n_qubits) count = 0 for r in range(reps): for i in range(n_qubits): circ.ry(params[count], i) count += 1 return circ
[docs] def circuit2(self): """Generate tight-binding ansatz.""" reps = self.reps n_qubits = self.n_qubits circ = QuantumCircuit(n_qubits) params = ParameterVector("θ", reps * 2 * n_qubits) count = 0 for r in range(reps): for i in range(n_qubits): circ.ry(params[count], i) count += 1 circ.rz(params[count], i) count += 1 return circ
[docs] def circuit3(self): """Generate tight-binding ansatz.""" reps = self.reps n_qubits = self.n_qubits circ = QuantumCircuit(n_qubits) params = ParameterVector("θ", reps * 2 * n_qubits) count = 0 for r in range(reps): for i in range(n_qubits): circ.ry(params[count], i) count += 1 circ.rz(params[count], i) count += 1 for i in range(n_qubits): if i != n_qubits - 1: circ.cx(i, n_qubits - 1) return circ
[docs] def circuit4(self): """Generate RealAmplitudes ansatz.""" reps = self.reps n_qubits = self.n_qubits return RealAmplitudes(num_qubits=n_qubits, reps=reps)
[docs] def circuit5(self): """Generate PauliTwoDesign ansatz.""" reps = self.reps n_qubits = self.n_qubits return PauliTwoDesign(num_qubits=n_qubits, reps=reps)
[docs] def circuit6(self): """Generate EfficientSU2 ansatz.""" reps = self.reps n_qubits = self.n_qubits return EfficientSU2(num_qubits=n_qubits, reps=reps)
[docs] def circuit7(self): """Generate tight-binding ansatz.""" reps = self.reps n_qubits = self.n_qubits circ = QuantumCircuit(n_qubits) params = ParameterVector("theta", reps * 4 * n_qubits) count = 0 for r in range(reps): for i in range(n_qubits): circ.ry(params[count], i) count += 1 circ.rz(params[count], i) count += 1 for i in range(n_qubits): if i != n_qubits - 1: circ.cx(i, n_qubits - 1) for j in range(n_qubits): if i + j < n_qubits and j > 0: circ.cx(i, i + j) for i in range(n_qubits): circ.ry(params[count], i) count += 1 circ.rz(params[count], i) count += 1 return circ
""" if __name__ == "__main__": from jarvis.db.figshare import ( get_wann_phonon, get_hk_tb, get_wann_electron, ) from jarvis.io.qiskit.inputs import HermitianSolver w, atoms, ef = get_wann_electron("JVASP-816") kps = [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]] for kk, k in enumerate(kps): print() hk = get_hk_tb(w=w, k=k) HS = HermitianSolver(hk) n_qubits = HS.n_qubits() Q = QuantumCircuitLibrary(n_qubits=n_qubits) circs = [ Q.circuit1(), Q.circuit2(), Q.circuit3(), Q.circuit4(), Q.circuit5(), Q.circuit6(), ] for ii, i in enumerate(circs): en, vqe_result, vqe = HS.run_vqe(var_form=i) vals, vecs = HS.run_numpy() diff = abs(en - vals[0]) print("VQE,numpy", ii, kk, en, vals[0], diff) print(i) """