CUQIpy 1.3.0.post0.dev104__tar.gz → 1.3.0.post0.dev266__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.
Potentially problematic release.
This version of CUQIpy might be problematic. Click here for more details.
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/CUQIpy.egg-info/PKG-INFO +1 -1
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/CUQIpy.egg-info/SOURCES.txt +1 -1
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/PKG-INFO +1 -1
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/_version.py +3 -3
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/__init__.py +1 -0
- cuqipy-1.3.0.post0.dev266/cuqi/experimental/_recommender.py +200 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/geometry/_productgeometry.py +3 -3
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/__init__.py +0 -1
- cuqipy-1.3.0.post0.dev266/cuqi/model/_model.py +1500 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/pde/_pde.py +14 -10
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/testproblem/_testproblem.py +2 -3
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_distribution.py +1 -1
- cuqipy-1.3.0.post0.dev266/tests/test_model.py +1941 -0
- cuqipy-1.3.0.post0.dev104/cuqi/experimental/mcmc/_utilities.py +0 -17
- cuqipy-1.3.0.post0.dev104/cuqi/model/_model.py +0 -796
- cuqipy-1.3.0.post0.dev104/tests/test_model.py +0 -516
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/CUQIpy.egg-info/dependency_links.txt +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/CUQIpy.egg-info/requires.txt +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/CUQIpy.egg-info/top_level.txt +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/LICENSE +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/README.md +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/_messages.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/array/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/array/_array.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/config.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/data/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/data/_data.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/data/astronaut.npz +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/data/camera.npz +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/data/cat.npz +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/data/cookie.png +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/data/satellite.mat +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/density/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/density/_density.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/diagnostics.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_beta.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_cauchy.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_cmrf.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_custom.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_distribution.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_gamma.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_gaussian.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_gmrf.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_inverse_gamma.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_joint_distribution.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_laplace.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_lmrf.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_lognormal.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_modifiedhalfnormal.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_normal.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_posterior.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_smoothed_laplace.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_truncated_normal.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/distribution/_uniform.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/algebra/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/algebra/_ast.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/algebra/_orderedset.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/algebra/_randomvariable.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/geometry/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_conjugate.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_conjugate_approx.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_cwmh.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_direct.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_gibbs.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_hmc.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_langevin_algorithm.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_laplace_approximation.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_mh.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_pcn.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_rto.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/experimental/mcmc/_sampler.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/geometry/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/geometry/_geometry.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/implicitprior/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/implicitprior/_regularizedGMRF.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/implicitprior/_regularizedGaussian.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/implicitprior/_regularizedUnboundedUniform.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/implicitprior/_restorator.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/likelihood/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/likelihood/_likelihood.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/model/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/operator/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/operator/_operator.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/pde/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/problem/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/problem/_problem.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_conjugate.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_conjugate_approx.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_cwmh.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_gibbs.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_hmc.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_langevin_algorithm.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_laplace_approximation.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_mh.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_pcn.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_rto.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/sampler/_sampler.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/samples/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/samples/_samples.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/solver/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/solver/_solver.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/testproblem/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/utilities/__init__.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/utilities/_get_python_variable_name.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/cuqi/utilities/_utilities.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/pyproject.toml +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/requirements.txt +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/setup.cfg +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/setup.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_MRFs.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_abstract_distribution_density.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_bayesian_inversion.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_density.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_distributions_shape.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_geometry.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_implicit_priors.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_joint_distribution.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_likelihood.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_pde.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_posterior.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_problem.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_sampler.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_samples.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_solver.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_testproblem.py +0 -0
- {cuqipy-1.3.0.post0.dev104 → cuqipy-1.3.0.post0.dev266}/tests/test_utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: CUQIpy
|
|
3
|
-
Version: 1.3.0.post0.
|
|
3
|
+
Version: 1.3.0.post0.dev266
|
|
4
4
|
Summary: Computational Uncertainty Quantification for Inverse problems in Python
|
|
5
5
|
Maintainer-email: "Nicolai A. B. Riis" <nabr@dtu.dk>, "Jakob S. Jørgensen" <jakj@dtu.dk>, "Amal M. Alghamdi" <amaal@dtu.dk>, Chao Zhang <chaz@dtu.dk>
|
|
6
6
|
License: Apache License
|
|
@@ -45,6 +45,7 @@ cuqi/distribution/_smoothed_laplace.py
|
|
|
45
45
|
cuqi/distribution/_truncated_normal.py
|
|
46
46
|
cuqi/distribution/_uniform.py
|
|
47
47
|
cuqi/experimental/__init__.py
|
|
48
|
+
cuqi/experimental/_recommender.py
|
|
48
49
|
cuqi/experimental/algebra/__init__.py
|
|
49
50
|
cuqi/experimental/algebra/_ast.py
|
|
50
51
|
cuqi/experimental/algebra/_orderedset.py
|
|
@@ -64,7 +65,6 @@ cuqi/experimental/mcmc/_mh.py
|
|
|
64
65
|
cuqi/experimental/mcmc/_pcn.py
|
|
65
66
|
cuqi/experimental/mcmc/_rto.py
|
|
66
67
|
cuqi/experimental/mcmc/_sampler.py
|
|
67
|
-
cuqi/experimental/mcmc/_utilities.py
|
|
68
68
|
cuqi/geometry/__init__.py
|
|
69
69
|
cuqi/geometry/_geometry.py
|
|
70
70
|
cuqi/implicitprior/__init__.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: CUQIpy
|
|
3
|
-
Version: 1.3.0.post0.
|
|
3
|
+
Version: 1.3.0.post0.dev266
|
|
4
4
|
Summary: Computational Uncertainty Quantification for Inverse problems in Python
|
|
5
5
|
Maintainer-email: "Nicolai A. B. Riis" <nabr@dtu.dk>, "Jakob S. Jørgensen" <jakj@dtu.dk>, "Amal M. Alghamdi" <amaal@dtu.dk>, Chao Zhang <chaz@dtu.dk>
|
|
6
6
|
License: Apache License
|
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-
|
|
11
|
+
"date": "2025-06-23T11:22:39+0300",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.3.0.post0.
|
|
14
|
+
"full-revisionid": "0ad94a56cb0776e3b0964f9aebbc01c1b7b41ac1",
|
|
15
|
+
"version": "1.3.0.post0.dev266"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import cuqi
|
|
2
|
+
import inspect
|
|
3
|
+
import numpy as np
|
|
4
|
+
|
|
5
|
+
# This import makes suggest_sampler easier to read
|
|
6
|
+
import cuqi.experimental.mcmc as samplers
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class SamplerRecommender(object):
|
|
10
|
+
"""
|
|
11
|
+
This class can be used to automatically choose a sampler.
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
target: Density or JointDistribution
|
|
16
|
+
Distribution to get sampler recommendations for.
|
|
17
|
+
|
|
18
|
+
exceptions: list[cuqi.experimental.mcmc.Sampler], *optional*
|
|
19
|
+
Samplers not to be recommended.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, target:cuqi.density.Density, exceptions = []):
|
|
23
|
+
self._target = target
|
|
24
|
+
self._exceptions = exceptions
|
|
25
|
+
self._create_ordering()
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def target(self) -> cuqi.density.Density:
|
|
29
|
+
""" Return the target Distribution. """
|
|
30
|
+
return self._target
|
|
31
|
+
|
|
32
|
+
@target.setter
|
|
33
|
+
def target(self, value:cuqi.density.Density):
|
|
34
|
+
""" Set the target Distribution. Runs validation of the target. """
|
|
35
|
+
if value is None:
|
|
36
|
+
raise ValueError("Target needs to be of type cuqi.density.Density.")
|
|
37
|
+
self._target = value
|
|
38
|
+
|
|
39
|
+
def _create_ordering(self):
|
|
40
|
+
"""
|
|
41
|
+
Every element in the ordering consists of a tuple:
|
|
42
|
+
(
|
|
43
|
+
Sampler: Class
|
|
44
|
+
boolean: additional conditions on the target
|
|
45
|
+
parameters: additional parameters to be passed to the sampler once initialized
|
|
46
|
+
)
|
|
47
|
+
"""
|
|
48
|
+
number_of_components = np.sum(self._target.dim)
|
|
49
|
+
|
|
50
|
+
self._ordering = [
|
|
51
|
+
# Direct and Conjugate samplers
|
|
52
|
+
(samplers.Direct, True, {}),
|
|
53
|
+
(samplers.Conjugate, True, {}),
|
|
54
|
+
(samplers.ConjugateApprox, True, {}),
|
|
55
|
+
# Specialized samplers
|
|
56
|
+
(samplers.LinearRTO, True, {}),
|
|
57
|
+
(samplers.RegularizedLinearRTO, True, {}),
|
|
58
|
+
(samplers.UGLA, True, {}),
|
|
59
|
+
# Gradient.based samplers (Hamiltonian and Langevin)
|
|
60
|
+
(samplers.NUTS, True, {}),
|
|
61
|
+
(samplers.MALA, True, {}),
|
|
62
|
+
(samplers.ULA, True, {}),
|
|
63
|
+
# Gibbs and Componentwise samplers
|
|
64
|
+
(samplers.HybridGibbs, True, {"sampling_strategy" : self.recommend_HybridGibbs_sampling_strategy(as_string = False)}),
|
|
65
|
+
(samplers.CWMH, number_of_components <= 100, {"scale" : 0.05*np.ones(number_of_components),
|
|
66
|
+
"initial_point" : 0.5*np.ones(number_of_components)}),
|
|
67
|
+
# Proposal based samplers
|
|
68
|
+
(samplers.PCN, True, {"scale" : 0.02}),
|
|
69
|
+
(samplers.MH, number_of_components <= 1000, {}),
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def ordering(self):
|
|
74
|
+
""" Returns the ordered list of recommendation rules used by the recommender. """
|
|
75
|
+
return self._ordering
|
|
76
|
+
|
|
77
|
+
def valid_samplers(self, as_string = True):
|
|
78
|
+
"""
|
|
79
|
+
Finds all possible samplers that can be used for sampling from the target distribution.
|
|
80
|
+
|
|
81
|
+
Parameters
|
|
82
|
+
----------
|
|
83
|
+
|
|
84
|
+
as_string : boolean
|
|
85
|
+
Whether to return the name of the sampler as a string instead of instantiating a sampler. *Optional*
|
|
86
|
+
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
all_samplers = [(name, cls) for name, cls in inspect.getmembers(cuqi.experimental.mcmc, inspect.isclass) if issubclass(cls, cuqi.experimental.mcmc.Sampler)]
|
|
90
|
+
valid_samplers = []
|
|
91
|
+
|
|
92
|
+
for name, sampler in all_samplers:
|
|
93
|
+
try:
|
|
94
|
+
sampler(self.target)
|
|
95
|
+
valid_samplers += [name if as_string else sampler]
|
|
96
|
+
except:
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
# Need a separate case for HybridGibbs
|
|
100
|
+
if self.valid_HybridGibbs_sampling_strategy() is not None:
|
|
101
|
+
valid_samplers += [cuqi.experimental.mcmc.HybridGibbs.__name__ if as_string else cuqi.experimental.mcmc.HybridGibbs]
|
|
102
|
+
|
|
103
|
+
return valid_samplers
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def valid_HybridGibbs_sampling_strategy(self, as_string = True):
|
|
107
|
+
"""
|
|
108
|
+
Find all possible sampling strategies to be used with the HybridGibbs sampler.
|
|
109
|
+
Returns None if no sampler could be suggested for at least one conditional distribution.
|
|
110
|
+
|
|
111
|
+
Parameters
|
|
112
|
+
----------
|
|
113
|
+
|
|
114
|
+
as_string : boolean
|
|
115
|
+
Whether to return the name of the samplers in the sampling strategy as a string instead of instantiating samplers. *Optional*
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
if not isinstance(self.target, cuqi.distribution.JointDistribution):
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
par_names = self.target.get_parameter_names()
|
|
124
|
+
|
|
125
|
+
valid_samplers = dict()
|
|
126
|
+
for par_name in par_names:
|
|
127
|
+
conditional_params = {par_name_: np.ones(self.target.dim[i]) for i, par_name_ in enumerate(par_names) if par_name_ != par_name}
|
|
128
|
+
conditional = self.target(**conditional_params)
|
|
129
|
+
|
|
130
|
+
recommender = SamplerRecommender(conditional)
|
|
131
|
+
samplers = recommender.valid_samplers(as_string)
|
|
132
|
+
if len(samplers) == 0:
|
|
133
|
+
return None
|
|
134
|
+
|
|
135
|
+
valid_samplers[par_name] = samplers
|
|
136
|
+
|
|
137
|
+
return valid_samplers
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def recommend(self, as_string = False):
|
|
141
|
+
"""
|
|
142
|
+
Suggests a possible sampler that can be used for sampling from the target distribution.
|
|
143
|
+
Return None if no sampler could be suggested.
|
|
144
|
+
|
|
145
|
+
Parameters
|
|
146
|
+
----------
|
|
147
|
+
|
|
148
|
+
as_string : boolean
|
|
149
|
+
Whether to return the name of the sampler as a string instead of instantiating a sampler. *Optional*
|
|
150
|
+
|
|
151
|
+
"""
|
|
152
|
+
|
|
153
|
+
valid_samplers = self.valid_samplers(as_string = False)
|
|
154
|
+
|
|
155
|
+
for suggestion, flag, values in self._ordering:
|
|
156
|
+
if flag and (suggestion in valid_samplers) and (suggestion not in self._exceptions):
|
|
157
|
+
# Sampler found
|
|
158
|
+
if as_string:
|
|
159
|
+
return suggestion.__name__
|
|
160
|
+
else:
|
|
161
|
+
return suggestion(self.target, **values)
|
|
162
|
+
|
|
163
|
+
# No sampler can be suggested
|
|
164
|
+
raise ValueError("Cannot suggest any sampler. Either the provided distribution is incorrectly defined or there are too many exceptions provided.")
|
|
165
|
+
|
|
166
|
+
def recommend_HybridGibbs_sampling_strategy(self, as_string = False):
|
|
167
|
+
"""
|
|
168
|
+
Suggests a possible sampling strategy to be used with the HybridGibbs sampler.
|
|
169
|
+
Returns None if no sampler could be suggested for at least one conditional distribution.
|
|
170
|
+
|
|
171
|
+
Parameters
|
|
172
|
+
----------
|
|
173
|
+
|
|
174
|
+
target : `cuqi.distribution.JointDistribution`
|
|
175
|
+
The target distribution get a sampling strategy for.
|
|
176
|
+
|
|
177
|
+
as_string : boolean
|
|
178
|
+
Whether to return the name of the samplers in the sampling strategy as a string instead of instantiating samplers. *Optional*
|
|
179
|
+
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
if not isinstance(self.target, cuqi.distribution.JointDistribution):
|
|
183
|
+
return None
|
|
184
|
+
|
|
185
|
+
par_names = self.target.get_parameter_names()
|
|
186
|
+
|
|
187
|
+
suggested_samplers = dict()
|
|
188
|
+
for par_name in par_names:
|
|
189
|
+
conditional_params = {par_name_: np.ones(self.target.dim[i]) for i, par_name_ in enumerate(par_names) if par_name_ != par_name}
|
|
190
|
+
conditional = self.target(**conditional_params)
|
|
191
|
+
|
|
192
|
+
recommender = SamplerRecommender(conditional, exceptions = self._exceptions.copy())
|
|
193
|
+
sampler = recommender.recommend(as_string = as_string)
|
|
194
|
+
|
|
195
|
+
if sampler is None:
|
|
196
|
+
return None
|
|
197
|
+
|
|
198
|
+
suggested_samplers[par_name] = sampler
|
|
199
|
+
|
|
200
|
+
return suggested_samplers
|
|
@@ -172,10 +172,10 @@ class _ProductGeometry(Geometry):
|
|
|
172
172
|
return tuple(funvecs)
|
|
173
173
|
|
|
174
174
|
|
|
175
|
-
def __repr__(self) -> str:
|
|
175
|
+
def __repr__(self, pad="") -> str:
|
|
176
176
|
"""Representation of the product geometry."""
|
|
177
177
|
string = "{}(".format(self.__class__.__name__) + "\n"
|
|
178
178
|
for g in self.geometries:
|
|
179
|
-
string += "
|
|
180
|
-
string += ")"
|
|
179
|
+
string += pad + " {}\n".format(g.__repr__())
|
|
180
|
+
string += pad + ")"
|
|
181
181
|
return string
|