diff --git a/SimPEG/Maps.py b/SimPEG/Maps.py index 00f8f302..dde3e752 100644 --- a/SimPEG/Maps.py +++ b/SimPEG/Maps.py @@ -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)) diff --git a/SimPEG/Problem.py b/SimPEG/Problem.py index 477ba604..7e6ba0d7 100644 --- a/SimPEG/Problem.py +++ b/SimPEG/Problem.py @@ -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): diff --git a/SimPEG/Regularization.py b/SimPEG/Regularization.py index 8f7b9ede..cc78df36 100644 --- a/SimPEG/Regularization.py +++ b/SimPEG/Regularization.py @@ -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 diff --git a/SimPEG/Tests/test_model.py b/SimPEG/Tests/test_maps.py similarity index 61% rename from SimPEG/Tests/test_model.py rename to SimPEG/Tests/test_maps.py index cd4a0e07..abd5701f 100644 --- a/SimPEG/Tests/test_model.py +++ b/SimPEG/Tests/test_maps.py @@ -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()) diff --git a/SimPEG/__init__.py b/SimPEG/__init__.py index 874f4ffe..49061e09 100644 --- a/SimPEG/__init__.py +++ b/SimPEG/__init__.py @@ -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