Skip to content

Commit

Permalink
user can pass init_state
Browse files Browse the repository at this point in the history
  • Loading branch information
Avimita-amc8313 committed Jul 5, 2024
1 parent 3e11208 commit 5364bab
Show file tree
Hide file tree
Showing 4 changed files with 223 additions and 221 deletions.
10 changes: 5 additions & 5 deletions hamlib/_common/hamiltonian_simulation_exact.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ def construct_hamiltonian(n_spins: int, hamiltonian: str, w: float, hx : list[fl
else:
raise ValueError("Invalid Hamiltonian specification.")

def HamiltonianSimulationExact(n_spins: int):
def HamiltonianSimulationExact(n_spins: int, init_state=None):
"""
Perform exact Hamiltonian simulation using classical matrix evolution.
Expand All @@ -144,16 +144,16 @@ def HamiltonianSimulationExact(n_spins: int):
Returns:
dict: The distribution of the evolved state.
"""
_, hamiltonian_sparse, _ = create_circuit(n_spins)
time_problem = TimeEvolutionProblem(hamiltonian_sparse, 0.2, initial_state=initial_state(n_spins, 'checkerboard'))
_, hamiltonian_sparse, _ = create_circuit(n_spins=n_spins, init_state=init_state)
time_problem = TimeEvolutionProblem(hamiltonian_sparse, 0.2, initial_state=initial_state(n_spins, init_state))
result = SciPyRealEvolver(num_timesteps=1).evolve(time_problem)

# if verbose:
# print (result)

return result.evolved_state.probabilities_dict()

def HamiltonianSimulationExact_Noiseless(n_spins: int):
def HamiltonianSimulationExact_Noiseless(n_spins: int, init_state=None):
"""
Simulate a quantum Hamiltonian circuit for a specified number of spins using a noiseless quantum simulator.
Expand All @@ -172,7 +172,7 @@ def HamiltonianSimulationExact_Noiseless(n_spins: int):
that measures qubits and returns a count of the measurement outcomes. The function assumes that the circuit
creation and the simulator are perfectly noiseless, meaning there are no errors during simulation.
"""
qc, _, _ = create_circuit(n_spins)
qc, _, _ = create_circuit(n_spins=n_spins,init_state=init_state)
num_shots = 100000
backend = Aer.get_backend("qasm_simulator")
# Transpile and run the circuits
Expand Down
412 changes: 206 additions & 206 deletions hamlib/qiskit/benchmarks-qiskit.ipynb

Large diffs are not rendered by default.

14 changes: 8 additions & 6 deletions hamlib/qiskit/hamlib_simulation_benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
from hamlib_simulation_kernel import HamiltonianSimulation, kernel_draw, get_valid_qubits
from hamlib_utils import create_full_filenames, construct_dataset_name
from hamiltonian_simulation_exact import HamiltonianSimulationExact, HamiltonianSimulationExact_Noiseless
# from hamlib_test import create_circuit, HamiltonianSimulationExact
from qiskit_algorithms import TimeEvolutionProblem, SciPyRealEvolver

min_qubits = 0
Expand Down Expand Up @@ -123,12 +122,12 @@ def analyze_and_print_result(qc, result, num_qubits: int,

# Precalculated correct distribution
if method == 1:
correct_dist = HamiltonianSimulationExact_Noiseless(num_qubits)
correct_dist = HamiltonianSimulationExact_Noiseless(n_spins=num_qubits,init_state=init_state)
elif method == 2:
if verbose:
print(f"... begin exact computation ...")
ts = time.time()
correct_dist = HamiltonianSimulationExact(num_qubits)
correct_dist = HamiltonianSimulationExact(n_spins=num_qubits,init_state=init_state)
if verbose:
print(f"... exact computation time = {round((time.time() - ts), 3)} sec")
elif method == 3:
Expand Down Expand Up @@ -214,7 +213,7 @@ def initial_state(n_spins: int, initial_state: str = "checker") -> QuantumCircui
def run(min_qubits: int = 2, max_qubits: int = 8, max_circuits: int = 3,
skip_qubits: int = 1, num_shots: int = 100,
hamiltonian: str = "TFIM", method: int = 2,
use_XX_YY_ZZ_gates: bool = False, random_pauli_flag: bool = False, init_state: str = "checkerboard",
use_XX_YY_ZZ_gates: bool = False, 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 Down Expand Up @@ -243,6 +242,9 @@ def run(min_qubits: int = 2, max_qubits: int = 8, max_circuits: int = 3,
None
"""

if init_state == None:
init_state = "checkerboard"

hamlib_simulation_kernel.filename = create_full_filenames(hamiltonian)
hamlib_simulation_kernel.dataset_name_template = construct_dataset_name(hamlib_simulation_kernel.filename)

Expand Down Expand Up @@ -308,7 +310,7 @@ def execution_handler(qc, result, num_qubits, type, num_shots):
hz = precalculated_data['hz'][:num_qubits]

qc = HamiltonianSimulation(num_qubits, K=k, t=t,
hamiltonian=hamiltonian,
hamiltonian=hamiltonian, init_state=init_state,
w=w, hx = hx, hz = hz,
use_XX_YY_ZZ_gates = use_XX_YY_ZZ_gates,
method = method)
Expand Down Expand Up @@ -358,7 +360,7 @@ def get_args():
parser.add_argument("--nonoise", "-non", action="store_true", help="Use Noiseless Simulator")
parser.add_argument("--verbose", "-v", action="store_true", help="Verbose")
parser.add_argument("--random_pauli_flag", "-ranp", action="store_true", help="random pauli flag")
parser.add_argument("--init_state", "-init", default="checkerboard", help="initial state")
parser.add_argument("--init_state", "-init", default=None, help="initial state")
return parser.parse_args()

# if main, execute method
Expand Down
8 changes: 4 additions & 4 deletions hamlib/qiskit/hamlib_simulation_kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ def create_trotter_steps(num_trotter_steps, evo, operator, circuit):
circuit.barrier()
return circuit

def create_circuit(n_spins: int, time: float = 0.2, num_trotter_steps: int = 5, method = 1):
def create_circuit(n_spins: int, time: float = 0.2, num_trotter_steps: int = 5, method = 1, init_state=None):
"""
Create a quantum circuit based on the Hamiltonian data from an HDF5 file.
Expand Down Expand Up @@ -200,7 +200,7 @@ def create_circuit(n_spins: int, time: float = 0.2, num_trotter_steps: int = 5,
circuit_without_initial_state = QuantumCircuit(operator.num_qubits)

# first insert the initial_state
init_state = "checkerboard"
# init_state = "checkerboard"
QCI_ = initial_state(num_qubits, init_state)
circuit.append(QCI_, range(operator.num_qubits))
circuit.barrier()
Expand Down Expand Up @@ -252,7 +252,7 @@ def initial_state(n_spins: int, initial_state: str = "checker") -> QuantumCircui

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,
use_XX_YY_ZZ_gates: bool = False, init_state=None,
method: int = 1) -> QuantumCircuit:
"""
Construct a Qiskit circuit for Hamiltonian simulation.
Expand Down Expand Up @@ -284,7 +284,7 @@ def HamiltonianSimulation(n_spins: int, K: int, t: float,

hamiltonian = hamiltonian.strip().lower()

qc, ham_op, evo = create_circuit(n_spins = n_spins, method = method)
qc, ham_op, evo = create_circuit(n_spins = n_spins, method = method, init_state=init_state)

# Save smaller circuit example for display
global QC_, HAM_, EVO_
Expand Down

0 comments on commit 5364bab

Please sign in to comment.