Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F60538936
polynomial_interpolator.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, Apr 30, 23:08
Size
5 KB
Mime Type
text/x-python
Expires
Thu, May 2, 23:08 (2 d)
Engine
blob
Format
Raw Data
Handle
17370151
Attached To
R6746 RationalROMPy
polynomial_interpolator.py
View Options
# Copyright (C) 2018 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.utilities.base.types
import
(
List
,
ListAny
,
DictAny
,
Np1D
,
Np2D
,
paramList
)
from
rrompy.utilities.base
import
freepar
as
fp
from
rrompy.utilities.poly_fitting.interpolator
import
GenericInterpolator
from
rrompy.utilities.poly_fitting.custom_fit
import
customFit
from
.base
import
polyfitname
from
.val
import
polyval
from
.roots
import
polyroots
from
.vander
import
polyvander
as
pv
,
polyvanderTotal
as
pvT
from
rrompy.utilities.numerical
import
degreeTotalToFull
,
dot
from
rrompy.utilities.exception_manager
import
RROMPyAssert
,
RROMPyException
from
rrompy.parameter
import
checkParameterList
__all__
=
[
'PolynomialInterpolator'
]
class
PolynomialInterpolator
(
GenericInterpolator
):
"""HERE"""
def
__init__
(
self
,
other
=
None
):
if
other
is
None
:
return
self
.
coeffs
=
other
.
coeffs
self
.
npar
=
other
.
npar
self
.
polybasis
=
other
.
polybasis
@property
def
shape
(
self
):
if
self
.
coeffs
.
ndim
>
self
.
npar
:
sh
=
self
.
coeffs
.
shape
[
self
.
npar
:]
else
:
sh
=
tuple
([
1
])
return
sh
@property
def
deg
(
self
):
return
[
x
-
1
for
x
in
self
.
coeffs
.
shape
[:
self
.
npar
]]
def
__getitem__
(
self
,
key
):
return
self
.
coeffs
[
key
]
def
__call__
(
self
,
mu
:
paramList
,
der
:
List
[
int
]
=
None
,
scl
:
Np1D
=
None
):
return
polyval
(
mu
,
self
.
coeffs
,
self
.
polybasis
,
der
,
scl
)
def
__copy__
(
self
):
return
PolynomialInterpolator
(
self
)
def
__deepcopy__
(
self
,
memo
):
other
=
PolynomialInterpolator
()
other
.
coeffs
,
other
.
npar
,
other
.
polybasis
=
copy
(
(
self
.
coeffs
,
self
.
npar
,
self
.
polybasis
),
memo
)
return
other
def
pad
(
self
,
nleft
:
List
[
int
]
=
None
,
nright
:
List
[
int
]
=
None
):
if
nleft
is
None
:
nleft
=
[
0
]
*
len
(
self
.
shape
)
if
nright
is
None
:
nright
=
[
0
]
*
len
(
self
.
shape
)
if
not
hasattr
(
nleft
,
"__len__"
):
nleft
=
[
nleft
]
if
not
hasattr
(
nright
,
"__len__"
):
nright
=
[
nright
]
RROMPyAssert
(
len
(
self
.
shape
),
len
(
nleft
),
"Shape of output"
)
RROMPyAssert
(
len
(
self
.
shape
),
len
(
nright
),
"Shape of output"
)
padwidth
=
[(
0
,
0
)]
*
self
.
npar
padwidth
=
padwidth
+
[(
l
,
r
)
for
l
,
r
in
zip
(
nleft
,
nright
)]
self
.
coeffs
=
np
.
pad
(
self
.
coeffs
,
padwidth
,
"constant"
,
constant_values
=
(
0.
,
0.
))
def
postmultiplyTensorize
(
self
,
A
:
Np2D
):
RROMPyAssert
(
A
.
shape
[
0
],
self
.
shape
[
-
1
],
"Shape of output"
)
self
.
coeffs
=
dot
(
self
.
coeffs
,
A
)
def
setupByInterpolation
(
self
,
support
:
paramList
,
values
:
ListAny
,
deg
:
int
,
polybasis
:
str
=
"MONOMIAL"
,
verbose
:
bool
=
True
,
totalDegree
:
bool
=
True
,
vanderCoeffs
:
DictAny
=
{},
fitCoeffs
:
DictAny
=
{}):
support
=
checkParameterList
(
support
)[
0
]
self
.
npar
=
support
.
shape
[
1
]
self
.
polybasis
=
polybasis
if
totalDegree
:
vander
=
pvT
(
support
,
deg
,
basis
=
polybasis
,
**
vanderCoeffs
)
else
:
if
not
hasattr
(
deg
,
"__len__"
):
deg
=
[
deg
]
*
self
.
npar
vander
=
pv
(
support
,
deg
,
basis
=
polybasis
,
**
vanderCoeffs
)
outDim
=
values
.
shape
[
1
:]
values
=
values
.
reshape
(
values
.
shape
[
0
],
-
1
)
fitOut
=
customFit
(
vander
,
values
,
full
=
True
,
**
fitCoeffs
)
P
=
fitOut
[
0
]
if
verbose
:
msg
=
(
"Fitting {} samples with degree {} through {}... "
"Conditioning of LS system: {:.4e}."
)
.
format
(
len
(
vander
),
deg
,
polyfitname
(
self
.
polybasis
),
fitOut
[
1
][
2
][
0
]
/
fitOut
[
1
][
2
][
-
1
])
else
:
msg
=
None
if
totalDegree
:
self
.
coeffs
=
degreeTotalToFull
(
tuple
([
deg
+
1
]
*
self
.
npar
)
+
outDim
,
self
.
npar
,
P
)
else
:
self
.
coeffs
=
P
.
reshape
(
tuple
([
d
+
1
for
d
in
deg
])
+
outDim
)
return
fitOut
[
1
][
1
]
==
vander
.
shape
[
1
],
msg
def
roots
(
self
,
marginalVals
:
ListAny
=
[
fp
]):
RROMPyAssert
(
self
.
shape
,
(
1
,),
"Shape of output"
)
RROMPyAssert
(
len
(
marginalVals
),
self
.
npar
,
"Number of parameters"
)
try
:
rDim
=
marginalVals
.
index
(
fp
)
if
rDim
<
len
(
marginalVals
)
-
1
and
fp
in
marginalVals
[
rDim
+
1
:]:
raise
except
:
raise
RROMPyException
((
"Exactly 1 'freepar' entry in "
"marginalVals must be provided."
))
return
polyroots
(
self
.
coeffs
,
self
.
polybasis
,
marginalVals
)
Event Timeline
Log In to Comment