mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-01 10:19:17 +08:00
modelObj and dataObj --> eval
This commit is contained in:
+12
-12
@@ -22,8 +22,8 @@ class BaseDataMisfit(object):
|
||||
Utils.setKwargs(self,**kwargs)
|
||||
|
||||
@Utils.timeIt
|
||||
def dataObj(self, m, u=None):
|
||||
"""dataObj(m, u=None)
|
||||
def eval(self, m, u=None):
|
||||
"""eval(m, u=None)
|
||||
|
||||
:param Problem,Survey forward: forward simulation
|
||||
:param numpy.array m: geophysical model
|
||||
@@ -35,8 +35,8 @@ class BaseDataMisfit(object):
|
||||
raise NotImplementedError('This method should be overwritten.')
|
||||
|
||||
@Utils.timeIt
|
||||
def dataObjDeriv(self, m, u=None):
|
||||
"""dataObjDeriv(m, u=None)
|
||||
def evalDeriv(self, m, u=None):
|
||||
"""evalDeriv(m, u=None)
|
||||
|
||||
:param Problem,Survey forward: forward simulation
|
||||
:param numpy.array m: geophysical model
|
||||
@@ -49,8 +49,8 @@ class BaseDataMisfit(object):
|
||||
|
||||
|
||||
@Utils.timeIt
|
||||
def dataObj2Deriv(self, m, v, u=None):
|
||||
"""dataObj2Deriv(m, v, u=None)
|
||||
def eval2Deriv(self, m, v, u=None):
|
||||
"""eval2Deriv(m, v, u=None)
|
||||
|
||||
:param Problem,Survey forward: forward simulation
|
||||
:param numpy.array m: geophysical model
|
||||
@@ -116,24 +116,24 @@ class l2_DataMisfit(BaseDataMisfit):
|
||||
self._Wd = value
|
||||
|
||||
@Utils.timeIt
|
||||
def dataObj(self, m, u=None):
|
||||
"dataObj2Deriv(m, u=None)"
|
||||
def eval(self, m, u=None):
|
||||
"eval(m, u=None)"
|
||||
prob = self.prob
|
||||
survey = self.survey
|
||||
R = self.Wd * survey.residual(m, u=u)
|
||||
return 0.5*np.vdot(R, R)
|
||||
|
||||
@Utils.timeIt
|
||||
def dataObjDeriv(self, m, u=None):
|
||||
"dataObj2Deriv(m, u=None)"
|
||||
def evalDeriv(self, m, u=None):
|
||||
"evalDeriv(m, u=None)"
|
||||
prob = self.prob
|
||||
survey = self.survey
|
||||
if u is None: u = prob.fields(m)
|
||||
return prob.Jtvec(m, self.Wd * (self.Wd * survey.residual(m, u=u)), u=u)
|
||||
|
||||
@Utils.timeIt
|
||||
def dataObj2Deriv(self, m, v, u=None):
|
||||
"dataObj2Deriv(m, v, u=None)"
|
||||
def eval2Deriv(self, m, v, u=None):
|
||||
"eval2Deriv(m, v, u=None)"
|
||||
prob = self.prob
|
||||
if u is None: u = prob.fields(m)
|
||||
return prob.Jtvec_approx(m, self.Wd * (self.Wd * prob.Jvec_approx(m, v, u=u)), u=u)
|
||||
|
||||
@@ -126,8 +126,8 @@ class BetaEstimate_ByEig(InversionDirective):
|
||||
u = self.invProb.u_current or self.prob.fields(m)
|
||||
|
||||
x0 = np.random.rand(*m.shape)
|
||||
t = x0.dot(self.dmisfit.dataObj2Deriv(m,x0,u=u))
|
||||
b = x0.dot(self.reg.modelObj2Deriv(m, v=x0))
|
||||
t = x0.dot(self.dmisfit.eval2Deriv(m,x0,u=u))
|
||||
b = x0.dot(self.reg.eval2Deriv(m, v=x0))
|
||||
self.beta0 = self.beta0_ratio*(t/b)
|
||||
|
||||
self.invProb.beta = self.beta0
|
||||
|
||||
@@ -50,8 +50,8 @@ class BaseInvProblem(object):
|
||||
|
||||
self.m_current = m0
|
||||
|
||||
print 'SimPEG.InvProblem is setting bfgsH0 to the inverse of the modelObj2Deriv. \n ***Done using direct methods***'
|
||||
self.opt.bfgsH0 = Solver(self.reg.modelObj2Deriv(self.m_current))
|
||||
print 'SimPEG.InvProblem is setting bfgsH0 to the inverse of the eval2Deriv. \n ***Done using direct methods***'
|
||||
self.opt.bfgsH0 = Solver(self.reg.eval2Deriv(self.m_current))
|
||||
|
||||
@Utils.timeIt
|
||||
def evalFunction(self, m, return_g=True, return_H=True):
|
||||
@@ -66,8 +66,8 @@ class BaseInvProblem(object):
|
||||
u = self.prob.fields(m)
|
||||
self.u_current = u
|
||||
|
||||
phi_d = self.dmisfit.dataObj(m, u=u)
|
||||
phi_m = self.reg.modelObj(m)
|
||||
phi_d = self.dmisfit.eval(m, u=u)
|
||||
phi_m = self.reg.eval(m)
|
||||
|
||||
self.dpred = self.survey.dpred(m, u=u) # This is a cheap matrix vector calculation.
|
||||
|
||||
@@ -78,16 +78,16 @@ class BaseInvProblem(object):
|
||||
|
||||
out = (f,)
|
||||
if return_g:
|
||||
phi_dDeriv = self.dmisfit.dataObjDeriv(m, u=u)
|
||||
phi_mDeriv = self.reg.modelObjDeriv(m)
|
||||
phi_dDeriv = self.dmisfit.evalDeriv(m, u=u)
|
||||
phi_mDeriv = self.reg.evalDeriv(m)
|
||||
|
||||
g = phi_dDeriv + self.beta * phi_mDeriv
|
||||
out += (g,)
|
||||
|
||||
if return_H:
|
||||
def H_fun(v):
|
||||
phi_d2Deriv = self.dmisfit.dataObj2Deriv(m, v, u=u)
|
||||
phi_m2Deriv = self.reg.modelObj2Deriv(m, v=v)
|
||||
phi_d2Deriv = self.dmisfit.eval2Deriv(m, v, u=u)
|
||||
phi_m2Deriv = self.reg.eval2Deriv(m, v=v)
|
||||
|
||||
return phi_d2Deriv + self.beta * phi_m2Deriv
|
||||
|
||||
|
||||
@@ -12,8 +12,6 @@ class BaseRegularization(object):
|
||||
|
||||
__metaclass__ = Utils.SimPEGMetaClass
|
||||
|
||||
|
||||
|
||||
counter = None
|
||||
|
||||
mapPair = Maps.IdentityMap #: A SimPEG.Map Class
|
||||
@@ -60,12 +58,12 @@ class BaseRegularization(object):
|
||||
|
||||
|
||||
@Utils.timeIt
|
||||
def modelObj(self, m):
|
||||
def eval(self, m):
|
||||
r = self.W * ( self.mapping * (m - self.mref) )
|
||||
return 0.5*r.dot(r)
|
||||
|
||||
@Utils.timeIt
|
||||
def modelObjDeriv(self, m):
|
||||
def evalDeriv(self, m):
|
||||
"""
|
||||
|
||||
The regularization is:
|
||||
@@ -86,7 +84,7 @@ class BaseRegularization(object):
|
||||
return mD.T * ( self.W.T * r )
|
||||
|
||||
@Utils.timeIt
|
||||
def modelObj2Deriv(self, m, v=None):
|
||||
def eval2Deriv(self, m, v=None):
|
||||
"""
|
||||
|
||||
:param numpy.array m: geophysical model
|
||||
|
||||
@@ -23,7 +23,7 @@ class RegularizationTests(unittest.TestCase):
|
||||
reg = r(self.mesh2, mapping=mapping)
|
||||
m = np.random.rand(mapping.nP)
|
||||
reg.mref = m[:]*0
|
||||
passed = checkDerivative(lambda m : [reg.modelObj(m), reg.modelObjDeriv(m)], m, plotIt=False)
|
||||
passed = checkDerivative(lambda m : [reg.eval(m), reg.evalDeriv(m)], m, plotIt=False)
|
||||
self.assertTrue(passed)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user