CUQIpy 1.0.0.post0.dev360__tar.gz → 1.0.0.post0.dev384__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.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/CUQIpy.egg-info/PKG-INFO +1 -1
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/CUQIpy.egg-info/SOURCES.txt +2 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/PKG-INFO +1 -1
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/_version.py +3 -3
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/__init__.py +1 -0
- cuqipy-1.0.0.post0.dev384/cuqi/distribution/_smoothed_laplace.py +95 -0
- cuqipy-1.0.0.post0.dev384/cuqi/implicitprior/__init__.py +3 -0
- cuqipy-1.0.0.post0.dev384/cuqi/implicitprior/_regularizedGMRF.py +152 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/implicitprior/_regularizedGaussian.py +87 -0
- cuqipy-1.0.0.post0.dev384/cuqi/implicitprior/_regularizedUnboundedUniform.py +66 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_distribution.py +27 -1
- cuqipy-1.0.0.post0.dev384/tests/test_implicit_priors.py +70 -0
- cuqipy-1.0.0.post0.dev360/cuqi/implicitprior/__init__.py +0 -2
- cuqipy-1.0.0.post0.dev360/cuqi/implicitprior/_regularizedGMRF.py +0 -70
- cuqipy-1.0.0.post0.dev360/tests/test_implicit_priors.py +0 -30
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/CUQIpy.egg-info/dependency_links.txt +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/CUQIpy.egg-info/requires.txt +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/CUQIpy.egg-info/top_level.txt +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/LICENSE +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/README.md +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/_messages.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/array/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/array/_array.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/config.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/data/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/data/_data.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/data/astronaut.npz +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/data/camera.npz +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/data/cat.npz +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/data/cookie.png +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/data/satellite.mat +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/density/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/density/_density.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/diagnostics.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_beta.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_cauchy.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_cmrf.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_custom.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_distribution.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_gamma.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_gaussian.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_gmrf.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_inverse_gamma.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_joint_distribution.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_laplace.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_lmrf.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_lognormal.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_modifiedhalfnormal.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_normal.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_posterior.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_uniform.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_conjugate.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_conjugate_approx.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_cwmh.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_direct.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_gibbs.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_hmc.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_langevin_algorithm.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_laplace_approximation.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_mh.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_pcn.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_rto.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_sampler.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_utilities.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/geometry/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/geometry/_geometry.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/likelihood/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/likelihood/_likelihood.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/model/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/model/_model.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/operator/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/operator/_operator.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/pde/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/pde/_pde.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/problem/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/problem/_problem.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_conjugate.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_conjugate_approx.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_cwmh.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_gibbs.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_hmc.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_langevin_algorithm.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_laplace_approximation.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_mh.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_pcn.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_rto.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_sampler.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/samples/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/samples/_samples.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/solver/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/solver/_solver.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/testproblem/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/testproblem/_testproblem.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/utilities/__init__.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/utilities/_get_python_variable_name.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/utilities/_utilities.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/pyproject.toml +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/requirements.txt +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/setup.cfg +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/setup.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_MRFs.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_abstract_distribution_density.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_bayesian_inversion.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_density.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_distributions_shape.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_geometry.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_joint_distribution.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_likelihood.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_model.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_pde.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_posterior.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_problem.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_sampler.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_samples.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_solver.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_testproblem.py +0 -0
- {cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_utilities.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: CUQIpy
|
|
3
|
-
Version: 1.0.0.post0.
|
|
3
|
+
Version: 1.0.0.post0.dev384
|
|
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
|
|
@@ -41,6 +41,7 @@ cuqi/distribution/_lognormal.py
|
|
|
41
41
|
cuqi/distribution/_modifiedhalfnormal.py
|
|
42
42
|
cuqi/distribution/_normal.py
|
|
43
43
|
cuqi/distribution/_posterior.py
|
|
44
|
+
cuqi/distribution/_smoothed_laplace.py
|
|
44
45
|
cuqi/distribution/_uniform.py
|
|
45
46
|
cuqi/experimental/__init__.py
|
|
46
47
|
cuqi/experimental/mcmc/__init__.py
|
|
@@ -62,6 +63,7 @@ cuqi/geometry/_geometry.py
|
|
|
62
63
|
cuqi/implicitprior/__init__.py
|
|
63
64
|
cuqi/implicitprior/_regularizedGMRF.py
|
|
64
65
|
cuqi/implicitprior/_regularizedGaussian.py
|
|
66
|
+
cuqi/implicitprior/_regularizedUnboundedUniform.py
|
|
65
67
|
cuqi/likelihood/__init__.py
|
|
66
68
|
cuqi/likelihood/_likelihood.py
|
|
67
69
|
cuqi/model/__init__.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: CUQIpy
|
|
3
|
-
Version: 1.0.0.post0.
|
|
3
|
+
Version: 1.0.0.post0.dev384
|
|
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": "2024-07-
|
|
11
|
+
"date": "2024-07-05T09:29:07+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.0.0.post0.
|
|
14
|
+
"full-revisionid": "3e3d762fab019f39257708bb9cdf5abc3681f196",
|
|
15
|
+
"version": "1.0.0.post0.dev384"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -9,6 +9,7 @@ from ._gmrf import GMRF
|
|
|
9
9
|
from ._inverse_gamma import InverseGamma
|
|
10
10
|
from ._lmrf import LMRF
|
|
11
11
|
from ._laplace import Laplace
|
|
12
|
+
from ._smoothed_laplace import SmoothedLaplace
|
|
12
13
|
from ._lognormal import Lognormal
|
|
13
14
|
from ._normal import Normal
|
|
14
15
|
from ._posterior import Posterior
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from cuqi.utilities import force_ndarray
|
|
3
|
+
from cuqi.distribution import Distribution
|
|
4
|
+
|
|
5
|
+
class SmoothedLaplace(Distribution):
|
|
6
|
+
""" Smoothed Laplace distribution.
|
|
7
|
+
|
|
8
|
+
Defines a smoothed Laplace distribution given a location, a scale and a smoothing parameter
|
|
9
|
+
beta. The smoothed Laplace distribution is defined as
|
|
10
|
+
|
|
11
|
+
.. math::
|
|
12
|
+
|
|
13
|
+
p(x) = \\frac{1}{2b} \exp\left(-\\frac{\sqrt{(x-\mu)^2 + \beta}}{b}\\right),
|
|
14
|
+
|
|
15
|
+
where :math:`\mu` is the location (mean), :math:`b` is the scale (decay) parameter and
|
|
16
|
+
:math:`\beta` is the smoothing parameter.
|
|
17
|
+
|
|
18
|
+
The rate parameter is defined as :math:`\lambda = \\frac{1}{b}`.
|
|
19
|
+
|
|
20
|
+
The variables of this Laplace distribution are independent identically distributed (i.i.d.).
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
location : scalar, list, tuple, or ndarray
|
|
25
|
+
The location parameter of the distribution.
|
|
26
|
+
|
|
27
|
+
scale : scalar, list, tuple, or ndarray
|
|
28
|
+
The scale parameter of the distribution.
|
|
29
|
+
|
|
30
|
+
beta : scalar
|
|
31
|
+
The smoothing parameter of the distribution.
|
|
32
|
+
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__(self, location=None, scale=None, beta=1e-3, **kwargs):
|
|
36
|
+
super().__init__(**kwargs)
|
|
37
|
+
|
|
38
|
+
self.location = location
|
|
39
|
+
self.scale = scale
|
|
40
|
+
self.beta = beta
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def location(self):
|
|
44
|
+
""" Location parameter """
|
|
45
|
+
return self._location
|
|
46
|
+
|
|
47
|
+
@location.setter
|
|
48
|
+
def location(self, value):
|
|
49
|
+
self._location = force_ndarray(value, flatten=True)
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def scale(self):
|
|
53
|
+
""" Scale parameter """
|
|
54
|
+
return self._scale
|
|
55
|
+
|
|
56
|
+
@scale.setter
|
|
57
|
+
def scale(self, value):
|
|
58
|
+
self._scale = force_ndarray(value, flatten=True)
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def beta(self):
|
|
62
|
+
""" Beta parameter """
|
|
63
|
+
return self._beta
|
|
64
|
+
|
|
65
|
+
@beta.setter
|
|
66
|
+
def beta(self, value):
|
|
67
|
+
self._beta = value
|
|
68
|
+
|
|
69
|
+
def logpdf(self, x):
|
|
70
|
+
"""
|
|
71
|
+
Computes the logarithm of the probability density function at the given values of x.
|
|
72
|
+
"""
|
|
73
|
+
# x accepts scalar, list, tuple, or ndarray
|
|
74
|
+
if isinstance(x, (float, int)):
|
|
75
|
+
x = np.array([x])
|
|
76
|
+
elif isinstance(x, (list, tuple)):
|
|
77
|
+
x = np.array(x)
|
|
78
|
+
return np.sum(np.log(0.5 / self.scale)) - np.sum(np.sqrt((x - self.location) ** 2 + self.beta) / self.scale)
|
|
79
|
+
|
|
80
|
+
def gradient(self, x):
|
|
81
|
+
"""
|
|
82
|
+
Computes the gradient of logpdf at the given values of x.
|
|
83
|
+
"""
|
|
84
|
+
# x accepts scalar, list, tuple, or ndarray
|
|
85
|
+
if isinstance(x, (float, int)):
|
|
86
|
+
x = np.array([x])
|
|
87
|
+
elif isinstance(x, (list, tuple)):
|
|
88
|
+
x = np.array(x)
|
|
89
|
+
return -np.array((x - self.location) / self.scale / np.sqrt((x - self.location) ** 2 + self.beta))
|
|
90
|
+
|
|
91
|
+
def _sample(self, N=1, rng=None):
|
|
92
|
+
"""
|
|
93
|
+
Generates random samples from the distribution.
|
|
94
|
+
"""
|
|
95
|
+
raise NotImplementedError(f"sample is not implemented for {self.__class__.__name__}.")
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
from cuqi.implicitprior import RegularizedGaussian
|
|
2
|
+
from cuqi.distribution import Distribution, GMRF
|
|
3
|
+
|
|
4
|
+
class RegularizedGMRF(RegularizedGaussian):
|
|
5
|
+
""" Implicit Regularized GMRF (Gaussian Markov Random Field).
|
|
6
|
+
|
|
7
|
+
Defines a so-called implicit prior based on a GMRF distribution with implicit regularization.
|
|
8
|
+
The regularization can be defined in the form of a proximal operator or a projector.
|
|
9
|
+
Alternatively, preset constraints and regularization can be used.
|
|
10
|
+
|
|
11
|
+
Only one of proximal, projector, constraint or regularization can be provided. Otherwise, an error is raised.
|
|
12
|
+
|
|
13
|
+
Can be used as a prior in a posterior which can be sampled with the RegularizedLinearRTO sampler.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
For more details on implicit regularized Gaussian see the following paper:
|
|
17
|
+
|
|
18
|
+
[1] Everink, Jasper M., Yiqiu Dong, and Martin S. Andersen. "Sparse Bayesian inference with regularized
|
|
19
|
+
Gaussian distributions." Inverse Problems 39.11 (2023): 115004.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
mean
|
|
24
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
25
|
+
|
|
26
|
+
prec
|
|
27
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
28
|
+
|
|
29
|
+
bc_type
|
|
30
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
31
|
+
|
|
32
|
+
order
|
|
33
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
34
|
+
|
|
35
|
+
proximal : callable f(x, scale) or None
|
|
36
|
+
Euclidean proximal operator f of the regularization function g, that is, a solver for the optimization problem
|
|
37
|
+
min_z 0.5||x-z||_2^2+scale*g(x).
|
|
38
|
+
|
|
39
|
+
projector : callable f(x) or None
|
|
40
|
+
Euclidean projection onto the constraint C, that is, a solver for the optimization problem
|
|
41
|
+
min_(z in C) 0.5||x-z||_2^2.
|
|
42
|
+
|
|
43
|
+
constraint : string or None
|
|
44
|
+
Preset constraints. Can be set to "nonnegativity" and "box". Required for use in Gibbs.
|
|
45
|
+
For "box", the following additional parameters can be passed:
|
|
46
|
+
lower_bound : array_like or None
|
|
47
|
+
Lower bound of box, defaults to zero
|
|
48
|
+
upper_bound : array_like
|
|
49
|
+
Upper bound of box, defaults to one
|
|
50
|
+
|
|
51
|
+
regularization : string or None
|
|
52
|
+
Preset regularization. Can be set to "l1". Required for use in Gibbs in future update.
|
|
53
|
+
For "l1", the following additional parameters can be passed:
|
|
54
|
+
strength : scalar
|
|
55
|
+
Regularization parameter, i.e., strength*||x||_1 , defaults to one
|
|
56
|
+
|
|
57
|
+
"""
|
|
58
|
+
def __init__(self, mean=None, prec=None, bc_type='zero', order=1, proximal = None, projector = None, constraint = None, regularization = None, **kwargs):
|
|
59
|
+
|
|
60
|
+
args = {"lower_bound" : kwargs.pop("lower_bound", None),
|
|
61
|
+
"upper_bound" : kwargs.pop("upper_bound", None),
|
|
62
|
+
"strength" : kwargs.pop("strength", None)}
|
|
63
|
+
|
|
64
|
+
# Underlying explicit GMRF
|
|
65
|
+
self._gaussian = GMRF(mean, prec, bc_type=bc_type, order=order, **kwargs)
|
|
66
|
+
|
|
67
|
+
# Init from abstract distribution class
|
|
68
|
+
super(Distribution, self).__init__(**kwargs)
|
|
69
|
+
|
|
70
|
+
self._parse_regularization_input_arguments(proximal, projector, constraint, regularization, args)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class ConstrainedGMRF(RegularizedGMRF):
|
|
75
|
+
""" Implicit Constrained GMRF (Gaussian Markov Random Field).
|
|
76
|
+
|
|
77
|
+
Defines a so-called implicit prior based on a GMRF distribution with implicit constraints.
|
|
78
|
+
The constraint can be defined as a preset or in the form of a projector.
|
|
79
|
+
|
|
80
|
+
Precisely one of projector or constraint needs to be provided. Otherwise, an error is raised.
|
|
81
|
+
|
|
82
|
+
Can be used as a prior in a posterior which can be sampled with the RegularizedLinearRTO sampler.
|
|
83
|
+
|
|
84
|
+
Alias for :class:`~cuqi.implicitprior.RegularizedGMRF` with only constraints available.
|
|
85
|
+
|
|
86
|
+
For more details on implicit regularized Gaussian see the following paper:
|
|
87
|
+
|
|
88
|
+
[1] Everink, Jasper M., Yiqiu Dong, and Martin S. Andersen. "Sparse Bayesian inference with regularized
|
|
89
|
+
Gaussian distributions." Inverse Problems 39.11 (2023): 115004.
|
|
90
|
+
|
|
91
|
+
Parameters
|
|
92
|
+
----------
|
|
93
|
+
mean
|
|
94
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
95
|
+
|
|
96
|
+
prec
|
|
97
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
98
|
+
|
|
99
|
+
bc_type
|
|
100
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
101
|
+
|
|
102
|
+
order
|
|
103
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
104
|
+
|
|
105
|
+
projector : callable f(x) or None
|
|
106
|
+
Euclidean projection onto the constraint C, that is, a solver for the optimization problem
|
|
107
|
+
min_(z in C) 0.5||x-z||_2^2.
|
|
108
|
+
|
|
109
|
+
constraint : string or None
|
|
110
|
+
Preset constraints. Can be set to "nonnegativity" and "box". Required for use in Gibbs.
|
|
111
|
+
For "box", the following additional parameters can be passed:
|
|
112
|
+
lower_bound : array_like or None
|
|
113
|
+
Lower bound of box, defaults to zero
|
|
114
|
+
upper_bound : array_like
|
|
115
|
+
Upper bound of box, defaults to one
|
|
116
|
+
|
|
117
|
+
"""
|
|
118
|
+
def __init__(self, mean=None, prec=None, bc_type='zero', order=1, projector=None, constraint=None, **kwargs):
|
|
119
|
+
super().__init__(mean=mean, prec=prec, bc_type=bc_type, order=order, projector=projector, constraint=constraint, **kwargs)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class NonnegativeGMRF(RegularizedGMRF):
|
|
123
|
+
""" Implicit Nonnegative GMRF (Gaussian Markov Random Field).
|
|
124
|
+
|
|
125
|
+
Defines a so-called implicit prior based on a GMRF distribution with implicit nonnegativity constraints.
|
|
126
|
+
|
|
127
|
+
Can be used as a prior in a posterior which can be sampled with the RegularizedLinearRTO sampler.
|
|
128
|
+
|
|
129
|
+
Alias for :class:`~cuqi.implicitprior.RegularizedGMRF` with only nonnegativity constraints.
|
|
130
|
+
|
|
131
|
+
For more details on implicit regularized Gaussian see the following paper:
|
|
132
|
+
|
|
133
|
+
[1] Everink, Jasper M., Yiqiu Dong, and Martin S. Andersen. "Sparse Bayesian inference with regularized
|
|
134
|
+
Gaussian distributions." Inverse Problems 39.11 (2023): 115004.
|
|
135
|
+
|
|
136
|
+
Parameters
|
|
137
|
+
----------
|
|
138
|
+
mean
|
|
139
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
140
|
+
|
|
141
|
+
prec
|
|
142
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
143
|
+
|
|
144
|
+
bc_type
|
|
145
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
146
|
+
|
|
147
|
+
order
|
|
148
|
+
See :class:`~cuqi.distribution.GMRF` for details.
|
|
149
|
+
|
|
150
|
+
"""
|
|
151
|
+
def __init__(self, mean=None, prec=None, bc_type='zero', order=1, **kwargs):
|
|
152
|
+
super().__init__(mean=mean, prec=prec, bc_type=bc_type, order=order, constraint="nonnegativity", **kwargs)
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/implicitprior/_regularizedGaussian.py
RENAMED
|
@@ -234,3 +234,90 @@ class RegularizedGaussian(Distribution):
|
|
|
234
234
|
new_density = new_density.to_likelihood(value)
|
|
235
235
|
|
|
236
236
|
return new_density
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
class ConstrainedGaussian(RegularizedGaussian):
|
|
240
|
+
""" Implicit Constrained Gaussian.
|
|
241
|
+
|
|
242
|
+
Defines a so-called implicit prior based on a Gaussian distribution with implicit constraints.
|
|
243
|
+
The constraint can be defined as a preset or in the form of a projector.
|
|
244
|
+
|
|
245
|
+
Precisely one of projector or constraint needs to be provided. Otherwise, an error is raised.
|
|
246
|
+
|
|
247
|
+
Can be used as a prior in a posterior which can be sampled with the RegularizedLinearRTO sampler.
|
|
248
|
+
|
|
249
|
+
Alias for :class:`~cuqi.implicitprior.RegularizedGaussian` with only constraints available.
|
|
250
|
+
|
|
251
|
+
For more details on implicit regularized Gaussian see the following paper:
|
|
252
|
+
|
|
253
|
+
[1] Everink, Jasper M., Yiqiu Dong, and Martin S. Andersen. "Sparse Bayesian inference with regularized
|
|
254
|
+
Gaussian distributions." Inverse Problems 39.11 (2023): 115004.
|
|
255
|
+
|
|
256
|
+
Parameters
|
|
257
|
+
----------
|
|
258
|
+
mean
|
|
259
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
260
|
+
|
|
261
|
+
cov
|
|
262
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
263
|
+
|
|
264
|
+
prec
|
|
265
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
266
|
+
|
|
267
|
+
sqrtcov
|
|
268
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
269
|
+
|
|
270
|
+
sqrtprec
|
|
271
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
272
|
+
|
|
273
|
+
projector : callable f(x) or None
|
|
274
|
+
Euclidean projection onto the constraint C, that is, a solver for the optimization problem
|
|
275
|
+
min_(z in C) 0.5||x-z||_2^2.
|
|
276
|
+
|
|
277
|
+
constraint : string or None
|
|
278
|
+
Preset constraints. Can be set to "nonnegativity" and "box". Required for use in Gibbs.
|
|
279
|
+
For "box", the following additional parameters can be passed:
|
|
280
|
+
lower_bound : array_like or None
|
|
281
|
+
Lower bound of box, defaults to zero
|
|
282
|
+
upper_bound : array_like
|
|
283
|
+
Upper bound of box, defaults to one
|
|
284
|
+
|
|
285
|
+
"""
|
|
286
|
+
def __init__(self, mean=None, cov=None, prec=None, sqrtcov=None,sqrtprec=None, projector=None, constraint=None, **kwargs):
|
|
287
|
+
super().__init__(mean=mean, cov=cov, prec=prec, sqrtcov=sqrtcov, sqrtprec=sqrtprec, projector=projector, constraint=constraint, **kwargs)
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class NonnegativeGaussian(RegularizedGaussian):
|
|
291
|
+
""" Implicit Nonnegative Gaussian.
|
|
292
|
+
|
|
293
|
+
Defines a so-called implicit prior based on a Gaussian distribution with implicit nonnegativity constraints.
|
|
294
|
+
|
|
295
|
+
Can be used as a prior in a posterior which can be sampled with the RegularizedLinearRTO sampler.
|
|
296
|
+
|
|
297
|
+
Alias for :class:`~cuqi.implicitprior.RegularizedGaussian` with only nonnegativity constraints.
|
|
298
|
+
|
|
299
|
+
For more details on implicit regularized Gaussian see the following paper:
|
|
300
|
+
|
|
301
|
+
[1] Everink, Jasper M., Yiqiu Dong, and Martin S. Andersen. "Sparse Bayesian inference with regularized
|
|
302
|
+
Gaussian distributions." Inverse Problems 39.11 (2023): 115004.
|
|
303
|
+
|
|
304
|
+
Parameters
|
|
305
|
+
----------
|
|
306
|
+
mean
|
|
307
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
308
|
+
|
|
309
|
+
cov
|
|
310
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
311
|
+
|
|
312
|
+
prec
|
|
313
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
314
|
+
|
|
315
|
+
sqrtcov
|
|
316
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
317
|
+
|
|
318
|
+
sqrtprec
|
|
319
|
+
See :class:`~cuqi.distribution.Gaussian` for details.
|
|
320
|
+
|
|
321
|
+
"""
|
|
322
|
+
def __init__(self, mean=None, cov=None, prec=None, sqrtcov=None,sqrtprec=None, **kwargs):
|
|
323
|
+
super().__init__(mean=mean, cov=cov, prec=prec, sqrtcov=sqrtcov, sqrtprec=sqrtprec, constraint="nonnegativity", **kwargs)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
from cuqi.implicitprior import RegularizedGaussian
|
|
2
|
+
from cuqi.distribution import Distribution, Gaussian
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class RegularizedUnboundedUniform(RegularizedGaussian):
|
|
8
|
+
""" Implicit Regularized Unbounded Uniform.
|
|
9
|
+
|
|
10
|
+
Defines a so-called implicit prior with implicit regularization on a Gaussian distribution with zero precision.
|
|
11
|
+
The regularization can be defined in the form of a proximal operator or a projector.
|
|
12
|
+
Alternatively, preset constraints and regularization can be used.
|
|
13
|
+
|
|
14
|
+
For regularization of the form f(x), provide a single proximal operator.
|
|
15
|
+
|
|
16
|
+
Can be used as a prior in a posterior which can be sampled with the RegularizedLinearRTO sampler.
|
|
17
|
+
|
|
18
|
+
Alias for :class:`~cuqi.implicitprior.RegularizedGaussian` with zero mean and zero sqrtprec.
|
|
19
|
+
|
|
20
|
+
For more details on implicit regularized Gaussian see the following paper:
|
|
21
|
+
|
|
22
|
+
[1] Everink, Jasper M., Yiqiu Dong, and Martin S. Andersen. "Sparse Bayesian inference with regularized
|
|
23
|
+
Gaussian distributions." Inverse Problems 39.11 (2023): 115004.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
geometry : :class:`~cuqi.geometry.Geometry` or integer
|
|
28
|
+
The geometry of the underlying variable. Defines the dimension of the distribution.
|
|
29
|
+
|
|
30
|
+
proximal : callable f(x, scale) or None
|
|
31
|
+
Euclidean proximal operator f of the regularization function g, that is, a solver for the optimization problem
|
|
32
|
+
min_z 0.5||x-z||_2^2+scale*g(x).
|
|
33
|
+
|
|
34
|
+
projector : callable f(x) or None
|
|
35
|
+
Euclidean projection onto the constraint C, that is, a solver for the optimization problem
|
|
36
|
+
min_(z in C) 0.5||x-z||_2^2.
|
|
37
|
+
|
|
38
|
+
constraint : string or None
|
|
39
|
+
Preset constraints. Can be set to "nonnegativity" and "box". Required for use in Gibbs.
|
|
40
|
+
For "box", the following additional parameters can be passed:
|
|
41
|
+
lower_bound : array_like or None
|
|
42
|
+
Lower bound of box, defaults to zero
|
|
43
|
+
upper_bound : array_like
|
|
44
|
+
Upper bound of box, defaults to one
|
|
45
|
+
|
|
46
|
+
regularization : string or None
|
|
47
|
+
Preset regularization. Can be set to "l1". Required for use in Gibbs in future update.
|
|
48
|
+
For "l1", the following additional parameters can be passed:
|
|
49
|
+
strength : scalar
|
|
50
|
+
Regularization parameter, i.e., strength*||x||_1 , defaults to one
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
def __init__(self, geometry, proximal = None, projector = None, constraint = None, regularization = None, **kwargs):
|
|
54
|
+
|
|
55
|
+
args = {"lower_bound" : kwargs.pop("lower_bound", None),
|
|
56
|
+
"upper_bound" : kwargs.pop("upper_bound", None),
|
|
57
|
+
"strength" : kwargs.pop("strength", None)}
|
|
58
|
+
|
|
59
|
+
# Underlying explicit Gaussian
|
|
60
|
+
# This line throws a warning due trying to applying get_sqrtprec_from_sqrtprec to an all zero matrix
|
|
61
|
+
self._gaussian = Gaussian(mean = np.zeros(geometry.par_dim), sqrtprec = np.zeros((geometry.par_dim,geometry.par_dim)), geometry = geometry, **kwargs)
|
|
62
|
+
|
|
63
|
+
# Init from abstract distribution class
|
|
64
|
+
super(Distribution, self).__init__(**kwargs)
|
|
65
|
+
|
|
66
|
+
self._parse_regularization_input_arguments(proximal, projector, constraint, regularization, args)
|
|
@@ -779,4 +779,30 @@ def test_MHN_regression(alpha, beta, gamma, expected_logpdf, expected_gradient):
|
|
|
779
779
|
logpdf = dist.logpdf(np.array([1.0, 2.0, 3.0, 4.0, 5.0]))
|
|
780
780
|
gradient = dist._gradient(np.array([1.0, 2.0, 3.0, 4.0, 5.0]))
|
|
781
781
|
assert np.allclose( logpdf, np.array(expected_logpdf))
|
|
782
|
-
assert np.allclose( gradient, np.array(expected_gradient))
|
|
782
|
+
assert np.allclose( gradient, np.array(expected_gradient))
|
|
783
|
+
|
|
784
|
+
def test_Smoothed_Laplace():
|
|
785
|
+
""" Test Smoothed Laplace distribution logpdf and gradient """
|
|
786
|
+
|
|
787
|
+
location = np.array([1, 2])
|
|
788
|
+
scale = np.array([1, 2])
|
|
789
|
+
scalar_laplace_0 = cuqi.distribution.Laplace(location[0], scale[0])
|
|
790
|
+
|
|
791
|
+
scalar_smoothed_laplace_0 = cuqi.distribution.SmoothedLaplace(location[0], scale[0], 1e-8)
|
|
792
|
+
scalar_smoothed_laplace_1 = cuqi.distribution.SmoothedLaplace(location[1], scale[1], 1e-8)
|
|
793
|
+
vector_smoothed_laplace = cuqi.distribution.SmoothedLaplace(location, scale, 1e-8)
|
|
794
|
+
|
|
795
|
+
x = np.array([3, 4])
|
|
796
|
+
|
|
797
|
+
# logpdf (scalar Laplace vs scalar Smoothed Laplace)
|
|
798
|
+
assert np.allclose(scalar_laplace_0.logpdf([x[0]]), scalar_smoothed_laplace_0.logpdf(x[0]))
|
|
799
|
+
|
|
800
|
+
# logpdf (scalar Smoothed Laplace * scalar Smoothed Laplace vs vector Smoothed Laplace)
|
|
801
|
+
assert np.allclose(scalar_smoothed_laplace_0.logpdf(x[0])+scalar_smoothed_laplace_1.logpdf(x[1]),
|
|
802
|
+
vector_smoothed_laplace.logpdf(x))
|
|
803
|
+
|
|
804
|
+
# gradient (scalar Smoothed Laplace vs analytical)
|
|
805
|
+
assert np.allclose(scalar_smoothed_laplace_0.gradient(x[0]), -1/scale[0])
|
|
806
|
+
|
|
807
|
+
# gradient (vector Smoothed Laplace vs analytical)
|
|
808
|
+
assert np.allclose(vector_smoothed_laplace.gradient(x), -1/scale)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import cuqi
|
|
2
|
+
import numpy as np
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
def test_RegularizedGaussian_default_init():
|
|
6
|
+
""" Test that the implicit regularized Gaussian requires at least 1 regularization argument """
|
|
7
|
+
|
|
8
|
+
with pytest.raises(ValueError, match="Precisely one of "):
|
|
9
|
+
x = cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1)
|
|
10
|
+
|
|
11
|
+
def test_RegularizedGaussian_guarding_statements():
|
|
12
|
+
""" Test that we catch incorrect initialization of RegularizedGaussian """
|
|
13
|
+
|
|
14
|
+
# More than 1 argument
|
|
15
|
+
with pytest.raises(ValueError, match="Precisely one of "):
|
|
16
|
+
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, proximal=lambda s,z: s, constraint="nonnegativity")
|
|
17
|
+
|
|
18
|
+
# Proximal
|
|
19
|
+
with pytest.raises(ValueError, match="Proximal needs to be callable"):
|
|
20
|
+
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, proximal=1)
|
|
21
|
+
|
|
22
|
+
with pytest.raises(ValueError, match="Proximal should take 2 arguments"):
|
|
23
|
+
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, proximal=lambda s: s)
|
|
24
|
+
|
|
25
|
+
# Projector
|
|
26
|
+
with pytest.raises(ValueError, match="Projector needs to be callable"):
|
|
27
|
+
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, projector=1)
|
|
28
|
+
|
|
29
|
+
with pytest.raises(ValueError, match="Projector should take 1 argument"):
|
|
30
|
+
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, projector=lambda s,z: s)
|
|
31
|
+
|
|
32
|
+
def test_ConstrainedGaussian_alias():
|
|
33
|
+
""" Test that the implicit constrained Gaussian is a correct allias for an implicit regularized Gaussian """
|
|
34
|
+
|
|
35
|
+
x = cuqi.implicitprior.ConstrainedGaussian(np.zeros(5), 1, constraint="nonnegativity")
|
|
36
|
+
|
|
37
|
+
assert isinstance(x, cuqi.implicitprior.RegularizedGaussian)
|
|
38
|
+
assert x.preset == "nonnegativity"
|
|
39
|
+
|
|
40
|
+
def test_NonnegativeGaussian_alias():
|
|
41
|
+
""" Test that the implicit nonnegative Gaussian is a correct allias for an implicit regularized Gaussian """
|
|
42
|
+
|
|
43
|
+
x = cuqi.implicitprior.NonnegativeGaussian(np.zeros(5), 1)
|
|
44
|
+
|
|
45
|
+
assert isinstance(x, cuqi.implicitprior.RegularizedGaussian)
|
|
46
|
+
assert x.preset == "nonnegativity"
|
|
47
|
+
|
|
48
|
+
def test_ConstrainedGMRF_alias():
|
|
49
|
+
""" Test that the implicit constrained GMRF is a correct allias for an implicit regularized GMRF """
|
|
50
|
+
|
|
51
|
+
x = cuqi.implicitprior.ConstrainedGMRF(np.zeros(5), 1, constraint="nonnegativity")
|
|
52
|
+
|
|
53
|
+
assert isinstance(x, cuqi.implicitprior.RegularizedGMRF)
|
|
54
|
+
assert x.preset == "nonnegativity"
|
|
55
|
+
|
|
56
|
+
def test_NonnegativeGMRF_alias():
|
|
57
|
+
""" Test that the implicit nonnegative GMRF is a correct allias for an implicit regularized GMRF """
|
|
58
|
+
|
|
59
|
+
x = cuqi.implicitprior.NonnegativeGMRF(np.zeros(5), 1)
|
|
60
|
+
|
|
61
|
+
assert isinstance(x, cuqi.implicitprior.RegularizedGMRF)
|
|
62
|
+
assert x.preset == "nonnegativity"
|
|
63
|
+
|
|
64
|
+
def test_RegularizedUnboundedUniform_is_RegularizedGaussian():
|
|
65
|
+
""" Test that the implicit regularized unbounded uniform create a Regularized Gaussian with zero sqrtprec """
|
|
66
|
+
# NOTE: Test is based on the current assumption that the regularized uniform is modeled as a Gaussian with zero precision. This might change in the future.
|
|
67
|
+
|
|
68
|
+
x = cuqi.implicitprior.RegularizedUnboundedUniform(cuqi.geometry.Continuous1D(5), regularization="l1", strength = 5.0)
|
|
69
|
+
|
|
70
|
+
assert np.allclose(x.gaussian.sqrtprec, 0.0)
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
from cuqi.implicitprior import RegularizedGaussian
|
|
2
|
-
from cuqi.distribution import Distribution, GMRF
|
|
3
|
-
|
|
4
|
-
class RegularizedGMRF(RegularizedGaussian):
|
|
5
|
-
""" Implicit Regularized GMRF (Gaussian Markov Random Field).
|
|
6
|
-
|
|
7
|
-
Defines a so-called implicit prior based on a GMRF distribution with implicit regularization.
|
|
8
|
-
The regularization can be defined in the form of a proximal operator or a projector.
|
|
9
|
-
Alternatively, preset constraints and regularization can be used.
|
|
10
|
-
|
|
11
|
-
Only one of proximal, projector, constraint or regularization can be provided. Otherwise, an error is raised.
|
|
12
|
-
|
|
13
|
-
Can be used as a prior in a posterior which can be sampled with the RegularizedLinearRTO sampler.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
For more details on implicit regularized Gaussian see the following paper:
|
|
17
|
-
|
|
18
|
-
[1] Everink, Jasper M., Yiqiu Dong, and Martin S. Andersen. "Sparse Bayesian inference with regularized
|
|
19
|
-
Gaussian distributions." Inverse Problems 39.11 (2023): 115004.
|
|
20
|
-
|
|
21
|
-
Parameters
|
|
22
|
-
----------
|
|
23
|
-
mean
|
|
24
|
-
See :class:`~cuqi.distribution.GMRF` for details.
|
|
25
|
-
|
|
26
|
-
prec
|
|
27
|
-
See :class:`~cuqi.distribution.GMRF` for details.
|
|
28
|
-
|
|
29
|
-
bc_type
|
|
30
|
-
See :class:`~cuqi.distribution.GMRF` for details.
|
|
31
|
-
|
|
32
|
-
order
|
|
33
|
-
See :class:`~cuqi.distribution.GMRF` for details.
|
|
34
|
-
|
|
35
|
-
proximal : callable f(x, scale) or None
|
|
36
|
-
Euclidean proximal operator f of the regularization function g, that is, a solver for the optimization problem
|
|
37
|
-
min_z 0.5||x-z||_2^2+scale*g(x).
|
|
38
|
-
|
|
39
|
-
projector : callable f(x) or None
|
|
40
|
-
Euclidean projection onto the constraint C, that is, a solver for the optimization problem
|
|
41
|
-
min_(z in C) 0.5||x-z||_2^2.
|
|
42
|
-
|
|
43
|
-
constraint : string or None
|
|
44
|
-
Preset constraints. Can be set to "nonnegativity" and "box". Required for use in Gibbs.
|
|
45
|
-
For "box", the following additional parameters can be passed:
|
|
46
|
-
lower_bound : array_like or None
|
|
47
|
-
Lower bound of box, defaults to zero
|
|
48
|
-
upper_bound : array_like
|
|
49
|
-
Upper bound of box, defaults to one
|
|
50
|
-
|
|
51
|
-
regularization : string or None
|
|
52
|
-
Preset regularization. Can be set to "l1". Required for use in Gibbs in future update.
|
|
53
|
-
For "l1", the following additional parameters can be passed:
|
|
54
|
-
strength : scalar
|
|
55
|
-
Regularization parameter, i.e., strength*||x||_1 , defaults to one
|
|
56
|
-
|
|
57
|
-
"""
|
|
58
|
-
def __init__(self, mean=None, prec=None, bc_type='zero', order=1, proximal = None, projector = None, constraint = None, regularization = None, **kwargs):
|
|
59
|
-
|
|
60
|
-
args = {"lower_bound" : kwargs.pop("lower_bound", None),
|
|
61
|
-
"upper_bound" : kwargs.pop("upper_bound", None),
|
|
62
|
-
"strength" : kwargs.pop("strength", None)}
|
|
63
|
-
|
|
64
|
-
# Underlying explicit GMRF
|
|
65
|
-
self._gaussian = GMRF(mean, prec, bc_type=bc_type, order=order, **kwargs)
|
|
66
|
-
|
|
67
|
-
# Init from abstract distribution class
|
|
68
|
-
super(Distribution, self).__init__(**kwargs)
|
|
69
|
-
|
|
70
|
-
self._parse_regularization_input_arguments(proximal, projector, constraint, regularization, args)
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import cuqi
|
|
2
|
-
import numpy as np
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
def test_RegularizedGaussian_default_init():
|
|
6
|
-
""" Test that the implicit regularized Gaussian requires at least 1 regularization argument """
|
|
7
|
-
|
|
8
|
-
with pytest.raises(ValueError, match="Precisely one of "):
|
|
9
|
-
x = cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1)
|
|
10
|
-
|
|
11
|
-
def test_RegularizedGaussian_guarding_statements():
|
|
12
|
-
""" Test that we catch incorrect initialization of RegularizedGaussian """
|
|
13
|
-
|
|
14
|
-
# More than 1 argument
|
|
15
|
-
with pytest.raises(ValueError, match="Precisely one of "):
|
|
16
|
-
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, proximal=lambda s,z: s, constraint="nonnegativity")
|
|
17
|
-
|
|
18
|
-
# Proximal
|
|
19
|
-
with pytest.raises(ValueError, match="Proximal needs to be callable"):
|
|
20
|
-
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, proximal=1)
|
|
21
|
-
|
|
22
|
-
with pytest.raises(ValueError, match="Proximal should take 2 arguments"):
|
|
23
|
-
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, proximal=lambda s: s)
|
|
24
|
-
|
|
25
|
-
# Projector
|
|
26
|
-
with pytest.raises(ValueError, match="Projector needs to be callable"):
|
|
27
|
-
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, projector=1)
|
|
28
|
-
|
|
29
|
-
with pytest.raises(ValueError, match="Projector should take 1 argument"):
|
|
30
|
-
cuqi.implicitprior.RegularizedGaussian(np.zeros(5), 1, projector=lambda s,z: s)
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/CUQIpy.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_joint_distribution.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/distribution/_modifiedhalfnormal.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_conjugate.py
RENAMED
|
File without changes
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_conjugate_approx.py
RENAMED
|
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
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/experimental/mcmc/_utilities.py
RENAMED
|
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
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/sampler/_laplace_approximation.py
RENAMED
|
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
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/cuqi/utilities/_get_python_variable_name.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuqipy-1.0.0.post0.dev360 → cuqipy-1.0.0.post0.dev384}/tests/test_abstract_distribution_density.py
RENAMED
|
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
|