TensorWaves 0.3.7
See all documentation for this version here.
💡 New features
Optimizer and Estimator type are now written to callback output (#364)
CSVSummary
was writing "estimator_type"
incorrectly (it was writing the optimizer type). This PR fixes that and adds the optimizer type as an additional entry, also to YAMLSummary
.
Lambdify with common sub-expressions (#374)
See cse
argument in sympy.lambdify()
. This fixes #345 (comment).
Note that lambdified source code becomes significantly smaller in larger expressions. Finding common sub-expressions has a small hit in performance when lambdifying, but in larger expressions, this is overcome by the fact that the output source code is smaller.
⚠️ Interface
Sympy implementation is now isolated in a sub-module (#344)
Extracted all SymPy functionality under tensorwaves.model
into a separate sub-module tensorwaves.model.sympy
.
Removed doit call from SympyModel (#347)
Closes #280
This means that doit()
has to be called on the expression first.
🐛 Bug fixes
Correct estimator value is now written to callback output (#364)
CSVSummary
was writing "estimator_type"
incorrectly (it was writing the optimizer type). This PR fixes that and adds the optimizer type as an additional entry, also to YAMLSummary
.
ComplexSqrt can now lambdified to TensorFlow as well (#365)
JAX and TensorFlow printing is forwarded to the NumPy printer, but with jax.numpy
and tensorflow.experimental.numpy
as Printer._module
respectively.
Other improvements:
- Extended tests for
find_function
and wrote a test for lambdifying AmpForm'sComplexSqrt
- Allow getting
tensorflow.Tensor
withfind_function
- Moved
_backend
module tofunction
, becausefunction
is most related to back-ends.
🔨 Internal maintenance
Swapped optimized_lambdify() implementation (#348)
Closes #322
The role of _backend_lambdify
and _sympy_lambdify
is now swapped:
_backend_lambdify
is now purely a wrapper aroundsympy.lambdify
._sympy_lambdify
offers a switch between_backend_lambdify
andoptimized_lambdify
.
These functions will change further in #292, but this is PR focuses only on the problem describe din #322.
Unit tests and integration tests are now split (#349)
All tests that require AmpForm have been seperated from proper unit tests (that require no additional dependencies). The folder structure under tests
is now:
tests
├── integration
└── unit
Additional improvements:
- Fixtures for the AmpForm tests have been parametrized:
qrules.ReactionInfo
is parametrized with the canonica-helicity and helicity formalism.SympyModel
is constructed with and withoutmax_complexity
argument in the constructor, so thatoptimized_lambdify
is tested as well.
- Improved error message of
LambdifiedFunction.update_parameters
: over-defined parameters were computed incorrectly. In addition, the error message now prints the expected parameters. - Callbacks can now take
pathlib.Path
(previously onlystr
). This makes it possible to convert theoutput_dir
fixture into aPath
as well.
Backend handling is now isolated in a sub-module (#350)
#344 created a module tensorwaves.model.backend
with the intention to collect functions that handle back-ends. This PR moves _find_function_in_backend
(which was under tensorwaves.estimator
) there as well, moves the module to the top, and hides it altogether, as these functions are implementation details.
Add unit tests for optimized_lambdify (#351)
Additional fixes:
- The faster-lambdify notebook was failing due to the interface change introduced by #348. This was not noticed, because the
%%time
statement in the cell makes the error code of that cell return 'success'. The error has been fixed and a hidden test cell has been added to prevent such failures in the future. optimized_lambdify
now directly calls_backend_lambdify
ismax_complexity
is higher than the number of nodes in the expression.
Callback output is written to separate files in the tests (#352)
Integration tests have become unstable since #349, see e.g. https://github.com/ComPWA/tensorwaves/actions/runs/1504632721, because the callback output is written to the same file when using optimized_lambdify
/ _backend_lambdify
.
Added unit tests for fast optimize (#360)
Closes #135
Adds a test under the tests/unit
folder that fits a small model with all back-ends and optimizers plus a unit test for generate_data
. This also helped fishing out some bugs (see commit history).
Other improvements:
- Import optimizers directly from the
tensorwaves.optimizer
module, e.g.:instead offrom tensorwaves.optimizer import Minuit2
from tensorwaves.optimizer.minuit import Minuit2
- CSVSummary writes estimator value as float (was complex by mistake)
- Latest function call number is also stored in
Loadable
callbacks. - Scipy now works with TF
Importing tensorwaves is now about 8x as fast (#363)
Import expensive modules inline to speed up importing tensorwaves
. This makes import tensorwaves
(and collecting tests) about 8x as fast. Profiling done with tuna as follows (see stackoverflow):
python3 -X importtime -c "import tensorwaves" 2> tw.log && tuna tw.log
Callbacks are now not run during optimize() if unspecified (#366)
Previously, if no callback was specified in the optimizer constructor, an empty CallbackList would be created and on_optimize_end etc were always called. This is (theoretically) slower.
Some other improvements:
- Use
attrs
next-generation API (see also ComPWA/compwa.github.io#90). - Avoid creating stream on creation of Loadable callback.
- Fail pytest on warnings (this helped fishing out the above bug)
Generalized SymPy printer implementation (#371)
📝 Documentation
Added API links to FitResult.specifics (#356)
Added links to the 'fit result' objects in the iminuit
and SciPy APIs.
🖱️ Developer Experience
Pytest on GitHub Actions is now stable (#355)
Fix-up to #349
Writing with a callback in a pytest fixture and then loading it back in a test led to instable CI. This PR should fix that.
Notebooks can now be run with pytest (#359)
Switch from pytest-notebook
to nbmake
. Now it's again possible to run specific notebooks from the terminal with e.g.:
pytest --nbmake docs/usage/basics.ipynb
Other small fixes:
- Avoid
fast_lambdify()
in Jupyter notebooks to speed up docs workflow. - Cast to
tuple
inParametrizedBackendFunction
.
Merge test jobs on GitHub Actions (#367)
Reorganise GitHub Action workflow for pytest. Extracted from #366 in order to identify potential performance issues. Notebooks slow after the changes introduced in #366, which may be caused by the changes to the callbacks.
Other changes;
- Treat warnings raised under pytest as errors.
- Renamed tox job for testing notebooks to
nb
.
Reduced dependencies in style requirements (#369)
Should speed up pre-commit job.
Pytest collect is now faster (#370)
Import expensive modules in the tests inline so that pytest --collect-only
is faster.