%%javascript
IPython.OutputArea.prototype._should_scroll = function(lines) {
return false;
}
import gstlearn as gl
import gstlearn.plot as gp
import numpy as np
import matplotlib.pyplot as plt
import gstlearn.plot as gp
import scipy.sparse as sc
Test of Simulation Post-Processing¶
This test is meant to demonstrate the tool for post-processing simulation results.
We construct several simulations independently. Here, the manner these simulations are constrcuted has no interest and we simply sample distributions (Uniform or Gaussian) with various parameters. We construct three simulations (called SimuA, SimuB and SimuC) with different occurence numbers (3, 2 and 2).
Then, for each cell of the output grid:
- a search for the samples belonging to the cell is performed
- a particular transformation (calculating their sum and their standard deviation) is applied to the outcomes of these samples
- the transformed values of these samples are upscaled (using the mean) to one single multivariate per cell
- Some statistics (mean and variance) are calculated on the results of the transformation per cell.
Creating a point Data Base
nech=10
db = gl.Db.createFillRandom(ndat=nech, ndim=2, nvar=0, seed = 3143233)
err = db.addColumns(np.arange(0,nech),"rank")
Creating a Grid Data Base covering the same area
nx = 5
dx = 1 / nx
x0 = dx / 2
dbgrid = gl.DbGrid.create(nx=[nx,nx], dx=[dx,dx], x0=[x0,x0])
Adding a first set of 3 simulation outcomes (sampled from Normal distribution)
nsimuA = 3
uid = db.addColumnsByConstant(nsimuA, 0., "SimuA")
for i in range(nsimuA):
vec = gl.VectorHelper.simulateGaussian(nech)
db.setColumnByUID(vec, uid + i)
Adding a second set of 2 simulations (sampled from Uniform distribution between 100 and 200)
nsimuB = 2
uid = db.addColumnsByConstant(nsimuB, 0., "SimuB")
for i in range(nsimuB):
vec = gl.VectorHelper.simulateUniform(nech, 100., 200.)
db.setColumnByUID(vec, uid + i)
Adding a third set of 2 simulations (sampled from Uniform distribution between -4 and -2)
nsimuC = 2
uid = db.addColumnsByConstant(nsimuC, 0., "SimuC")
for i in range(nsimuC):
vec = gl.VectorHelper.simulateUniform(nech, -4., -2.)
db.setColumnByUID(vec, uid + i)
In the following paragraph, we provide the complete dump of the contents of the Data Base to better understand the next steps.
dbfmt = gl.DbStringFormat.createFromFlags(flag_resume = False, flag_vars=False, flag_array=True)
gl.OptCst.defineByKey("NTROW",-1)
gl.OptCst.defineByKey("NTCOL",-1)
db.display(dbfmt)
Data Base Characteristics
=========================
Data Base Contents
------------------
x-1 x-2 rank SimuA-1 SimuA-2 SimuA-3 SimuB-1
[ 0,] 0.502 0.135 0.000 1.489 -0.056 0.187 196.812
[ 1,] 0.693 0.185 1.000 0.519 -0.594 -0.438 165.288
[ 2,] 0.809 0.387 2.000 -2.893 0.909 0.171 155.281
[ 3,] 0.915 0.617 3.000 1.224 -1.397 0.647 104.455
[ 4,] 0.088 0.808 4.000 -0.171 -0.214 -0.783 167.794
[ 5,] 0.189 0.802 5.000 1.071 2.205 -0.047 118.355
[ 6,] 0.835 0.201 6.000 -0.722 -0.029 -0.781 127.263
[ 7,] 0.647 0.105 7.000 -0.462 -0.816 0.772 162.597
[ 8,] 0.907 0.070 8.000 1.315 -0.602 -1.556 172.682
[ 9,] 0.258 0.374 9.000 -0.496 -1.302 0.050 131.565
SimuB-2 SimuC-1 SimuC-2
[ 0,] 114.333 -3.668 -3.635
[ 1,] 104.997 -3.142 -3.692
[ 2,] 124.644 -3.934 -3.673
[ 3,] 187.628 -3.087 -3.684
[ 4,] 100.972 -2.142 -2.837
[ 5,] 102.044 -2.891 -3.889
[ 6,] 114.671 -3.572 -2.395
[ 7,] 140.488 -3.040 -3.493
[ 8,] 151.285 -3.228 -2.714
[ 9,] 184.920 -2.987 -2.919
Display of the samples and overlay the grid of cells
gp.setDefaultGeographic([10,10])
gp.grid(dbgrid, flagCell=True)
gp.literal(db, name="rank", s=100)
<matplotlib.collections.PathCollection at 0x7fa5c567e850>
We perform the simulations post-processing as described in the introduction.
In this first application, we bypass any transformation function.
A particular attention is brought to the cell (ranked 4 [1-based]) in order to check the work flow applied to the information.
err = gl.simuPost(db, dbgrid, ["SimuA*", "SimuB*", "SimuC*"], flag_match=False,
upscale = gl.EPostUpscale.MEAN,
stats = [gl.EPostStat.MEAN, gl.EPostStat.VAR],
rank_check=4, verbose=True, namconv=gl.NamingConvention("Post1"))
Simulation Post-Processing
--------------------------
Multiplicity order for all variables
- Variable 1 (SimuA*) = 3
- Variable 2 (SimuB*) = 2
- Variable 3 (SimuC*) = 2
Number of Iterations: 12 (using the 'product' criterion)
Number of Statistics: 2
Number of Output Variables: 6
== Cell #4/25
Iteration 0/ 12 -> Indices (1-based): 1/3 1/2 1/2
Sample Rank #1 0.519 165.288 -3.142
Sample Rank #7 -0.462 162.597 -3.040
Upscale (Average) 0.029 163.943 -3.091
Iteration 1/ 12 -> Indices (1-based): 1/3 1/2 2/2
Sample Rank #1 0.519 165.288 -3.692
Sample Rank #7 -0.462 162.597 -3.493
Upscale (Average) 0.029 163.943 -3.592
Iteration 2/ 12 -> Indices (1-based): 1/3 2/2 1/2
Sample Rank #1 0.519 104.997 -3.142
Sample Rank #7 -0.462 140.488 -3.040
Upscale (Average) 0.029 122.743 -3.091
Iteration 3/ 12 -> Indices (1-based): 1/3 2/2 2/2
Sample Rank #1 0.519 104.997 -3.692
Sample Rank #7 -0.462 140.488 -3.493
Upscale (Average) 0.029 122.743 -3.592
Iteration 4/ 12 -> Indices (1-based): 2/3 1/2 1/2
Sample Rank #1 -0.594 165.288 -3.142
Sample Rank #7 -0.816 162.597 -3.040
Upscale (Average) -0.705 163.943 -3.091
Iteration 5/ 12 -> Indices (1-based): 2/3 1/2 2/2
Sample Rank #1 -0.594 165.288 -3.692
Sample Rank #7 -0.816 162.597 -3.493
Upscale (Average) -0.705 163.943 -3.592
Iteration 6/ 12 -> Indices (1-based): 2/3 2/2 1/2
Sample Rank #1 -0.594 104.997 -3.142
Sample Rank #7 -0.816 140.488 -3.040
Upscale (Average) -0.705 122.743 -3.091
Iteration 7/ 12 -> Indices (1-based): 2/3 2/2 2/2
Sample Rank #1 -0.594 104.997 -3.692
Sample Rank #7 -0.816 140.488 -3.493
Upscale (Average) -0.705 122.743 -3.592
Iteration 8/ 12 -> Indices (1-based): 3/3 1/2 1/2
Sample Rank #1 -0.438 165.288 -3.142
Sample Rank #7 0.772 162.597 -3.040
Upscale (Average) 0.167 163.943 -3.091
Iteration 9/ 12 -> Indices (1-based): 3/3 1/2 2/2
Sample Rank #1 -0.438 165.288 -3.692
Sample Rank #7 0.772 162.597 -3.493
Upscale (Average) 0.167 163.943 -3.592
Iteration 10/ 12 -> Indices (1-based): 3/3 2/2 1/2
Sample Rank #1 -0.438 104.997 -3.142
Sample Rank #7 0.772 140.488 -3.040
Upscale (Average) 0.167 122.743 -3.091
Iteration 11/ 12 -> Indices (1-based): 3/3 2/2 2/2
Sample Rank #1 -0.438 104.997 -3.692
Sample Rank #7 0.772 140.488 -3.493
Upscale (Average) 0.167 122.743 -3.592
Statistics (Mean, Variance) -0.170 0.146 143.343 424.363 -3.342 0.063
dbgrid
Data Base Grid Characteristics ============================== Data Base Summary ----------------- File is organized as a regular grid Space dimension = 2 Number of Columns = 9 Maximum Number of UIDs = 9 Total number of samples = 25 Grid characteristics: --------------------- Origin : 0.100 0.100 Mesh : 0.200 0.200 Number : 5 5 Variables --------- Column = 0 - Name = rank - Locator = NA Column = 1 - Name = x1 - Locator = x1 Column = 2 - Name = x2 - Locator = x2 Column = 3 - Name = Post1.Var1.Mean - Locator = NA Column = 4 - Name = Post1.Var1.Variance - Locator = NA Column = 5 - Name = Post1.Var2.Mean - Locator = NA Column = 6 - Name = Post1.Var2.Variance - Locator = NA Column = 7 - Name = Post1.Var3.Mean - Locator = NA Column = 8 - Name = Post1.Var3.Variance - Locator = NA
gp.setDefaultGeographic([10,10])
gp.literal(dbgrid, name="Post1.Var1.Variance", marker="")
gp.grid(dbgrid, flagCell=True)
gp.literal(db, name="rank", s=100)
<matplotlib.collections.PathCollection at 0x7fa5c54ed410>
In this second trial, we use simuPostDemo where a stransformation has been embedded in the procedure: this transformation calculates the sumù and the *standard deviation of the simulation outcomes for eachsample of the target cell. For comparison sake, we still keep the focus on the same cell.
err = gl.simuPostDemo(db, dbgrid, ["SimuA*", "SimuB*", "SimuC*"], flag_match=False,
upscale = gl.EPostUpscale.MEAN,
stats = [gl.EPostStat.MEAN, gl.EPostStat.VAR],
rank_check=4, verbose=True, namconv=gl.NamingConvention("Post2"))
Simulation Post-Processing
--------------------------
Multiplicity order for all variables
- Variable 1 (SimuA*) = 3
- Variable 2 (SimuB*) = 2
- Variable 3 (SimuC*) = 2
Number of Iterations: 12 (using the 'product' criterion)
Number of Statistics: 2
Number of Transform Variables: 2
Number of Output Variables: 4
== Cell #4/25
Iteration 0/ 12 -> Indices (1-based): 1/3 1/2 1/2
Sample Rank #1 0.519 165.288 -3.142
Sample Rank #7 -0.462 162.597 -3.040
After Transform 162.665 78.550 159.095 77.482
Upscale (Average) 160.880 78.016
Iteration 1/ 12 -> Indices (1-based): 1/3 1/2 2/2
Sample Rank #1 0.519 165.288 -3.692
Sample Rank #7 -0.462 162.597 -3.493
After Transform 162.115 78.684 158.643 77.591
Upscale (Average) 160.379 78.138
Iteration 2/ 12 -> Indices (1-based): 1/3 2/2 1/2
Sample Rank #1 0.519 104.997 -3.142
Sample Rank #7 -0.462 140.488 -3.040
After Transform 102.374 50.136 136.987 67.061
Upscale (Average) 119.680 58.598
Iteration 3/ 12 -> Indices (1-based): 1/3 2/2 2/2
Sample Rank #1 0.519 104.997 -3.692
Sample Rank #7 -0.462 140.488 -3.493
After Transform 101.824 50.273 136.534 67.170
Upscale (Average) 119.179 58.722
Iteration 4/ 12 -> Indices (1-based): 2/3 1/2 1/2
Sample Rank #1 -0.594 165.288 -3.142
Sample Rank #7 -0.816 162.597 -3.040
After Transform 161.552 78.805 158.741 77.563
Upscale (Average) 160.146 78.184
Iteration 5/ 12 -> Indices (1-based): 2/3 1/2 2/2
Sample Rank #1 -0.594 165.288 -3.692
Sample Rank #7 -0.816 162.597 -3.493
After Transform 161.002 78.938 158.289 77.672
Upscale (Average) 159.645 78.305
Iteration 6/ 12 -> Indices (1-based): 2/3 2/2 1/2
Sample Rank #1 -0.594 104.997 -3.142
Sample Rank #7 -0.816 140.488 -3.040
After Transform 101.260 50.387 136.632 67.142
Upscale (Average) 118.946 58.765
Iteration 7/ 12 -> Indices (1-based): 2/3 2/2 2/2
Sample Rank #1 -0.594 104.997 -3.692
Sample Rank #7 -0.816 140.488 -3.493
After Transform 100.710 50.522 136.180 67.251
Upscale (Average) 118.445 58.887
Iteration 8/ 12 -> Indices (1-based): 3/3 1/2 1/2
Sample Rank #1 -0.438 165.288 -3.142
Sample Rank #7 0.772 162.597 -3.040
After Transform 161.708 78.769 160.329 77.199
Upscale (Average) 161.019 77.984
Iteration 9/ 12 -> Indices (1-based): 3/3 1/2 2/2
Sample Rank #1 -0.438 165.288 -3.692
Sample Rank #7 0.772 162.597 -3.493
After Transform 161.158 78.902 159.877 77.310
Upscale (Average) 160.517 78.106
Iteration 10/ 12 -> Indices (1-based): 3/3 2/2 1/2
Sample Rank #1 -0.438 104.997 -3.142
Sample Rank #7 0.772 140.488 -3.040
After Transform 101.417 50.352 138.220 66.780
Upscale (Average) 119.818 58.566
Iteration 11/ 12 -> Indices (1-based): 3/3 2/2 2/2
Sample Rank #1 -0.438 104.997 -3.692
Sample Rank #7 0.772 140.488 -3.493
After Transform 100.867 50.487 137.768 66.891
Upscale (Average) 119.317 58.689
Statistics (Mean, Variance) 139.831 424.572 68.413 94.275
gp.setDefaultGeographic([10,10])
gp.literal(dbgrid, name="Post2.Var1.Variance", marker="")
gp.grid(dbgrid, flagCell=True)
gp.literal(db, name="rank", s=100)
<matplotlib.collections.PathCollection at 0x7fa5c54638d0>