Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
BayesValidRox
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
inversemodeling
BayesValidRox
Commits
73cc5aea
Commit
73cc5aea
authored
5 months ago
by
kohlhaasrebecca
Browse files
Options
Downloads
Patches
Plain Diff
[fix] Sorted out_dir, changed eval_pce_model_3d to plot_metamodel_3d
parent
0779c683
No related branches found
No related tags found
1 merge request
!37
Fix/post processing
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/bayesvalidrox/post_processing/post_processing.py
+70
-123
70 additions, 123 deletions
src/bayesvalidrox/post_processing/post_processing.py
with
70 additions
and
123 deletions
src/bayesvalidrox/post_processing/post_processing.py
+
70
−
123
View file @
73cc5aea
...
...
@@ -29,14 +29,21 @@ class PostProcessing:
name : string
Name of the PostProcessing object to be used for saving the generated files.
The default is
'
calib
'
.
out_dir : string
Output directory in which the images are placed. The default is
''
.
"""
def
__init__
(
self
,
engine
,
name
=
'
calib
'
):
def
__init__
(
self
,
engine
,
name
=
'
calib
'
,
out_dir
=
''
):
self
.
engine
=
engine
self
.
name
=
name
self
.
out_dir
=
f
'
{
out_dir
}
/Outputs_PostProcessing_
{
self
.
name
}
/
'
# Open a pdf for the plots
if
not
os
.
path
.
exists
(
self
.
out_dir
):
os
.
makedirs
(
self
.
out_dir
)
# -------------------------------------------------------------------------
def
plot_moments
(
self
,
xlabel
:
str
=
'
Time [s]
'
,
plot_type
:
str
=
None
):
...
...
@@ -72,11 +79,6 @@ class PostProcessing:
# Compute the moments with the PCEModel object
self
.
means
,
self
.
stds
=
self
.
engine
.
MetaModel
.
compute_moments
()
# Open a pdf for the plots
newpath
=
(
f
'
Outputs_PostProcessing_
{
self
.
name
}
/
'
)
if
not
os
.
path
.
exists
(
newpath
):
os
.
makedirs
(
newpath
)
# Plot the best fit line, set the linewidth (lw), color and
# transparency (alpha) of the line
for
key
in
self
.
engine
.
out_names
:
...
...
@@ -138,7 +140,7 @@ class PostProcessing:
# save the current figure
fig
.
savefig
(
f
'
./
{
newpath
}
Mean_Std_PCE_
{
key
}
.pdf
'
,
f
'
./
{
self
.
out_dir
}
Mean_Std_PCE_
{
key
}
.pdf
'
,
bbox_inches
=
'
tight
'
)
...
...
@@ -190,6 +192,9 @@ class PostProcessing:
self
.
_plot_validation
()
else
:
self
.
_plot_validation_multi
(
x_values
=
x_values
,
x_axis
=
x_axis
)
# Zip the subdirectories
self
.
engine
.
Model
.
zip_subdirs
(
f
'
{
self
.
engine
.
Model
.
name
}
valid
'
,
f
'
{
self
.
engine
.
Model
.
name
}
valid_
'
)
# -------------------------------------------------------------------------
def
check_accuracy
(
self
,
n_samples
=
None
,
samples
=
None
,
outputs
=
None
)
->
None
:
...
...
@@ -272,6 +277,7 @@ class PostProcessing:
n_init_samples
=
engine
.
ExpDesign
.
n_init_samples
n_total_samples
=
engine
.
ExpDesign
.
X
.
shape
[
0
]
# TODO: move this one!
newpath
=
f
'
Outputs_PostProcessing_
{
self
.
name
}
/seq_design_diagnostics/
'
if
not
os
.
path
.
exists
(
newpath
):
os
.
makedirs
(
newpath
)
...
...
@@ -755,10 +761,6 @@ class PostProcessing:
par_names
=
self
.
engine
.
ExpDesign
.
par_names
x_values_orig
=
self
.
engine
.
ExpDesign
.
x_values
newpath
=
(
f
'
Outputs_PostProcessing_
{
self
.
name
}
/
'
)
if
not
os
.
path
.
exists
(
newpath
):
os
.
makedirs
(
newpath
)
fig
=
plt
.
figure
()
for
outIdx
,
output
in
enumerate
(
self
.
engine
.
out_names
):
...
...
@@ -801,14 +803,14 @@ class PostProcessing:
plt
.
legend
(
loc
=
'
best
'
,
frameon
=
True
)
# Save indices
np
.
savetxt
(
f
'
./
{
newpath
}
totalsobol_
'
+
np
.
savetxt
(
f
'
./
{
self
.
out_dir
}
totalsobol_
'
+
output
.
replace
(
'
/
'
,
'
_
'
)
+
'
.csv
'
,
total_sobol
.
T
,
delimiter
=
'
,
'
,
header
=
'
,
'
.
join
(
par_names
),
comments
=
''
)
# save the current figure
fig
.
savefig
(
f
'
./
{
newpath
}
Sobol_indices_
{
output
}
.pdf
'
,
f
'
./
{
self
.
out_dir
}
Sobol_indices_
{
output
}
.pdf
'
,
bbox_inches
=
'
tight
'
)
...
...
@@ -850,11 +852,6 @@ class PostProcessing:
y_val
=
outputs
y_pce_val
,
_
=
self
.
engine
.
eval_metamodel
(
samples
=
samples
)
# Open a pdf for the plots
newpath
=
f
'
Outputs_PostProcessing_
{
self
.
name
}
/
'
if
not
os
.
path
.
exists
(
newpath
):
os
.
makedirs
(
newpath
)
# Fit the data(train the model)
for
key
in
y_pce_val
.
keys
():
...
...
@@ -877,7 +874,7 @@ class PostProcessing:
plt
.
ylabel
(
'
Residuals
'
)
# save the current figure
fig1
.
savefig
(
f
'
./
{
newpath
}
/Residuals_vs_Par_
{
i
+
1
}
.pdf
'
,
fig1
.
savefig
(
f
'
./
{
self
.
out_dir
}
/Residuals_vs_Par_
{
i
+
1
}
.pdf
'
,
bbox_inches
=
'
tight
'
)
# Destroy the current plot
plt
.
close
()
...
...
@@ -895,7 +892,7 @@ class PostProcessing:
plt
.
ylabel
(
'
Residuals
'
)
# save the current figure
fig2
.
savefig
(
f
'
./
{
newpath
}
/Fitted_vs_Residuals.pdf
'
,
fig2
.
savefig
(
f
'
./
{
self
.
out_dir
}
/Fitted_vs_Residuals.pdf
'
,
bbox_inches
=
'
tight
'
)
# Destroy the current plot
plt
.
close
()
...
...
@@ -921,7 +918,7 @@ class PostProcessing:
ax
.
add_artist
(
at
)
# save the current figure
fig3
.
savefig
(
f
'
./
{
newpath
}
/Hist_NormResiduals.pdf
'
,
fig3
.
savefig
(
f
'
./
{
self
.
out_dir
}
/Hist_NormResiduals.pdf
'
,
bbox_inches
=
'
tight
'
)
# Destroy the current plot
plt
.
close
()
...
...
@@ -937,103 +934,61 @@ class PostProcessing:
plt
.
grid
(
True
)
# save the current figure
plt
.
savefig
(
f
'
./
{
newpath
}
/QQPlot_NormResiduals.pdf
'
,
plt
.
savefig
(
f
'
./
{
self
.
out_dir
}
/QQPlot_NormResiduals.pdf
'
,
bbox_inches
=
'
tight
'
)
# Destroy the current plot
plt
.
close
()
# -------------------------------------------------------------------------
def
eval_pce_model_3d
(
self
):
# This function currently only supports PCE/aPCE
PCEModel
=
self
.
engine
.
MetaModel
if
not
hasattr
(
PCEModel
,
'
meta_model_type
'
):
raise
AttributeError
(
'
This evaluation only support PCE-type models!
'
)
if
PCEModel
.
meta_model_type
.
lower
()
not
in
[
'
pce
'
,
'
apce
'
]:
raise
AttributeError
(
'
This evaluation only support PCE-type models!
'
)
self
.
n_samples
=
1000
n_samples
=
self
.
n_samples
# Create 3D-Grid
# TODO: Make it general
x
=
np
.
linspace
(
-
5
,
10
,
n_samples
)
y
=
np
.
linspace
(
0
,
15
,
n_samples
)
X
,
Y
=
np
.
meshgrid
(
x
,
y
)
PCE_Z
=
np
.
zeros
((
self
.
n_samples
,
self
.
n_samples
))
Model_Z
=
np
.
zeros
((
self
.
n_samples
,
self
.
n_samples
))
for
idxMesh
in
range
(
self
.
n_samples
):
sample_mesh
=
np
.
vstack
((
X
[:,
idxMesh
],
Y
[:,
idxMesh
])).
T
univ_p_val
=
PCEModel
.
univ_basis_vals
(
sample_mesh
)
for
Outkey
,
ValuesDict
in
PCEModel
.
coeffs_dict
.
items
():
pce_out_mean
=
np
.
zeros
((
len
(
sample_mesh
),
len
(
ValuesDict
)))
pce_out_std
=
np
.
zeros
((
len
(
sample_mesh
),
len
(
ValuesDict
)))
model_outs
=
np
.
zeros
((
len
(
sample_mesh
),
len
(
ValuesDict
)))
for
Inkey
,
InIdxValues
in
ValuesDict
.
items
():
idx
=
int
(
Inkey
.
split
(
'
_
'
)[
1
])
-
1
basis_deg_ind
=
PCEModel
.
basis_dict
[
Outkey
][
Inkey
]
clf_poly
=
PCEModel
.
clf_poly
[
Outkey
][
Inkey
]
PSI_Val
=
PCEModel
.
create_psi
(
basis_deg_ind
,
univ_p_val
)
# Perdiction with error bar
y_mean
,
y_std
=
clf_poly
.
predict
(
PSI_Val
,
return_std
=
True
)
pce_out_mean
[:,
idx
]
=
y_mean
pce_out_std
[:,
idx
]
=
y_std
# Model evaluation
model_out_dict
,
_
=
self
.
engine
.
Model
.
run_model_parallel
(
sample_mesh
,
key_str
=
'
Valid3D
'
)
model_outs
[:,
idx
]
=
model_out_dict
[
Outkey
].
T
PCE_Z
[:,
idxMesh
]
=
y_mean
Model_Z
[:,
idxMesh
]
=
model_outs
[:,
0
]
# ---------------- 3D plot for PCEModel -----------------------
fig_PCE
=
plt
.
figure
()
ax
=
plt
.
axes
(
projection
=
'
3d
'
)
ax
.
plot_surface
(
X
,
Y
,
PCE_Z
,
rstride
=
1
,
cstride
=
1
,
cmap
=
'
viridis
'
,
edgecolor
=
'
none
'
)
ax
.
set_title
(
'
PCEModel
'
)
ax
.
set_xlabel
(
'
$x_1$
'
)
ax
.
set_ylabel
(
'
$x_2$
'
)
ax
.
set_zlabel
(
'
$f(x_1,x_2)$
'
)
def
plot_metamodel_3d
(
self
,
n_samples
=
10
):
"""
Visualize the results of a PCE MetaModel as a 3D surface over two input
parameters.
Parameters
----------
n_samples : int
Number of samples that are used to generate the 3D plot.
plt
.
grid
()
Raises
------
AttributeError
This function is only applicable if the MetaModel input dimension is 2.
# Saving the figure
newpath
=
f
'
Outputs_PostProcessing_
{
self
.
name
}
/
'
if
not
os
.
path
.
exists
(
newpath
):
os
.
makedirs
(
newpath
)
Returns
-------
None.
# save the figure to file
fig_PCE
.
savefig
(
f
'
./
{
newpath
}
/3DPlot_PCEModel.pdf
'
,
bbox_inches
=
'
tight
'
)
plt
.
close
(
fig_PCE
)
# ---------------- 3D plot for Model -----------------------
fig_Model
=
plt
.
figure
()
ax
=
plt
.
axes
(
projection
=
'
3d
'
)
ax
.
plot_surface
(
X
,
Y
,
PCE_Z
,
rstride
=
1
,
cstride
=
1
,
cmap
=
'
viridis
'
,
edgecolor
=
'
none
'
)
ax
.
set_title
(
'
Model
'
)
ax
.
set_xlabel
(
'
$x_1$
'
)
ax
.
set_ylabel
(
'
$x_2$
'
)
ax
.
set_zlabel
(
'
$f(x_1,x_2)$
'
)
plt
.
grid
()
"""
if
self
.
engine
.
ExpDesign
.
ndim
!=
2
:
raise
AttributeError
(
'
This function is only applicable if the MetaModel input dimension is 2.
'
)
samples
=
self
.
engine
.
ExpDesign
.
generate_samples
(
n_samples
)
samples
=
np
.
sort
(
np
.
sort
(
samples
,
axis
=
1
),
axis
=
0
)
mean
,
stdev
=
self
.
engine
.
eval_metamodel
(
samples
=
samples
)
if
self
.
engine
.
emulator
:
title
=
'
MetaModel
'
else
:
title
=
'
Model
'
X
,
Y
=
np
.
meshgrid
(
samples
[:,
0
],
samples
[:,
1
])
for
name
in
self
.
engine
.
out_names
:
for
t
in
range
(
mean
[
name
].
shape
[
1
]):
fig
=
plt
.
figure
()
ax
=
plt
.
axes
(
projection
=
'
3d
'
)
ax
.
plot_surface
(
X
,
Y
,
np
.
atleast_2d
(
mean
[
name
][:,
t
]),
rstride
=
1
,
cstride
=
1
,
cmap
=
'
viridis
'
,
edgecolor
=
'
none
'
)
ax
.
set_title
(
title
)
ax
.
set_xlabel
(
'
$x_1$
'
)
ax
.
set_ylabel
(
'
$x_2$
'
)
ax
.
set_zlabel
(
'
$f(x_1,x_2)$
'
)
plt
.
grid
()
# save the figure to file
fig
.
savefig
(
f
'
./
{
self
.
out_dir
}
/3DPlot_
{
title
}
_
{
name
}{
t
}
.pdf
'
,
bbox_inches
=
'
tight
'
)
plt
.
close
(
fig
)
# Save the figure
fig_Model
.
savefig
(
f
'
./
{
newpath
}
/3DPlot_Model.pdf
'
,
bbox_inches
=
'
tight
'
)
plt
.
close
(
fig_Model
)
return
# -------------------------------------------------------------------------
def
_get_sample
(
self
,
n_samples
=
None
):
...
...
@@ -1106,11 +1061,6 @@ class PostProcessing:
y_pce_val
=
self
.
pce_out_mean
y_val
=
self
.
model_out_dict
# Open a pdf for the plots
newpath
=
f
'
Outputs_PostProcessing_
{
self
.
name
}
/
'
if
not
os
.
path
.
exists
(
newpath
):
os
.
makedirs
(
newpath
)
fig
=
plt
.
figure
()
# Fit the data(train the model)
for
key
in
y_pce_val
.
keys
():
...
...
@@ -1151,7 +1101,7 @@ class PostProcessing:
# save the current figure
plot_name
=
key
.
replace
(
'
'
,
'
_
'
)
fig
.
savefig
(
f
'
./
{
newpath
}
/Model_vs_PCEModel_
{
plot_name
}
.pdf
'
,
fig
.
savefig
(
f
'
./
{
self
.
out_dir
}
/Model_vs_PCEModel_
{
plot_name
}
.pdf
'
,
bbox_inches
=
'
tight
'
)
# Destroy the current plot
...
...
@@ -1169,6 +1119,10 @@ class PostProcessing:
List of x values. The default is [].
x_axis : str, optional
Label of the x axis. The default is
"
x [m]
"
.
Raises
------
AttributeError: This evaluation only support PCE-type models!
Returns
-------
...
...
@@ -1182,10 +1136,6 @@ class PostProcessing:
if
PCEModel
.
meta_model_type
.
lower
()
not
in
[
'
pce
'
,
'
apce
'
]:
raise
AttributeError
(
'
This evaluation only support PCE-type models!
'
)
newpath
=
f
'
Outputs_PostProcessing_
{
self
.
name
}
/
'
if
not
os
.
path
.
exists
(
newpath
):
os
.
makedirs
(
newpath
)
# List of markers and colors
color
=
cycle
(([
'
b
'
,
'
g
'
,
'
r
'
,
'
y
'
,
'
k
'
]))
marker
=
cycle
((
'
x
'
,
'
d
'
,
'
+
'
,
'
o
'
,
'
*
'
))
...
...
@@ -1231,11 +1181,8 @@ class PostProcessing:
# save the current figure
plot_name
=
key
.
replace
(
'
'
,
'
_
'
)
fig
.
savefig
(
f
'
./
{
newpath
}
/Model_vs_PCEModel_
{
plot_name
}
.pdf
'
,
fig
.
savefig
(
f
'
./
{
self
.
out_dir
}
/Model_vs_PCEModel_
{
plot_name
}
.pdf
'
,
bbox_inches
=
'
tight
'
)
# Destroy the current plot
plt
.
close
()
# Zip the subdirectories
self
.
engine
.
Model
.
zip_subdirs
(
f
'
{
self
.
engine
.
Model
.
name
}
valid
'
,
f
'
{
self
.
engine
.
Model
.
name
}
valid_
'
)
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment