Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F60221921
trained_model_rational.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
Sun, Apr 28, 10:26
Size
6 KB
Mime Type
text/x-python
Expires
Tue, Apr 30, 10:26 (2 d)
Engine
blob
Format
Raw Data
Handle
17319852
Attached To
R6746 RationalROMPy
trained_model_rational.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
collections.abc
import
Iterable
from
rrompy.reduction_methods.base.trained_model.trained_model
import
(
TrainedModel
)
from
rrompy.utilities.numerical
import
dot
from
rrompy.utilities.numerical.compress_matrix
import
compressMatrix
from
rrompy.utilities.base.types
import
(
Np1D
,
Np2D
,
Tuple
,
List
,
ListAny
,
paramVal
,
paramList
,
sampList
)
from
rrompy.utilities.base
import
verbosityManager
as
vbMng
,
freepar
as
fp
from
rrompy.utilities.exception_manager
import
RROMPyException
,
RROMPyWarning
from
rrompy.parameter
import
emptyParameterList
from
rrompy.sampling
import
sampleList
__all__
=
[
'TrainedModelRational'
]
class
TrainedModelRational
(
TrainedModel
):
"""
ROM approximant evaluation for rational approximant.
Attributes:
Data: dictionary with all that can be pickled.
"""
def
compress
(
self
,
collapse
:
bool
=
False
,
tol
:
float
=
0.
,
*
args
,
**
kwargs
):
if
not
collapse
and
tol
<=
0.
:
return
RMat
=
self
.
data
.
projMat
if
not
collapse
:
if
hasattr
(
self
.
data
,
"_compressTol"
):
RROMPyWarning
((
"Recompressing already compressed model is "
"ineffective. Aborting."
))
return
self
.
data
.
projMat
,
RMat
,
_
=
compressMatrix
(
RMat
,
tol
,
*
args
,
**
kwargs
)
self
.
data
.
P
.
postmultiplyTensorize
(
RMat
.
T
)
super
()
.
compress
(
collapse
,
tol
)
def
centerNormalize
(
self
,
mu
:
paramList
=
[],
mu0
:
paramVal
=
None
)
->
paramList
:
"""
Compute normalized parameter to be plugged into approximant.
Args:
mu: Parameter(s) 1.
mu0: Parameter(s) 2. If None, set to self.data.mu0.
Returns:
Normalized parameter.
"""
mu
=
self
.
checkParameterList
(
mu
)
if
mu0
is
None
:
mu0
=
self
.
data
.
mu0
return
(
self
.
mapParameterList
(
mu
)
-
self
.
mapParameterList
(
mu0
))
/
self
.
data
.
scaleFactor
def
getPVal
(
self
,
mu
:
paramList
=
[])
->
sampList
:
"""
Evaluate rational numerator at arbitrary parameter.
Args:
mu: Target parameter.
"""
mu
=
self
.
checkParameterList
(
mu
)
vbMng
(
self
,
"INIT"
,
"Evaluating numerator at mu = {}."
.
format
(
mu
),
17
)
p
=
sampleList
(
self
.
data
.
P
(
self
.
centerNormalize
(
mu
)))
vbMng
(
self
,
"DEL"
,
"Done evaluating numerator."
,
17
)
return
p
def
getQVal
(
self
,
mu
:
Np1D
,
der
:
List
[
int
]
=
None
,
scl
:
Np1D
=
None
)
->
Np1D
:
"""
Evaluate rational denominator at arbitrary parameter.
Args:
mu: Target parameter.
der(optional): Derivatives to take before evaluation.
"""
mu
=
self
.
checkParameterList
(
mu
)
vbMng
(
self
,
"INIT"
,
"Evaluating denominator at mu = {}."
.
format
(
mu
),
17
)
q
=
self
.
data
.
Q
(
self
.
centerNormalize
(
mu
),
der
,
scl
)
vbMng
(
self
,
"DEL"
,
"Done evaluating denominator."
,
17
)
return
q
def
getApproxReduced
(
self
,
mu
:
paramList
=
[])
->
sampList
:
"""
Evaluate reduced representation of approximant at arbitrary parameter.
Args:
mu: Target parameter.
"""
mu
=
self
.
checkParameterList
(
mu
)
if
(
not
hasattr
(
self
,
"lastSolvedApproxReduced"
)
or
self
.
lastSolvedApproxReduced
!=
mu
):
vbMng
(
self
,
"INIT"
,
"Evaluating approximant at mu = {}."
.
format
(
mu
),
12
)
QV
=
self
.
getQVal
(
mu
)
QVzero
=
np
.
where
(
QV
==
0.
)[
0
]
if
len
(
QVzero
)
>
0
:
QV
[
QVzero
]
=
np
.
finfo
(
np
.
complex
)
.
eps
/
(
1.
+
self
.
data
.
Q
.
deg
[
0
])
self
.
uApproxReduced
=
self
.
getPVal
(
mu
)
/
QV
vbMng
(
self
,
"DEL"
,
"Done evaluating approximant."
,
12
)
self
.
lastSolvedApproxReduced
=
mu
return
self
.
uApproxReduced
def
getPoles
(
self
,
marginalVals
:
ListAny
=
[
fp
])
->
paramList
:
"""
Obtain approximant poles.
Returns:
Numpy complex vector of poles.
"""
mVals
=
list
(
marginalVals
)
rDim
=
mVals
.
index
(
fp
)
if
rDim
<
len
(
mVals
)
-
1
and
fp
in
mVals
[
rDim
+
1
:]:
raise
RROMPyException
((
"Exactly 1 'freepar' entry in "
"marginalVals must be provided."
))
mVals
[
rDim
]
=
self
.
data
.
mu0
(
rDim
)
mVals
=
list
(
self
.
centerNormalize
(
mVals
)
.
data
.
flatten
())
mVals
[
rDim
]
=
fp
roots
=
self
.
data
.
scaleFactor
[
rDim
]
*
self
.
data
.
Q
.
roots
(
mVals
)
return
self
.
mapParameterList
(
self
.
mapParameterList
(
self
.
data
.
mu0
(
rDim
),
idx
=
[
rDim
])(
0
,
0
)
+
roots
,
"B"
,
[
rDim
])(
0
)
def
getResidues
(
self
,
*
args
,
**
kwargs
)
->
Tuple
[
paramList
,
Np2D
]:
"""
Obtain approximant residues.
Returns:
Numpy matrix with residues as columns.
"""
pls
=
self
.
getPoles
(
*
args
,
**
kwargs
)
if
len
(
pls
)
==
0
:
return
pls
,
np
.
empty
((
0
,
0
),
dtype
=
self
.
data
.
P
.
coeffs
.
dtype
)
if
len
(
args
)
==
1
:
mVals
=
args
[
0
]
elif
len
(
args
)
==
0
:
mVals
=
[
None
]
else
:
mVals
=
kwargs
[
"marginalVals"
]
if
not
isinstance
(
mVals
,
Iterable
):
mVals
=
[
mVals
]
mVals
=
list
(
mVals
)
rDim
=
mVals
.
index
(
fp
)
poles
=
emptyParameterList
()
poles
.
reset
((
len
(
pls
),
self
.
data
.
npar
),
dtype
=
pls
.
dtype
)
for
k
,
pl
in
enumerate
(
pls
):
mValsLoc
=
list
(
mVals
)
mValsLoc
[
rDim
]
=
pl
poles
[
k
]
=
mValsLoc
QV
=
self
.
getQVal
(
poles
,
list
(
1
*
(
np
.
arange
(
self
.
data
.
npar
)
==
rDim
)))
QVzero
=
np
.
where
(
QV
==
0.
)[
0
]
if
len
(
QVzero
)
>
0
:
RROMPyWarning
((
"Adjusting residues to avoid division by "
"numerically zero denominator."
))
QV
[
QVzero
]
=
np
.
finfo
(
np
.
complex
)
.
eps
/
(
1.
+
self
.
data
.
Q
.
deg
[
0
])
res
=
self
.
getPVal
(
poles
)
.
data
/
QV
if
not
self
.
data
.
_collapsed
:
res
=
dot
(
self
.
data
.
projMat
,
res
)
.
T
return
pls
,
res
Event Timeline
Log In to Comment