From fcaff5ed642883d56ec0222a49b0c652ca72e5a5 Mon Sep 17 00:00:00 2001 From: rowanc1 Date: Fri, 7 Mar 2014 13:55:08 -0800 Subject: [PATCH] Changed Data to Survey as per Issue #61 --- SimPEG/Inversion.py | 65 -------------------- SimPEG/ObjFunction.py | 42 +++++++------ SimPEG/Parameters.py | 6 +- SimPEG/Problem.py | 55 +++++++++-------- SimPEG/Regularization.py | 2 +- SimPEG/{Data.py => Survey.py} | 108 ++++++++++++++++++++++++++-------- SimPEG/Utils/__init__.py | 4 +- SimPEG/__init__.py | 2 +- Tutorials/Linear.py | 11 ++-- docs/simpeg-framework.png | Bin 16020 -> 20636 bytes 10 files changed, 149 insertions(+), 146 deletions(-) rename SimPEG/{Data.py => Survey.py} (55%) diff --git a/SimPEG/Inversion.py b/SimPEG/Inversion.py index 297270ef..8dbee17d 100644 --- a/SimPEG/Inversion.py +++ b/SimPEG/Inversion.py @@ -32,24 +32,6 @@ class BaseInversion(object): self.opt.printers.insert(2,IterationPrinters.phi_d) self.opt.printers.insert(3,IterationPrinters.phi_m) - #TODO: Move this to the data class? - @property - def phi_d_target(self): - """ - target for phi_d - - By default this is the number of data. - - Note that we do not set the target if it is None, but we return the default value. - """ - if getattr(self, '_phi_d_target', None) is None: - return self.data.dobs.size # - return self._phi_d_target - - @phi_d_target.setter - def phi_d_target(self, value): - self._phi_d_target = value - @Utils.timeIt def run(self, m0): """run(m0) @@ -70,50 +52,3 @@ class BaseInversion(object): **finish** is called at the end of the optimization. """ pass - - - def save(self, group): - group.attrs['phi_d'] = self.phi_d - group.attrs['phi_m'] = self.phi_m - group.setArray('m', self.m) - group.setArray('dpred', self.dpred) - - - -# class Inversion(Cooling, Remember, BaseInversion): - -# maxIter = 10 -# name = "SimPEG Inversion" - -# def __init__(self, prob, reg, opt, data, **kwargs): -# BaseInversion.__init__(self, prob, reg, opt, data, **kwargs) - -# self.stoppers.append(StoppingCriteria.phi_d_target_Inversion) - -# if StoppingCriteria.phi_d_target_Minimize not in self.opt.stoppers: -# self.opt.stoppers.append(StoppingCriteria.phi_d_target_Minimize) - -# class TimeSteppingInversion(Remember, BaseInversion): -# """ -# A slightly different view on regularization parameters, -# let Beta be viewed as 1/dt, and timestep by updating the -# reference model every optimization iteration. -# """ -# maxIter = 1 -# name = "Time-Stepping SimPEG Inversion" - -# def __init__(self, prob, reg, opt, data, **kwargs): -# BaseInversion.__init__(self, prob, reg, opt, data, **kwargs) - -# self.stoppers.append(StoppingCriteria.phi_d_target_Inversion) - -# if StoppingCriteria.phi_d_target_Minimize not in self.opt.stoppers: -# self.opt.stoppers.append(StoppingCriteria.phi_d_target_Minimize) - -# def _startup_TimeSteppingInversion(self, m0): - -# def _doEndIteration_updateMref(self, xt): -# if self.debug: 'Updating the reference model.' -# self.parent.reg.mref = self.xc - -# self.opt.hook(_doEndIteration_updateMref, overwrite=True) diff --git a/SimPEG/ObjFunction.py b/SimPEG/ObjFunction.py index 2b1912b8..18d9cfc3 100644 --- a/SimPEG/ObjFunction.py +++ b/SimPEG/ObjFunction.py @@ -1,7 +1,7 @@ -import Utils, Parameters, numpy as np, scipy.sparse as sp +import Utils, Parameters, Survey, Problem, numpy as np, scipy.sparse as sp class BaseObjFunction(object): - """BaseObjFunction(data, reg, **kwargs)""" + """BaseObjFunction(forward, reg, **kwargs)""" __metaclass__ = Utils.SimPEGMetaClass @@ -10,6 +10,9 @@ class BaseObjFunction(object): debug = False #: Print debugging information counter = None #: Set this to a SimPEG.Utils.Counter() if you want to count things + surveyPair = Survey.BaseSurvey + problemPair = Problem.BaseProblem + name = 'Base Objective Function' #: Name of the objective function u_current = None #: The most current evaluated field @@ -31,18 +34,19 @@ class BaseObjFunction(object): def objFunc(self): return self @property def opt(self): return getattr(self.parent,'opt',None) - @property - def prob(self): return self.data.prob - @property - def mesh(self): return self.data.prob.mesh - @property - def model(self): return self.data.prob.model - def __init__(self, data, reg, **kwargs): + def __init__(self, forward, reg, **kwargs): Utils.setKwargs(self, **kwargs) - self.data = data + assert forward.ispaired, 'The forward problem and survey must be paired.' + if isinstance(forward, self.surveyPair): + self.survey = forward + self.prob = forward.prob + elif isinstance(forward, self.problemPair): + self.prob = forward + self.survey = forward.survey + self.reg = reg self.reg.parent = self @@ -73,13 +77,13 @@ class BaseObjFunction(object): self.u_current = None self.m_current = m - u = self.data.prob.fields(m) + u = self.prob.fields(m) self.u_current = u phi_d = self.dataObj(m, u=u) phi_m = self.reg.modelObj(m) - self.dpred = self.data.dpred(m, u=u) # This is a cheap matrix vector calculation. + self.dpred = self.survey.dpred(m, u=u) # This is a cheap matrix vector calculation. self.phi_d, self.phi_d_last = phi_d, self.phi_d self.phi_m, self.phi_m_last = phi_m, self.phi_m @@ -124,7 +128,7 @@ class BaseObjFunction(object): u is the field of interest; d_obs is the observed data; and W is the weighting matrix. """ # TODO: ensure that this is a data is vector and Wd is a matrix. - R = self.data.residualWeighted(m, u=u) + R = self.survey.residualWeighted(m, u=u) return 0.5*np.vdot(R, R) @Utils.timeIt @@ -160,11 +164,11 @@ class BaseObjFunction(object): \\frac{\partial \mu_\\text{data}}{\partial \mathbf{m}} = \mathbf{J}^\\top \mathbf{W \circ R} """ - if u is None: u = self.data.prob.fields(m) + if u is None: u = self.prob.fields(m) - R = self.data.residualWeighted(m, u=u) + R = self.survey.residualWeighted(m, u=u) - dmisfit = self.data.prob.Jtvec(m, self.data.Wd * R, u=u) + dmisfit = self.prob.Jtvec(m, self.survey.Wd * R, u=u) return dmisfit @@ -204,12 +208,12 @@ class BaseObjFunction(object): \\frac{\partial^2 \mu_\\text{data}}{\partial^2 \mathbf{m}} = \mathbf{J}^\\top \mathbf{W \circ W J} """ - if u is None: u = self.data.prob.fields(m) + if u is None: u = self.prob.fields(m) - R = self.data.residualWeighted(m, u=u) + R = self.survey.residualWeighted(m, u=u) # TODO: abstract to different norms a little cleaner. # \/ it goes here. in l2 it is the identity. - dmisfit = self.data.prob.Jtvec_approx(m, self.data.Wd * self.data.Wd * self.data.prob.Jvec_approx(m, v, u=u), u=u) + dmisfit = self.prob.Jtvec_approx(m, self.survey.Wd * self.survey.Wd * self.prob.Jvec_approx(m, v, u=u), u=u) return dmisfit diff --git a/SimPEG/Parameters.py b/SimPEG/Parameters.py index 5a6760e6..417051df 100644 --- a/SimPEG/Parameters.py +++ b/SimPEG/Parameters.py @@ -41,7 +41,7 @@ class Parameter(object): @property def reg(self): return self.parent.reg @property - def data(self): return self.parent.data + def survey(self): return self.parent.survey @property def prob(self): return self.parent.prob @property @@ -131,13 +131,13 @@ class BetaEstimate(Parameter): :return: beta0 """ objFunc = self.parent - data = objFunc.data + survey = objFunc.survey m = objFunc.m_current u = objFunc.u_current if u is None: - u = data.prob.fields(m) + u = survey.prob.fields(m) x0 = np.random.rand(*m.shape) t = x0.dot(objFunc.dataObj2Deriv(m,x0,u=u)) diff --git a/SimPEG/Problem.py b/SimPEG/Problem.py index a509f6cd..c360f02c 100644 --- a/SimPEG/Problem.py +++ b/SimPEG/Problem.py @@ -1,4 +1,4 @@ -import Utils, Data, numpy as np, scipy.sparse as sp +import Utils, Survey, numpy as np, scipy.sparse as sp import Model class BaseProblem(object): @@ -38,40 +38,42 @@ class BaseProblem(object): counter = None #: A SimPEG.Utils.Counter object - dataPair = Data.BaseData + surveyPair = Survey.BaseSurvey modelPair = Model.BaseModel - def __init__(self, mesh, model, **kwargs): + def __init__(self, model, **kwargs): Utils.setKwargs(self, **kwargs) - self.mesh = mesh 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 data(self): + def mesh(self): return self.model.mesh + + @property + def survey(self): """ - The data object for this problem. + The survey object for this problem. """ - return getattr(self, '_data', None) + return getattr(self, '_survey', None) def pair(self, d): - """Bind a data to this problem instance using pointers.""" - assert isinstance(d, self.dataPair), "Data object must be an instance of a %s class."%(self.dataPair.__name__) + """Bind a survey to this problem instance using pointers.""" + assert isinstance(d, self.surveyPair), "Data object must be an instance of a %s class."%(self.surveyPair.__name__) if d.ispaired: - raise Exception("The data object is already paired to a problem. Use data.unpair()") - self._data = d + raise Exception("The survey object is already paired to a problem. Use survey.unpair()") + self._survey = d d._prob = self def unpair(self): - """Unbind a data from this problem instance.""" + """Unbind a survey from this problem instance.""" if not self.ispaired: return - self.data._prob = None - self._data = None + self.survey._prob = None + self._survey = None @property - def ispaired(self): return self.data is not None + def ispaired(self): return self.survey is not None @Utils.timeIt def Jvec(self, m, v, u=None): @@ -156,25 +158,26 @@ class BaseProblem(object): """ pass - def createSyntheticData(self, m, std=0.05, u=None, **geometry_kwargs): + #TODO: Rename and refactor to createSyntheticData + def createSyntheticSurvey(self, m, std=0.05, u=None, **geometry_kwargs): """ - Create synthetic data given a model, and a standard deviation. + Create synthetic survey given a model, and a standard deviation. :param numpy.array m: geophysical model :param numpy.array std: standard deviation - :rtype: numpy.array, numpy.array - :return: dobs, Wd + :rtype: SurveyObject + :return: survey Returns the observed data with random Gaussian noise and Wd which is the same size as data, and can be used to weight the inversion. """ - data = self.dataPair(mtrue=m, **geometry_kwargs) - data.pair(self) - data.dtrue = data.dpred(m, u=u) - noise = std*abs(data.dtrue)*np.random.randn(*data.dtrue.shape) - data.dobs = data.dtrue+noise - data.std = data.dobs*0 + std - return data + survey = self.surveyPair(mtrue=m, **geometry_kwargs) + survey.pair(self) + survey.dtrue = survey.dpred(m, u=u) + noise = std*abs(survey.dtrue)*np.random.randn(*survey.dtrue.shape) + survey.dobs = survey.dtrue+noise + survey.std = survey.dobs*0 + std + return survey diff --git a/SimPEG/Regularization.py b/SimPEG/Regularization.py index 8dc32b79..8f7b9ede 100644 --- a/SimPEG/Regularization.py +++ b/SimPEG/Regularization.py @@ -46,7 +46,7 @@ class BaseRegularization(object): @property def prob(self): return self.parent.prob @property - def data(self): return self.parent.data + def survey(self): return self.parent.survey @property def mesh(self): return self.model.mesh diff --git a/SimPEG/Data.py b/SimPEG/Survey.py similarity index 55% rename from SimPEG/Data.py rename to SimPEG/Survey.py index 12696406..c640d865 100644 --- a/SimPEG/Data.py +++ b/SimPEG/Survey.py @@ -1,8 +1,8 @@ import Utils, numpy as np -class BaseData(object): - """Data holds the observed data, and the standard deviations.""" +class BaseSurvey(object): + """Survey holds the observed data, and the standard deviations.""" __metaclass__ = Utils.SimPEGMetaClass @@ -19,25 +19,25 @@ class BaseData(object): @property def prob(self): """ - The geophysical problem that explains this data, use:: + The geophysical problem that explains this survey, use:: - data.pair(prob) + survey.pair(prob) """ return getattr(self, '_prob', None) def pair(self, p): - """Bind a problem to this data instance using pointers""" - assert hasattr(p, 'dataPair'), "Problem must have an attribute 'dataPair'." - assert isinstance(self, p.dataPair), "Problem requires data object must be an instance of a %s class."%(p.dataPair.__name__) + """Bind a problem to this survey instance using pointers""" + assert hasattr(p, 'surveyPair'), "Problem must have an attribute 'surveyPair'." + assert isinstance(self, p.surveyPair), "Problem requires survey object must be an instance of a %s class."%(p.surveyPair.__name__) if p.ispaired: - raise Exception("The problem object is already paired to a data. Use prob.unpair()") + raise Exception("The problem object is already paired to a survey. Use prob.unpair()") self._prob = p - p._data = self + p._survey = self def unpair(self): - """Unbind a problem from this data instance""" + """Unbind a problem from this survey instance""" if not self.ispaired: return - self.prob._data = None + self.prob._survey = None self._prob = None @property @@ -108,7 +108,7 @@ class BaseData(object): """ Data weighting matrix. This is a covariance matrix used in:: - def data.residualWeighted(m,u=None): + def residualWeighted(m,u=None): return self.Wd*self.residual(m, u=u) By default, this is based on the norm of the data plus a noise floor. @@ -139,20 +139,82 @@ class BaseData(object): """ return Utils.mkvc(self.Wd*self.residual(m, u=u)) - @property - def RHS(self): - """ - Source matrix. - """ - return getattr(self, '_RHS', None) - @RHS.setter - def RHS(self, value): - self._RHS = value - @property def isSynthetic(self): "Check if the data is synthetic." - return (self.mtrue is not None) + return self.mtrue is not None + + + #TODO: Move this to the data class? + # @property + # def phi_d_target(self): + # """ + # target for phi_d + + # By default this is the number of data. + + # Note that we do not set the target if it is None, but we return the default value. + # """ + # if getattr(self, '_phi_d_target', None) is None: + # return self.data.dobs.size # + # return self._phi_d_target + + # @phi_d_target.setter + # def phi_d_target(self, value): + # self._phi_d_target = value + + +class BaseRxList(object): + """SimPEG Receiver List Object""" + + locs = None #: Locations (nRx x 3) + + knownRxTypes = None #: Set this to a list of strings to ensure that txType is known + + def __init__(self, locs, rxType, **kwargs): + self.locs = locs + self.rxType = rxType + Utils.setKwargs(self, **kwargs) + + @property + def rxType(self): + """Receiver Type""" + return getattr(self, '_rxType', None) + @rxType.setter + def rxType(self, value): + known = self.knownRxTypes + if known is not None: + assert value in known, "rxType must be in ['%s']" % ("', '".join(known)) + self._rxType = value + +class BaseTx(object): + """SimPEG Transmitter Object""" + + loc = None #: Location [x,y,z] + + rxList = None #: SimPEG Receiver List + rxListPair = BaseRxList + + knownTxTypes = None #: Set this to a list of strings to ensure that txType is known + + def __init__(self, loc, txType, rxList, **kwargs): + assert isinstance(rxList, self.rxListPair), 'rxList must be a %s'%self.rxListPair.__name__ + + self.loc = loc + self.txType = txType + self.rxList = rxList + Utils.setKwargs(self, **kwargs) + + @property + def txType(self): + """Transmitter Type""" + return getattr(self, '_txType', None) + @txType.setter + def txType(self, value): + known = self.knownTxTypes + if known is not None: + assert value in known, "txType must be in ['%s']" % ("', '".join(known)) + self._txType = value if __name__ == '__main__': d = BaseData() diff --git a/SimPEG/Utils/__init__.py b/SimPEG/Utils/__init__.py index a44cfd74..209d1cff 100644 --- a/SimPEG/Utils/__init__.py +++ b/SimPEG/Utils/__init__.py @@ -159,11 +159,11 @@ def requires(var): .. note:: - To use data.%s(), SimPEG requires that a problem be bound to the data. + To use survey.%s(), SimPEG requires that a problem be bound to the survey. If a problem has not been bound, an Exception will be raised. To bind a problem to the Data object:: - data.pair(myProblem) + survey.pair(myProblem) """ % f.__name__ else: diff --git a/SimPEG/__init__.py b/SimPEG/__init__.py index 17f64d54..874f4ffe 100644 --- a/SimPEG/__init__.py +++ b/SimPEG/__init__.py @@ -5,7 +5,7 @@ from Solver import Solver import Mesh import Model import Problem -import Data +import Survey import Regularization import ObjFunction import Optimization diff --git a/Tutorials/Linear.py b/Tutorials/Linear.py index 7d3aa805..90714abc 100644 --- a/Tutorials/Linear.py +++ b/Tutorials/Linear.py @@ -5,8 +5,8 @@ import matplotlib.pyplot as plt class LinearProblem(Problem.BaseProblem): """docstring for LinearProblem""" - def __init__(self, mesh, model, G, **kwargs): - Problem.BaseProblem.__init__(self, mesh, model, **kwargs) + def __init__(self, model, G, **kwargs): + Problem.BaseProblem.__init__(self, model, **kwargs) self.G = G def fields(self, m, u=None): @@ -20,8 +20,7 @@ class LinearProblem(Problem.BaseProblem): def example(N): - h = np.ones(N)/N - M = Mesh.TensorMesh([h]) + M = Mesh.TensorMesh([N]) nk = 20 jk = np.linspace(1.,20.,nk) @@ -43,8 +42,8 @@ def example(N): model = Model.BaseModel(M) - prob = LinearProblem(M, model, G) - data = prob.createSyntheticData(mtrue, std=0.01) + prob = LinearProblem(model, G) + data = prob.createSyntheticSurvey(mtrue, std=0.01) return prob, data, model diff --git a/docs/simpeg-framework.png b/docs/simpeg-framework.png index ad8e5c1c0d848cd29af422bc8e316944b0264359..f90f8260a2d465fd36a9a1a79eb8498bc911b40e 100644 GIT binary patch literal 20636 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 MoV}bVCqu6P3zX2`+yDRo literal 16020 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