From 725bff87daf1ea27f57779377b022f52d20cedaa Mon Sep 17 00:00:00 2001 From: rtvuser1 Date: Wed, 17 Jul 2024 07:25:56 -0700 Subject: [PATCH] Fix bug with VQE method 2, using code from PR #575 (closed) --- vqe/qiskit/vqe_benchmark.py | 64 +++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/vqe/qiskit/vqe_benchmark.py b/vqe/qiskit/vqe_benchmark.py index 3a5a74a5..28c07a33 100644 --- a/vqe/qiskit/vqe_benchmark.py +++ b/vqe/qiskit/vqe_benchmark.py @@ -125,7 +125,7 @@ def VQEEnergy(n_spin_orbs, na, nb, circuit_id=0, method=1): off_diag.append(p) # modify the name of diagonal circuit - qc_list[0].name = qubit_op[1].primitive.to_list()[0][0] + " " + str(np.real(diag_coeff)) + qc_list[0].name = qubit_op[1].to_list()[0][0] + " " + str(np.real(diag_coeff)) normalization /= len(qc_list) return qc_list @@ -293,11 +293,22 @@ def analyze_and_print_result(qc, result, num_qubits, references, num_shots): # compute fidelity fidelity = metrics.polarization_fidelity(counts, correct_dist) + + if verbose: + print(f"... fidelity = {fidelity}") - # modify fidelity based on the coefficient + # modify fidelity based on the coefficient (only for method 2) + # Note: method 1 total name has 3 components, method 2 has only 2; if (len(total_name.split()) == 2): - fidelity *= ( abs(float(total_name.split()[1])) / normalization ) - + + coefficient = abs(float(total_name.split()[1])) / normalization + fidelity = {f : v * coefficient for f, v in fidelity.items()} + if verbose: + print(f"... total_name={total_name}, coefficient={coefficient}, product_fidelity={fidelity}") + + if verbose: + print(f"... total fidelity = {fidelity}") + return fidelity ################ Benchmark Loop @@ -308,7 +319,7 @@ def analyze_and_print_result(qc, result, num_qubits, references, num_shots): # Execute program with default parameters def run(min_qubits=4, max_qubits=8, skip_qubits=1, max_circuits=3, num_shots=4092, method=1, - backend_id="qasm_simulator", provider_backend=None, + backend_id=None, provider_backend=None, hub="ibm-q", group="open", project="main", exec_options=None, context=None): @@ -443,5 +454,44 @@ def execution_handler(qc, result, num_qubits, type, num_shots): # Plot metrics for all circuit sizes metrics.plot_metrics(f"Benchmark Results - {benchmark_name} ({method}) - Qiskit") -# if main, execute methods -if __name__ == "__main__": run() +####################### +# MAIN + +import argparse +def get_args(): + parser = argparse.ArgumentParser(description="Variational Quantum Eigensolver Benchmark") + #parser.add_argument("--api", "-a", default=None, help="Programming API", type=str) + #parser.add_argument("--target", "-t", default=None, help="Target Backend", type=str) + parser.add_argument("--backend_id", "-b", default=None, help="Backend Identifier", type=str) + parser.add_argument("--num_qubits", "-n", default=0, help="Number of qubits (min = max = N)", type=int) + parser.add_argument("--min_qubits", "-min", default=4, help="Minimum number of qubits", type=int) + parser.add_argument("--max_qubits", "-max", default=8, help="Maximum number of qubits", type=int) + parser.add_argument("--skip_qubits", "-k", default=1, help="Number of qubits to skip", type=int) + parser.add_argument("--max_circuits", "-c", default=3, help="Maximum circuit repetitions", type=int) + parser.add_argument("--num_shots", "-s", default=4092, help="Number of shots", type=int) + parser.add_argument("--method", "-m", default=1, help="Algorithm Method", type=int) + parser.add_argument("--nonoise", "-non", action="store_true", help="Use Noiseless Simulator") + parser.add_argument("--verbose", "-v", action="store_true", help="Verbose") + + return parser.parse_args() + +if __name__ == "__main__": + import argparse + args = get_args() + + # special argument handling + ex.verbose = args.verbose + verbose = args.verbose + + if args.num_qubits > 0: args.min_qubits = args.max_qubits = args.num_qubits + + # execute benchmark program + run(min_qubits=args.min_qubits, max_qubits=args.max_qubits, + skip_qubits=args.skip_qubits, max_circuits=args.max_circuits, + num_shots=args.num_shots, + method=args.method, + backend_id=args.backend_id, + exec_options = {"noise_model" : None} if args.nonoise else {}, + #api=args.api + ) +