gaussian_pulse_stf
The Boulder Opal Toolkits are currently in beta phase of development. Breaking changes may be introduced.
- gaussian_pulse_stf(amplitude, width, center_time, drag=None)
Create an Stf representing a Gaussian pulse.
- Parameters:
amplitude (float or complex or Tensor) – The amplitude of the Gaussian pulse, \(A\). It must either be a scalar or contain a single element.
width (float or Tensor) – The standard deviation of the Gaussian pulse, \(\sigma\). It must either be a scalar or contain a single element.
center_time (float or Tensor) – The center of the Gaussian pulse, \(t_0\). It must either be a scalar or contain a single element.
drag (float or Tensor, optional) – The DRAG parameter, \(\beta\). If passed, it must either be a scalar or contain a single element. Defaults to no DRAG correction.
- Returns:
The sampleable Gaussian pulse.
- Return type:
See also
signals.gaussian_pulse_pwc()
Corresponding operation with Pwc output.
signals.sech_pulse_stf()
Create an Stf representing a hyperbolic secant pulse.
Notes
The Gaussian pulse is defined as
\[\mathop{\mathrm{Gaussian}}(t) = A \left(1-\frac{i\beta (t-t_0)}{\sigma^2}\right) \exp \left(- \frac{(t-t_0)^2}{2\sigma^2} \right) .\]Examples
Define a sampleable Gaussian pulse.
>>> gaussian = graph.signals.gaussian_pulse_stf( ... amplitude=1.0, width=0.1, center_time=0.5 ... ) >>> gaussian <Stf: operation_name="multiply", value_shape=(), batch_shape=()> >>> graph.sample_stf(stf=gaussian, sample_times=np.linspace(0, 1, 5), name="gaussian_samples") <Tensor: name="gaussian_samples", operation_name="sample_stf", shape=(5,)> >>> graph.discretize_stf( ... gaussian, duration=1, segment_count=100, name="discretized_gaussian" ... ) <Pwc: name="discretized_gaussian", operation_name="discretize_stf", value_shape=(), batch_shape=()> >>> result = qctrl.functions.calculate_graph( ... graph=graph, output_node_names=["gaussian_samples", "discretized_gaussian"] ... ) >>> result.output["gaussian_samples"]["value"] array([3.727e-06, 4.394e-02, 1.000e+00, 4.394e-02, 3.727e-06])
Define a sampleable Gaussian with a DRAG correction.
>>> gaussian = graph.signals.gaussian_pulse_stf( ... amplitude=1.0, width=0.1, center_time=0.5, drag=0.2 ... ) >>> gaussian <Stf: operation_name="multiply", value_shape=(), batch_shape=()> >>> graph.sample_stf( ... stf=gaussian, sample_times=np.linspace(0, 1, 5), name="drag_gaussian_samples" ... ) <Tensor: name="drag_gaussian_samples", operation_name="sample_stf", shape=(5,)> >>> graph.discretize_stf( ... gaussian, duration=1, segment_count=100, name="discretized_drag_gaussian" ... ) <Pwc: name="discretized_drag_gaussian", operation_name="discretize_stf", value_shape=(), batch_shape=()> >>> result = qctrl.functions.calculate_graph( ... graph=graph, output_node_names=["drag_gaussian_samples", "discretized_drag_gaussian"] ... ) >>> result.output["drag_gaussian_samples"]["value"] array([ 3.727e-06 + 9.317e-06j, 4.394e-02 + 5.492e-02j, 1.000e+00 + 0.000e+00j, 4.394e-02 - 5.492e-02j, 3.727e-06 - 9.317e-06j, ])
Define a sampleable Gaussian pulse with optimizable parameters.
>>> amplitude = graph.optimization_variable( ... count=1, lower_bound=0, upper_bound=2.*np.pi, name="amplitude" ... ) >>> width = graph.optimization_variable( ... count=1, lower_bound=0.1, upper_bound=0.5, name="width" ... ) >>> center_time = graph.optimization_variable( ... count=1, lower_bound=0.2, upper_bound=0.8, name="center_time" ... ) >>> drag = graph.optimization_variable( ... count=1, lower_bound=0, upper_bound=0.5, name="drag" ... ) >>> graph.signals.gaussian_pulse_stf( ... amplitude=amplitude, width=width, center_time=center_time, drag=drag ... ) <Stf: operation_name="multiply", value_shape=(), batch_shape=()>