Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F84911962
marginal_proxy_engine.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
Wed, Sep 25, 13:20
Size
5 KB
Mime Type
text/x-python
Expires
Fri, Sep 27, 13:20 (2 d)
Engine
blob
Format
Raw Data
Handle
21074915
Attached To
R6746 RationalROMPy
marginal_proxy_engine.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
inspect
import
numpy
as
np
from
copy
import
copy
as
softcopy
from
rrompy.utilities.base.types
import
Np1D
,
paramVal
,
paramList
,
HFEng
from
rrompy.utilities.base
import
freepar
as
fp
from
rrompy.utilities.base.decorators
import
(
affine_construct
,
nonaffine_construct
)
from
rrompy.utilities.exception_manager
import
RROMPyException
from
rrompy.parameter
import
checkParameter
,
checkParameterList
__all__
=
[
'MarginalProxyEngine'
]
def
MarginalProxyEngine
(
HFEngine
:
HFEng
,
marginalized
:
Np1D
):
Aaff
=
hasattr
(
HFEngine
.
A
,
"is_affine"
)
and
HFEngine
.
A
.
is_affine
baff
=
hasattr
(
HFEngine
.
b
,
"is_affine"
)
and
HFEngine
.
b
.
is_affine
if
Aaff
:
if
baff
:
return
MarginalProxyEngineAffineAb
(
HFEngine
,
marginalized
)
return
MarginalProxyEngineAffineA
(
HFEngine
,
marginalized
)
if
baff
:
return
MarginalProxyEngineAffineb
(
HFEngine
,
marginalized
)
return
MarginalProxyEngineNonAffine
(
HFEngine
,
marginalized
)
class
MarginalProxyEngineNonAffine
:
"""
Marginalized should prescribe fixed value for the marginalized parameters
and leave freepar/None elsewhere.
"""
_allowedMuDependencies
=
[
"A"
,
"b"
,
"checkParameter"
,
"checkParameterList"
,
"_assembleObject"
,
"solve"
,
"residual"
]
def
__init__
(
self
,
HFEngine
:
HFEng
,
marginalized
:
Np1D
):
self
.
baseHF
=
HFEngine
self
.
marg
=
marginalized
for
name
in
HFEngine
.
__dir_base__
():
att
=
getattr
(
HFEngine
,
name
)
if
inspect
.
ismethod
(
att
):
attargs
=
inspect
.
getfullargspec
(
att
)
.
args
if
"mu"
not
in
attargs
:
setattr
(
self
.
__class__
,
name
,
getattr
(
HFEngine
,
name
))
else
:
if
name
not
in
self
.
_allowedMuDependencies
:
raise
RROMPyException
((
"Function {} depends on mu "
"and was not accounted for. "
"Must override."
)
.
format
(
name
))
@property
def
affinePoly
(
self
):
return
self
.
nparFixed
==
0
and
self
.
baseHF
.
affinePoly
@property
def
freeLocations
(
self
):
return
[
x
for
x
in
range
(
self
.
baseHF
.
npar
)
if
self
.
marg
[
x
]
==
fp
]
@property
def
fixedLocations
(
self
):
return
[
x
for
x
in
range
(
self
.
baseHF
.
npar
)
if
self
.
marg
[
x
]
!=
fp
]
@property
def
_freeLocationsInsert
(
self
):
return
np
.
cumsum
([
m
==
fp
for
m
in
self
.
marg
])[
self
.
fixedLocations
]
@property
def
muFixed
(
self
):
muF
=
checkParameter
([
m
for
m
in
self
.
marg
if
m
!=
fp
])
if
self
.
baseHF
.
npar
-
self
.
nparFree
>
0
:
muF
=
muF
[
0
]
return
muF
@property
def
nparFree
(
self
):
"""Value of nparFree."""
return
len
(
self
.
freeLocations
)
@property
def
nparFixed
(
self
):
"""Value of nparFixed."""
return
len
(
self
.
fixedLocations
)
def
name
(
self
)
->
str
:
return
"{}-proxy for {}"
.
format
(
self
.
freeLocations
,
self
.
baseHF
.
name
())
def
__str__
(
self
)
->
str
:
return
self
.
name
()
def
__repr__
(
self
)
->
str
:
return
self
.
__str__
()
+
" at "
+
hex
(
id
(
self
))
def
__dir_base__
(
self
):
return
[
x
for
x
in
self
.
__dir__
()
if
x
[:
2
]
!=
"__"
]
def
__deepcopy__
(
self
,
memo
):
return
softcopy
(
self
)
def
completeMu
(
self
,
mu
:
paramVal
):
mu
=
checkParameter
(
mu
,
self
.
nparFree
,
return_data
=
True
)
return
np
.
insert
(
mu
,
self
.
_freeLocationsInsert
,
self
.
muFixed
,
axis
=
1
)
def
completeMuList
(
self
,
mu
:
paramList
):
mu
=
checkParameterList
(
mu
,
self
.
nparFree
,
return_data
=
True
)
return
np
.
insert
(
mu
,
self
.
_freeLocationsInsert
,
self
.
muFixed
,
axis
=
1
)
@nonaffine_construct
def
A
(
self
,
mu
:
paramVal
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
A
(
self
.
completeMu
(
mu
),
*
args
,
**
kwargs
)
@nonaffine_construct
def
b
(
self
,
mu
:
paramVal
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
b
(
self
.
completeMu
(
mu
),
*
args
,
**
kwargs
)
def
checkParameter
(
self
,
mu
:
paramVal
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
checkParameter
(
self
.
completeMu
(
mu
),
*
args
,
**
kwargs
)
def
checkParameterList
(
self
,
mu
:
paramList
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
checkParameterList
(
self
.
completeMuList
(
mu
),
*
args
,
**
kwargs
)
def
_assembleObject
(
self
,
mu
:
paramVal
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
_assembleObject
(
self
.
completeMu
(
mu
),
*
args
,
**
kwargs
)
def
solve
(
self
,
mu
:
paramList
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
solve
(
self
.
completeMuList
(
mu
),
*
args
,
**
kwargs
)
def
residual
(
self
,
mu
:
paramList
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
residual
(
self
.
completeMuList
(
mu
),
*
args
,
**
kwargs
)
class
MarginalProxyEngineAffineA
(
MarginalProxyEngineNonAffine
):
@affine_construct
def
A
(
self
,
mu
:
paramVal
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
A
(
self
.
completeMu
(
mu
),
*
args
,
**
kwargs
)
class
MarginalProxyEngineAffineb
(
MarginalProxyEngineNonAffine
):
@affine_construct
def
b
(
self
,
mu
:
paramVal
=
[],
*
args
,
**
kwargs
):
return
self
.
baseHF
.
b
(
self
.
completeMu
(
mu
),
*
args
,
**
kwargs
)
class
MarginalProxyEngineAffineAb
(
MarginalProxyEngineAffineA
,
MarginalProxyEngineAffineb
):
pass
Event Timeline
Log In to Comment