#
# This file is part of TransportMaps.
#
# TransportMaps 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.
#
# TransportMaps 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 TransportMaps. If not, see <http://www.gnu.org/licenses/>.
#
# Transport Maps Library
# Copyright (C) 2015-2018 Massachusetts Institute of Technology
# Uncertainty Quantification group
# Department of Aeronautics and Astronautics
#
# Authors: Transport Map Team
# Website: transportmaps.mit.edu
# Support: transportmaps.mit.edu/qa/
#
import numpy as np
from ...Misc import deprecate, cmdinput
from ...Maps import ParametricTriangularComponentwiseTransportMap, MapFactory, \
assemble_IsotropicIntegratedSquaredTriangularTransportMap, IdentityEmbeddedParametricTransportMap
__all__ = [
'DeepLazyMapFactory',
'FixedOrderDeepLazyMapFactory',
'ManualDeepLazyMapFactory',
'DeepLazyMapListFactory',
'FixedOrderMapFactory',
'ManualMapFactory',
# Deprecated
'LazyTransportMap',
]
[docs]class LazyTransportMap(ParametricTriangularComponentwiseTransportMap):
@deprecate(
'LazyTransportMap',
'3.0',
'Use Maps.IdentityEmbeddedParametricTransportMap instead'
)
def __init__(self, head, tail):
self.head = head
self.tail = tail
dim = head.dim + tail.dim
super(LazyTransportMap, self).__init__(
active_vars = head.active_vars + [ [d] for d in range(head.dim,dim) ],
approx_list = head.approx_list + tail.approx_list
)
[docs] def get_identity_coeffs(self):
return np.hstack([
self.head.get_identity_coeffs(),
self.tail.get_identity_coeffs()
])
[docs] def get_default_init_values_minimize_kl_divergence(self):
return self.get_identity_coeffs()
[docs]class DeepLazyMapFactory(MapFactory):
[docs] def generate(self, dim, dim_k, order, *args, **kwargs):
tm = assemble_IsotropicIntegratedSquaredTriangularTransportMap(
dim_k, order=order )
if dim_k < dim:
tm = IdentityEmbeddedParametricTransportMap(
tm=tm, idxs=list(range(dim_k)), dim=dim
)
# Id = MAPS.IdentityParametricTriangularComponentwiseTransportMap(dim=dim-dim_k)
# tm = LazyTransportMap(tm, Id)
return tm
[docs]class DeepLazyMapListFactory( DeepLazyMapFactory ):
[docs] def generate(self, dim, dim_k, order, *args, **kwargs):
tm_list = []
for o in range(1, self.order+1):
tm = assemble_IsotropicIntegratedSquaredTriangularTransportMap(
dim_k, order=o )
if dim_k < dim:
tm = IdentityEmbeddedParametricTransportMap(
tm=tm, idxs=list(range(dim_k)), dim=dim
)
# Id = MAPS.IdentityParametricTriangularComponentwiseTransportMap(dim=dim-dim_k)
# tm = LazyTransportMap(tm, Id)
tm_list.append( tm )
return tm_list
[docs]class FixedOrderDeepLazyMapFactory( DeepLazyMapFactory ):
def __init__(self, order):
super(FixedOrderDeepLazyMapFactory, self).__init__()
self.order = order
[docs] def generate(self, dim, dim_k, *args, **kwargs):
return super(FixedOrderDeepLazyMapFactory, self).generate(
dim, dim_k, self.order )
[docs]class ManualDeepLazyMapFactory( DeepLazyMapFactory ):
[docs] def generate(self, dim, dim_k, *args, **kwargs):
order = None
while not isinstance(order, int):
instr = cmdinput(
"Select the order of the new lazy map [>0]: "
)
try:
order = int(instr)
if order < 1: order = None
except ValueError:
pass
return super(ManualDeepLazyMapFactory, self).generate(
dim, dim_k, order )
[docs]class FixedOrderMapFactory(MapFactory):
def __init__(self, order):
super(FixedOrderMapFactory, self).__init__()
self.order = order
[docs] def generate(self, dim_k, *args, **kwargs):
tm = assemble_IsotropicIntegratedSquaredTriangularTransportMap(
dim_k, order=self.order )
return tm
[docs]class ManualMapFactory(MapFactory):
[docs] def generate(self, dim_k, *args, **kwargs):
order = None
while not isinstance(order, int):
instr = cmdinput(
"Select the order of the new lazy map [>0]: "
)
try:
order = int(instr)
if order < 1: order = None
except ValueError:
pass
tm = assemble_IsotropicIntegratedSquaredTriangularTransportMap(
dim_k, order=order )
return tm