Note
Go to the end to download the full example code.
Uncertainty Quantification in one-dimensional deconvolution#
This tutorial walks through the process of solving a simple 1D deconvolution problem in a Bayesian setting. It also shows how to define such a convolution model in CUQIpy.
Setup#
We start by importing the necessary modules
import cuqi
import numpy as np
import matplotlib.pyplot as plt
Setting up the forward model#
We start by defining the forward model. In this case, we will use a simple convolution model. The forward model is defined by the following equation:
where \(\mathbf{y}\) is the data, \(\mathbf{A}\) is the convolution (forward model) operator, and \(\mathbf{x}\) is the solution.
The easiest way to define the forward model is to use the testproblem module.
This module contains a number of pre-defined test problems that contain the
forward model and synthetic data. In this case, we will use the
cuqi.testproblem.Deconvolution1D
test problem. We extract the forward model
and synthetic data from the test problem by calling the get_components()
method.
# Forward model and data
A, y_data, info = cuqi.testproblem.Deconvolution1D().get_components()
There are many parameters that can be set when creating the test problem. For more details
see the cuqi.testproblem.Deconvolution1D
documentation. In this case, we will use
the default parameters. The get_components()
method returns the forward model,
synthetic data, and a ProblemInfo
object that contains information about the
test problem.
Let’s take a look at the forward model
print(A)
CUQI LinearModel: Continuous1D[128] -> Continuous1D[128].
Forward parameters: ['x'].
We see that the forward model is a a LinearModel
object. This
object contains the forward model and the adjoint model. We also see that the domain and
range of the forward model are both continuous 1D spaces. Finally, we see that the default
forward parameters are set to \(\mathbf{x}\).
Let’s take a look at the synthetic data and compare with the exact solution
that we can find in the ProblemInfo
object.
y_data.plot(label="Synthetic data")
info.exactSolution.plot(label="Exact solution")
plt.title("Deconvolution 1D problem")
plt.legend()

<matplotlib.legend.Legend object at 0x7fad7829caa0>
Setting up the prior#
We now need to define the prior distribution for the solution. In this case, we will use
a Gaussian Markov Random Field (GMRF) prior. For more details on the GMRF prior, see the
cuqi.distribution.GMRF
documentation.
x = cuqi.distribution.GMRF(np.zeros(A.domain_dim), 200)
Setting up the likelihood#
We now need to define the likelihood. First let us take a look at the information provided by the test problem.
print(info.infoString)
Noise type: Additive Gaussian with std: 0.01
We see that the noise level is known and that the noise is Gaussian. We can use this
information to define the likelihood. In this case, we will use a Gaussian
distribution.
y = cuqi.distribution.Gaussian(A @ x, 0.01**2)
Bayesian problem (Joint distribution)#
After defining the prior and likelihood, we can now define the Bayesian problem. The Bayesian problem is defined by the joint distribution of the solution and the data. This can be seen when we print the Bayesian problem.
BP = cuqi.problem.BayesianProblem(y, x)
print(BP)
BayesianProblem with target:
JointDistribution(
Equation:
p(y,x) = p(y|x)p(x)
Densities:
y ~ CUQI Gaussian. Conditioning variables ['x'].
x ~ CUQI GMRF.
)
Setting the data (posterior)#
Now to set the data, we need to call the set_data()
BP.set_data(y=y_data)
print(BP)
BayesianProblem with target:
Posterior(
Equation:
p(x|y) ∝ L(x|y)p(x)
Densities:
y ~ CUQI Gaussian Likelihood function. Parameters ['x'].
x ~ CUQI GMRF.
)
Sampling from the posterior#
We can then use the automatic sampling method to sample from the posterior distribution.
samples = BP.sample_posterior(1000)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Automatic sampler selection is a work-in-progress. !!!
!!! Always validate the computed results. !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Using cuqi.sampler LinearRTO sampler.
burn-in: 20%
Sample 12 / 1200
Sample 24 / 1200
Sample 36 / 1200
Sample 48 / 1200
Sample 60 / 1200
Sample 72 / 1200
Sample 84 / 1200
Sample 96 / 1200
Sample 108 / 1200
Sample 120 / 1200
Sample 132 / 1200
Sample 144 / 1200
Sample 156 / 1200
Sample 168 / 1200
Sample 180 / 1200
Sample 192 / 1200
Sample 204 / 1200
Sample 216 / 1200
Sample 228 / 1200
Sample 240 / 1200
Sample 252 / 1200
Sample 264 / 1200
Sample 276 / 1200
Sample 288 / 1200
Sample 300 / 1200
Sample 312 / 1200
Sample 324 / 1200
Sample 336 / 1200
Sample 348 / 1200
Sample 360 / 1200
Sample 372 / 1200
Sample 384 / 1200
Sample 396 / 1200
Sample 408 / 1200
Sample 420 / 1200
Sample 432 / 1200
Sample 444 / 1200
Sample 456 / 1200
Sample 468 / 1200
Sample 480 / 1200
Sample 492 / 1200
Sample 504 / 1200
Sample 516 / 1200
Sample 528 / 1200
Sample 540 / 1200
Sample 552 / 1200
Sample 564 / 1200
Sample 576 / 1200
Sample 588 / 1200
Sample 600 / 1200
Sample 612 / 1200
Sample 624 / 1200
Sample 636 / 1200
Sample 648 / 1200
Sample 660 / 1200
Sample 672 / 1200
Sample 684 / 1200
Sample 696 / 1200
Sample 708 / 1200
Sample 720 / 1200
Sample 732 / 1200
Sample 744 / 1200
Sample 756 / 1200
Sample 768 / 1200
Sample 780 / 1200
Sample 792 / 1200
Sample 804 / 1200
Sample 816 / 1200
Sample 828 / 1200
Sample 840 / 1200
Sample 852 / 1200
Sample 864 / 1200
Sample 876 / 1200
Sample 888 / 1200
Sample 900 / 1200
Sample 912 / 1200
Sample 924 / 1200
Sample 936 / 1200
Sample 948 / 1200
Sample 960 / 1200
Sample 972 / 1200
Sample 984 / 1200
Sample 996 / 1200
Sample 1008 / 1200
Sample 1020 / 1200
Sample 1032 / 1200
Sample 1044 / 1200
Sample 1056 / 1200
Sample 1068 / 1200
Sample 1080 / 1200
Sample 1092 / 1200
Sample 1104 / 1200
Sample 1116 / 1200
Sample 1128 / 1200
Sample 1140 / 1200
Sample 1152 / 1200
Sample 1164 / 1200
Sample 1176 / 1200
Sample 1188 / 1200
Sample 1200 / 1200
Sample 1200 / 1200
Elapsed time: 2.9734134674072266
Plotting the results#
samples.plot_ci(exact=info.exactSolution)

