mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-24 13:20:06 +08:00
testMaps Working!
This commit is contained in:
+22
-17
@@ -1,7 +1,7 @@
|
||||
import Utils, Parameters, numpy as np, scipy.sparse as sp
|
||||
from Tests import checkDerivative
|
||||
|
||||
class BaseModel(object):
|
||||
class IdentityMap(object):
|
||||
"""
|
||||
SimPEG Model
|
||||
|
||||
@@ -66,9 +66,14 @@ class BaseModel(object):
|
||||
kwargs['plotIt'] = False
|
||||
return checkDerivative(lambda m : [self.transform(m), self.transformDeriv(m)], m, **kwargs)
|
||||
|
||||
class BaseNonLinearModel(object):
|
||||
def _assertMatchesPair(self, pair):
|
||||
assert (isinstance(self, pair) or
|
||||
isinstance(self, ComboMap) and isinstance(self.models[0], pair)
|
||||
), "Model object must be an instance of a %s class."%(pair.__name__)
|
||||
|
||||
class NonLinearMap(object):
|
||||
"""
|
||||
SimPEG BaseNonLinearModel
|
||||
SimPEG NonLinearMap
|
||||
|
||||
"""
|
||||
|
||||
@@ -129,11 +134,11 @@ class BaseNonLinearModel(object):
|
||||
raise NotImplementedError('The test is not implemented.')
|
||||
|
||||
|
||||
class LogModel(BaseModel):
|
||||
"""SimPEG LogModel"""
|
||||
class ExpMap(IdentityMap):
|
||||
"""SimPEG ExpMap"""
|
||||
|
||||
def __init__(self, mesh, **kwargs):
|
||||
BaseModel.__init__(self, mesh, **kwargs)
|
||||
IdentityMap.__init__(self, mesh, **kwargs)
|
||||
|
||||
def transform(self, m):
|
||||
"""
|
||||
@@ -197,8 +202,8 @@ class LogModel(BaseModel):
|
||||
"""
|
||||
return Utils.sdiag(np.exp(Utils.mkvc(m)))
|
||||
|
||||
class Vertical1DModel(BaseModel):
|
||||
"""Vertical1DModel
|
||||
class Vertical1DMap(IdentityMap):
|
||||
"""Vertical1DMap
|
||||
|
||||
Given a 1D vector through the last dimension
|
||||
of the mesh, this will extend to the full
|
||||
@@ -206,7 +211,7 @@ class Vertical1DModel(BaseModel):
|
||||
"""
|
||||
|
||||
def __init__(self, mesh, **kwargs):
|
||||
BaseModel.__init__(self, mesh, **kwargs)
|
||||
IdentityMap.__init__(self, mesh, **kwargs)
|
||||
|
||||
@property
|
||||
def nP(self):
|
||||
@@ -238,7 +243,7 @@ class Vertical1DModel(BaseModel):
|
||||
), shape=(repNum, 1))
|
||||
return sp.kron(sp.identity(self.nP), repVec)
|
||||
|
||||
class Mesh2Mesh(BaseModel):
|
||||
class Mesh2Mesh(IdentityMap):
|
||||
"""
|
||||
Takes a model on one mesh are translates it to another mesh.
|
||||
|
||||
@@ -251,8 +256,8 @@ class Mesh2Mesh(BaseModel):
|
||||
M2 = Mesh.TensorMesh([h1,h1])
|
||||
V = Utils.ModelBuilder.randomModel(M.vnC, seed=79, its=50)
|
||||
v = Utils.mkvc(V)
|
||||
modh = Model.Mesh2Mesh([M,M2])
|
||||
modH = Model.Mesh2Mesh([M2,M])
|
||||
modh = Maps.Mesh2Mesh([M,M2])
|
||||
modH = Maps.Mesh2Mesh([M2,M])
|
||||
H = modH.transform(v)
|
||||
h = modh.transform(H)
|
||||
ax = plt.subplot(131)
|
||||
@@ -289,7 +294,7 @@ class Mesh2Mesh(BaseModel):
|
||||
return self.P
|
||||
|
||||
|
||||
class ActiveModel(BaseModel):
|
||||
class ActiveCells(IdentityMap):
|
||||
"""
|
||||
Active model parameters.
|
||||
|
||||
@@ -329,15 +334,15 @@ class ActiveModel(BaseModel):
|
||||
def transformDeriv(self, m):
|
||||
return self.P
|
||||
|
||||
class ComboModel(BaseModel):
|
||||
class ComboMap(IdentityMap):
|
||||
"""Combination of various models."""
|
||||
|
||||
def __init__(self, mesh, models, **kwargs):
|
||||
BaseModel.__init__(self, mesh, **kwargs)
|
||||
IdentityMap.__init__(self, mesh, **kwargs)
|
||||
|
||||
self.models = []
|
||||
for m in models:
|
||||
if not isinstance(m, BaseModel):
|
||||
if not isinstance(m, IdentityMap):
|
||||
self.models += [m(mesh, **kwargs)]
|
||||
else:
|
||||
self.models += [m]
|
||||
@@ -366,7 +371,7 @@ class ComboModel(BaseModel):
|
||||
if __name__ == '__main__':
|
||||
from SimPEG import *
|
||||
mesh = Mesh.TensorMesh([10,8])
|
||||
combo = ComboModel(mesh, [LogModel, Vertical1DModel])
|
||||
combo = ComboMap(mesh, [ExpMap, Vertical1DMap])
|
||||
m = combo.example()
|
||||
print m.shape
|
||||
print combo.test(np.arange(8))
|
||||
|
||||
+9
-12
@@ -1,5 +1,5 @@
|
||||
import Utils, Survey, numpy as np, scipy.sparse as sp
|
||||
import Model
|
||||
import Maps
|
||||
|
||||
class BaseProblem(object):
|
||||
"""
|
||||
@@ -11,19 +11,16 @@ class BaseProblem(object):
|
||||
counter = None #: A SimPEG.Utils.Counter object
|
||||
|
||||
surveyPair = Survey.BaseSurvey #: A SimPEG.Survey Class
|
||||
modelPair = Model.BaseModel #: A SimPEG.Model Class
|
||||
mapPair = Maps.IdentityMap #: A SimPEG.Map Class
|
||||
|
||||
def __init__(self, model, **kwargs):
|
||||
mapping = None #: A SimPEG.Map instance.
|
||||
mesh = None #: A SimPEG.Mesh instance.
|
||||
|
||||
def __init__(self, mesh, mapping=None, **kwargs):
|
||||
Utils.setKwargs(self, **kwargs)
|
||||
assert (isinstance(model, self.modelPair) or
|
||||
isinstance(model, Model.ComboModel) and isinstance(model.models[0], self.modelPair)
|
||||
), "Model object must be an instance of a %s class."%(self.modelPair.__name__)
|
||||
self.model = model
|
||||
|
||||
@property
|
||||
def mesh(self):
|
||||
"""SimPEG mesh that is associated with the model provided."""
|
||||
return self.model.mesh
|
||||
self.mesh = mesh
|
||||
self.mapping = mapping or Maps.IdentityMap(mesh)
|
||||
self.mapping._assertMatchesPair(mapPair)
|
||||
|
||||
@property
|
||||
def survey(self):
|
||||
|
||||
+14
-12
@@ -1,4 +1,4 @@
|
||||
import Utils, Model, Parameters, numpy as np, scipy.sparse as sp
|
||||
import Utils, Maps, Parameters, numpy as np, scipy.sparse as sp
|
||||
|
||||
class BaseRegularization(object):
|
||||
"""
|
||||
@@ -12,16 +12,20 @@ class BaseRegularization(object):
|
||||
|
||||
__metaclass__ = Utils.SimPEGMetaClass
|
||||
|
||||
modelPair = Model.BaseModel #: Some regularizations only work on specific models
|
||||
|
||||
model = None #: A SimPEG.Model instance.
|
||||
|
||||
counter = None
|
||||
|
||||
def __init__(self, model, **kwargs):
|
||||
mapPair = Maps.IdentityMap #: A SimPEG.Map Class
|
||||
|
||||
mapping = None #: A SimPEG.Map instance.
|
||||
mesh = None #: A SimPEG.Mesh instance.
|
||||
|
||||
def __init__(self, mesh, mapping=None, **kwargs):
|
||||
Utils.setKwargs(self, **kwargs)
|
||||
assert isinstance(model, self.modelPair), "Incorrect model for this regularization"
|
||||
self.model = model
|
||||
self.mesh = mesh
|
||||
self.mapping = mapping or Maps.IdentityMap(mesh)
|
||||
self.mapping._assertMatchesPair(mapPair)
|
||||
|
||||
mref = Parameters.ParameterProperty('mref', default=None, doc='Reference model.')
|
||||
|
||||
@@ -47,8 +51,6 @@ class BaseRegularization(object):
|
||||
def prob(self): return self.parent.prob
|
||||
@property
|
||||
def survey(self): return self.parent.survey
|
||||
@property
|
||||
def mesh(self): return self.model.mesh
|
||||
|
||||
|
||||
@property
|
||||
@@ -59,7 +61,7 @@ class BaseRegularization(object):
|
||||
|
||||
@Utils.timeIt
|
||||
def modelObj(self, m):
|
||||
r = self.W * self.model.transform(m - self.mref)
|
||||
r = self.W * self.mapping.transform(m - self.mref)
|
||||
return 0.5*r.dot(r)
|
||||
|
||||
@Utils.timeIt
|
||||
@@ -79,8 +81,8 @@ class BaseRegularization(object):
|
||||
R(m) = \mathbf{W^\\top W (m-m_\\text{ref})}
|
||||
|
||||
"""
|
||||
mTd = self.model.transformDeriv(m - self.mref)
|
||||
return mTd.T * ( self.W.T * ( self.W * self.model.transform(m - self.mref) ) )
|
||||
mTd = self.mapping.transformDeriv(m - self.mref)
|
||||
return mTd.T * ( self.W.T * ( self.W * self.mapping.transform(m - self.mref) ) )
|
||||
|
||||
@Utils.timeIt
|
||||
def modelObj2Deriv(self, m, v=None):
|
||||
@@ -104,7 +106,7 @@ class BaseRegularization(object):
|
||||
R(m) = \mathbf{W^\\top W}
|
||||
|
||||
"""
|
||||
mTd = self.model.transformDeriv(m - self.mref)
|
||||
mTd = self.mapping.transformDeriv(m - self.mref)
|
||||
if v is None:
|
||||
return mTd.T * self.W.T * self.W * mTd
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ from TestUtils import checkDerivative
|
||||
from scipy.sparse.linalg import dsolve
|
||||
|
||||
|
||||
class ModelTests(unittest.TestCase):
|
||||
class MapTests(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
||||
@@ -15,22 +15,22 @@ class ModelTests(unittest.TestCase):
|
||||
self.mesh22 = Mesh.TensorMesh([b, a], x0=np.array([3, 5]))
|
||||
|
||||
def test_modelTransforms(self):
|
||||
for M in dir(Model):
|
||||
for M in dir(Maps):
|
||||
try:
|
||||
model = getattr(Model, M)(self.mesh2)
|
||||
assert isinstance(model, Model.BaseModel)
|
||||
model = getattr(Maps, M)(self.mesh2)
|
||||
assert isinstance(model, Maps.BaseModel)
|
||||
except Exception, e:
|
||||
continue
|
||||
self.assertTrue(model.test())
|
||||
|
||||
def test_Mesh2MeshModel(self):
|
||||
model = Model.Mesh2Mesh([self.mesh22, self.mesh2])
|
||||
def test_Mesh2MeshMap(self):
|
||||
model = Maps.Mesh2Mesh([self.mesh22, self.mesh2])
|
||||
self.assertTrue(model.test())
|
||||
|
||||
def test_comboModels(self):
|
||||
combos = [(Model.LogModel, Model.Vertical1DModel)]
|
||||
def test_comboMaps(self):
|
||||
combos = [(Maps.ExpMap, Maps.Vertical1DMap)]
|
||||
for combo in combos:
|
||||
model = Model.ComboModel(self.mesh2, combo)
|
||||
model = Maps.ComboMap(self.mesh2, combo)
|
||||
self.assertTrue(model.test())
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ import scipy.sparse as sp
|
||||
import Utils
|
||||
from Solver import Solver
|
||||
import Mesh
|
||||
import Model
|
||||
import Maps
|
||||
import Problem
|
||||
import Survey
|
||||
import Regularization
|
||||
|
||||
Reference in New Issue
Block a user