_See all documentation for this version [here](https://tensorwaves.rtfd.io/en/0.4.1)._
💡 New features
<details>
<summary>Implemented create_cached_function() (397)</summary>
Closes 358
Expression tree optimizations sketched [here](https://tensorwaves.readthedocs.io/en/0.4.0/amplitude-analysis.html#prepare-parametrized-function) have been bundled in a new function [`create_cached_function()`](https://tensorwaves--397.org.readthedocs.build/en/397/api/tensorwaves.estimator.html#tensorwaves.estimator.create_cached_function). A usage notebook can be previewed [here](https://tensorwaves--397.org.readthedocs.build/en/397/usage/caching.html).
</details>
⚠️ Interface
<details>
<summary>TensorFlow has become an optional dependency (394)</summary>
All computational backends are now optional dependencies (apart from NumPy). So for instance, to install TensorWaves with JAX, run:
shell
pip install tensorwaves[jax]
To do amplitude analysis, install with:
shell
pip install tensorwaves[jax,pwa]
</details>
🐛 Bug fixes
<details>
<summary>Progress bar of domain generator is hidden in IntensityDistributionGenerator (396)</summary>
Closes 395
python
import ampform
import qrules
from ampform.dynamics.builder import create_relativistic_breit_wigner_with_ff
from tensorwaves.data import (
IntensityDistributionGenerator,
TFPhaseSpaceGenerator,
TFUniformRealNumberGenerator,
)
from tensorwaves.data.transform import SympyDataTransformer
from tensorwaves.function.sympy import create_parametrized_function
reaction = qrules.generate_transitions(
initial_state="J/psi(1S)",
final_state=["gamma", "pi0", "pi0"],
allowed_intermediate_particles=["f(0)"],
allowed_interaction_types=["strong", "EM"],
)
builder = ampform.get_builder(reaction)
resonances = reaction.get_intermediate_particles()
for p in resonances:
builder.set_dynamics(p.name, create_relativistic_breit_wigner_with_ff)
model = builder.formulate()
intensity = create_parametrized_function(
model.expression.doit(),
parameters=model.parameter_defaults,
backend="jax",
)
helicity_transformer = SympyDataTransformer.from_sympy(
model.kinematic_variables, backend="jax"
)
phsp_generator = TFPhaseSpaceGenerator(
initial_state_mass=reaction.initial_state[-1].mass,
final_state_masses={i: p.mass for i, p in reaction.final_state.items()},
)
data_generator = IntensityDistributionGenerator(
function=intensity,
domain_generator=phsp_generator,
domain_transformer=helicity_transformer,
)
rng = TFUniformRealNumberGenerator(seed=0)
phsp_momenta = phsp_generator.generate(1_000_000, rng)
data_momenta = data_generator.generate(100_000, rng)

</details>
🖱️ Developer Experience
<details>
<summary>Increased test coverage (393)</summary>
- Wrote some additional tests for the `tensorwaves.function` module
- [`TYPE_CHECKING`](https://docs.python.org/3/library/typing.html#typing.TYPE_CHECKING) is now [ignored](https://coverage.readthedocs.io/en/latest/excluding.html#excluding-code-from-coverage-py) in test coverage
</details>