testMaps Working!

This commit is contained in:
rowanc1
2014-04-15 09:43:10 -07:00
parent 0ac4b260f4
commit 25421f739f
5 changed files with 55 additions and 51 deletions
+22 -17
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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