Affine Pattern Matching¶
A sound but incomplete test to determine whether a funsor is affine with respect to all of its real inputs.
Parameters: fn (Funsor) – A funsor. Return type: bool
Returns a [sound sub]set of real inputs of
fnis known to be affine.
Parameters: fn (Funsor) – A funsor. Returns: A set of input names wrt which
Return type: frozenset
Extracts an affine representation of a funsor, satisfying:
x = ... const, coeffs = extract_affine(x) y = sum(Einsum(eqn, (coeff, Variable(var, coeff.output))) for var, (coeff, eqn) in coeffs.items()) assert_close(y, x) assert frozenset(coeffs) == affine_inputs(x)
coeffswill have one key per input wrt which
fnis known to be affine (via
coeffs.valueswill all be constant wrt these inputs.
The affine approximation is computed by ev evaluating
fnat zero and each basis vector. To improve performance, users may want to run under the
Parameters: fn (Funsor) – A funsor that is affine wrt the (add,mul) semiring in some subset of its inputs. Returns: A pair
(const, coeffs)where const is a funsor with no real inputs and
coeffsis an OrderedDict mapping input name to a
(coefficient, eqn)pair in einsum form.
Return type: tuple