[<matplotlib.lines.Line2D object at 0x7fad73fd1b50>, <matplotlib.lines.Line2D object at 0x7fad73fd0dd0>, <matplotlib.collections.FillBetweenPolyCollection object at 0x7fad73d45550>]
Unknown noise level#
In the previous example, we assumed that we knew the noise level of the data. In
many cases, this is not the case. If we do not know the noise level, we can
use a Gamma
distribution to model the noise level.
s = cuqi.distribution.Gamma(1, 1e-4)
Update likelihood with unknown noise level#
y = cuqi.distribution.Gaussian(A @ x, prec=lambda s: s)
Bayesian problem (Joint distribution)#
BP = cuqi.problem.BayesianProblem(y, x, s)
print(BP)
BayesianProblem with target:
JointDistribution(
Equation:
p(y,x,s) = p(y|x,s)p(x)p(s)
Densities:
y ~ CUQI Gaussian. Conditioning variables ['x', 's'].
x ~ CUQI GMRF.
s ~ CUQI Gamma.
)
Setting the data (posterior)#
BP.set_data(y=y_data)
print(BP)
BayesianProblem with target:
JointDistribution(
Equation:
p(x,s|y) ∝ L(x,s|y)p(x)p(s)
Densities:
y ~ CUQI Gaussian Likelihood function. Parameters ['x', 's'].
x ~ CUQI GMRF.
s ~ CUQI Gamma.
)
Sampling from the posterior#
samples = BP.sample_posterior(1000)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Automatic sampler selection is a work-in-progress. !!!
!!! Always validate the computed results. !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Using Gibbs sampler
burn-in: 20%
Automatically determined sampling strategy:
x: LinearRTO
s: Conjugate
Warmup 2 / 200
Warmup 4 / 200
Warmup 6 / 200
Warmup 8 / 200
Warmup 10 / 200
Warmup 12 / 200
Warmup 14 / 200
Warmup 16 / 200
Warmup 18 / 200
Warmup 20 / 200
Warmup 22 / 200
Warmup 24 / 200
Warmup 26 / 200
Warmup 28 / 200
Warmup 30 / 200
Warmup 32 / 200
Warmup 34 / 200
Warmup 36 / 200
Warmup 38 / 200
Warmup 40 / 200
Warmup 42 / 200
Warmup 44 / 200
Warmup 46 / 200
Warmup 48 / 200
Warmup 50 / 200
Warmup 52 / 200
Warmup 54 / 200
Warmup 56 / 200
Warmup 58 / 200
Warmup 60 / 200
Warmup 62 / 200
Warmup 64 / 200
Warmup 66 / 200
Warmup 68 / 200
Warmup 70 / 200
Warmup 72 / 200
Warmup 74 / 200
Warmup 76 / 200
Warmup 78 / 200
Warmup 80 / 200
Warmup 82 / 200
Warmup 84 / 200
Warmup 86 / 200
Warmup 88 / 200
Warmup 90 / 200
Warmup 92 / 200
Warmup 94 / 200
Warmup 96 / 200
Warmup 98 / 200
Warmup 100 / 200
Warmup 102 / 200
Warmup 104 / 200
Warmup 106 / 200
Warmup 108 / 200
Warmup 110 / 200
Warmup 112 / 200
Warmup 114 / 200
Warmup 116 / 200
Warmup 118 / 200
Warmup 120 / 200
Warmup 122 / 200
Warmup 124 / 200
Warmup 126 / 200
Warmup 128 / 200
Warmup 130 / 200
Warmup 132 / 200
Warmup 134 / 200
Warmup 136 / 200
Warmup 138 / 200
Warmup 140 / 200
Warmup 142 / 200
Warmup 144 / 200
Warmup 146 / 200
Warmup 148 / 200
Warmup 150 / 200
Warmup 152 / 200
Warmup 154 / 200
Warmup 156 / 200
Warmup 158 / 200
Warmup 160 / 200
Warmup 162 / 200
Warmup 164 / 200
Warmup 166 / 200
Warmup 168 / 200
Warmup 170 / 200
Warmup 172 / 200
Warmup 174 / 200
Warmup 176 / 200
Warmup 178 / 200
Warmup 180 / 200
Warmup 182 / 200
Warmup 184 / 200
Warmup 186 / 200
Warmup 188 / 200
Warmup 190 / 200
Warmup 192 / 200
Warmup 194 / 200
Warmup 196 / 200
Warmup 198 / 200
Warmup 200 / 200
Warmup 200 / 200
Sample 10 / 1000
Sample 20 / 1000
Sample 30 / 1000
Sample 40 / 1000
Sample 50 / 1000
Sample 60 / 1000
Sample 70 / 1000
Sample 80 / 1000
Sample 90 / 1000
Sample 100 / 1000
Sample 110 / 1000
Sample 120 / 1000
Sample 130 / 1000
Sample 140 / 1000
Sample 150 / 1000
Sample 160 / 1000
Sample 170 / 1000
Sample 180 / 1000
Sample 190 / 1000
Sample 200 / 1000
Sample 210 / 1000
Sample 220 / 1000
Sample 230 / 1000
Sample 240 / 1000
Sample 250 / 1000
Sample 260 / 1000
Sample 270 / 1000
Sample 280 / 1000
Sample 290 / 1000
Sample 300 / 1000
Sample 310 / 1000
Sample 320 / 1000
Sample 330 / 1000
Sample 340 / 1000
Sample 350 / 1000
Sample 360 / 1000
Sample 370 / 1000
Sample 380 / 1000
Sample 390 / 1000
Sample 400 / 1000
Sample 410 / 1000
Sample 420 / 1000
Sample 430 / 1000
Sample 440 / 1000
Sample 450 / 1000
Sample 460 / 1000
Sample 470 / 1000
Sample 480 / 1000
Sample 490 / 1000
Sample 500 / 1000
Sample 510 / 1000
Sample 520 / 1000
Sample 530 / 1000
Sample 540 / 1000
Sample 550 / 1000
Sample 560 / 1000
Sample 570 / 1000
Sample 580 / 1000
Sample 590 / 1000
Sample 600 / 1000
Sample 610 / 1000
Sample 620 / 1000
Sample 630 / 1000
Sample 640 / 1000
Sample 650 / 1000
Sample 660 / 1000
Sample 670 / 1000
Sample 680 / 1000
Sample 690 / 1000
Sample 700 / 1000
Sample 710 / 1000
Sample 720 / 1000
Sample 730 / 1000
Sample 740 / 1000
Sample 750 / 1000
Sample 760 / 1000
Sample 770 / 1000
Sample 780 / 1000
Sample 790 / 1000
Sample 800 / 1000
Sample 810 / 1000
Sample 820 / 1000
Sample 830 / 1000
Sample 840 / 1000
Sample 850 / 1000
Sample 860 / 1000
Sample 870 / 1000
Sample 880 / 1000
Sample 890 / 1000
Sample 900 / 1000
Sample 910 / 1000
Sample 920 / 1000
Sample 930 / 1000
Sample 940 / 1000
Sample 950 / 1000
Sample 960 / 1000
Sample 970 / 1000
Sample 980 / 1000
Sample 990 / 1000
Sample 1000 / 1000
Sample 1000 / 1000
Elapsed time: 4.619251728057861
Plotting the results#
Let is first look at the estimated noise level and compare it with the true noise level
samples["s"].plot_trace(exact=1/0.01**2)

