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.
Files changed (227) hide show
  1. {gpflow-2.8.0/gpflow.egg-info → gpflow-2.9.0}/PKG-INFO +1 -1
  2. {gpflow-2.8.0 → gpflow-2.9.0}/RELEASE.md +39 -1
  3. gpflow-2.9.0/VERSION +1 -0
  4. {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/conf.py +1 -1
  5. {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/installation.rst +4 -0
  6. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/config/__config__.py +1 -2
  7. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/categorical.py +0 -1
  8. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/optimizers/natgrad.py +3 -1
  9. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/optimizers/scipy.py +92 -11
  10. {gpflow-2.8.0 → gpflow-2.9.0/gpflow.egg-info}/PKG-INFO +1 -1
  11. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/expectations/test_expectations.py +4 -4
  12. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_methods.py +0 -3
  13. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_sgpr.py +0 -3
  14. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_svgp.py +0 -3
  15. gpflow-2.9.0/tests/gpflow/optimizers/test_scipy.py +547 -0
  16. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_monitor.py +23 -2
  17. {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_linear_noise.py +0 -1
  18. {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_method_equivalence.py +1 -1
  19. gpflow-2.8.0/VERSION +0 -1
  20. gpflow-2.8.0/tests/gpflow/optimizers/test_scipy.py +0 -223
  21. {gpflow-2.8.0 → gpflow-2.9.0}/LICENSE +0 -0
  22. {gpflow-2.8.0 → gpflow-2.9.0}/MANIFEST.in +0 -0
  23. {gpflow-2.8.0 → gpflow-2.9.0}/README.md +0 -0
  24. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/__init__.py +0 -0
  25. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/benchmark_api.py +0 -0
  26. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/benchmarks.py +0 -0
  27. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/dataset_api.py +0 -0
  28. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/datasets.py +0 -0
  29. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/grouping.py +0 -0
  30. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/metadata.py +0 -0
  31. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/metric_api.py +0 -0
  32. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/metrics.py +0 -0
  33. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/model_api.py +0 -0
  34. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/models.py +0 -0
  35. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/paths.py +0 -0
  36. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/plot.py +0 -0
  37. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/plotter_api.py +0 -0
  38. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/plotters.py +0 -0
  39. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/registry.py +0 -0
  40. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/run.py +0 -0
  41. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/sharding.py +0 -0
  42. {gpflow-2.8.0 → gpflow-2.9.0}/benchmark/tag.py +0 -0
  43. {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/benchmarks.rst +0 -0
  44. {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/bibliography.rst +0 -0
  45. {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/getting_started.rst +0 -0
  46. {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/index.rst +0 -0
  47. {gpflow-2.8.0 → gpflow-2.9.0}/doc/sphinx/user_guide.rst +0 -0
  48. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/__init__.py +0 -0
  49. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/base.py +0 -0
  50. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/ci_utils.py +0 -0
  51. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/__init__.py +0 -0
  52. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/conditionals.py +0 -0
  53. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/dispatch.py +0 -0
  54. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/multioutput/__init__.py +0 -0
  55. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/multioutput/conditionals.py +0 -0
  56. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/multioutput/sample_conditionals.py +0 -0
  57. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/sample_conditionals.py +0 -0
  58. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/uncertain_conditionals.py +0 -0
  59. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/conditionals/util.py +0 -0
  60. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/config/__init__.py +0 -0
  61. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/__init__.py +0 -0
  62. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/dispatch.py +0 -0
  63. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/kufs.py +0 -0
  64. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/kuus.py +0 -0
  65. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/multioutput/__init__.py +0 -0
  66. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/multioutput/kufs.py +0 -0
  67. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/covariances/multioutput/kuus.py +0 -0
  68. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/__init__.py +0 -0
  69. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/cross_kernels.py +0 -0
  70. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/dispatch.py +0 -0
  71. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/expectations.py +0 -0
  72. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/linears.py +0 -0
  73. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/mean_functions.py +0 -0
  74. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/misc.py +0 -0
  75. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/products.py +0 -0
  76. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/quadratures.py +0 -0
  77. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/squared_exponentials.py +0 -0
  78. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/expectations/sums.py +0 -0
  79. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/experimental/__init__.py +0 -0
  80. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/experimental/utils.py +0 -0
  81. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/functions.py +0 -0
  82. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/__init__.py +0 -0
  83. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/inducing_patch.py +0 -0
  84. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/inducing_variables.py +0 -0
  85. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/multioutput/__init__.py +0 -0
  86. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/inducing_variables/multioutput/inducing_variables.py +0 -0
  87. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/__init__.py +0 -0
  88. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/base.py +0 -0
  89. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/changepoints.py +0 -0
  90. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/convolutional.py +0 -0
  91. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/linears.py +0 -0
  92. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/misc.py +0 -0
  93. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/multioutput/__init__.py +0 -0
  94. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/multioutput/kernels.py +0 -0
  95. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/periodic.py +0 -0
  96. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/statics.py +0 -0
  97. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kernels/stationaries.py +0 -0
  98. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/kullback_leiblers.py +0 -0
  99. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/__init__.py +0 -0
  100. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/base.py +0 -0
  101. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/misc.py +0 -0
  102. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/multiclass.py +0 -0
  103. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/multilatent.py +0 -0
  104. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/scalar_continuous.py +0 -0
  105. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/scalar_discrete.py +0 -0
  106. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/likelihoods/utils.py +0 -0
  107. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/logdensities.py +0 -0
  108. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/mean_functions.py +0 -0
  109. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/__init__.py +0 -0
  110. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/cglb.py +0 -0
  111. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/gplvm.py +0 -0
  112. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/gpmc.py +0 -0
  113. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/gpr.py +0 -0
  114. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/model.py +0 -0
  115. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/sgpmc.py +0 -0
  116. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/sgpr.py +0 -0
  117. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/svgp.py +0 -0
  118. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/training_mixins.py +0 -0
  119. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/util.py +0 -0
  120. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/models/vgp.py +0 -0
  121. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/monitor/__init__.py +0 -0
  122. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/monitor/base.py +0 -0
  123. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/monitor/tensorboard.py +0 -0
  124. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/mypy_flags.py +0 -0
  125. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/optimizers/__init__.py +0 -0
  126. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/optimizers/mcmc.py +0 -0
  127. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/posteriors.py +0 -0
  128. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/probability_distributions.py +0 -0
  129. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/py.typed +0 -0
  130. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/quadrature/__init__.py +0 -0
  131. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/quadrature/base.py +0 -0
  132. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/quadrature/deprecated.py +0 -0
  133. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/quadrature/gauss_hermite.py +0 -0
  134. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/type_flags.py +0 -0
  135. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/__init__.py +0 -0
  136. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/bijectors.py +0 -0
  137. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/misc.py +0 -0
  138. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/model_utils.py +0 -0
  139. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/multipledispatch.py +0 -0
  140. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/ops.py +0 -0
  141. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/parameter_or_function.py +0 -0
  142. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/utilities/traversal.py +0 -0
  143. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow/versions.py +0 -0
  144. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow.egg-info/SOURCES.txt +0 -0
  145. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow.egg-info/dependency_links.txt +0 -0
  146. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow.egg-info/requires.txt +0 -0
  147. {gpflow-2.8.0 → gpflow-2.9.0}/gpflow.egg-info/top_level.txt +0 -0
  148. {gpflow-2.8.0 → gpflow-2.9.0}/setup.cfg +0 -0
  149. {gpflow-2.8.0 → gpflow-2.9.0}/setup.py +0 -0
  150. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/__init__.py +0 -0
  151. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/__init__.py +0 -0
  152. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_broadcasted_conditionals.py +0 -0
  153. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_conditionals.py +0 -0
  154. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_multioutput.py +0 -0
  155. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_uncertain_conditional.py +0 -0
  156. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conditionals/test_util.py +0 -0
  157. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/config/__init__.py +0 -0
  158. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/config/test_config.py +0 -0
  159. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/conftest.py +0 -0
  160. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/covariances/__init__.py +0 -0
  161. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/covariances/test_base_covariances.py +0 -0
  162. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/covariances/test_multioutput.py +0 -0
  163. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/expectations/__init__.py +0 -0
  164. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/experimental/__init__.py +0 -0
  165. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/experimental/test_utils.py +0 -0
  166. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/__init__.py +0 -0
  167. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/reference.py +0 -0
  168. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_broadcasting.py +0 -0
  169. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_changepoints.py +0 -0
  170. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_coregion.py +0 -0
  171. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_kernels.py +0 -0
  172. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_positive_semidefinite.py +0 -0
  173. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/kernels/test_scaled_euclid_dist.py +0 -0
  174. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/__init__.py +0 -0
  175. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_function_params.py +0 -0
  176. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_heteroskedastic.py +0 -0
  177. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_heteroskedastic_constant_variance.py +0 -0
  178. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_likelihoods.py +0 -0
  179. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_multiclass.py +0 -0
  180. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/likelihoods/test_switched_likelihood.py +0 -0
  181. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/__init__.py +0 -0
  182. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_cglb.py +0 -0
  183. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_gplvm.py +0 -0
  184. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_gpr.py +0 -0
  185. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_gpr_posterior.py +0 -0
  186. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_mcmc.py +0 -0
  187. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_model_predict.py +0 -0
  188. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_sgpr_posterior.py +0 -0
  189. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_svgp_posterior.py +0 -0
  190. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_training_mixins.py +0 -0
  191. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_variational.py +0 -0
  192. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_vgp.py +0 -0
  193. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/models/test_vgp_posterior.py +0 -0
  194. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/optimizers/__init__.py +0 -0
  195. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/optimizers/test_mcmc.py +0 -0
  196. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/optimizers/test_natural_gradient.py +0 -0
  197. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/posteriors/__init__.py +0 -0
  198. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/posteriors/conftest.py +0 -0
  199. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/posteriors/test_bo_integration.py +0 -0
  200. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/posteriors/test_posteriors.py +0 -0
  201. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_all.py +0 -0
  202. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_base.py +0 -0
  203. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_base_prior.py +0 -0
  204. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_base_training.py +0 -0
  205. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_functions.py +0 -0
  206. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_inducing_variables.py +0 -0
  207. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_initial_value.py +0 -0
  208. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_kullback_leiblers.py +0 -0
  209. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/test_logdensities.py +0 -0
  210. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/__init__.py +0 -0
  211. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_bijectors.py +0 -0
  212. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_deepcopy.py +0 -0
  213. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_misc.py +0 -0
  214. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_model_utils.py +0 -0
  215. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_multipledispatch.py +0 -0
  216. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_ops.py +0 -0
  217. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_parameter_or_function.py +0 -0
  218. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_set_trainable.py +0 -0
  219. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_training_loop.py +0 -0
  220. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_traversal.py +0 -0
  221. {gpflow-2.8.0 → gpflow-2.9.0}/tests/gpflow/utilities/test_utilities.py +0 -0
  222. {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/__init__.py +0 -0
  223. {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_benchmark.py +0 -0
  224. {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_docs.py +0 -0
  225. {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_dynamic_shapes.py +0 -0
  226. {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_model_serialization.py +0 -0
  227. {gpflow-2.8.0 → gpflow-2.9.0}/tests/integration/test_notebooks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gpflow
3
- Version: 2.8.0
3
+ Version: 2.9.0
4
4
  Summary: Gaussian process methods in TensorFlow
5
5
  Home-page: https://www.gpflow.org
6
6
  Author: James Hensman, Alex Matthews
@@ -33,7 +33,7 @@ This release contains contributions from:
33
33
  <INSERT>, <NAME>, <HERE>, <USING>, <GITHUB>, <HANDLE>
34
34
 
35
35
 
36
- # Release 2.9.0 (next release)
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.8.0"
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, Tuple, Union
55
+ from typing import Any, Dict, Generator, List, Mapping, Optional, Union
57
56
 
58
57
  import numpy as np
59
58
  import tabulate
@@ -16,7 +16,6 @@ from typing import Any, Optional
16
16
 
17
17
  import numpy as np
18
18
  import tensorflow as tf
19
- import tensorflow_probability as tfp
20
19
 
21
20
  from .. import default_int, set_trainable
22
21
  from ..base import Parameter, TensorType
@@ -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._name}/natural_gradient_steps"):
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 typing import Any, Callable, Iterable, List, Mapping, Optional, Sequence, Tuple, Union
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.update(dict(callback=callback))
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
- cls,
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 = cls.unpack_tensors(variables, x)
134
- cls.assign_tensors(variables, values)
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 = cls._filter_unused_variables(variables, grads, allow_unused_variables)
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, cls.pack_tensors(grads)
195
+ return loss, self.pack_tensors(grads)
149
196
 
150
197
  if compile:
151
- _tf_eval = tf.function(_tf_eval, **tf_fun_args)
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
- step = 0 # type: int
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]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gpflow
3
- Version: 2.8.0
3
+ Version: 2.9.0
4
4
  Summary: Gaussian process methods in TensorFlow
5
5
  Home-page: https://www.gpflow.org
6
6
  Author: James Hensman, Alex Matthews
@@ -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)