Source code for aspire.flows.jax.utils
from typing import Callable
import flowjax.bijections
import flowjax.distributions
import flowjax.flows
import jax
import jax.numpy as jnp
import jax.random as jrandom
[docs]
def get_flow_function_class(name: str) -> Callable:
try:
return getattr(flowjax.flows, name)
except AttributeError:
raise ValueError(f"Unknown flow function: {name}")
[docs]
def get_bijection_class(name: str) -> Callable:
try:
return getattr(flowjax.bijections, name)
except AttributeError:
raise ValueError(f"Unknown bijection: {name}")
[docs]
def get_flow(
*,
key: jax.Array,
dims: int,
flow_type: str | Callable = "masked_autoregressive_flow",
bijection_type: str | flowjax.bijections.AbstractBijection | None = None,
bijection_kwargs: dict | None = None,
dtype=None,
**kwargs,
) -> flowjax.distributions.Transformed:
dtype = dtype or jnp.float32
if isinstance(flow_type, str):
flow_type = get_flow_function_class(flow_type)
if isinstance(bijection_type, str):
bijection_type = get_bijection_class(bijection_type)
if bijection_type is not None:
transformer = bijection_type(**bijection_kwargs)
else:
transformer = None
if bijection_kwargs is None:
bijection_kwargs = {}
base_dist = flowjax.distributions.Normal(jnp.zeros(dims, dtype=dtype))
key, subkey = jrandom.split(key)
return flow_type(
subkey,
base_dist=base_dist,
transformer=transformer,
**kwargs,
)