# tanh_ramp_pwc

The Boulder Opal Toolkits are currently in beta phase of development. Breaking changes may be introduced.

tanh_ramp_pwc(duration, segment_count, end_value, start_value=None, ramp_duration=None, center_time=None, *, name=None)

Create a Pwc representing a hyperbolic tangent ramp.

Parameters
• duration (float) – The duration of the signal, $$T$$.

• segment_count (int) – The number of segments in the PWC.

• end_value (float or complex or Tensor) – The asymptotic value of the ramp towards $$t \to +\infty$$, $$a_+$$. It must either be a scalar or contain a single element.

• start_value (float or complex or Tensor, optional) – The asymptotic value of the ramp towards $$t \to -\infty$$, $$a_-$$. If passed, it must either be a scalar or contain a single element. Defaults to minus end_value.

• ramp_duration (float or Tensor, optional) – The characteristic time for the hyperbolic tangent ramp, $$t_\mathrm{ramp}$$. If passed, it must either be a scalar or contain a single element. Defaults to $$T/6$$.

• center_time (float or Tensor, optional) – The time at which the ramp has its greatest slope, $$t_0$$. If passed, it must either be a scalar or contain a single element. Defaults to $$T/2$$.

• name (str, optional) – The name of the node.

Returns

The sampled hyperbolic tangent ramp.

Return type

Pwc

signals.linear_ramp_pwc()

Create a Pwc representing a linear ramp.

signals.tanh_ramp()

Function to create a Signal object representing a hyperbolic tangent ramp.

signals.tanh_ramp_stf()

Corresponding operation with Stf output.

tanh()

Calculate the element-wise hyperbolic tangent of an object.

Notes

The hyperbolic tangent ramp is defined as

$\mathop{\mathrm{Tanh}}(t) = \frac{a_+ + a_-}{2} + \frac{a_+ - a_-}{2} \tanh\left( \frac{t - t_0}{t_\mathrm{ramp}} \right) ,$

where the function’s asymptotic values $$a_\pm$$ are defined by:

$a_\pm := \lim_{t\to\pm\infty} \mathop{\mathrm{Tanh}}(t) ,$

and $$t_0$$ is related to $$t_\mathrm{ramp}$$ by:

$\left.\frac{{\rm d}\mathop{\mathrm{Tanh}}(t)}{{\rm d}t}\right|_{t=t_0} = \frac{ (a_+ - a_-)}{2 t_\mathrm{ramp}} .$

Note that if $$t_0$$ is close to the edges of the PWC, for example $$t_0 \lesssim 2 t_\mathrm{ramp}$$, then the first and last values of the PWC will differ from the expected asymptotic values.

With the default values of start_value ($$a_-$$), ramp_duration ($$t_\mathrm{ramp}$$), and center_time ($$t_0$$), the ramp expression simplifies to

$\mathop{\mathrm{Tanh}}(t) = A \tanh\left( \frac{t - T/2}{T/6} \right),$

where $$A = a_+$$ is the end value (the start value is then $$-A$$). This defines a symmetric ramp (around $$(T/2, 0)$$) between $$-0.995 A$$ (at $$t=0$$) and $$0.995 A$$ (at $$t=T$$).

Examples

Define a simple tanh PWC ramp.

>>> graph.signals.tanh_ramp_pwc(
...     duration=5.0, segment_count=50, end_value=1, name="tanh_ramp"
... )
<Pwc: name="tanh_ramp", operation_name="discretize_stf", value_shape=(), batch_shape=()>
>>> result = qctrl.functions.calculate_graph(graph=graph, output_node_names=["tanh_ramp"])
>>> result.output["tanh_ramp"]
[
{'value': -0.9944, 'duration': 0.1},
{'value': -0.9929, 'duration': 0.1},
...
{'value': 0.9929, 'duration': 0.1},
{'value': 0.9944, 'duration': 0.1},
]


Define a flat-top pulse from two hyperbolic tangent ramps.

>>> ramp = graph.signals.tanh_ramp_pwc(
...     duration=3,
...     segment_count=60,
...     end_value=1,
...     ramp_duration=0.25,
...     center_time=0.5,
... )
>>> flat_top_pulse = 0.5 * (ramp + graph.time_reverse_pwc(ramp))
>>> flat_top_pulse.name="flat_top_pulse"
>>> result = qctrl.functions.calculate_graph(graph=graph, output_node_names=["flat_top_pulse"])
>>> result.output["flat_top_pulse"]
[
{'value': 0.0219, 'duration': 0.05},
{'value': 0.0323, 'duration': 0.05},
...
{'value': 0.0323, 'duration': 0.05},
{'value': 0.0219, 'duration': 0.05},
]


Define a hyperbolic tangent ramp with optimizable parameters.

>>> end_value = graph.optimization_variable(
...     count=1, lower_bound=0, upper_bound=3e6, name="end_value"
... )
>>> ramp_duration = graph.optimization_variable(
...     count=1, lower_bound=0.1e-6, upper_bound=0.3e-6, name="ramp_duration"
... )
>>> center_time = graph.optimization_variable(
...     count=1, lower_bound=0.25e-6, upper_bound=0.75e-6, name="center_time"
... )
>>> graph.signals.tanh_ramp_pwc(
...     duration=1e-6,
...     segment_count=32,
...     end_value=end_value,
...     start_value=0.0,
...     ramp_duration=ramp_duration,
...     center_time=center_time,
...     name="tanh_ramp",
... )
<Pwc: name="tanh_ramp", operation_name="discretize_stf", value_shape=(), batch_shape=()>