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.
Files changed (231) hide show
  1. {gpflow-2.11.0/gpflow.egg-info → gpflow-2.11.2}/PKG-INFO +2 -1
  2. {gpflow-2.11.0 → gpflow-2.11.2}/RELEASE.md +21 -16
  3. gpflow-2.11.2/VERSION +1 -0
  4. {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/conf.py +1 -1
  5. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/hierarchical.py +13 -2
  6. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/posteriors.py +5 -0
  7. {gpflow-2.11.0 → gpflow-2.11.2/gpflow.egg-info}/PKG-INFO +2 -1
  8. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow.egg-info/requires.txt +1 -6
  9. {gpflow-2.11.0 → gpflow-2.11.2}/setup.py +2 -3
  10. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_broadcasting.py +16 -5
  11. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_hierarchical.py +76 -0
  12. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_gpr.py +38 -0
  13. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_sgpr.py +36 -0
  14. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_svgp.py +31 -0
  15. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_vgp.py +34 -0
  16. gpflow-2.11.0/VERSION +0 -1
  17. {gpflow-2.11.0 → gpflow-2.11.2}/LICENSE +0 -0
  18. {gpflow-2.11.0 → gpflow-2.11.2}/MANIFEST.in +0 -0
  19. {gpflow-2.11.0 → gpflow-2.11.2}/README.md +0 -0
  20. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/__init__.py +0 -0
  21. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/benchmark_api.py +0 -0
  22. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/benchmarks.py +0 -0
  23. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/dataset_api.py +0 -0
  24. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/datasets.py +0 -0
  25. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/grouping.py +0 -0
  26. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/metadata.py +0 -0
  27. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/metric_api.py +0 -0
  28. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/metrics.py +0 -0
  29. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/model_api.py +0 -0
  30. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/models.py +0 -0
  31. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/paths.py +0 -0
  32. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/plot.py +0 -0
  33. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/plotter_api.py +0 -0
  34. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/plotters.py +0 -0
  35. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/registry.py +0 -0
  36. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/run.py +0 -0
  37. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/sharding.py +0 -0
  38. {gpflow-2.11.0 → gpflow-2.11.2}/benchmark/tag.py +0 -0
  39. {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/benchmarks.rst +0 -0
  40. {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/bibliography.rst +0 -0
  41. {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/getting_started.rst +0 -0
  42. {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/index.rst +0 -0
  43. {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/installation.rst +0 -0
  44. {gpflow-2.11.0 → gpflow-2.11.2}/doc/sphinx/user_guide.rst +0 -0
  45. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/__init__.py +0 -0
  46. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/base.py +0 -0
  47. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/ci_utils.py +0 -0
  48. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/__init__.py +0 -0
  49. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/conditionals.py +0 -0
  50. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/dispatch.py +0 -0
  51. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/multioutput/__init__.py +0 -0
  52. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/multioutput/conditionals.py +0 -0
  53. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/multioutput/sample_conditionals.py +0 -0
  54. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/sample_conditionals.py +0 -0
  55. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/uncertain_conditionals.py +0 -0
  56. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/conditionals/util.py +0 -0
  57. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/config/__config__.py +0 -0
  58. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/config/__init__.py +0 -0
  59. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/__init__.py +0 -0
  60. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/dispatch.py +0 -0
  61. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/kufs.py +0 -0
  62. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/kuus.py +0 -0
  63. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/multioutput/__init__.py +0 -0
  64. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/multioutput/kufs.py +0 -0
  65. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/covariances/multioutput/kuus.py +0 -0
  66. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/__init__.py +0 -0
  67. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/cross_kernels.py +0 -0
  68. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/dispatch.py +0 -0
  69. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/expectations.py +0 -0
  70. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/linears.py +0 -0
  71. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/mean_functions.py +0 -0
  72. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/misc.py +0 -0
  73. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/products.py +0 -0
  74. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/quadratures.py +0 -0
  75. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/squared_exponentials.py +0 -0
  76. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/expectations/sums.py +0 -0
  77. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/experimental/__init__.py +0 -0
  78. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/experimental/utils.py +0 -0
  79. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/functions.py +0 -0
  80. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/__init__.py +0 -0
  81. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/inducing_patch.py +0 -0
  82. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/inducing_variables.py +0 -0
  83. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/multioutput/__init__.py +0 -0
  84. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/inducing_variables/multioutput/inducing_variables.py +0 -0
  85. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/keras.py +0 -0
  86. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/__init__.py +0 -0
  87. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/base.py +0 -0
  88. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/categorical.py +0 -0
  89. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/changepoints.py +0 -0
  90. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/convolutional.py +0 -0
  91. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/hierarchical_axioms.py +0 -0
  92. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/linears.py +0 -0
  93. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/misc.py +0 -0
  94. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/multioutput/__init__.py +0 -0
  95. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/multioutput/kernels.py +0 -0
  96. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/periodic.py +0 -0
  97. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/statics.py +0 -0
  98. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kernels/stationaries.py +0 -0
  99. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/kullback_leiblers.py +0 -0
  100. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/__init__.py +0 -0
  101. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/base.py +0 -0
  102. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/misc.py +0 -0
  103. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/multiclass.py +0 -0
  104. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/multilatent.py +0 -0
  105. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/scalar_continuous.py +0 -0
  106. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/scalar_discrete.py +0 -0
  107. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/likelihoods/utils.py +0 -0
  108. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/logdensities.py +0 -0
  109. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/mean_functions.py +0 -0
  110. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/__init__.py +0 -0
  111. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/cglb.py +0 -0
  112. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/gplvm.py +0 -0
  113. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/gpmc.py +0 -0
  114. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/gpr.py +0 -0
  115. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/model.py +0 -0
  116. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/sgpmc.py +0 -0
  117. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/sgpr.py +0 -0
  118. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/svgp.py +0 -0
  119. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/training_mixins.py +0 -0
  120. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/util.py +0 -0
  121. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/models/vgp.py +0 -0
  122. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/monitor/__init__.py +0 -0
  123. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/monitor/base.py +0 -0
  124. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/monitor/tensorboard.py +0 -0
  125. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/mypy_flags.py +0 -0
  126. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/optimizers/__init__.py +0 -0
  127. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/optimizers/mcmc.py +0 -0
  128. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/optimizers/natgrad.py +0 -0
  129. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/optimizers/scipy.py +0 -0
  130. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/probability_distributions.py +0 -0
  131. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/py.typed +0 -0
  132. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/quadrature/__init__.py +0 -0
  133. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/quadrature/base.py +0 -0
  134. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/quadrature/deprecated.py +0 -0
  135. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/quadrature/gauss_hermite.py +0 -0
  136. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/type_flags.py +0 -0
  137. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/__init__.py +0 -0
  138. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/bijectors.py +0 -0
  139. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/misc.py +0 -0
  140. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/model_utils.py +0 -0
  141. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/multipledispatch.py +0 -0
  142. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/ops.py +0 -0
  143. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/parameter_or_function.py +0 -0
  144. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/utilities/traversal.py +0 -0
  145. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow/versions.py +0 -0
  146. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow.egg-info/SOURCES.txt +0 -0
  147. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow.egg-info/dependency_links.txt +0 -0
  148. {gpflow-2.11.0 → gpflow-2.11.2}/gpflow.egg-info/top_level.txt +0 -0
  149. {gpflow-2.11.0 → gpflow-2.11.2}/setup.cfg +0 -0
  150. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/__init__.py +0 -0
  151. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/__init__.py +0 -0
  152. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_broadcasted_conditionals.py +0 -0
  153. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_conditionals.py +0 -0
  154. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_multioutput.py +0 -0
  155. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_uncertain_conditional.py +0 -0
  156. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conditionals/test_util.py +0 -0
  157. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/config/__init__.py +0 -0
  158. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/config/test_config.py +0 -0
  159. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/conftest.py +0 -0
  160. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/covariances/__init__.py +0 -0
  161. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/covariances/test_base_covariances.py +0 -0
  162. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/covariances/test_multioutput.py +0 -0
  163. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/expectations/__init__.py +0 -0
  164. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/expectations/test_expectations.py +0 -0
  165. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/experimental/__init__.py +0 -0
  166. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/experimental/test_utils.py +0 -0
  167. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/__init__.py +0 -0
  168. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/reference.py +0 -0
  169. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_changepoints.py +0 -0
  170. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_coregion.py +0 -0
  171. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_hierarchical_axioms.py +0 -0
  172. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_kernels.py +0 -0
  173. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_positive_semidefinite.py +0 -0
  174. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/kernels/test_scaled_euclid_dist.py +0 -0
  175. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/__init__.py +0 -0
  176. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_function_params.py +0 -0
  177. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_heteroskedastic.py +0 -0
  178. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_heteroskedastic_constant_variance.py +0 -0
  179. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_likelihoods.py +0 -0
  180. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_multiclass.py +0 -0
  181. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/likelihoods/test_switched_likelihood.py +0 -0
  182. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/__init__.py +0 -0
  183. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_cglb.py +0 -0
  184. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_gplvm.py +0 -0
  185. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_gpr_posterior.py +0 -0
  186. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_mcmc.py +0 -0
  187. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_methods.py +0 -0
  188. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_model_predict.py +0 -0
  189. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_sgpr_posterior.py +0 -0
  190. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_svgp_posterior.py +0 -0
  191. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_training_mixins.py +0 -0
  192. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_variational.py +0 -0
  193. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/models/test_vgp_posterior.py +0 -0
  194. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/optimizers/__init__.py +0 -0
  195. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/optimizers/test_mcmc.py +0 -0
  196. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/optimizers/test_natural_gradient.py +0 -0
  197. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/optimizers/test_scipy.py +0 -0
  198. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/posteriors/__init__.py +0 -0
  199. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/posteriors/conftest.py +0 -0
  200. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/posteriors/test_bo_integration.py +0 -0
  201. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/posteriors/test_posteriors.py +0 -0
  202. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_all.py +0 -0
  203. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_base.py +0 -0
  204. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_base_prior.py +0 -0
  205. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_base_training.py +0 -0
  206. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_functions.py +0 -0
  207. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_inducing_variables.py +0 -0
  208. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_initial_value.py +0 -0
  209. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_kullback_leiblers.py +0 -0
  210. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_logdensities.py +0 -0
  211. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/test_monitor.py +0 -0
  212. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/__init__.py +0 -0
  213. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_bijectors.py +0 -0
  214. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_deepcopy.py +0 -0
  215. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_misc.py +0 -0
  216. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_model_utils.py +0 -0
  217. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_multipledispatch.py +0 -0
  218. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_ops.py +0 -0
  219. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_parameter_or_function.py +0 -0
  220. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_set_trainable.py +0 -0
  221. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_training_loop.py +0 -0
  222. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_traversal.py +0 -0
  223. {gpflow-2.11.0 → gpflow-2.11.2}/tests/gpflow/utilities/test_utilities.py +0 -0
  224. {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/__init__.py +0 -0
  225. {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_benchmark.py +0 -0
  226. {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_docs.py +0 -0
  227. {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_dynamic_shapes.py +0 -0
  228. {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_linear_noise.py +0 -0
  229. {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_method_equivalence.py +0 -0
  230. {gpflow-2.11.0 → gpflow-2.11.2}/tests/integration/test_model_serialization.py +0 -0
  231. {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.0
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.0 (next release)
36
+ # Release 2.11.2
37
37
 
38
- <INSERT SMALL BLURB ABOUT RELEASE FOCUS AREA AND POTENTIAL TOOLCHAIN CHANGES>
38
+ This release adds support for TensorFlow 2.18.
39
39
 
40
- ## Breaking Changes
40
+ ## Known Caveats
41
41
 
42
- * <DOCUMENT BREAKING CHANGES HERE>
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
- ## Known Caveats
44
+ ## Bug Fixes and Other Changes
46
45
 
47
- * <CAVEATS REGARDING THE RELEASE (BUT NOT BREAKING CHANGES).>
48
- * <ADDING/BUMPING DEPENDENCIES SHOULD GO HERE>
49
- * <KNOWN LACK OF SUPPORT ON SOME PLATFORM SHOULD GO HERE>
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
- ## Major Features and Improvements
50
+ ## Thanks to our Contributors
52
51
 
53
- * <INSERT MAJOR FEATURE HERE, USING MARKDOWN SYNTAX>
54
- * <IF RELEASE CONTAINS MULTIPLE FEATURES FROM SAME AREA, GROUP THEM TOGETHER>
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
- * <SIMILAR TO ABOVE SECTION, BUT FOR OTHER IMPORTANT CHANGES / BUG FIXES>
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
- <INSERT>, <NAME>, <HERE>, <USING>, <GITHUB>, <HANDLE>
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.0"
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=tfp.bijectors.Sigmoid(to_default_float(0.1), to_default_float(0.9)),
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=tfp.bijectors.Sigmoid(to_default_float(1e-6), to_default_float(np.pi)),
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.0
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; platform_system!='Darwin' or platform_machine!='arm64'",
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 = cast(kernels.MultioutputKernel, kernel) # type: ignore[redundant-cast]
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), X2, 2
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), X2, 2
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), X, 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
- [np.arange(rank), [rank + rank2], np.arange(rank2) + rank, [rank + rank2 + 1]],
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