Skip to content

Commit 2ebe601

Browse files
authored
Merge pull request #84 from qutech/hotfix/cache_intermediates_hilbert
Cache more intermediates in calculation with unitaries
2 parents aba0d05 + affb039 commit 2ebe601

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

filter_functions/numeric.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,8 +591,12 @@ def calculate_noise_operators_from_scratch(
591591
noise_operators = np.zeros((len(omega), len(n_opers), d, d), dtype=complex)
592592

593593
if cache_intermediates:
594+
phase_factors_cache = np.empty((len(dt), len(omega)), dtype=complex)
595+
int_cache = np.empty((len(dt), len(omega), d, d), dtype=complex)
594596
sum_cache = np.empty((len(dt), len(omega), len(n_opers), d, d), dtype=complex)
595597
else:
598+
phase_factors = np.empty((len(omega),), dtype=complex)
599+
int_buf = np.empty((len(omega), d, d), dtype=complex)
596600
sum_buf = np.empty((len(omega), len(n_opers), d, d), dtype=complex)
597601

598602
# Set up reusable expressions
@@ -607,17 +611,22 @@ def calculate_noise_operators_from_scratch(
607611
if cache_intermediates:
608612
# Assign references to the locations in the cache for the quantities
609613
# that should be stored
614+
phase_factors = phase_factors_cache[g]
615+
int_buf = int_cache[g]
610616
sum_buf = sum_cache[g]
611617

618+
phase_factors = util.cexp(omega*t[g], out=phase_factors)
612619
int_buf = _first_order_integral(omega, eigvals[g], dt[g], exp_buf, int_buf)
613-
sum_buf = expr_1(n_opers_transformed[:, g], util.cexp(omega*t[g])[:, None, None]*int_buf,
620+
sum_buf = expr_1(n_opers_transformed[:, g], phase_factors[:, None, None]*int_buf,
614621
out=sum_buf)
615622

616623
noise_operators += expr_2(eigvecs_propagated[g].conj(), sum_buf, eigvecs_propagated[g],
617624
out=sum_buf)
618625

619626
if cache_intermediates:
620627
intermediates = dict(n_opers_transformed=n_opers_transformed,
628+
first_order_integral=int_cache,
629+
phase_factors=phase_factors_cache,
621630
noise_operators_step=sum_cache)
622631
return noise_operators, intermediates
623632

tests/test_core.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ def test_pulse_sequence_attributes_concat(self):
608608
self.assertEqual(periodic_pulse._tau, pulse.tau * 7)
609609
self.assertArrayAlmostEqual(periodic_pulse.t, [0, *periodic_pulse.dt.cumsum()])
610610

611-
def test_cache_intermediates(self):
611+
def test_cache_intermediates_liouville(self):
612612
"""Test caching of intermediate elements"""
613613
pulse = testutil.rand_pulse_sequence(3, 4, 2, 3)
614614
omega = util.get_sample_frequencies(pulse, 33, spacing='linear')
@@ -627,6 +627,27 @@ def test_cache_intermediates(self):
627627
eigvecs_prop.conj(), pulse.basis, eigvecs_prop)
628628
self.assertArrayAlmostEqual(pulse._intermediates['basis_transformed'], basis_transformed,
629629
atol=1e-14)
630+
self.assertArrayAlmostEqual(pulse._intermediates['phase_factors'],
631+
util.cexp(omega*pulse.t[:-1, None]))
632+
633+
def test_cache_intermediates_hilbert(self):
634+
pulse = testutil.rand_pulse_sequence(3, 4, 2, 3)
635+
omega = util.get_sample_frequencies(pulse, 33, spacing='linear')
636+
unitary, intermediates = numeric.calculate_noise_operators_from_scratch(
637+
pulse.eigvals, pulse.eigvecs, pulse.propagators, omega, pulse.n_opers, pulse.n_coeffs,
638+
pulse.dt, pulse.t, cache_intermediates=True
639+
)
640+
641+
pulse._intermediates.update(**intermediates)
642+
643+
self.assertArrayAlmostEqual(pulse._intermediates['noise_operators_step'].sum(0), unitary)
644+
self.assertArrayAlmostEqual(pulse._intermediates['n_opers_transformed'],
645+
numeric._transform_hamiltonian(pulse.eigvecs,
646+
pulse.n_opers,
647+
pulse.n_coeffs))
648+
self.assertArrayAlmostEqual(pulse._intermediates['phase_factors'],
649+
util.cexp(omega*pulse.t[:-1, None]))
650+
630651

631652
def test_cache_filter_function(self):
632653
omega = rng.random(32)

0 commit comments

Comments
 (0)