gpflow 2.11.0__tar.gz → 2.11.2__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.11.0/gpflow.egg-info → gpflow-2.11.2}/PKG-INFO +2 -1
- {gpflow-2.11.0 → gpflow-2.11.2}/RELEASE.md +21 -16
- gpflow-2.11.2/VERSION +1 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/conf.py +1 -1
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/hierarchical.py +13 -2
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/posteriors.py +5 -0
- {gpflow-2.11.0 → gpflow-2.11.2/gpflow.egg-info}/PKG-INFO +2 -1
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow.egg-info/requires.txt +1 -6
- {gpflow-2.11.0 → gpflow-2.11.2}/setup.py +2 -3
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_broadcasting.py +16 -5
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_hierarchical.py +76 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_gpr.py +38 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_sgpr.py +36 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_svgp.py +31 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_vgp.py +34 -0
- gpflow-2.11.0/VERSION +0 -1
- {gpflow-2.11.0 → gpflow-2.11.2}/LICENSE +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/MANIFEST.in +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/README.md +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/benchmark_api.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/benchmarks.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/dataset_api.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/datasets.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/grouping.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/metadata.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/metric_api.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/metrics.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/model_api.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/models.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/paths.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/plot.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/plotter_api.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/plotters.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/registry.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/run.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/sharding.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/tag.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/benchmarks.rst +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/bibliography.rst +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/getting_started.rst +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/index.rst +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/installation.rst +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/user_guide.rst +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/base.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/ci_utils.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/conditionals.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/dispatch.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/multioutput/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/multioutput/conditionals.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/multioutput/sample_conditionals.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/sample_conditionals.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/uncertain_conditionals.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/util.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/config/__config__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/config/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/dispatch.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/kufs.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/kuus.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/multioutput/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/multioutput/kufs.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/multioutput/kuus.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/cross_kernels.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/dispatch.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/expectations.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/linears.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/mean_functions.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/misc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/products.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/quadratures.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/squared_exponentials.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/sums.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/experimental/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/experimental/utils.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/functions.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/inducing_patch.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/inducing_variables.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/multioutput/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/multioutput/inducing_variables.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/keras.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/base.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/categorical.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/changepoints.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/convolutional.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/hierarchical_axioms.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/linears.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/misc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/multioutput/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/multioutput/kernels.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/periodic.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/statics.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/stationaries.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kullback_leiblers.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/base.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/misc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/multiclass.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/multilatent.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/scalar_continuous.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/scalar_discrete.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/utils.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/logdensities.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/mean_functions.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/cglb.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/gplvm.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/gpmc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/gpr.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/model.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/sgpmc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/sgpr.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/svgp.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/training_mixins.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/util.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/vgp.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/monitor/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/monitor/base.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/monitor/tensorboard.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/mypy_flags.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/optimizers/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/optimizers/mcmc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/optimizers/natgrad.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/optimizers/scipy.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/probability_distributions.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/py.typed +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/quadrature/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/quadrature/base.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/quadrature/deprecated.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/quadrature/gauss_hermite.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/type_flags.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/bijectors.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/misc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/model_utils.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/multipledispatch.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/ops.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/parameter_or_function.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/traversal.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/versions.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow.egg-info/SOURCES.txt +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow.egg-info/dependency_links.txt +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/gpflow.egg-info/top_level.txt +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/setup.cfg +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_broadcasted_conditionals.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_conditionals.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_multioutput.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_uncertain_conditional.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_util.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/config/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/config/test_config.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conftest.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/covariances/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/covariances/test_base_covariances.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/covariances/test_multioutput.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/expectations/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/expectations/test_expectations.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/experimental/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/experimental/test_utils.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/reference.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_changepoints.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_coregion.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_hierarchical_axioms.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_kernels.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_positive_semidefinite.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_scaled_euclid_dist.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_function_params.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_heteroskedastic.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_heteroskedastic_constant_variance.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_likelihoods.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_multiclass.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_switched_likelihood.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_cglb.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_gplvm.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_gpr_posterior.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_mcmc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_methods.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_model_predict.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_sgpr_posterior.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_svgp_posterior.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_training_mixins.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_variational.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_vgp_posterior.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/optimizers/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/optimizers/test_mcmc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/optimizers/test_natural_gradient.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/optimizers/test_scipy.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/posteriors/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/posteriors/conftest.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/posteriors/test_bo_integration.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/posteriors/test_posteriors.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_all.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_base.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_base_prior.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_base_training.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_functions.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_inducing_variables.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_initial_value.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_kullback_leiblers.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_logdensities.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_monitor.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_bijectors.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_deepcopy.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_misc.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_model_utils.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_multipledispatch.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_ops.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_parameter_or_function.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_set_trainable.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_training_loop.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_traversal.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_utilities.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/__init__.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_benchmark.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_docs.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_dynamic_shapes.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_linear_noise.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_method_equivalence.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_model_serialization.py +0 -0
- {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_notebooks.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: gpflow
|
|
3
|
-
Version: 2.11.
|
|
3
|
+
Version: 2.11.2
|
|
4
4
|
Summary: Gaussian process methods in TensorFlow
|
|
5
5
|
Home-page: https://www.gpflow.org
|
|
6
6
|
Author: James Hensman, Alex Matthews
|
|
@@ -23,6 +23,7 @@ Classifier: Programming Language :: Python :: 3.7
|
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.8
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.9
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.10
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
26
27
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
27
28
|
Classifier: Typing :: Typed
|
|
28
29
|
Requires-Python: >=3.7
|
|
@@ -33,35 +33,40 @@ This release contains contributions from:
|
|
|
33
33
|
<INSERT>, <NAME>, <HERE>, <USING>, <GITHUB>, <HANDLE>
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
# Release 2.11.
|
|
36
|
+
# Release 2.11.2
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
This release adds support for TensorFlow 2.18.
|
|
39
39
|
|
|
40
|
-
##
|
|
40
|
+
## Known Caveats
|
|
41
41
|
|
|
42
|
-
*
|
|
43
|
-
* <THIS SECTION SHOULD CONTAIN API AND BEHAVIORAL BREAKING CHANGES>
|
|
42
|
+
* GPflow no longer depends on `tensorflow-macos` on Apple Silicon Macs, as that package is no longer released after TensorFlow 2.16. The regular `tensorflow` package is used on all platforms instead. Note that it only provides Apple Silicon wheels for TensorFlow 2.13 and later.
|
|
44
43
|
|
|
45
|
-
##
|
|
44
|
+
## Bug Fixes and Other Changes
|
|
46
45
|
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
46
|
+
* Fix an issue with Tensorflow's Cholesky decomposition where it can fail silently.
|
|
47
|
+
* Support and test against TensorFlow 2.18 (and TensorFlow Probability 0.25).
|
|
48
|
+
* Test the production configuration against Python 3.11.
|
|
50
49
|
|
|
51
|
-
##
|
|
50
|
+
## Thanks to our Contributors
|
|
52
51
|
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
This release contains contributions from:
|
|
53
|
+
|
|
54
|
+
uri-granta
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# Release 2.11.1
|
|
58
|
+
|
|
59
|
+
This release fixes a bug in the hierarchical kernels introduced in 2.11.0.
|
|
55
60
|
|
|
56
61
|
## Bug Fixes and Other Changes
|
|
57
62
|
|
|
58
|
-
*
|
|
59
|
-
* <IF A CHANGE CLOSES A GITHUB ISSUE, IT SHOULD BE DOCUMENTED HERE>
|
|
60
|
-
* <NOTES SHOULD BE GROUPED PER AREA>
|
|
63
|
+
* Fix `ArcHierarchical` and `WedgeHierarchical` parameter bounds to be per-conditional-column vectors rather than scalars, enabling correct multistart hyperparameter sampling (e.g. via `randomize_hyperparameters`).
|
|
61
64
|
|
|
62
65
|
## Thanks to our Contributors
|
|
63
66
|
|
|
64
|
-
|
|
67
|
+
This release contains contributions from:
|
|
68
|
+
|
|
69
|
+
mawbray
|
|
65
70
|
|
|
66
71
|
|
|
67
72
|
# Release 2.11.0
|
gpflow-2.11.2/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.11.2
|
|
@@ -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.11.
|
|
27
|
+
release = "2.11.2"
|
|
28
28
|
|
|
29
29
|
# -- General configuration ---------------------------------------------------
|
|
30
30
|
|
|
@@ -51,6 +51,17 @@ def _check_non_negative_unique(values: Sequence[int], name: str) -> None:
|
|
|
51
51
|
raise ValueError(f"`{name}` contains duplicate entries: {list(values)}.")
|
|
52
52
|
|
|
53
53
|
|
|
54
|
+
def _vector_sigmoid(low: float, high: float, n: int) -> tfp.bijectors.Sigmoid:
|
|
55
|
+
"""A ``Sigmoid`` bijector whose ``low``/``high`` are length-``n`` vectors, so
|
|
56
|
+
per-element bounds line up with an ``[n]``-shaped Parameter (e.g. for
|
|
57
|
+
bound-aware multistart restart sampling)."""
|
|
58
|
+
ones = tf.ones(n, dtype=default_float())
|
|
59
|
+
return tfp.bijectors.Sigmoid(
|
|
60
|
+
low=to_default_float(low) * ones,
|
|
61
|
+
high=to_default_float(high) * ones,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
54
65
|
def _active_dims_width(active_dims: NormalizedActiveDims) -> Optional[int]:
|
|
55
66
|
"""Number of columns selected by ``active_dims``, or ``None`` if it cannot
|
|
56
67
|
be determined without knowing the input dimension (an open-ended slice)."""
|
|
@@ -442,7 +453,7 @@ class ArcHierarchical(HierarchicalEmbeddingKernel):
|
|
|
442
453
|
if self._n_cond > 0:
|
|
443
454
|
self.angle = Parameter(
|
|
444
455
|
0.5 * tf.ones(self._n_cond, dtype=default_float()),
|
|
445
|
-
transform=
|
|
456
|
+
transform=_vector_sigmoid(0.1, 0.9, self._n_cond),
|
|
446
457
|
name="angle",
|
|
447
458
|
)
|
|
448
459
|
self.radius = Parameter(
|
|
@@ -499,7 +510,7 @@ class WedgeHierarchical(HierarchicalEmbeddingKernel):
|
|
|
499
510
|
)
|
|
500
511
|
self.rho = Parameter(
|
|
501
512
|
0.5 * np.pi * tf.ones(self._n_cond, dtype=default_float()),
|
|
502
|
-
transform=
|
|
513
|
+
transform=_vector_sigmoid(1e-6, np.pi, self._n_cond),
|
|
503
514
|
name="rho",
|
|
504
515
|
)
|
|
505
516
|
|
|
@@ -420,6 +420,7 @@ class GPRPosterior(AbstractPosterior):
|
|
|
420
420
|
Kmm = self.kernel(X_data)
|
|
421
421
|
Kmm_plus_s = add_likelihood_noise_cov(Kmm, self.likelihood, X_data)
|
|
422
422
|
Lm = tf.linalg.cholesky(Kmm_plus_s)
|
|
423
|
+
tf.debugging.check_numerics(Lm, "GPR posterior Cholesky factor is non-finite")
|
|
423
424
|
|
|
424
425
|
D = err.shape[1]
|
|
425
426
|
M = X_data.shape[0]
|
|
@@ -531,11 +532,13 @@ class SGPRPosterior(AbstractPosterior):
|
|
|
531
532
|
sigma = tf.sqrt(sigma_sq)
|
|
532
533
|
|
|
533
534
|
L = tf.linalg.cholesky(kuu) # cache alpha, qinv
|
|
535
|
+
tf.debugging.check_numerics(L, "SGPR posterior inducing Cholesky factor is non-finite")
|
|
534
536
|
A = tf.linalg.triangular_solve(L, kuf / sigma, lower=True)
|
|
535
537
|
B = tf.linalg.matmul(A, A, transpose_b=True) + tf.eye(
|
|
536
538
|
num_inducing, dtype=default_float()
|
|
537
539
|
) # cache qinv
|
|
538
540
|
LB = tf.linalg.cholesky(B) # cache alpha
|
|
541
|
+
tf.debugging.check_numerics(LB, "SGPR posterior Cholesky factor is non-finite")
|
|
539
542
|
Aerr = tf.linalg.matmul(A, err / sigma[..., None])
|
|
540
543
|
c = tf.linalg.triangular_solve(LB, Aerr, lower=True)
|
|
541
544
|
|
|
@@ -622,6 +625,7 @@ class VGPPosterior(AbstractPosterior):
|
|
|
622
625
|
tf.shape(X_data)[-2], value=default_jitter(), dtype=X_data.dtype
|
|
623
626
|
) # [..., M, M]
|
|
624
627
|
Lm = tf.linalg.cholesky(Kmm)
|
|
628
|
+
tf.debugging.check_numerics(Lm, "VGP posterior Cholesky factor is non-finite")
|
|
625
629
|
|
|
626
630
|
M = X_data.shape[0]
|
|
627
631
|
M_dynamic = M is None
|
|
@@ -701,6 +705,7 @@ class BasePosterior(AbstractPosterior):
|
|
|
701
705
|
if Kuu.shape.ndims == 3:
|
|
702
706
|
q_mu = tf.linalg.adjoint(self._q_dist.q_mu)[..., None] # [..., R, M, 1]
|
|
703
707
|
L = tf.linalg.cholesky(Kuu)
|
|
708
|
+
tf.debugging.check_numerics(L, "SVGP posterior Cholesky factor is non-finite")
|
|
704
709
|
|
|
705
710
|
if not self.whiten:
|
|
706
711
|
# alpha = Kuu⁻¹ q_mu
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: gpflow
|
|
3
|
-
Version: 2.11.
|
|
3
|
+
Version: 2.11.2
|
|
4
4
|
Summary: Gaussian process methods in TensorFlow
|
|
5
5
|
Home-page: https://www.gpflow.org
|
|
6
6
|
Author: James Hensman, Alex Matthews
|
|
@@ -23,6 +23,7 @@ Classifier: Programming Language :: Python :: 3.7
|
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.8
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.9
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.10
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
26
27
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
27
28
|
Classifier: Typing :: Typed
|
|
28
29
|
Requires-Python: >=3.7
|
|
@@ -7,13 +7,8 @@ scipy
|
|
|
7
7
|
setuptools>=41.0.0
|
|
8
8
|
tabulate
|
|
9
9
|
tensorflow-probability[tf]>=0.12.0
|
|
10
|
-
typing_extensions
|
|
11
|
-
|
|
12
|
-
[:platform_system != "Darwin" or platform_machine != "arm64"]
|
|
13
10
|
tensorflow>=2.4.0
|
|
14
|
-
|
|
15
|
-
[:platform_system == "Darwin" and platform_machine == "arm64"]
|
|
16
|
-
tensorflow-macos>=2.4.0
|
|
11
|
+
typing_extensions
|
|
17
12
|
|
|
18
13
|
[:python_version < "3.8"]
|
|
19
14
|
importlib_metadata
|
|
@@ -20,9 +20,7 @@ requirements = [
|
|
|
20
20
|
"setuptools>=41.0.0", # to satisfy dependency constraints
|
|
21
21
|
"tabulate",
|
|
22
22
|
"tensorflow-probability[tf]>=0.12.0",
|
|
23
|
-
"tensorflow>=2.4.0
|
|
24
|
-
# NOTE: Support of Apple Silicon MacOS platforms is in an experimental mode
|
|
25
|
-
"tensorflow-macos>=2.4.0; platform_system=='Darwin' and platform_machine=='arm64'",
|
|
23
|
+
"tensorflow>=2.4.0",
|
|
26
24
|
# NOTE: once we require tensorflow-probability>=0.12, we can remove our custom deepcopy handling
|
|
27
25
|
"typing_extensions",
|
|
28
26
|
]
|
|
@@ -79,6 +77,7 @@ setup(
|
|
|
79
77
|
"Programming Language :: Python :: 3.8",
|
|
80
78
|
"Programming Language :: Python :: 3.9",
|
|
81
79
|
"Programming Language :: Python :: 3.10",
|
|
80
|
+
"Programming Language :: Python :: 3.11",
|
|
82
81
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
83
82
|
"Typing :: Typed",
|
|
84
83
|
],
|
|
@@ -164,12 +164,14 @@ def test_broadcasting(
|
|
|
164
164
|
rank2 = len(batch2_shape) - 1
|
|
165
165
|
|
|
166
166
|
if isinstance(kernel, kernels.MultioutputKernel):
|
|
167
|
-
mo_kernel
|
|
167
|
+
mo_kernel: kernels.MultioutputKernel = kernel
|
|
168
168
|
|
|
169
169
|
loop = cs(
|
|
170
170
|
unroll_batches(
|
|
171
171
|
lambda x: unroll_batches(
|
|
172
|
-
lambda x2: mo_kernel(x, x2, full_cov=True, full_output_cov=True),
|
|
172
|
+
lambda x2: mo_kernel(x, x2, full_cov=True, full_output_cov=True),
|
|
173
|
+
X2,
|
|
174
|
+
2,
|
|
173
175
|
),
|
|
174
176
|
X,
|
|
175
177
|
2,
|
|
@@ -200,7 +202,9 @@ def test_broadcasting(
|
|
|
200
202
|
loop = cs(
|
|
201
203
|
unroll_batches(
|
|
202
204
|
lambda x: unroll_batches(
|
|
203
|
-
lambda x2: mo_kernel(x, x2, full_cov=True, full_output_cov=False),
|
|
205
|
+
lambda x2: mo_kernel(x, x2, full_cov=True, full_output_cov=False),
|
|
206
|
+
X2,
|
|
207
|
+
2,
|
|
204
208
|
),
|
|
205
209
|
X,
|
|
206
210
|
2,
|
|
@@ -274,7 +278,9 @@ def test_broadcasting(
|
|
|
274
278
|
else: # Single-output kernel:
|
|
275
279
|
loop = cs(
|
|
276
280
|
unroll_batches(
|
|
277
|
-
lambda x: unroll_batches(lambda x2: kernel(x, x2, full_cov=True), X2, 2),
|
|
281
|
+
lambda x: unroll_batches(lambda x2: kernel(x, x2, full_cov=True), X2, 2),
|
|
282
|
+
X,
|
|
283
|
+
2,
|
|
278
284
|
),
|
|
279
285
|
"[batch..., batch2..., N, N2]",
|
|
280
286
|
)
|
|
@@ -282,7 +288,12 @@ def test_broadcasting(
|
|
|
282
288
|
tf.transpose(
|
|
283
289
|
loop,
|
|
284
290
|
tf.concat(
|
|
285
|
-
[
|
|
291
|
+
[
|
|
292
|
+
np.arange(rank),
|
|
293
|
+
[rank + rank2],
|
|
294
|
+
np.arange(rank2) + rank,
|
|
295
|
+
[rank + rank2 + 1],
|
|
296
|
+
],
|
|
286
297
|
0,
|
|
287
298
|
),
|
|
288
299
|
),
|
|
@@ -941,6 +941,44 @@ class TestArcHierarchical:
|
|
|
941
941
|
kernel = _arc()
|
|
942
942
|
np.testing.assert_allclose(kernel.radius.numpy(), [1.0, 1.0])
|
|
943
943
|
|
|
944
|
+
def test_angle_sigmoid_bounds_are_per_conditional_vectors(self) -> None:
|
|
945
|
+
# Bounds must be [n_cond] vectors so a multistart scheme that samples
|
|
946
|
+
# `tf.random.uniform(bijector.low.shape, ...)` gets a per-column restart.
|
|
947
|
+
kernel = _arc()
|
|
948
|
+
transform = kernel.angle.transform
|
|
949
|
+
assert transform is not None
|
|
950
|
+
low = transform.low
|
|
951
|
+
high = transform.high
|
|
952
|
+
assert tuple(low.shape) == (2,)
|
|
953
|
+
assert tuple(high.shape) == (2,)
|
|
954
|
+
np.testing.assert_allclose(low.numpy(), [0.1, 0.1])
|
|
955
|
+
np.testing.assert_allclose(high.numpy(), [0.9, 0.9])
|
|
956
|
+
|
|
957
|
+
def test_angle_multistart_restart_roundtrip(self) -> None:
|
|
958
|
+
kernel = _arc()
|
|
959
|
+
param = kernel.angle
|
|
960
|
+
transform = param.transform
|
|
961
|
+
assert transform is not None
|
|
962
|
+
low, high = transform.low, transform.high
|
|
963
|
+
sample = tf.random.uniform(low.shape, minval=low, maxval=high, dtype=low.dtype)
|
|
964
|
+
assert tuple(sample.shape) == (2,)
|
|
965
|
+
param.assign(sample)
|
|
966
|
+
assert tuple(param.shape) == (2,)
|
|
967
|
+
assert np.all(param.numpy() >= low.numpy())
|
|
968
|
+
assert np.all(param.numpy() <= high.numpy())
|
|
969
|
+
X = tf.constant(
|
|
970
|
+
[
|
|
971
|
+
[0.5, 1.0, 2.5, 0.0],
|
|
972
|
+
[0.5, 0.0, 2.5, 0.5],
|
|
973
|
+
[0.3, 1.0, 4.0, 0.0],
|
|
974
|
+
],
|
|
975
|
+
dtype=tf.float64,
|
|
976
|
+
)
|
|
977
|
+
K = kernel.K(X).numpy()
|
|
978
|
+
assert np.all(np.isfinite(K))
|
|
979
|
+
eigs = np.linalg.eigvalsh(K + 1e-10 * np.eye(3))
|
|
980
|
+
assert eigs.min() > -1e-8
|
|
981
|
+
|
|
944
982
|
def test_K_shape_and_psd(self) -> None:
|
|
945
983
|
kernel = _arc()
|
|
946
984
|
X = tf.constant(
|
|
@@ -1004,6 +1042,44 @@ class TestWedgeHierarchical:
|
|
|
1004
1042
|
kernel = _wedge()
|
|
1005
1043
|
np.testing.assert_allclose(kernel.rho.numpy(), [np.pi / 2, np.pi / 2])
|
|
1006
1044
|
|
|
1045
|
+
def test_rho_sigmoid_bounds_are_per_conditional_vectors(self) -> None:
|
|
1046
|
+
# Bounds must be [n_cond] vectors so a multistart scheme that samples
|
|
1047
|
+
# `tf.random.uniform(bijector.low.shape, ...)` gets a per-column restart.
|
|
1048
|
+
kernel = _wedge()
|
|
1049
|
+
transform = kernel.rho.transform
|
|
1050
|
+
assert transform is not None
|
|
1051
|
+
low = transform.low
|
|
1052
|
+
high = transform.high
|
|
1053
|
+
assert tuple(low.shape) == (2,)
|
|
1054
|
+
assert tuple(high.shape) == (2,)
|
|
1055
|
+
np.testing.assert_allclose(low.numpy(), [1e-6, 1e-6])
|
|
1056
|
+
np.testing.assert_allclose(high.numpy(), [np.pi, np.pi])
|
|
1057
|
+
|
|
1058
|
+
def test_rho_multistart_restart_roundtrip(self) -> None:
|
|
1059
|
+
kernel = _wedge()
|
|
1060
|
+
param = kernel.rho
|
|
1061
|
+
transform = param.transform
|
|
1062
|
+
assert transform is not None
|
|
1063
|
+
low, high = transform.low, transform.high
|
|
1064
|
+
sample = tf.random.uniform(low.shape, minval=low, maxval=high, dtype=low.dtype)
|
|
1065
|
+
assert tuple(sample.shape) == (2,)
|
|
1066
|
+
param.assign(sample)
|
|
1067
|
+
assert tuple(param.shape) == (2,)
|
|
1068
|
+
assert np.all(param.numpy() >= low.numpy())
|
|
1069
|
+
assert np.all(param.numpy() <= high.numpy())
|
|
1070
|
+
X = tf.constant(
|
|
1071
|
+
[
|
|
1072
|
+
[0.5, 1.0, 2.5, 0.0],
|
|
1073
|
+
[0.5, 0.0, 2.5, 0.5],
|
|
1074
|
+
[0.3, 1.0, 4.0, 0.0],
|
|
1075
|
+
],
|
|
1076
|
+
dtype=tf.float64,
|
|
1077
|
+
)
|
|
1078
|
+
K = kernel.K(X).numpy()
|
|
1079
|
+
assert np.all(np.isfinite(K))
|
|
1080
|
+
eigs = np.linalg.eigvalsh(K + 1e-10 * np.eye(3))
|
|
1081
|
+
assert eigs.min() > -1e-8
|
|
1082
|
+
|
|
1007
1083
|
def test_K_shape_and_psd(self) -> None:
|
|
1008
1084
|
kernel = _wedge()
|
|
1009
1085
|
X = tf.constant(
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import numpy as np
|
|
16
|
+
import pytest
|
|
16
17
|
import tensorflow as tf
|
|
17
18
|
|
|
18
19
|
import gpflow
|
|
@@ -73,3 +74,40 @@ def test_varying_data() -> None:
|
|
|
73
74
|
assert (
|
|
74
75
|
np.abs((old_lml - new_lml) / (new_lml + old_lml)) > 0.1
|
|
75
76
|
), "we expect the LML for different data to be significantly different"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_non_finite_posterior_cholesky_raises() -> None:
|
|
80
|
+
"""A collapsed ARD lengthscale on a binary column makes K non-positive-definite.
|
|
81
|
+
|
|
82
|
+
Cholesky then returns a NaN factor. Prediction and posterior construction
|
|
83
|
+
must raise rather than cache that factor and return NaN means.
|
|
84
|
+
"""
|
|
85
|
+
data_rng = np.random.RandomState(0)
|
|
86
|
+
n = 10
|
|
87
|
+
binary = np.array([0.0, 1.0] * (n // 2))[:, None]
|
|
88
|
+
X = np.hstack([data_rng.randn(n, 2), binary])
|
|
89
|
+
Y = data_rng.randn(n, 1)
|
|
90
|
+
collapsed = gpflow.models.GPR(
|
|
91
|
+
(X, Y),
|
|
92
|
+
kernel=gpflow.kernels.SquaredExponential(lengthscales=[1.0, 1.0, 1e-8]),
|
|
93
|
+
noise_variance=1e-5,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
with pytest.raises(
|
|
97
|
+
tf.errors.InvalidArgumentError,
|
|
98
|
+
match=r"Cholesky factor is non-finite|Cholesky decomposition was not successful",
|
|
99
|
+
):
|
|
100
|
+
collapsed.predict_f(X[:2])
|
|
101
|
+
with pytest.raises(
|
|
102
|
+
tf.errors.InvalidArgumentError,
|
|
103
|
+
match=r"Cholesky factor is non-finite|Cholesky decomposition was not successful",
|
|
104
|
+
):
|
|
105
|
+
collapsed.posterior()
|
|
106
|
+
|
|
107
|
+
healthy = gpflow.models.GPR(
|
|
108
|
+
(X, Y),
|
|
109
|
+
kernel=gpflow.kernels.SquaredExponential(lengthscales=[1.0, 1.0, 1.0]),
|
|
110
|
+
noise_variance=1e-5,
|
|
111
|
+
)
|
|
112
|
+
mean, _ = healthy.predict_f(X[:2])
|
|
113
|
+
assert np.all(np.isfinite(mean))
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
import numpy as np
|
|
15
|
+
import pytest
|
|
15
16
|
import tensorflow as tf
|
|
16
17
|
|
|
17
18
|
import gpflow
|
|
@@ -77,3 +78,38 @@ def test_sgpr_svgp_qu_equivivalent() -> None:
|
|
|
77
78
|
svgp.predict_f(Xnew),
|
|
78
79
|
atol=1e-4,
|
|
79
80
|
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_non_finite_posterior_cholesky_raises() -> None:
|
|
84
|
+
"""A collapsed ARD lengthscale on a binary column makes Kuu non-positive-definite."""
|
|
85
|
+
data_rng = np.random.RandomState(0)
|
|
86
|
+
n = 10
|
|
87
|
+
binary = np.array([0.0, 1.0] * (n // 2))[:, None]
|
|
88
|
+
X = np.hstack([data_rng.randn(n, 2), binary])
|
|
89
|
+
Y = data_rng.randn(n, 1)
|
|
90
|
+
collapsed = gpflow.models.SGPR(
|
|
91
|
+
(X, Y),
|
|
92
|
+
kernel=gpflow.kernels.SquaredExponential(lengthscales=[1.0, 1.0, 1e-8]),
|
|
93
|
+
inducing_variable=X,
|
|
94
|
+
noise_variance=1e-5,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
with pytest.raises(
|
|
98
|
+
tf.errors.InvalidArgumentError,
|
|
99
|
+
match=r"Cholesky factor is non-finite|Cholesky decomposition was not successful",
|
|
100
|
+
):
|
|
101
|
+
collapsed.predict_f(X[:2])
|
|
102
|
+
with pytest.raises(
|
|
103
|
+
tf.errors.InvalidArgumentError,
|
|
104
|
+
match=r"Cholesky factor is non-finite|Cholesky decomposition was not successful",
|
|
105
|
+
):
|
|
106
|
+
collapsed.posterior()
|
|
107
|
+
|
|
108
|
+
healthy = gpflow.models.SGPR(
|
|
109
|
+
(X, Y),
|
|
110
|
+
kernel=gpflow.kernels.SquaredExponential(lengthscales=[1.0, 1.0, 1.0]),
|
|
111
|
+
inducing_variable=X,
|
|
112
|
+
noise_variance=1e-5,
|
|
113
|
+
)
|
|
114
|
+
mean, _ = healthy.predict_f(X[:2])
|
|
115
|
+
assert np.all(np.isfinite(mean))
|
|
@@ -197,3 +197,34 @@ def test_stochastic_gradients(
|
|
|
197
197
|
model_1 = training_loop(indices_1, num_data=num_data1, max_iter=max_iter)
|
|
198
198
|
model_2 = training_loop(indices_2, num_data=num_data2, max_iter=max_iter)
|
|
199
199
|
assert _check_models_close(model_1, model_2)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def test_non_finite_posterior_cholesky_raises() -> None:
|
|
203
|
+
"""A collapsed ARD lengthscale on a binary column makes Kuu non-positive-definite.
|
|
204
|
+
|
|
205
|
+
The cached posterior factorises Kuu in BasePosterior._precompute.
|
|
206
|
+
"""
|
|
207
|
+
data_rng = np.random.RandomState(0)
|
|
208
|
+
n = 10
|
|
209
|
+
binary = np.array([0.0, 1.0] * (n // 2))[:, None]
|
|
210
|
+
X = np.hstack([data_rng.randn(n, 2), binary])
|
|
211
|
+
Y = data_rng.randn(n, 1)
|
|
212
|
+
collapsed = gpflow.models.SVGP(
|
|
213
|
+
kernel=gpflow.kernels.SquaredExponential(lengthscales=[1.0, 1.0, 1e-8]),
|
|
214
|
+
likelihood=gpflow.likelihoods.Gaussian(),
|
|
215
|
+
inducing_variable=X,
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
with pytest.raises(
|
|
219
|
+
tf.errors.InvalidArgumentError,
|
|
220
|
+
match=r"Cholesky factor is non-finite|Cholesky decomposition was not successful",
|
|
221
|
+
):
|
|
222
|
+
collapsed.posterior()
|
|
223
|
+
|
|
224
|
+
healthy = gpflow.models.SVGP(
|
|
225
|
+
kernel=gpflow.kernels.SquaredExponential(lengthscales=[1.0, 1.0, 1.0]),
|
|
226
|
+
likelihood=gpflow.likelihoods.Gaussian(),
|
|
227
|
+
inducing_variable=X,
|
|
228
|
+
)
|
|
229
|
+
mean, _ = healthy.predict_f(X[:2])
|
|
230
|
+
assert np.all(np.isfinite(mean))
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
import numpy as np
|
|
15
|
+
import pytest
|
|
15
16
|
import tensorflow as tf
|
|
16
17
|
|
|
17
18
|
import gpflow
|
|
@@ -59,3 +60,36 @@ def test_update_vgp_data() -> None:
|
|
|
59
60
|
|
|
60
61
|
np.testing.assert_allclose(mean_before, mean_after, atol=1e-5)
|
|
61
62
|
np.testing.assert_allclose(var_before, var_after, atol=1e-6)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def test_non_finite_posterior_cholesky_raises() -> None:
|
|
66
|
+
"""A collapsed ARD lengthscale on a binary column makes K non-positive-definite."""
|
|
67
|
+
data_rng = np.random.RandomState(0)
|
|
68
|
+
n = 10
|
|
69
|
+
binary = np.array([0.0, 1.0] * (n // 2))[:, None]
|
|
70
|
+
X = np.hstack([data_rng.randn(n, 2), binary])
|
|
71
|
+
Y = data_rng.randn(n, 1)
|
|
72
|
+
collapsed = gpflow.models.VGP(
|
|
73
|
+
(X, Y),
|
|
74
|
+
kernel=gpflow.kernels.SquaredExponential(lengthscales=[1.0, 1.0, 1e-8]),
|
|
75
|
+
likelihood=gpflow.likelihoods.Gaussian(),
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
with pytest.raises(
|
|
79
|
+
tf.errors.InvalidArgumentError,
|
|
80
|
+
match=r"Cholesky factor is non-finite|Cholesky decomposition was not successful",
|
|
81
|
+
):
|
|
82
|
+
collapsed.predict_f(X[:2])
|
|
83
|
+
with pytest.raises(
|
|
84
|
+
tf.errors.InvalidArgumentError,
|
|
85
|
+
match=r"Cholesky factor is non-finite|Cholesky decomposition was not successful",
|
|
86
|
+
):
|
|
87
|
+
collapsed.posterior()
|
|
88
|
+
|
|
89
|
+
healthy = gpflow.models.VGP(
|
|
90
|
+
(X, Y),
|
|
91
|
+
kernel=gpflow.kernels.SquaredExponential(lengthscales=[1.0, 1.0, 1.0]),
|
|
92
|
+
likelihood=gpflow.likelihoods.Gaussian(),
|
|
93
|
+
)
|
|
94
|
+
mean, _ = healthy.predict_f(X[:2])
|
|
95
|
+
assert np.all(np.isfinite(mean))
|
gpflow-2.11.0/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.11.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|