boundlab.ExprGroup#
- class boundlab.ExprGroup[source]#
-
A typed sum of components: at most one
Exprper class.Linear primitives map over the members;
ub/lbadd the members’ bounds (sound since the components are summed). Build one withfrom_sum(), which merges same-class addends viaaddand never nests groups.Methods
Bound on the magnitude: \(\max(|lb|, ub) \ge \sup |x|\).
Same-class addition;
__add__dispatches here when classes match and otherwise groups the addends in anExprGroup.Center/halfwidth form:
c = (ub + lb) / 2,w = (ub - lb) / 2.The set of component classes present in this value.
Hook: build an instance of
clsrepresenting exactlyexpr, orNonewhen this class cannot.Hook: convert
selfintoexpr_type, orNonewhen this class does not know how.Apply the linear map described by an integer-label einsum.
Lift a tensor/scalar into a broadcast
Bias; passExprthrough.Normalized sum of arbitrary components.
Create a new dictionary with keys from iterable and values set to value.
Return the value for key if key is in the dictionary, else default.
Sound elementwise lower bound on every concrete value represented.
(lb, ub)in one call; components override it when computing both at once is cheaper than two passes.If the key is not found, return the default if given; otherwise, raise a KeyError.
Remove and return a (key, value) pair as a 2-tuple.
Insert key with a value of default if key is not in the dictionary.
Split into
(matching, rest)so thatmatching + rest == self.Convert to another component class, exactly.
Collapse to the box hull
Bias(c) + Noise(w).Diagnostics as a
TensorFormat.Sound elementwise upper bound on every concrete value represented.
If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]
- static from_sum(*args)[source]#
Normalized sum of arbitrary components.
Same-class addends are merged with
add,Zerosvanish, and the result collapses to a bare component (orZeros) whenever fewer than two classes remain.
- property shape_dtype: ShapeDtype#
Allocation-free
(shape, dtype)metadata of the value.
- einsum(subscripts, *operands)[source]#
Apply the linear map described by an integer-label einsum.
subscriptsholds one label tuple per input followed by the output labels (seeboundlab.utils.einsum_parser()). This is the single linear primitive:__mul__,__matmul__,sumandmeanall lower to it, so implementing it soundly makes every derived linear operation sound.
- add(other)[source]#
Same-class addition;
__add__dispatches here when classes match and otherwise groups the addends in anExprGroup.
- lbub()[source]#
(lb, ub)in one call; components override it when computing both at once is cheaper than two passes.
- torch_print(group='reason')[source]#
Diagnostics as a
TensorFormat.The result is safe to hand to
Torch diagnostic outputunder tracing: only plain arrays cross the callback boundary, never expression metadata (which may hold tracers, e.g. reason weights).
- split(u: type[U], /) tuple[U, Expr][source]#
- split(u: type[U], v: type[V], /) tuple[ExprGroup[U | V], Expr]
- split(u: type[U], v: type[V], w: type[W], /) tuple[ExprGroup[U | V | W], Expr]
- split(u: type[U], v: type[V], w: type[W], x: type[X], /) tuple[ExprGroup[U | V | W | X], Expr]
Split into
(matching, rest)so thatmatching + rest == self.The main way handlers peel off the component class they transform while passing the remainder through untouched.
- __add__(other)#
- __mul__(other)#
- classmethod __new__(*args, **kwargs)#
- absub()#
Bound on the magnitude: \(\max(|lb|, ub) \ge \sup |x|\).
- classset()#
The set of component classes present in this value.
A single component reports
{type(self)}, anExprGroupits member classes, andZerosthe empty set. Handlers use this to decide which part of a value they know how to transform.
- clear() None. Remove all items from D.#
- classmethod convert_from(expr)#
Hook: build an instance of
clsrepresenting exactlyexpr, orNonewhen this class cannot. One half ofto().
- convert_to(expr_type)#
Hook: convert
selfintoexpr_type, orNonewhen this class does not know how. The other half ofto().
- copy() a shallow copy of D#
- static from_exprlike(expr, shape)#
Lift a tensor/scalar into a broadcast
Bias; passExprthrough.
- classmethod fromkeys(iterable, value=None, /)#
Create a new dictionary with keys from iterable and values set to value.
- get(key, default=None, /)#
Return the value for key if key is in the dictionary, else default.
- items() a set-like object providing a view on D's items#
- keys() a set-like object providing a view on D's keys#
- keyset()#
- matmul(other)#
- mean(axis, keepdims=False)#
- numel()#
- pop(k[, d]) v, remove specified key and return the corresponding value.#
If the key is not found, return the default if given; otherwise, raise a KeyError.
- popitem()#
Remove and return a (key, value) pair as a 2-tuple.
Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.
- rmatmul(other)#
- setdefault(key, default=None, /)#
Insert key with a value of default if key is not in the dictionary.
Return the value for key if key is in the dictionary, else default.
- squeeze(axes=None)#
- sum(axis, keepdims=False)#
- to(expr_type)#
Convert to another component class, exactly.
Identity short-circuits; otherwise the target’s
convert_fromis tried, then this class’sconvert_to. RaisesTypeErrorwhen neither side knows the conversion — conversions never approximate.
- to_intervals(name='')#
Collapse to the box hull
Bias(c) + Noise(w).Sound but lossy: every correlation between error symbols is dropped, so downstream cancellation (
x - x = 0) no longer happens.
- unsqueeze(axes)#
- update([E, ]**F) None. Update D from mapping/iterable E and F.#
If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]
- values() an object providing a view on D's values#