def test_discretize(): """Test the `discretize` routine""" tlist = np.linspace(0, 10, 20) control = partial(krotov.shapes.blackman, t_start=0, t_stop=10) with pytest.raises(TypeError): discretize(control, tlist) with pytest.raises(TypeError): discretize('sin(t)', tlist) control = qutip_callback(krotov.shapes.blackman, t_start=0, t_stop=10) with pytest.raises(ValueError): discretize(np.array([control(t, None) for t in tlist[:-1]]), tlist) control_array = discretize(control, tlist) assert len(control_array) == len(tlist) assert abs(control_array[0]) < 1e-15 assert abs(control_array[-1]) < 1e-15 control = np.array([control(t, None) for t in tlist]) assert np.max(np.abs((control - control_array))) < 1e-15 control_array2 = discretize(control, tlist) assert np.max(np.abs((control_array2 - control_array))) < 1e-15
def test_initialize_krotov_controls(): """Check that pulses and controls are initialized while preserving the correct boundary conditions. This is the point that the section "Time Discretization Schemes" in the documentation is making. Tests the resolution of #20. """ T = 10 blackman = qutip_callback(krotov.shapes.blackman, t_start=0, t_stop=T) H = ['H0', ['H1', blackman]] tlist = np.linspace(0, T, 10) pulse_options = {blackman: dict(lambda_a=1.0, update_shape=1)} objectives = [ krotov.Objective(initial_state=qutip.Qobj(), target=None, H=H) ] assert abs(blackman(0, None)) < 1e-15 assert abs(blackman(T, None)) < 1e-15 ( guess_controls, guess_pulses, pulses_mapping, lambda_vals, shape_arrays, ) = krotov.optimize._initialize_krotov_controls( objectives, pulse_options, tlist ) assert isinstance(guess_controls[0], np.ndarray) assert len(guess_controls[0]) == len(tlist) assert abs(guess_controls[0][0]) < 1e-15 assert abs(guess_controls[0][-1]) < 1e-15 assert isinstance(guess_pulses[0], np.ndarray) assert len(guess_pulses[0]) == len(tlist) - 1 assert abs(guess_pulses[0][0]) < 1e-15 assert abs(guess_pulses[0][-1]) < 1e-15 assert len(pulse_options) == 1 assert len(pulses_mapping) == 1 assert len(pulses_mapping[0]) == 1 assert len(pulses_mapping[0][0]) == 1 assert len(pulses_mapping[0][0][0]) == 1 assert pulses_mapping[0][0][0][0] == 1 assert len(lambda_vals) == 1 assert lambda_vals[0] == 1.0 assert len(shape_arrays) == 1 assert isinstance(shape_arrays[0], np.ndarray) assert len(shape_arrays[0]) == len(tlist) - 1
def test_conversion_control_pulse_inverse(): """Test that `controls_onto_interval` and `pulses_onto_tlist` are inverses""" tlist = np.linspace(0, 10, 20) blackman = qutip_callback(krotov.shapes.blackman, t_start=0, t_stop=10) pulse_orig = krotov.conversions.control_onto_interval( discretize(blackman, tlist)) control = krotov.conversions.pulse_onto_tlist(pulse_orig) pulse = krotov.conversions.control_onto_interval(control) assert np.max(np.abs(pulse - pulse_orig)) < 1e-14
def test_conversion_control_pulse_inverse(): """Test that `controls_onto_interval` and `pulses_onto_tlist` are inverses""" tlist = np.linspace(0, 10, 20) tlist_midpoints = [] for i in range(len(tlist) - 1): tlist_midpoints.append(0.5 * (tlist[i + 1] + tlist[i])) tlist_midpoints = np.array(tlist_midpoints) blackman = qutip_callback(krotov.shapes.blackman, t_start=0, t_stop=10) pulse_orig = krotov.structural_conversions.control_onto_interval( blackman, tlist, tlist_midpoints) control = krotov.structural_conversions.pulse_onto_tlist(pulse_orig) pulse = krotov.structural_conversions.control_onto_interval( control, tlist, tlist_midpoints) assert np.max(np.abs(pulse - pulse_orig)) < 1e-14