array([[<Axes: title={'center': 's'}>, <Axes: title={'center': 's'}>]],
dtype=object)
We see that the estimated noise level is close to the true noise level. Let’s now look at the estimated solution
samples["x"].plot_ci(exact=info.exactSolution)

[<matplotlib.lines.Line2D object at 0x7fad78127f50>, <matplotlib.lines.Line2D object at 0x7fad78126510>, <matplotlib.collections.FillBetweenPolyCollection object at 0x7fad785b8bc0>]
We can even plot traces of “x” for a few cases and compare
samples["x"].plot_trace(exact=info.exactSolution)

Selecting 5 randomly chosen variables
array([[<Axes: title={'center': 'x13'}>, <Axes: title={'center': 'x13'}>],
[<Axes: title={'center': 'x17'}>, <Axes: title={'center': 'x17'}>],
[<Axes: title={'center': 'x39'}>, <Axes: title={'center': 'x39'}>],
[<Axes: title={'center': 'x56'}>, <Axes: title={'center': 'x56'}>],
[<Axes: title={'center': 'x119'}>,
<Axes: title={'center': 'x119'}>]], dtype=object)
And finally we note that the UQ method does this analysis automatically and shows a selected number of plots
BP.UQ(exact={"x": info.exactSolution, "s": 1/0.01**2})
Computing 1000 samples
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Automatic sampler selection is a work-in-progress. !!!
!!! Always validate the computed results. !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Using Gibbs sampler
burn-in: 20%
Automatically determined sampling strategy:
x: LinearRTO
s: Conjugate
Warmup 2 / 200
Warmup 4 / 200
Warmup 6 / 200
Warmup 8 / 200
Warmup 10 / 200
Warmup 12 / 200
Warmup 14 / 200
Warmup 16 / 200
Warmup 18 / 200
Warmup 20 / 200
Warmup 22 / 200
Warmup 24 / 200
Warmup 26 / 200
Warmup 28 / 200
Warmup 30 / 200
Warmup 32 / 200
Warmup 34 / 200
Warmup 36 / 200
Warmup 38 / 200
Warmup 40 / 200
Warmup 42 / 200
Warmup 44 / 200
Warmup 46 / 200
Warmup 48 / 200
Warmup 50 / 200
Warmup 52 / 200
Warmup 54 / 200
Warmup 56 / 200
Warmup 58 / 200
Warmup 60 / 200
Warmup 62 / 200
Warmup 64 / 200
Warmup 66 / 200
Warmup 68 / 200
Warmup 70 / 200
Warmup 72 / 200
Warmup 74 / 200
Warmup 76 / 200
Warmup 78 / 200
Warmup 80 / 200
Warmup 82 / 200
Warmup 84 / 200
Warmup 86 / 200
Warmup 88 / 200
Warmup 90 / 200
Warmup 92 / 200
Warmup 94 / 200
Warmup 96 / 200
Warmup 98 / 200
Warmup 100 / 200
Warmup 102 / 200
Warmup 104 / 200
Warmup 106 / 200
Warmup 108 / 200
Warmup 110 / 200
Warmup 112 / 200
Warmup 114 / 200
Warmup 116 / 200
Warmup 118 / 200
Warmup 120 / 200
Warmup 122 / 200
Warmup 124 / 200
Warmup 126 / 200
Warmup 128 / 200
Warmup 130 / 200
Warmup 132 / 200
Warmup 134 / 200
Warmup 136 / 200
Warmup 138 / 200
Warmup 140 / 200
Warmup 142 / 200
Warmup 144 / 200
Warmup 146 / 200
Warmup 148 / 200
Warmup 150 / 200
Warmup 152 / 200
Warmup 154 / 200
Warmup 156 / 200
Warmup 158 / 200
Warmup 160 / 200
Warmup 162 / 200
Warmup 164 / 200
Warmup 166 / 200
Warmup 168 / 200
Warmup 170 / 200
Warmup 172 / 200
Warmup 174 / 200
Warmup 176 / 200
Warmup 178 / 200
Warmup 180 / 200
Warmup 182 / 200
Warmup 184 / 200
Warmup 186 / 200
Warmup 188 / 200
Warmup 190 / 200
Warmup 192 / 200
Warmup 194 / 200
Warmup 196 / 200
Warmup 198 / 200
Warmup 200 / 200
Warmup 200 / 200
Sample 10 / 1000
Sample 20 / 1000
Sample 30 / 1000
Sample 40 / 1000
Sample 50 / 1000
Sample 60 / 1000
Sample 70 / 1000
Sample 80 / 1000
Sample 90 / 1000
Sample 100 / 1000
Sample 110 / 1000
Sample 120 / 1000
Sample 130 / 1000
Sample 140 / 1000
Sample 150 / 1000
Sample 160 / 1000
Sample 170 / 1000
Sample 180 / 1000
Sample 190 / 1000
Sample 200 / 1000
Sample 210 / 1000
Sample 220 / 1000
Sample 230 / 1000
Sample 240 / 1000
Sample 250 / 1000
Sample 260 / 1000
Sample 270 / 1000
Sample 280 / 1000
Sample 290 / 1000
Sample 300 / 1000
Sample 310 / 1000
Sample 320 / 1000
Sample 330 / 1000
Sample 340 / 1000
Sample 350 / 1000
Sample 360 / 1000
Sample 370 / 1000
Sample 380 / 1000
Sample 390 / 1000
Sample 400 / 1000
Sample 410 / 1000
Sample 420 / 1000
Sample 430 / 1000
Sample 440 / 1000
Sample 450 / 1000
Sample 460 / 1000
Sample 470 / 1000
Sample 480 / 1000
Sample 490 / 1000
Sample 500 / 1000
Sample 510 / 1000
Sample 520 / 1000
Sample 530 / 1000
Sample 540 / 1000
Sample 550 / 1000
Sample 560 / 1000
Sample 570 / 1000
Sample 580 / 1000
Sample 590 / 1000
Sample 600 / 1000
Sample 610 / 1000
Sample 620 / 1000
Sample 630 / 1000
Sample 640 / 1000
Sample 650 / 1000
Sample 660 / 1000
Sample 670 / 1000
Sample 680 / 1000
Sample 690 / 1000
Sample 700 / 1000
Sample 710 / 1000
Sample 720 / 1000
Sample 730 / 1000
Sample 740 / 1000
Sample 750 / 1000
Sample 760 / 1000
Sample 770 / 1000
Sample 780 / 1000
Sample 790 / 1000
Sample 800 / 1000
Sample 810 / 1000
Sample 820 / 1000
Sample 830 / 1000
Sample 840 / 1000
Sample 850 / 1000
Sample 860 / 1000
Sample 870 / 1000
Sample 880 / 1000
Sample 890 / 1000
Sample 900 / 1000
Sample 910 / 1000
Sample 920 / 1000
Sample 930 / 1000
Sample 940 / 1000
Sample 950 / 1000
Sample 960 / 1000
Sample 970 / 1000
Sample 980 / 1000
Sample 990 / 1000
Sample 1000 / 1000
Sample 1000 / 1000
Elapsed time: 4.604166030883789
Plotting results
{'x': CUQIpy Samples:
---------------
Ns (number of samples):
1000
Geometry:
_DefaultGeometry1D[128]
Shape:
(128, 1000)
Samples:
[[ 0.0618453 0.07626861 -0.06397197 ... 0.03660061 -0.018834
0.02208633]
[ 0.04090545 0.10575296 -0.07316161 ... 0.07386206 -0.01817452
0.0461615 ]
[ 0.12200632 0.06148444 0.02467105 ... 0.04250902 0.00584573
0.01069121]
...
[ 0.05785521 -0.01794829 0.03422982 ... 0.09473283 0.05314016
0.08696787]
[ 0.0555219 -0.02355431 0.09301284 ... -0.01661903 0.04886413
0.05206315]
[ 0.00247182 -0.01837786 -0.0454012 ... -0.00911954 0.02045178
-0.03140952]]
, 's': CUQIpy Samples:
---------------
Ns (number of samples):
1000
Geometry:
_DefaultGeometry1D[1]
Shape:
(1, 1000)
Samples:
[[10594.12379585 12121.81508892 11384.40144924 13206.41902302
12897.3404173 12482.16457027 9903.94371797 12381.72939327
10637.89769919 12975.83955567 11346.95125214 11354.12084202
12857.39922942 10595.53164607 10994.2787046 10972.7584469
9933.35655342 9972.88349757 13340.88668782 9511.72000169
11421.33066053 11203.56883978 11173.06595463 10971.93398827
10879.54381593 9646.0988863 12519.25709992 14589.94679495
10524.57845522 10049.6470148 11620.7068093 11223.75361607
11884.14763227 10877.64520596 11907.21364198 13092.10335647
9608.4000084 12950.69565685 9884.04716277 12076.32479784
10921.93011504 17138.94615697 10849.47540006 10910.14964701
10450.56686927 10993.54900787 12287.43011962 11925.44963422
12181.1387665 10535.41333859 10612.47622835 10416.81449308
12157.68861117 9676.60657771 9700.28939409 11652.6349611
10307.45360464 9585.06872042 12078.89459884 9255.40569048
11488.63935796 10542.41976532 7964.75074076 11831.78392991
12008.73310787 8788.75185933 9263.18340513 11042.04663026
10949.07085081 12332.05050864 9109.69344445 8998.26760453
13359.7418854 8853.89986407 9377.21318852 8710.64417829
12983.61491636 17679.4124463 13283.69117397 12012.46089558
9662.71248534 10794.56259557 10809.7638544 11869.62599182
9144.29698053 8901.32125575 11403.19668682 8818.16890911
10139.44082208 10755.37060704 6991.70373787 12369.72913377
9194.04714783 15612.56104698 9479.72797807 9951.5409136
13088.76631881 11111.82598035 12725.97411866 15310.79002738
10681.30123668 10377.87916269 10028.08892901 9819.75564239
10740.41055382 9062.28911934 9470.89833465 8687.44679147
12273.04825024 11516.44308774 12110.71197165 11939.36843149
13441.34244039 10507.61522016 10328.50701505 11258.92930116
11676.42778387 11152.60374552 10530.85078977 11003.86521688
11495.47589233 11000.9306232 10044.45133797 12706.29584723
9094.51670662 10878.0893366 15736.55563276 10971.6319834
10423.2896032 10719.33180758 14647.78755744 9953.28938384
11222.44876257 8895.63982787 12496.99397139 13817.19526406
12553.20037382 10330.36893412 10826.33519099 9130.34346561
11779.80844561 11619.14467799 10069.63176147 13325.90008257
12983.73521642 9693.93467166 12214.19908371 12751.23780335
12407.70041205 11078.37470557 7411.01932312 14209.14348228
11541.88622176 11500.72828656 11067.60555821 10638.47115554
11760.8624633 10470.27370814 9013.01582414 8556.44455479
11022.44926231 15620.86845345 13527.42292158 12474.02297392
10523.27463257 10527.0690884 10555.76792695 11342.75578118
10655.18805342 11876.80340403 9679.71436917 8687.77043686
12117.72566768 10354.06540727 11782.58896053 11850.77478272
10758.90235808 12171.34614499 10983.26514569 9266.71887704
12439.8654418 11600.57119173 12098.37902884 11026.90199896
10486.16278315 13965.64881633 9233.12146265 12191.98379094
11979.4968778 11944.5482305 10937.01569627 15056.74693427
14978.95505753 12737.04587454 10017.61226916 12111.29192365
11934.5741539 9168.73632424 12556.50080669 11478.30087508
9132.80231997 14270.20450583 11767.50226967 9554.81083825
11481.81924444 10196.47725806 10445.21766055 7894.28562242
9749.3722853 12230.84728121 9612.0406013 11085.87253359
10734.8486424 11303.17915218 10744.48924333 12086.78966263
9801.12286978 7814.89814369 9258.31475352 10060.23679658
12022.89707776 12139.7990572 9011.82529928 10402.36732388
7550.65097583 9744.80237477 10242.24247853 10474.29074554
9738.93343083 10147.2691982 9033.14311544 12205.931854
12553.15639064 12562.71430149 13081.24698091 8885.34770011
10308.9073294 12476.73187952 11601.17506296 10748.02607877
11430.50715298 10510.03783627 10887.72732355 11024.78963035
12589.06870558 10264.13005232 9791.57267278 12256.15736854
10704.57705141 10002.48052525 13054.49943636 12983.5920998
10184.44996488 12430.47056218 10237.03607675 10526.22666624
11589.69216291 11697.32865026 12711.30778295 9135.23245648
10283.45146767 12672.75908339 10253.53261168 11943.18203269
11457.27510469 11896.32822396 11024.85908677 9054.82210047
9944.88700497 12269.35718851 9940.69224427 9781.07412834
9373.66530606 11079.52162979 9104.41433744 13145.98992562
12255.19342022 12714.34080192 10980.3451025 11125.06678753
11625.57391313 10758.6041761 9983.00486709 8900.45195425
10609.13171629 10206.62182637 10741.46446332 11054.68216957
11040.53791813 11496.10110572 9881.75863444 10189.47100409
12031.00297818 9604.28801859 8781.0297404 10530.11935684
11646.3117946 9277.0134658 11460.16963358 14915.08725479
9222.69053268 13424.29969388 13120.60737328 12632.54438275
10098.86483745 14336.69830068 12615.62791917 10942.88626912
10447.60105479 14687.47602178 10845.1439582 9777.75303734
11990.43851419 9046.53448607 9953.04590494 12406.14646305
11654.99502624 11531.42310297 10723.52574074 7731.72324489
9195.10357443 10662.37096399 9843.41814303 10914.23482905
8934.72000389 14087.53832414 10549.87894609 8803.92578152
12019.99027362 14204.59997342 11395.70345701 13427.4257323
9239.70651168 9015.19939474 11335.74664549 11566.95341886
9650.07683912 12354.89328513 13326.61877839 11492.89671563
10644.97077223 12296.87632492 10587.23428804 11997.23767337
9024.54652598 11931.62630754 9693.38707704 12460.04073512
12297.81640506 12456.68298759 13529.28048655 10664.9774981
11843.08282295 9456.33147406 11735.98114533 11417.7073899
9494.41498592 14823.9392158 10012.1646761 12837.68712024
9637.60534264 8133.0608038 10331.31574562 10359.97224109
9817.34791595 10455.10199163 11288.98373187 10025.86361831
7935.09908742 11664.21905924 11186.17931336 11186.1741954
11753.97008014 12714.36143174 10579.66126212 13058.3021784
11855.7320109 11393.62743773 14285.49875352 10530.62129899
11724.2572037 11017.83693138 10650.48928523 11374.11836196
10975.12374096 12690.28112351 10087.10004164 12078.32997664
13929.83321958 11170.17830383 11154.3899742 12989.24579032
11851.30446243 11744.2021436 9305.47874158 11296.95514001
11121.87384979 11128.76851467 13190.25323165 9755.3483751
10310.72253633 8407.92288241 12663.35343973 11228.28342954
12751.2603629 11938.33973095 10430.01347151 10946.90455256
10401.52003921 10873.41199656 10818.90327912 12696.53078535
13592.4510716 11345.53961216 15131.42269983 12417.67602759
11139.83540244 10815.2732654 10455.16010127 10944.93759248
11054.91897915 9414.25699357 12660.23582493 12020.71697968
11789.10636819 10772.39813519 11225.20336995 11205.66061508
11875.92256829 10516.4821887 10561.20882969 9733.19406657
10726.38545594 10256.51850204 10300.51643544 11331.9765072
11415.11619316 11481.30379403 11498.46362111 14844.4608728
12354.86174982 10963.91758086 11128.91765874 10870.77342656
11887.10302907 11883.95356546 9617.84238557 11228.91045721
10593.93424294 9488.14144297 11722.34914606 8928.29160206
10268.62962071 10990.0008196 9730.8305126 11319.68087306
10792.86922525 12367.60539862 12256.2638786 11820.44244239
12145.53865054 10538.45331499 12701.73666063 9444.76625146
8140.48922321 15087.32276166 10968.5648219 12350.56214775
8079.28868207 9428.80774557 11484.74514322 11120.38242181
8890.52747031 10199.91975856 12080.10816724 12576.65158233
13983.98794662 11272.19472104 12357.98031127 10838.39118559
9675.60091114 10669.34220023 13336.3406668 10566.73492998
12047.03341168 10804.35835442 8860.02840821 10826.93213088
14866.44034643 10230.44255583 14407.7268981 9492.78644831
8464.27150211 9861.94572294 11836.09198986 9105.50046974
10558.29469349 11407.4320745 13099.61702722 11801.57326291
9001.11810021 11075.54742293 10652.92534929 10410.36969435
11066.37289841 13326.63673967 10655.32940907 9542.50840557
10995.97515001 11082.12974112 9896.89722186 9937.58711581
9361.293177 11785.33087258 10317.58371824 11267.64453076
11980.16868535 12334.44595855 9952.12701203 12610.67856417
11181.3970614 10212.43994951 11498.29820365 12514.51039462
9475.44906054 9133.13379124 12745.16171609 12768.77584376
8963.60896944 12134.49968329 10096.67008827 10233.66863706
10843.99095465 10156.94085769 10200.8902646 10306.83853406
11109.32214265 10114.45197863 9774.27441544 9865.73357088
10570.49909457 9060.098773 9890.4286328 9685.18116769
12280.31816088 11675.27166959 10630.83080518 11213.19402134
10439.08716022 11054.97264789 12097.0315394 12136.37140329
12441.81578239 9852.20184832 11690.26193845 9851.47687755
10582.33249182 12053.49720599 12311.60145343 13571.40857684
11976.39306471 10804.55271547 11855.09733834 9844.12198882
11499.38934222 10691.02728762 11830.04038147 9258.08643735
10276.15770018 9720.06547274 8768.79545387 9535.60125164
10185.09481576 9370.1519177 12607.04356326 10076.8539566
9740.7293486 11187.52029029 13305.83291634 11750.57258767
11250.39538764 8378.90662761 13254.19748071 9098.70658199
12672.52442756 11876.22093979 8807.69977581 10430.43139611
11759.2387969 9424.57186777 9675.68028969 11453.85396029
10289.98098843 11942.98187933 9499.99331338 12020.1634422
11327.14331782 10199.61632103 9961.27082597 12008.67081341
10831.97345527 11704.89045011 9459.56968704 10560.65636587
9723.77201898 10728.39616912 11500.90756301 13346.2932437
8400.1378139 8125.94800156 9909.67441743 12412.51147506
12135.9405446 11312.36286469 10533.16057216 10032.89022376
9547.98751909 16349.13343331 9789.56803443 11603.30090164
11743.14690009 12465.35955852 10882.12806127 9343.70958842
10873.14344919 11981.16651085 12627.27267109 13117.3141186
10285.52478886 11802.18975972 9535.02392788 8140.71413766
9247.92794213 9074.69395341 10559.81408776 12800.95239538
11109.64371455 9795.57733332 10963.31786607 12131.36342299
9117.8748008 10479.00840634 9732.25936459 11451.59298538
10123.26229572 12209.16323606 13448.44965399 13379.01484959
11485.61030058 12565.51281589 11917.25167293 12049.17314336
10553.45946946 12415.4060728 10065.20489233 10252.26819324
10668.59960082 11153.83034979 10607.31682954 9806.25551777
11324.74572504 10907.3053547 11658.7552148 14390.38169561
10979.18083471 12355.8496319 12635.72886725 9991.60908027
10782.82982835 12188.72147855 10906.02352603 9263.91433912
12395.91390489 10964.44242842 11825.13077514 9150.11292267
12552.47469277 11014.60611273 12574.98605067 15524.13494427
11813.72441454 10934.77947558 13538.6648494 10788.22072831
11666.26712548 12132.00228793 13729.5936973 11067.30527308
11644.32325121 10562.23026982 10256.80459794 10793.53768897
11979.08153204 10862.8204499 13068.32318779 10124.65165135
12396.18890621 12045.2051124 9969.57450745 12120.05428284
10916.85597556 12029.96332899 9558.04378398 9691.94661007
9085.20082801 9295.27765043 11845.21524618 11935.93176643
11773.93229347 9808.61632798 13423.33053445 12118.87872043
13720.24251587 12995.98325384 9628.05750195 12234.93512152
12292.0235158 11933.05263018 11677.04157499 9462.88866859
9822.26147446 11634.53680838 10706.20469161 11855.97820822
10857.4530902 11328.7268283 10118.90904219 11046.34813097
8712.94194611 8797.98273601 12244.8089166 13394.18960266
12054.97462307 10554.46541475 11641.12619592 11785.1606529
12990.54256357 12438.69898695 11960.05659858 8505.70710869
9436.29258292 13269.08769597 9848.07935148 10947.86543369
11715.08248806 12926.61443273 11239.51334154 11197.70654715
11690.4145397 10504.89497095 11370.08278744 12687.35479691
12088.15783143 10354.62877265 10330.70421436 11734.53374729
10826.97675641 9832.31953517 11355.46596685 11027.33091068
11385.94583288 13238.13453155 10500.38631374 12311.36116504
11458.38757232 15061.6293487 10520.39195474 8828.11532043
14050.16137759 9007.86844845 11429.35069399 9567.61880713
9015.18148636 12905.04844353 10259.37270674 13931.74671614
10205.8174276 9857.37985346 9220.81035253 11399.1142157
9864.08508313 11572.85385455 11707.98166889 11245.52115426
9340.09912029 9253.25216984 10362.66821528 9155.01630077
9768.59906766 10115.68176166 11368.28406487 10179.9211757
9882.54007627 10707.35813715 12873.56442554 12105.38860931
13685.52440224 11929.60282687 13449.65924622 9965.70968006
9375.63089792 10231.74650073 9278.75961772 10036.79664233
12873.69792092 11092.53259079 11144.24457821 9157.18839634
10365.63595951 12690.17350821 10630.3104646 12217.24203627
10829.447942 8390.43946019 12494.23855078 10323.08762107
12695.27845194 8521.25071359 10914.60519663 14015.25028051
13107.48456428 11747.33349469 10557.289088 8243.57455251
9554.97003618 10493.41053987 10950.24392418 11671.66493361
10701.18370844 11394.98595172 11809.60424206 16044.35554794
9626.73702849 10272.31197517 11065.60210209 11060.41899807
9478.46924551 10858.77407377 8393.35756562 11039.59152982
10868.35917992 13695.0465726 11362.40194267 12980.95755729
8486.20374737 9584.91796113 12344.56718377 9432.19946095
11789.85254053 10010.49111375 10078.46161388 10879.74685394
10905.41965527 9494.1857229 12552.9906509 10246.89684294
9469.14873937 9776.07385022 10376.83656793 8719.60410227
10529.75927708 9964.23312991 12508.67800499 10970.69246237
11038.46968144 13753.02639538 13725.50707606 10824.09038973
10018.01536204 11059.03653501 10926.47892112 9274.41736464
12450.06227127 9835.07964199 12780.42047494 10145.41999757
11107.75717594 11826.79298863 10266.48758119 10250.42333403
10980.63981344 12777.15456567 10077.64687139 9669.70753551
11087.80871517 13666.36074022 10583.96911148 10457.32978604
11127.42688755 9904.02841771 12158.43277214 11414.45612891
10481.80004028 9086.73833002 12503.5404358 10168.91227067
11357.68375769 9921.08288745 11001.79284124 12402.97957422
11543.73923776 12397.93374653 9123.60757679 12606.74865444
10707.94159951 8813.36769446 9781.27434809 11188.09721958
11149.74177843 11924.84580853 11282.10474479 11304.64384147
11210.0924355 10838.80818972 12846.03606339 12098.54226253
12582.38901783 11954.66869474 12215.75250948 9000.63896943
10751.63336085 11809.65100643 12190.7262239 12232.49042276
11128.26253678 11457.89111953 10608.99581703 9934.84001852
9357.72958773 9245.30091254 12541.00665958 11034.28187128
10335.55086847 8828.95557341 11885.75630844 11861.12335134
12069.33670745 9521.05785003 11262.06495961 10515.68429075
9875.8345821 10338.64172932 12216.97020211 10002.67843112
11221.37373007 11676.74022912 12533.30206102 10262.18424668
10268.78149461 11664.18456609 10049.57729043 11647.1305917
9923.59442854 13846.39698191 11359.87334017 10483.09339809
12158.32796057 11309.96061504 10725.31328517 8049.5992518
12242.32635036 7909.99627535 10958.76691941 10377.0944774
9699.14080033 12083.49660307 10208.69953023 12292.19612773
12261.12958396 10485.53886781 12374.19105202 12504.37864922
9924.7931988 9148.71569062 11302.58762266 10466.9969137
11257.40388534 14138.14512861 9522.90256695 12071.34071664
13284.71453025 8063.44964682 10021.5983743 11455.46873749
10432.35503795 10824.27755498 11052.33818769 9374.17268964
12694.03585676 10038.22511381 11743.04602448 12093.52307808
8655.64838909 9709.97598948 9778.23374852 12220.78489299
12521.80559035 10526.6018747 12620.53385689 12443.28893711]]
}
Total running time of the script: (0 minutes 13.075 seconds)