Noiseless time-dependent Hamiltonian evolution
For use cases when the Hamiltonian of the system is time-dependent, Qadence provides a special parameter TimeParameter("t") that denotes the explicit time dependence. Using this time parameter, one can define a parameterized block acting as the generator passed to HamEvo that encapsulates the required time dependence function.
from qadence import X, Y, HamEvo, TimeParameter, FeatureParameter, runfrom pyqtorch.utils import SolverTypeimport torch
# Simulation parametersode_solver = SolverType.DP5_SE # time-dependent Schrodinger equation solver methodn_steps_hevo = 500 # integration time steps used by solver
# Define block parameterst = TimeParameter("t")omega_param = FeatureParameter("omega")
# Arbitrarily compose a time-dependent generatortd_generator = omega_param * (t * X(0) + t**2 * Y(1))
# Create parameterized HamEvo blockhamevo = HamEvo(td_generator, t)Note that when using HamEvo with a time-dependent generator, the actual time parameter that was used to construct the generator must be passed for the second argument parameter.
By default, the code above will initialize an internal parameter FeatureParameter("duration") in the HamEvo. Alternatively,
the duration argument can be used to rename this parameter, or to pass a fixed value directly. If no fixed value is passed,
it must then be set in the values dictionary at runtime.
values = {"omega": torch.tensor(10.0), "duration": torch.tensor(1.0)}
config = {"ode_solver": ode_solver, "n_steps_hevo": n_steps_hevo}
out_state = run(hamevo, values = values, configuration = config)
print(out_state)tensor([[-0.2785+0.0000j, -0.0541+0.0000j, 0.0000-0.9414j, 0.0000-0.1827j]])Note that Qadence makes no assumption on units. The unit of passed duration value must be aligned with the units of other parameters in the time-dependent generator so that the integral of generator is dimensionless.
To perform noisy time-dependent Hamiltonian evolution, one needs to pass a list of noise operators to the noise_operators argument in HamEvo. They correspond to the jump operators used within the time-dependent Schrodinger equation solver method SolverType.DP5_ME:
from qadence import X, Y, HamEvo, TimeParameter, FeatureParameter, runfrom pyqtorch.utils import SolverTypeimport torch
# Simulation parametersode_solver = SolverType.DP5_ME # time-dependent Schrodinger equation solver methodn_steps_hevo = 500 # integration time steps used by solver
# Define block parameterst = TimeParameter("t")omega_param = FeatureParameter("omega")
# Arbitrarily compose a time-dependent generatortd_generator = omega_param * (t * X(0) + t**2 * Y(1))
# Create parameterized HamEvo blocknoise_operators = [X(i) for i in td_generator.qubit_support]hamevo = HamEvo(td_generator, t, noise_operators = noise_operators)
values = {"omega": torch.tensor(10.0), "duration": torch.tensor(1.0)}
config = {"ode_solver": ode_solver, "n_steps_hevo": n_steps_hevo}
out_state = run(hamevo, values = values, configuration = config)
print(out_state)