boundlab.zono.linearizers.Exp#

class boundlab.zono.linearizers.Exp[source]#

Bases: OpHandler

Chord-slope enclosure of \(e^x\).

With the chord slope \(\lambda = (e^u - e^l)/(u - l)\) (mean value: \(\lambda = e^\xi\) for some interior \(\xi\)), convexity puts the residual’s maximum at the endpoints — where the chord touches, value \(U = e^u - \lambda u\) — and its minimum at the tangency point \(x^* = \log\lambda\), value \(L = \lambda(1 - \log\lambda)\). Centering yields \(\mu = (U + L)/2\), \(\beta = (U - L)/2\). Near-degenerate intervals switch to the midpoint derivative, and any non-finite element falls back to the sound interval enclosure \(e^u/2 \pm e^u/2 \supseteq [0, e^u]\).

Methods

__init__

apply_bound

condition

Whether this handler applies to these operands (default: always).

handle

Transform the operands; sub-operations go through interp.<op> so the enclosing domain's handlers apply to them too.

override_handler

A copy of this handler that takes precedence over other when both are ready for the same call.

__call__(l, u, x=None)#

Call self as a function.

__init__(op='exp', apply_bound=<function linearizer_fn.<locals>.decorator.<locals>.LinearizerHandler.<lambda>>)#
apply_bound(x)#
condition(x, **kwargs)#

Whether this handler applies to these operands (default: always).

handle(interp, x, **kwargs)#

Transform the operands; sub-operations go through interp.<op> so the enclosing domain’s handlers apply to them too.

op: str = 'exp'#
override_handler(other)#

A copy of this handler that takes precedence over other when both are ready for the same call.

overrides: list[type[OpHandler]] = []#