From 1b7ad56e94f9478d865e0a119d9e4ed5eadafa03 Mon Sep 17 00:00:00 2001 From: Rowan Cockett Date: Wed, 3 Jun 2015 15:46:38 -0700 Subject: [PATCH 1/3] updates to #104 --- SimPEG/PropMaps.py | 3 +++ SimPEG/Tests/test_PropMaps.py | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/SimPEG/PropMaps.py b/SimPEG/PropMaps.py index d7bd2ba2..bddd3df7 100644 --- a/SimPEG/PropMaps.py +++ b/SimPEG/PropMaps.py @@ -238,3 +238,6 @@ class PropMap(object): def __call__(self, vec): return self.PropModel(self, vec) + def __contains__(self, val): + activeMaps = [name for name in self._properties if getattr(self, '%sMap'%name) is not None] + return val in activeMaps diff --git a/SimPEG/Tests/test_PropMaps.py b/SimPEG/Tests/test_PropMaps.py index c2726d71..6861f09b 100644 --- a/SimPEG/Tests/test_PropMaps.py +++ b/SimPEG/Tests/test_PropMaps.py @@ -36,6 +36,10 @@ class TestPropMaps(unittest.TestCase): assert PM.muMap is None assert PM.muIndex is None + assert 'sigma' in PM + assert 'mu' not in PM + assert 'mui' not in PM + m = PM(np.r_[1.,2,3]) assert m.mu == mu_0 assert m.muModel is None @@ -67,6 +71,10 @@ class TestPropMaps(unittest.TestCase): assert pm.nP == 6 + assert 'sigma' in PM + assert 'mu' in PM + assert 'mui' not in PM + assert np.all(pm.sigmaModel == [1.,2,3]) assert np.all(pm.sigma == np.exp([1.,2,3])) assert np.all(pm.muModel == [4.,5,6]) @@ -83,6 +91,10 @@ class TestPropMaps(unittest.TestCase): assert pm.nP == 3 + assert 'sigma' in PM + assert 'mu' in PM + assert 'mui' not in PM + assert np.all(pm.sigmaModel == [1,2,3]) assert np.all(pm.sigma == np.exp([1,2,3])) assert np.all(pm.muModel == [1,2,3]) @@ -103,6 +115,11 @@ class TestPropMaps(unittest.TestCase): assert pm.sigmaDeriv is not None assert pm.rhoDeriv is not None + assert 'sigma' in PM + assert 'rho' not in PM + assert 'mu' not in PM + assert 'mui' not in PM + assert pm.mu == mu_0 assert pm.mui == 1.0/mu_0 assert pm.muMap is None @@ -121,6 +138,11 @@ class TestPropMaps(unittest.TestCase): assert pm.sigmaDeriv is not None assert pm.rhoDeriv is not None + assert 'sigma' not in PM + assert 'rho' in PM + assert 'mu' not in PM + assert 'mui' not in PM + self.assertRaises(AssertionError, MyReciprocalPropMap, [('rho', iMap), ('sigma', iMap)]) self.assertRaises(AssertionError, MyReciprocalPropMap, [('sigma', iMap), ('rho', iMap)]) From 838ee6e09b47f7b716a359bbf55cb2cff544b4bb Mon Sep 17 00:00:00 2001 From: Rowan Cockett Date: Wed, 3 Jun 2015 15:59:20 -0700 Subject: [PATCH 2/3] updates to adding projections to the models --- SimPEG/PropMaps.py | 18 ++++++++++++++++-- SimPEG/Tests/test_PropMaps.py | 14 ++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/SimPEG/PropMaps.py b/SimPEG/PropMaps.py index bddd3df7..c0913cae 100644 --- a/SimPEG/PropMaps.py +++ b/SimPEG/PropMaps.py @@ -1,4 +1,4 @@ -import Utils, Maps, numpy as np +import Utils, Maps, numpy as np, scipy.sparse as sp class Property(object): @@ -87,10 +87,23 @@ class Property(object): mapping = getattr(self, '%sMap'%prop.name) if mapping is None: return None - index = getattr(self.propMap, '_%sIndex'%prop.name, slice(None)) + index = getattr(self.propMap, '%sIndex'%prop.name) return self.vector[index] return property(fget=fget) + def _getModelProjProperty(self): + prop = self + def fget(self): + mapping = getattr(self, '%sMap'%prop.name) + if mapping is None: + return None + inds = getattr(self.propMap, '%sIndex'%prop.name) + if type(inds) is slice: + inds = range(*inds.indices(self.nP)) + nI, nP = len(inds),self.nP + return sp.csr_matrix((np.ones(nI), (range(nI), inds) ), shape=(nI, nP)) + return property(fget=fget) + def _getModelMapProperty(self): prop = self def fget(self): @@ -167,6 +180,7 @@ class _PropMapMetaClass(type): attrs[attr ] = prop._getProperty() attrs[attr + 'Map' ] = prop._getModelMapProperty() + attrs[attr + 'Proj' ] = prop._getModelProjProperty() attrs[attr + 'Model'] = prop._getModelProperty() attrs[attr + 'Deriv'] = prop._getModelDerivProperty() diff --git a/SimPEG/Tests/test_PropMaps.py b/SimPEG/Tests/test_PropMaps.py index 6861f09b..93ef4129 100644 --- a/SimPEG/Tests/test_PropMaps.py +++ b/SimPEG/Tests/test_PropMaps.py @@ -100,6 +100,20 @@ class TestPropMaps(unittest.TestCase): assert np.all(pm.muModel == [1,2,3]) assert np.all(pm.mu == [1,2,3]) + def test_Projections(self): + m = Mesh.TensorMesh((3,)) + iMap = Maps.IdentityMap(m) + PM = MyReciprocalPropMap([('sigma', iMap)]) + v = np.r_[1,2.,3] + pm = PM(v) + + assert pm.sigmaProj is not None + assert pm.rhoProj is None + assert pm.muProj is None + assert pm.muiProj is None + + assert np.all(pm.sigmaProj * v == pm.sigmaModel) + def test_Links(self): m = Mesh.TensorMesh((3,)) expMap = Maps.ExpMap(m) From 9ec2fa5e794a46b05849b69d9d869211e02b69fd Mon Sep 17 00:00:00 2001 From: Rowan Cockett Date: Wed, 3 Jun 2015 16:05:14 -0700 Subject: [PATCH 3/3] ask 'mu' in self.curModel ? --- SimPEG/PropMaps.py | 3 +++ SimPEG/Tests/test_PropMaps.py | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/SimPEG/PropMaps.py b/SimPEG/PropMaps.py index c0913cae..995216f7 100644 --- a/SimPEG/PropMaps.py +++ b/SimPEG/PropMaps.py @@ -132,6 +132,9 @@ class PropModel(object): self._nP = len(set(inds)) return self._nP + def __contains__(self, val): + return val in self.propMap + _PROPMAPCLASSREGISTRY = {} diff --git a/SimPEG/Tests/test_PropMaps.py b/SimPEG/Tests/test_PropMaps.py index 93ef4129..b4c0eb8d 100644 --- a/SimPEG/Tests/test_PropMaps.py +++ b/SimPEG/Tests/test_PropMaps.py @@ -41,6 +41,11 @@ class TestPropMaps(unittest.TestCase): assert 'mui' not in PM m = PM(np.r_[1.,2,3]) + + assert 'sigma' in m + assert 'mu' not in m + assert 'mui' not in m + assert m.mu == mu_0 assert m.muModel is None assert m.muMap is None @@ -75,6 +80,10 @@ class TestPropMaps(unittest.TestCase): assert 'mu' in PM assert 'mui' not in PM + assert 'sigma' in pm + assert 'mu' in pm + assert 'mui' not in pm + assert np.all(pm.sigmaModel == [1.,2,3]) assert np.all(pm.sigma == np.exp([1.,2,3])) assert np.all(pm.muModel == [4.,5,6]) @@ -95,6 +104,10 @@ class TestPropMaps(unittest.TestCase): assert 'mu' in PM assert 'mui' not in PM + assert 'sigma' in pm + assert 'mu' in pm + assert 'mui' not in pm + assert np.all(pm.sigmaModel == [1,2,3]) assert np.all(pm.sigma == np.exp([1,2,3])) assert np.all(pm.muModel == [1,2,3]) @@ -134,6 +147,12 @@ class TestPropMaps(unittest.TestCase): assert 'mu' not in PM assert 'mui' not in PM + + assert 'sigma' in pm + assert 'rho' not in pm + assert 'mu' not in pm + assert 'mui' not in pm + assert pm.mu == mu_0 assert pm.mui == 1.0/mu_0 assert pm.muMap is None @@ -157,6 +176,12 @@ class TestPropMaps(unittest.TestCase): assert 'mu' not in PM assert 'mui' not in PM + + assert 'sigma' not in pm + assert 'rho' in pm + assert 'mu' not in pm + assert 'mui' not in pm + self.assertRaises(AssertionError, MyReciprocalPropMap, [('rho', iMap), ('sigma', iMap)]) self.assertRaises(AssertionError, MyReciprocalPropMap, [('sigma', iMap), ('rho', iMap)])