gpflow 2.8.0__tar.gz → 2.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gpflow-2.8.0/gpflow.egg-info → gpflow-2.9.0}/PKG-INFO +1 -1
- {gpflow-2.8.0 → gpflow-2.9.0}/RELEASE.md +39 -1
- gpflow-2.9.0/VERSION +1 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/conf.py +1 -1
- {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/installation.rst +4 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/config/__config__.py +1 -2
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/categorical.py +0 -1
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/optimizers/natgrad.py +3 -1
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/optimizers/scipy.py +92 -11
- {gpflow-2.8.0 → gpflow-2.9.0/gpflow.egg-info}/PKG-INFO +1 -1
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/expectations/test_expectations.py +4 -4
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_methods.py +0 -3
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_sgpr.py +0 -3
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_svgp.py +0 -3
- gpflow-2.9.0/tests/gpflow/optimizers/test_scipy.py +547 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_monitor.py +23 -2
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_linear_noise.py +0 -1
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_method_equivalence.py +1 -1
- gpflow-2.8.0/VERSION +0 -1
- gpflow-2.8.0/tests/gpflow/optimizers/test_scipy.py +0 -223
- {gpflow-2.8.0 → gpflow-2.9.0}/LICENSE +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/MANIFEST.in +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/README.md +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/benchmark_api.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/benchmarks.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/dataset_api.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/datasets.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/grouping.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/metadata.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/metric_api.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/metrics.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/model_api.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/models.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/paths.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/plot.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/plotter_api.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/plotters.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/registry.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/run.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/sharding.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/tag.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/benchmarks.rst +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/bibliography.rst +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/getting_started.rst +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/index.rst +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/user_guide.rst +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/base.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/ci_utils.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/conditionals.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/dispatch.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/multioutput/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/multioutput/conditionals.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/multioutput/sample_conditionals.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/sample_conditionals.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/uncertain_conditionals.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/util.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/config/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/dispatch.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/kufs.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/kuus.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/multioutput/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/multioutput/kufs.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/multioutput/kuus.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/cross_kernels.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/dispatch.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/expectations.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/linears.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/mean_functions.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/misc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/products.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/quadratures.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/squared_exponentials.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/sums.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/experimental/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/experimental/utils.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/functions.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/inducing_patch.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/inducing_variables.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/multioutput/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/multioutput/inducing_variables.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/base.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/changepoints.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/convolutional.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/linears.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/misc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/multioutput/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/multioutput/kernels.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/periodic.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/statics.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/stationaries.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kullback_leiblers.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/base.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/misc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/multiclass.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/multilatent.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/scalar_continuous.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/scalar_discrete.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/utils.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/logdensities.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/mean_functions.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/cglb.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/gplvm.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/gpmc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/gpr.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/model.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/sgpmc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/sgpr.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/svgp.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/training_mixins.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/util.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/vgp.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/monitor/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/monitor/base.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/monitor/tensorboard.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/mypy_flags.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/optimizers/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/optimizers/mcmc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/posteriors.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/probability_distributions.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/py.typed +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/quadrature/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/quadrature/base.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/quadrature/deprecated.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/quadrature/gauss_hermite.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/type_flags.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/bijectors.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/misc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/model_utils.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/multipledispatch.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/ops.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/parameter_or_function.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/traversal.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/versions.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow.egg-info/SOURCES.txt +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow.egg-info/dependency_links.txt +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow.egg-info/requires.txt +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/gpflow.egg-info/top_level.txt +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/setup.cfg +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/setup.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_broadcasted_conditionals.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_conditionals.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_multioutput.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_uncertain_conditional.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_util.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/config/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/config/test_config.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conftest.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/covariances/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/covariances/test_base_covariances.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/covariances/test_multioutput.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/expectations/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/experimental/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/experimental/test_utils.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/reference.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_broadcasting.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_changepoints.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_coregion.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_kernels.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_positive_semidefinite.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_scaled_euclid_dist.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_function_params.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_heteroskedastic.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_heteroskedastic_constant_variance.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_likelihoods.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_multiclass.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_switched_likelihood.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_cglb.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_gplvm.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_gpr.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_gpr_posterior.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_mcmc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_model_predict.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_sgpr_posterior.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_svgp_posterior.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_training_mixins.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_variational.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_vgp.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_vgp_posterior.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/optimizers/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/optimizers/test_mcmc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/optimizers/test_natural_gradient.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/posteriors/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/posteriors/conftest.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/posteriors/test_bo_integration.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/posteriors/test_posteriors.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_all.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_base.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_base_prior.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_base_training.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_functions.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_inducing_variables.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_initial_value.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_kullback_leiblers.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_logdensities.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_bijectors.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_deepcopy.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_misc.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_model_utils.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_multipledispatch.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_ops.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_parameter_or_function.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_set_trainable.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_training_loop.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_traversal.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_utilities.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/__init__.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_benchmark.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_docs.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_dynamic_shapes.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_model_serialization.py +0 -0
- {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_notebooks.py +0 -0
|
@@ -33,7 +33,7 @@ This release contains contributions from:
|
|
|
33
33
|
<INSERT>, <NAME>, <HERE>, <USING>, <GITHUB>, <HANDLE>
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
# Release 2.
|
|
36
|
+
# Release 2.10.0 (next release)
|
|
37
37
|
|
|
38
38
|
<INSERT SMALL BLURB ABOUT RELEASE FOCUS AREA AND POTENTIAL TOOLCHAIN CHANGES>
|
|
39
39
|
|
|
@@ -66,6 +66,44 @@ This release contains contributions from:
|
|
|
66
66
|
<INSERT>, <NAME>, <HERE>, <USING>, <GITHUB>, <HANDLE>
|
|
67
67
|
|
|
68
68
|
|
|
69
|
+
# Release 2.9.0
|
|
70
|
+
|
|
71
|
+
This release adds caching of compiled graphs inside the Scipy optimizer, and adds support
|
|
72
|
+
for returning loss history. It also adds supports for Python 3.11.
|
|
73
|
+
|
|
74
|
+
## Major Features and Improvements
|
|
75
|
+
|
|
76
|
+
* Support returning loss history with Scipy optimizer.
|
|
77
|
+
* Scipy minimize wrapper caches compiled graphs and re-uses them if called with the same arguments.
|
|
78
|
+
This functionality can be disabled by setting the new `compile_cache_size` argument to 0.
|
|
79
|
+
|
|
80
|
+
## Bug Fixes and Other Changes
|
|
81
|
+
|
|
82
|
+
* Support and test with Python 3.11
|
|
83
|
+
* Test against a 'production' environment (in addition to 'min' and 'max' environments).
|
|
84
|
+
|
|
85
|
+
## Thanks to our Contributors
|
|
86
|
+
|
|
87
|
+
This release contains contributions from:
|
|
88
|
+
|
|
89
|
+
khurram-ghani, jesnie, uri-granta
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# Release 2.8.1
|
|
93
|
+
|
|
94
|
+
A small fix to ensure support for (and testing with) TensorFlow 2.12.
|
|
95
|
+
|
|
96
|
+
## Bug Fixes and Other Changes
|
|
97
|
+
|
|
98
|
+
* Support and test with TensorFlow 2.12
|
|
99
|
+
|
|
100
|
+
## Thanks to our Contributors
|
|
101
|
+
|
|
102
|
+
This release contains contributions from:
|
|
103
|
+
|
|
104
|
+
uri-granta
|
|
105
|
+
|
|
106
|
+
|
|
69
107
|
# Release 2.8.0
|
|
70
108
|
|
|
71
109
|
The main focus of this release is to provide users control over arguments for `tf.function`
|
gpflow-2.9.0/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.9.0
|
|
@@ -24,7 +24,7 @@ copyright = "2023, The GPflow Contributors"
|
|
|
24
24
|
author = "The GPflow Contributors"
|
|
25
25
|
|
|
26
26
|
# The full version, including alpha/beta/rc tags
|
|
27
|
-
release = "2.
|
|
27
|
+
release = "2.9.0"
|
|
28
28
|
|
|
29
29
|
# -- General configuration ---------------------------------------------------
|
|
30
30
|
|
|
@@ -25,6 +25,10 @@ explicitly install specific versions of these.
|
|
|
25
25
|
+---------------------+---------------------------------+
|
|
26
26
|
| 2.10.* | 0.18.* |
|
|
27
27
|
+---------------------+---------------------------------+
|
|
28
|
+
| 2.11.* | 0.19.* |
|
|
29
|
+
+---------------------+---------------------------------+
|
|
30
|
+
| 2.12.* | 0.20.* |
|
|
31
|
+
+---------------------+---------------------------------+
|
|
28
32
|
|
|
29
33
|
Second, a word of warning about new Mac computers. On new Mac machines you will need to install
|
|
30
34
|
``tensorflow-macos`` instead of the regular ``tensorflow``.
|
|
@@ -50,10 +50,9 @@ manager :func:`as_context`:
|
|
|
50
50
|
"""
|
|
51
51
|
|
|
52
52
|
import contextlib
|
|
53
|
-
import enum
|
|
54
53
|
import os
|
|
55
54
|
from dataclasses import dataclass, field, replace
|
|
56
|
-
from typing import Any, Dict, Generator, List, Mapping, Optional,
|
|
55
|
+
from typing import Any, Dict, Generator, List, Mapping, Optional, Union
|
|
57
56
|
|
|
58
57
|
import numpy as np
|
|
59
58
|
import tabulate
|
|
@@ -201,6 +201,8 @@ class NaturalGradient(tf.optimizers.Optimizer):
|
|
|
201
201
|
"""
|
|
202
202
|
name = self.__class__.__name__ if name is None else name
|
|
203
203
|
super().__init__(name)
|
|
204
|
+
# explicitly store name (as TF <2.12 stores it differently from TF 2.12+)
|
|
205
|
+
self.natgrad_name = name
|
|
204
206
|
self.gamma = gamma
|
|
205
207
|
self.xi_transform = xi_transform
|
|
206
208
|
|
|
@@ -263,7 +265,7 @@ class NaturalGradient(tf.optimizers.Optimizer):
|
|
|
263
265
|
q_mu_grads, q_sqrt_grads = tape.gradient(loss, [q_mu_vars, q_sqrt_vars])
|
|
264
266
|
# NOTE that these are the gradients in *unconstrained* space
|
|
265
267
|
|
|
266
|
-
with tf.name_scope(f"{self.
|
|
268
|
+
with tf.name_scope(f"{self.natgrad_name}/natural_gradient_steps"):
|
|
267
269
|
for q_mu_grad, q_sqrt_grad, q_mu, q_sqrt, xi_transform in zip(
|
|
268
270
|
q_mu_grads, q_sqrt_grads, q_mus, q_sqrts, xis
|
|
269
271
|
):
|
|
@@ -13,7 +13,19 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import warnings
|
|
16
|
-
from
|
|
16
|
+
from collections import OrderedDict
|
|
17
|
+
from typing import (
|
|
18
|
+
Any,
|
|
19
|
+
Callable,
|
|
20
|
+
FrozenSet,
|
|
21
|
+
Iterable,
|
|
22
|
+
List,
|
|
23
|
+
Mapping,
|
|
24
|
+
Optional,
|
|
25
|
+
Sequence,
|
|
26
|
+
Tuple,
|
|
27
|
+
Union,
|
|
28
|
+
)
|
|
17
29
|
|
|
18
30
|
import numpy as np
|
|
19
31
|
import scipy.optimize
|
|
@@ -31,6 +43,31 @@ LossClosure = Callable[[], tf.Tensor]
|
|
|
31
43
|
|
|
32
44
|
|
|
33
45
|
class Scipy:
|
|
46
|
+
def __init__(self, compile_cache_size: int = 2) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Wrapper around the scipy optimizer.
|
|
49
|
+
|
|
50
|
+
:param compile_cache_size: The number of compiled evalutation functions to cache for calls
|
|
51
|
+
to `minimize`. Only applies when `compile` argument to `minimize` is True.
|
|
52
|
+
|
|
53
|
+
The compiled evaluation functions are cached so that subsequent calls to `minimize` with
|
|
54
|
+
the same `closure`, `variables`, `allow_unused_variables`, and `tf_fun_args` will reuse
|
|
55
|
+
a previously compiled function. Up to `compile_cache_size` most recent functions are
|
|
56
|
+
cached. This can be disabled by setting `compile_cache_size` to 0.
|
|
57
|
+
"""
|
|
58
|
+
self.compile_cache: OrderedDict[
|
|
59
|
+
Tuple[Callable[[], Any], Tuple[int, ...], FrozenSet[Tuple[str, Any]], bool],
|
|
60
|
+
tf.function,
|
|
61
|
+
] = OrderedDict()
|
|
62
|
+
|
|
63
|
+
if compile_cache_size < 0:
|
|
64
|
+
raise ValueError(
|
|
65
|
+
"The 'compile_cache_size' argument must be non-negative, got {}.".format(
|
|
66
|
+
compile_cache_size
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
self.compile_cache_size = compile_cache_size
|
|
70
|
+
|
|
34
71
|
def minimize(
|
|
35
72
|
self,
|
|
36
73
|
closure: LossClosure,
|
|
@@ -40,6 +77,7 @@ class Scipy:
|
|
|
40
77
|
compile: bool = True,
|
|
41
78
|
allow_unused_variables: bool = False,
|
|
42
79
|
tf_fun_args: Optional[Mapping[str, Any]] = None,
|
|
80
|
+
track_loss_history: bool = False,
|
|
43
81
|
**scipy_kwargs: Any,
|
|
44
82
|
) -> OptimizeResult:
|
|
45
83
|
"""
|
|
@@ -68,6 +106,8 @@ class Scipy:
|
|
|
68
106
|
|
|
69
107
|
opt = gpflow.optimizers.Scipy()
|
|
70
108
|
opt.minimize(..., compile=True, tf_fun_args=dict(jit_compile=True))
|
|
109
|
+
:param track_loss_history: Whether to track the training loss history and return it in
|
|
110
|
+
the optimization result.
|
|
71
111
|
:param scipy_kwargs: Arguments passed through to `scipy.optimize.minimize`.
|
|
72
112
|
Note that Scipy's minimize() takes a `callback` argument, but you probably want to use
|
|
73
113
|
our wrapper and pass in `step_callback`.
|
|
@@ -98,16 +138,24 @@ class Scipy:
|
|
|
98
138
|
allow_unused_variables=allow_unused_variables,
|
|
99
139
|
tf_fun_args=tf_fun_args,
|
|
100
140
|
)
|
|
141
|
+
|
|
101
142
|
if step_callback is not None:
|
|
102
143
|
if "callback" in scipy_kwargs:
|
|
103
144
|
raise ValueError("Callback passed both via `step_callback` and `callback`")
|
|
104
|
-
|
|
105
145
|
callback = self.callback_func(variables, step_callback)
|
|
106
|
-
scipy_kwargs
|
|
146
|
+
scipy_kwargs["callback"] = callback
|
|
147
|
+
history: List[AnyNDArray] = []
|
|
148
|
+
if track_loss_history:
|
|
149
|
+
callback = self.loss_history_callback_func(func, history, scipy_kwargs.get("callback"))
|
|
150
|
+
scipy_kwargs["callback"] = callback
|
|
107
151
|
|
|
108
152
|
opt_result = scipy.optimize.minimize(
|
|
109
153
|
func, initial_params, jac=True, method=method, **scipy_kwargs
|
|
110
154
|
)
|
|
155
|
+
|
|
156
|
+
if track_loss_history:
|
|
157
|
+
opt_result["loss_history"] = history
|
|
158
|
+
|
|
111
159
|
values = self.unpack_tensors(variables, opt_result.x)
|
|
112
160
|
self.assign_tensors(variables, values)
|
|
113
161
|
return opt_result
|
|
@@ -116,9 +164,8 @@ class Scipy:
|
|
|
116
164
|
def initial_parameters(cls, variables: Sequence[tf.Variable]) -> tf.Tensor:
|
|
117
165
|
return cls.pack_tensors(variables)
|
|
118
166
|
|
|
119
|
-
@classmethod
|
|
120
167
|
def eval_func(
|
|
121
|
-
|
|
168
|
+
self,
|
|
122
169
|
closure: LossClosure,
|
|
123
170
|
variables: Sequence[tf.Variable],
|
|
124
171
|
tf_fun_args: Mapping[str, Any],
|
|
@@ -130,25 +177,41 @@ class Scipy:
|
|
|
130
177
|
def _tf_eval(x: tf.Tensor) -> Tuple[tf.Tensor, tf.Tensor]:
|
|
131
178
|
nonlocal first_call
|
|
132
179
|
|
|
133
|
-
values =
|
|
134
|
-
|
|
180
|
+
values = self.unpack_tensors(variables, x)
|
|
181
|
+
self.assign_tensors(variables, values)
|
|
135
182
|
|
|
136
183
|
if first_call:
|
|
137
184
|
# Only check for unconnected gradients on the first function evaluation.
|
|
138
185
|
loss, grads = _compute_loss_and_gradients(
|
|
139
186
|
closure, variables, tf.UnconnectedGradients.NONE
|
|
140
187
|
)
|
|
141
|
-
grads =
|
|
188
|
+
grads = self._filter_unused_variables(variables, grads, allow_unused_variables)
|
|
142
189
|
first_call = False
|
|
143
190
|
else:
|
|
144
191
|
loss, grads = _compute_loss_and_gradients(
|
|
145
192
|
closure, variables, tf.UnconnectedGradients.ZERO
|
|
146
193
|
)
|
|
147
194
|
|
|
148
|
-
return loss,
|
|
195
|
+
return loss, self.pack_tensors(grads)
|
|
149
196
|
|
|
150
197
|
if compile:
|
|
151
|
-
|
|
198
|
+
# Re-use the same tf.function graph for calls to minimize, as long as the arguments
|
|
199
|
+
# affecting the graph are the same. This can boost performance of use cases where
|
|
200
|
+
# minimize is called repeatedly with the same model loss.
|
|
201
|
+
key = (
|
|
202
|
+
closure,
|
|
203
|
+
tuple(id(v) for v in variables),
|
|
204
|
+
frozenset(tf_fun_args.items()),
|
|
205
|
+
allow_unused_variables,
|
|
206
|
+
)
|
|
207
|
+
if self.compile_cache_size > 0:
|
|
208
|
+
if key not in self.compile_cache:
|
|
209
|
+
if len(self.compile_cache) >= self.compile_cache_size:
|
|
210
|
+
self.compile_cache.popitem(last=False) # Remove the oldest entry.
|
|
211
|
+
self.compile_cache[key] = tf.function(_tf_eval, **tf_fun_args)
|
|
212
|
+
_tf_eval = self.compile_cache[key]
|
|
213
|
+
else:
|
|
214
|
+
_tf_eval = tf.function(_tf_eval, **tf_fun_args)
|
|
152
215
|
|
|
153
216
|
def _eval(x: AnyNDArray) -> Tuple[AnyNDArray, AnyNDArray]:
|
|
154
217
|
loss, grad = _tf_eval(tf.convert_to_tensor(x))
|
|
@@ -186,7 +249,8 @@ class Scipy:
|
|
|
186
249
|
def callback_func(
|
|
187
250
|
cls, variables: Sequence[tf.Variable], step_callback: StepCallback
|
|
188
251
|
) -> Callable[[AnyNDArray], None]:
|
|
189
|
-
|
|
252
|
+
# Convert a step_callback function to a Scipy callback function
|
|
253
|
+
step: int = 0
|
|
190
254
|
|
|
191
255
|
def _callback(x: AnyNDArray) -> None:
|
|
192
256
|
nonlocal step
|
|
@@ -201,6 +265,23 @@ class Scipy:
|
|
|
201
265
|
|
|
202
266
|
return _callback
|
|
203
267
|
|
|
268
|
+
@classmethod
|
|
269
|
+
def loss_history_callback_func(
|
|
270
|
+
cls,
|
|
271
|
+
minimize_func: Callable[[AnyNDArray], Tuple[AnyNDArray, AnyNDArray]],
|
|
272
|
+
history: List[AnyNDArray],
|
|
273
|
+
callback: Optional[Callable[[AnyNDArray], None]] = None,
|
|
274
|
+
) -> Callable[[AnyNDArray], None]:
|
|
275
|
+
# Return a Scipy callback function that tracks loss history, optionally combined
|
|
276
|
+
# with another callback.
|
|
277
|
+
|
|
278
|
+
def _callback(x: AnyNDArray) -> None:
|
|
279
|
+
if callback is not None:
|
|
280
|
+
callback(x)
|
|
281
|
+
history.append(minimize_func(x)[0])
|
|
282
|
+
|
|
283
|
+
return _callback
|
|
284
|
+
|
|
204
285
|
@staticmethod
|
|
205
286
|
def pack_tensors(tensors: Sequence[Union[tf.Tensor, tf.Variable]]) -> tf.Tensor:
|
|
206
287
|
flats = [tf.reshape(tensor, (-1,)) for tensor in tensors]
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from typing import Any, Callable, Iterable, Mapping, Sequence
|
|
15
|
+
from typing import Any, Callable, Iterable, Mapping, Optional, Sequence
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
import pytest
|
|
@@ -128,9 +128,9 @@ def inducing_variable() -> iv.InducingVariables:
|
|
|
128
128
|
return iv.InducingPoints(Z)
|
|
129
129
|
|
|
130
130
|
|
|
131
|
-
def _check(params: Iterable[Any]) -> None:
|
|
131
|
+
def _check(params: Iterable[Any], nghp: Optional[int] = None) -> None:
|
|
132
132
|
analytic = expectation(*params)
|
|
133
|
-
quad = quadrature_expectation(*params)
|
|
133
|
+
quad = quadrature_expectation(*params, nghp=nghp) # type: ignore[misc]
|
|
134
134
|
assert_allclose(analytic, quad, rtol=RTOL)
|
|
135
135
|
|
|
136
136
|
|
|
@@ -302,7 +302,7 @@ def test_exKxz_markov(
|
|
|
302
302
|
mean: mf.MeanFunction,
|
|
303
303
|
inducing_variable: iv.InducingVariables,
|
|
304
304
|
) -> None:
|
|
305
|
-
_check((distribution, (kernel, inducing_variable), mean))
|
|
305
|
+
_check((distribution, (kernel, inducing_variable), mean), nghp=20)
|
|
306
306
|
|
|
307
307
|
|
|
308
308
|
@pytest.mark.parametrize("distribution", distrs("dirac_markov_gauss"))
|
|
@@ -11,8 +11,6 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
|
|
15
|
-
from dataclasses import dataclass
|
|
16
14
|
from typing import List
|
|
17
15
|
|
|
18
16
|
import numpy as np
|
|
@@ -27,7 +25,6 @@ from gpflow.base import AnyNDArray
|
|
|
27
25
|
# ------------------------------------------
|
|
28
26
|
|
|
29
27
|
|
|
30
|
-
@dataclass(frozen=True)
|
|
31
28
|
class Datum:
|
|
32
29
|
rng: np.random.RandomState = np.random.RandomState(0)
|
|
33
30
|
X: AnyNDArray = rng.randn(100, 2)
|
|
@@ -11,8 +11,6 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
from dataclasses import dataclass
|
|
15
|
-
|
|
16
14
|
import numpy as np
|
|
17
15
|
import tensorflow as tf
|
|
18
16
|
|
|
@@ -21,7 +19,6 @@ from gpflow.base import AnyNDArray
|
|
|
21
19
|
from gpflow.utilities import to_default_float
|
|
22
20
|
|
|
23
21
|
|
|
24
|
-
@dataclass(frozen=True)
|
|
25
22
|
class Datum:
|
|
26
23
|
rng: np.random.RandomState = np.random.RandomState(0)
|
|
27
24
|
X: AnyNDArray = rng.randn(100, 2)
|
|
@@ -11,8 +11,6 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
|
|
15
|
-
from dataclasses import dataclass
|
|
16
14
|
from typing import Sequence
|
|
17
15
|
|
|
18
16
|
import numpy as np
|
|
@@ -26,7 +24,6 @@ from gpflow.base import AnyNDArray
|
|
|
26
24
|
from gpflow.models import SVGP
|
|
27
25
|
|
|
28
26
|
|
|
29
|
-
@dataclass(frozen=True)
|
|
30
27
|
class DatumSVGP:
|
|
31
28
|
rng: np.random.RandomState = np.random.RandomState(0)
|
|
32
29
|
X: AnyNDArray = rng.randn(20, 1)
|