Skip to content

Commit

Permalink
Remove unused parameters from kernel; remove code to load precomputed…
Browse files Browse the repository at this point in the history
… distributions
  • Loading branch information
rtvuser1 committed Jul 28, 2024
1 parent ec40da0 commit a4125ca
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 37 deletions.
36 changes: 9 additions & 27 deletions hamlib/qiskit/hamlib_simulation_benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ def print_top_measurements(label, counts, top_n):
def run(min_qubits: int = 2, max_qubits: int = 8, max_circuits: int = 1,
skip_qubits: int = 1, num_shots: int = 100,
hamiltonian: str = "TFIM", method: int = 1,
use_XX_YY_ZZ_gates: bool = False, random_pauli_flag: bool = False, init_state: str = None,
random_pauli_flag: bool = False, init_state: str = None,
backend_id: str = None, provider_backend = None,
hub: str = "ibm-q", group: str = "open", project: str = "main", exec_options = None,
context = None, api = None):
Expand All @@ -199,7 +199,6 @@ def run(min_qubits: int = 2, max_qubits: int = 8, max_circuits: int = 1,
max_circuits (int): Maximum number of circuits to execute per group.
skip_qubits (int): Increment of number of qubits.
num_shots (int): Number of shots for each circuit execution.
use_XX_YY_ZZ_gates (bool): Flag to use unoptimized XX, YY, ZZ gates.
backend_id (str): Backend identifier for execution.
provider_backend: Provider backend instance.
hub (str): IBM Quantum hub.
Expand Down Expand Up @@ -245,10 +244,6 @@ def run(min_qubits: int = 2, max_qubits: int = 8, max_circuits: int = 1,
# assume default init_state if not given
if init_state == None:
init_state = "checkerboard"

# Set the flag to use an XX YY ZZ shim if given
if use_XX_YY_ZZ_gates:
print("... using unoptimized XX YY ZZ gates")

################################

Expand Down Expand Up @@ -286,31 +281,21 @@ def execution_handler(qc, result, num_qubits, type, num_shots):

print(f"************\nExecuting [{num_circuits}] circuits with num_qubits = {num_qubits}")

# Parameters of simulation
#### CANNOT BE MODIFIED W/O ALSO MODIFYING PRECALCULATED DATA #########
# DEVNOTE: HamLib is calculating expectation on the fly, so these could be set rather than pulled

# A large Trotter order approximates the Hamiltonian evolution better.
# But a large Trotter order also means the circuit is deeper.
# For ideal or noise-less quantum circuits, k >> 1 gives perfect Hamiltonian simulation.
w = precalculated_data['w'] # Strength of disorder
k = precalculated_data['k'] # Trotter error.
t = precalculated_data['t'] # Time of simulation
# Parameters of simulation (DEVNOTE: these should be configurable)
k = 5
t = 1.0

# Precalculated random numbers between [-1, 1]
hx = precalculated_data['hx'][:num_qubits]
hz = precalculated_data['hz'][:num_qubits]
#######################################################################

# Loop over only 1 circuit
for circuit_id in range(num_circuits):
ts = time.time()

# create the HamLibSimulation kernel
qc = HamiltonianSimulation(num_qubits, K=k, t=t,
hamiltonian=hamiltonian, init_state=init_state,
w=w, hx = hx, hz = hz,
use_XX_YY_ZZ_gates = use_XX_YY_ZZ_gates,
qc = HamiltonianSimulation(num_qubits,
hamiltonian=hamiltonian,
K=k, t=t,
init_state=init_state,
method = method)

metrics.store_metric(num_qubits, circuit_id, 'create_time', time.time() - ts)
Expand All @@ -327,11 +312,10 @@ def execution_handler(qc, result, num_qubits, type, num_shots):
##########

# draw a sample circuit
kernel_draw(hamiltonian, use_XX_YY_ZZ_gates, method)
kernel_draw(hamiltonian, method)

# Plot metrics for all circuit sizes
options = {"ham": hamiltonian, "method":method, "shots": num_shots, "reps": max_circuits}
if use_XX_YY_ZZ_gates: options.update({ "xyz": use_XX_YY_ZZ_gates })
metrics.plot_metrics(f"Benchmark Results - {benchmark_name} - Qiskit", options=options)


Expand All @@ -352,7 +336,6 @@ def get_args():
parser.add_argument("--max_circuits", "-c", default=1, help="Maximum circuit repetitions", type=int)
parser.add_argument("--hamiltonian", "-ham", default="TFIM", help="Name of Hamiltonian", type=str)
parser.add_argument("--method", "-m", default=1, help="Algorithm Method", type=int)
parser.add_argument("--use_XX_YY_ZZ_gates", action="store_true", help="Use explicit XX, YY, ZZ gates")
#parser.add_argument("--theta", default=0.0, help="Input Theta Value", type=float)
parser.add_argument("--nonoise", "-non", action="store_true", help="Use Noiseless Simulator")
parser.add_argument("--verbose", "-v", action="store_true", help="Verbose")
Expand Down Expand Up @@ -394,7 +377,6 @@ def get_args():
hamiltonian=args.hamiltonian,
method=args.method,
random_pauli_flag=args.random_pauli_flag,
use_XX_YY_ZZ_gates = args.use_XX_YY_ZZ_gates,
init_state = args.init_state,
#theta=args.theta,
backend_id=args.backend_id,
Expand Down
21 changes: 11 additions & 10 deletions hamlib/qiskit/hamlib_simulation_kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,21 +324,20 @@ def initial_state(n_spins: int, initial_state: str = "checker") -> QuantumCircui
return qc


def HamiltonianSimulation(n_spins: int, K: int, t: float,
hamiltonian: str, w: float, hx: list[float], hz: list[float],
use_XX_YY_ZZ_gates: bool = False, init_state=None,
def HamiltonianSimulation(n_spins: int,
hamiltonian: str,
K: int = 5, t: float = 1.0,
init_state=None,
method: int = 1) -> QuantumCircuit:
"""
Construct a Qiskit circuit for Hamiltonian simulation.
Args:
n_spins (int): Number of spins (qubits).
hamiltonian (str): Which hamiltonian to run. "heisenberg" by default but can also choose "TFIM".
K (int): The Trotterization order.
t (float): Duration of simulation.
hamiltonian (str): Which hamiltonian to run. "heisenberg" by default but can also choose "TFIM".
w (float): Strength of two-qubit interactions for heisenberg hamiltonian.
hx (list[float]): Strength of internal disorder parameter for heisenberg hamiltonian.
hz (list[float]): Strength of internal disorder parameter for heisenberg hamiltonian.
method (int): Type of comparison for fidelity
Returns:
QuantumCircuit: The constructed Qiskit circuit.
Expand All @@ -350,10 +349,12 @@ def HamiltonianSimulation(n_spins: int, K: int, t: float,
qr = QuantumRegister(n_spins)
cr = ClassicalRegister(n_spins)
qc = QuantumCircuit(qr, cr, name=f"hamsim-{num_qubits}-{secret_int}")

# size of one Trotter step
tau = t / K

h_x = hx[:n_spins]
h_z = hz[:n_spins]
#h_x = hx[:n_spins]
#h_z = hz[:n_spins]

hamiltonian = hamiltonian.strip().lower()

Expand All @@ -376,7 +377,7 @@ def HamiltonianSimulation(n_spins: int, K: int, t: float,
############### Circuit Drawer

# Draw the circuits of this benchmark program
def kernel_draw(hamiltonian: str = "hamlib", use_XX_YY_ZZ_gates: bool = False, method: int = 1):
def kernel_draw(hamiltonian: str = "hamlib", method: int = 1):

# Print a sample circuit
print("Sample Circuit:")
Expand Down

0 comments on commit a4125ca

Please sign in to comment.