Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F73600202
generic_standard_approximant.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Jul 23, 01:20
Size
9 KB
Mime Type
text/x-python
Expires
Thu, Jul 25, 01:20 (2 d)
Engine
blob
Format
Raw Data
Handle
19232117
Attached To
R6746 RationalROMPy
generic_standard_approximant.py
View Options
# Copyright (C) 2018-2020 by the RROMPy authors
#
# This file is part of RROMPy.
#
# RROMPy is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# RROMPy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with RROMPy. If not, see <http://www.gnu.org/licenses/>.
#
import
numpy
as
np
from
copy
import
deepcopy
as
copy
from
rrompy.reduction_methods.base.generic_approximant
import
(
GenericApproximant
)
from
rrompy.utilities.base
import
verbosityManager
as
vbMng
from
rrompy.utilities.base.types
import
Np2D
,
paramList
from
rrompy.utilities.exception_manager
import
(
RROMPyException
,
RROMPyAssert
,
RROMPyWarning
)
__all__
=
[
'GenericStandardApproximant'
]
class
GenericStandardApproximant
(
GenericApproximant
):
"""
ROM interpolant computation for parametric problems (ABSTRACT).
Args:
HFEngine: HF problem solver.
mu0(optional): Default parameter. Defaults to 0.
approxParameters(optional): Dictionary containing values for main
parameters of approximant. Recognized keys are:
- 'POD': kind of snapshots orthogonalization; allowed values
include 0, 1/2, and 1; defaults to 1, i.e. POD;
- 'scaleFactorDer': scaling factors for derivative computation;
defaults to 'AUTO';
- 'S': total number of samples current approximant relies upon;
- 'sampler': sample point generator.
Defaults to empty dict.
verbosity(optional): Verbosity level. Defaults to 10.
Attributes:
HFEngine: HF problem solver.
mu0: Default parameter.
mus: Array of snapshot parameters.
approxParameters: Dictionary containing values for main parameters of
approximant. Recognized keys are in parameterList.
parameterListSoft: Recognized keys of soft approximant parameters:
- 'POD': kind of snapshots orthogonalization;
- 'scaleFactorDer': scaling factors for derivative computation.
parameterListCritical: Recognized keys of critical approximant
parameters:
- 'S': total number of samples current approximant relies upon;
- 'sampler': sample point generator.
verbosity: Verbosity level.
POD: Kind of snapshots orthogonalization.
scaleFactorDer: Scaling factors for derivative computation.
S: Number of solution snapshots over which current approximant is
based upon.
sampler: Sample point generator.
muBounds: list of bounds for parameter values.
samplingEngine: Sampling engine.
uHF: High fidelity solution(s) with parameter(s) lastSolvedHF as
sampleList.
lastSolvedHF: Parameter(s) corresponding to last computed high fidelity
solution(s) as parameterList.
uApproxReduced: Reduced approximate solution(s) with parameter(s)
lastSolvedApprox as sampleList.
lastSolvedApproxReduced: Parameter(s) corresponding to last computed
reduced approximate solution(s) as parameterList.
uApprox: Approximate solution(s) with parameter(s) lastSolvedApprox as
sampleList.
lastSolvedApprox: Parameter(s) corresponding to last computed
approximate solution(s) as parameterList.
"""
def
__init__
(
self
,
*
args
,
**
kwargs
):
self
.
_preInit
()
from
rrompy.parameter.parameter_sampling
import
EmptySampler
as
ES
self
.
_addParametersToList
([],
[],
[
"sampler"
],
[
ES
()])
super
()
.
__init__
(
*
args
,
**
kwargs
)
self
.
_postInit
()
@property
def
mus
(
self
):
"""Value of mus. Its assignment may reset snapshots."""
return
self
.
_mus
@mus.setter
def
mus
(
self
,
mus
):
mus
=
self
.
checkParameterList
(
mus
)
musOld
=
copy
(
self
.
mus
)
if
hasattr
(
self
,
'_mus'
)
else
None
if
(
musOld
is
None
or
len
(
mus
)
!=
len
(
musOld
)
or
not
mus
==
musOld
):
self
.
resetSamples
()
self
.
_mus
=
mus
@property
def
muBounds
(
self
):
"""Value of muBounds."""
return
self
.
sampler
.
lims
@property
def
sampler
(
self
):
"""Value of sampler."""
return
self
.
_sampler
@sampler.setter
def
sampler
(
self
,
sampler
):
if
'generatePoints'
not
in
dir
(
sampler
):
raise
RROMPyException
(
"Sampler type not recognized."
)
if
hasattr
(
self
,
'_sampler'
)
and
self
.
_sampler
is
not
None
:
samplerOld
=
self
.
sampler
self
.
_sampler
=
copy
(
sampler
)
self
.
_approxParameters
[
"sampler"
]
=
self
.
sampler
if
not
'samplerOld'
in
locals
()
or
samplerOld
!=
self
.
sampler
:
self
.
resetSamples
()
def
setSamples
(
self
,
samplingEngine
,
merge
:
bool
=
False
):
"""Copy samplingEngine and samples."""
vbMng
(
self
,
"INIT"
,
"Transfering samples."
,
15
)
if
isinstance
(
samplingEngine
,
(
str
,
list
,
tuple
,)):
self
.
setupSampling
()
self
.
samplingEngine
.
load
(
samplingEngine
,
merge
)
elif
merge
:
try
:
selfkeys
=
self
.
samplingEngine
.
feature_keys
for
key
in
samplingEngine
.
feature_keys
:
if
key
in
selfkeys
:
self
.
samplingEngine
.
_mergeFeature
(
key
,
samplingEngine
.
feature_vals
[
key
])
except
:
RROMPyWarning
((
"Sample merge failed. Falling back to complete "
"sampling engine replacement."
))
self
.
samplingEngine
=
copy
(
samplingEngine
)
else
:
self
.
samplingEngine
=
copy
(
samplingEngine
)
if
self
.
POD
!=
0
and
(
self
.
samplingEngine
.
nsamples
!=
len
(
self
.
samplingEngine
.
samples_normal
)):
RROMPyWarning
((
"Assigning non-POD sampling engine to POD "
"approximant is unstable. Declassing local "
"POD to 0."
))
self
.
_POD
=
0
self
.
_mus
=
copy
(
self
.
samplingEngine
.
mus
)
self
.
scaleFactor
=
self
.
samplingEngine
.
scaleFactor
vbMng
(
self
,
"DEL"
,
"Done transfering samples."
,
15
)
def
computeSnapshots
(
self
):
"""Compute snapshots of solution map."""
RROMPyAssert
(
self
.
_mode
,
message
=
"Cannot start snapshot computation."
)
if
self
.
samplingEngine
.
nsamples
!=
self
.
S
:
self
.
computeScaleFactor
()
self
.
samplingEngine
.
scaleFactor
=
self
.
scaleFactorDer
vbMng
(
self
,
"INIT"
,
"Starting computation of snapshots."
,
5
)
self
.
mus
=
self
.
sampler
.
generatePoints
(
self
.
S
)
while
len
(
self
.
mus
)
>
self
.
S
:
self
.
mus
.
pop
()
self
.
samplingEngine
.
iterSample
(
self
.
mus
)
vbMng
(
self
,
"DEL"
,
"Done computing snapshots."
,
5
)
def
computeScaleFactor
(
self
):
"""Compute parameter rescaling factor."""
self
.
scaleFactor
=
.
5
*
np
.
abs
((
self
.
mapParameterList
(
self
.
muBounds
[
0
])
-
self
.
mapParameterList
(
self
.
muBounds
[
1
]))[
0
])
def
_setupTrainedModel
(
self
,
pMat
:
Np2D
,
pMatUpdate
:
bool
=
False
):
if
self
.
POD
==
1
and
not
(
hasattr
(
self
.
HFEngine
.
C
,
"is_mu_independent"
)
and
self
.
HFEngine
.
C
.
is_mu_independent
in
self
.
_output_lvl
):
raise
RROMPyException
((
"Cannot apply mu-dependent C to "
"orthonormalized samples."
))
vbMng
(
self
,
"INIT"
,
"Extracting system output from state."
,
35
)
pMat
=
self
.
HFEngine
.
applyC
(
pMat
,
self
.
mus
)
vbMng
(
self
,
"DEL"
,
"Done extracting system output."
,
35
)
if
self
.
trainedModel
is
None
:
self
.
trainedModel
=
self
.
tModelType
()
self
.
trainedModel
.
verbosity
=
self
.
verbosity
self
.
trainedModel
.
timestamp
=
self
.
timestamp
datadict
=
{
"mu0"
:
self
.
mu0
,
"mus"
:
copy
(
self
.
mus
),
"projMat"
:
pMat
,
"scaleFactor"
:
self
.
scaleFactor
,
"parameterMap"
:
self
.
HFEngine
.
parameterMap
}
self
.
trainedModel
.
data
=
self
.
initializeModelData
(
datadict
)[
0
]
else
:
self
.
trainedModel
=
self
.
trainedModel
if
pMatUpdate
:
self
.
trainedModel
.
data
.
projMat
=
np
.
hstack
(
(
self
.
trainedModel
.
data
.
projMat
,
pMat
))
else
:
self
.
trainedModel
.
data
.
projMat
=
copy
(
pMat
)
self
.
trainedModel
.
data
.
mus
=
copy
(
self
.
mus
)
def
addSamplePoints
(
self
,
mus
:
paramList
)
->
int
:
"""Add sample points to reduced model."""
if
not
self
.
checkComputedApprox
():
raise
RROMPyException
((
"Cannot add samples before initializing "
"reduced model through setupApprox."
))
RROMPyAssert
(
self
.
_mode
,
message
=
"Cannot add sample points."
)
mus
=
self
.
checkParameterList
(
mus
)
vbMng
(
self
,
"INIT"
,
"Adding sample point{} at {}."
.
format
(
"s"
*
(
len
(
mus
)
>
1
),
mus
),
5
)
for
mu
in
mus
:
self
.
mus
.
append
(
mu
)
self
.
samplingEngine
.
nextSample
(
mu
)
self
.
_S
=
len
(
self
.
mus
)
val
=
self
.
setupApprox
()
vbMng
(
self
,
"DEL"
,
"Done adding sample points."
,
5
)
return
val
Event Timeline
Log In to Comment