Parameter Transformations#

class BaseParameterTransformation(*args: Any, **kwargs: Any)[source]#

Bases: Module

Abstract interface for parameter transformations.

Subclasses provide unwrap/wrap implementations that translate between constrained and unconstrained representations of parameters.

abstractmethod unwrap(parameter: BaseParameter[V]) BaseParameter[V][source]#

Transforms a parameter from constrained to unconstrained space.

Parameters:

parameter – Parameter to transform.

Returns:

Transformed parameter instance.

Return type:

BaseParameter

abstractmethod wrap(parameter: BaseParameter[V]) BaseParameter[V][source]#

Transforms a parameter from unconstrained space back to its original domain.

Parameters:

parameter – Parameter to transform.

Returns:

Parameter in its original space.

Return type:

BaseParameter

class MinuitTransform(*args: Any, **kwargs: Any)[source]#

Bases: BaseParameterTransformation

Implements MINUIT-style transformations for bounded parameters.

Both lower and upper bounds must be finite for the transformation to be well-defined.

References

MINUIT User’s Guide, Section 1.2.1 The transformation for parameters with limits.

Examples

>>> import evermore as evm
>>> from evermore.parameters import transform as tr
>>> minuit = tr.MinuitTransform()
>>> params = {
...     "a": evm.Parameter(2.0, lower=-0.1, upper=2.2, transform=minuit),
...     "b": evm.Parameter(0.1, lower=0.0, upper=1.1, transform=minuit),
... }
>>> unconstrained = tr.unwrap(params)
>>> restored = tr.wrap(unconstrained)
>>> restored["a"].get_value() == params["a"].get_value()
Array(True, dtype=bool)
unwrap(parameter: BaseParameter[V]) BaseParameter[V][source]#

Transforms a parameter from constrained to unconstrained space.

Parameters:

parameter – Parameter to transform.

Returns:

Transformed parameter instance.

Return type:

BaseParameter

wrap(parameter: BaseParameter[V]) BaseParameter[V][source]#

Transforms a parameter from unconstrained space back to its original domain.

Parameters:

parameter – Parameter to transform.

Returns:

Parameter in its original space.

Return type:

BaseParameter

class SoftPlusTransform(*args: Any, **kwargs: Any)[source]#

Bases: BaseParameterTransformation

Ensures parameters remain positive by using the softplus bijection.

This transformation does not require explicit bounds; unwrap maps to the unconstrained real line and wrap maps back to the positive reals.

Examples

>>> import evermore as evm
>>> from evermore.parameters import transform as tr
>>> positive = tr.SoftPlusTransform()
>>> params = {
...     "a": evm.Parameter(2.0, transform=positive),
...     "b": evm.Parameter(0.1, transform=positive),
... }
>>> unconstrained = tr.unwrap(params)
>>> restored = tr.wrap(unconstrained)
>>> restored["b"].get_value()
Array(0.1, dtype=float32)
unwrap(parameter: BaseParameter[V]) BaseParameter[V][source]#

Applies the inverse softplus transformation after validating the value.

wrap(parameter: BaseParameter[V]) BaseParameter[V][source]#

Transforms a parameter from unconstrained space back to its original domain.

Parameters:

parameter – Parameter to transform.

Returns:

Parameter in its original space.

Return type:

BaseParameter

unwrap(params: PT) PT[source]#

Applies registered transformations to move parameters into unconstrained space.

Parameters:

params – PyTree that may contain parameters with attached transformations.

Returns:

PyTree where each parameter has been transformed via unwrap.

wrap(params: PT) PT[source]#

Applies registered transformations to move parameters back to constrained space.

Parameters:

params – PyTree that may contain parameters with attached transformations.

Returns:

PyTree where each parameter has been transformed via wrap.