diff --git a/SimPEG/Directives.py b/SimPEG/Directives.py index 68998a3f..226fb860 100644 --- a/SimPEG/Directives.py +++ b/SimPEG/Directives.py @@ -123,7 +123,7 @@ class BetaEstimate_ByEig(InversionDirective): if self.debug: print 'Calculating the beta0 parameter.' m = self.invProb.curModel - u = self.prob.fields(m) + u = self.invProb.getFields(m, store=True, deleteWarmstart=False) x0 = np.random.rand(*m.shape) t = x0.dot(self.dmisfit.eval2Deriv(m,x0,u=u)) diff --git a/SimPEG/InvProblem.py b/SimPEG/InvProblem.py index d75362c2..4d0597a9 100644 --- a/SimPEG/InvProblem.py +++ b/SimPEG/InvProblem.py @@ -66,16 +66,48 @@ class BaseInvProblem(object): 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.curModel)) + + @property + def warmstart(self): + return getattr(self, '_warmstart', []) + @warmstart.setter + def warmstart(self, value): + assert type(value) is list, 'warmstart must be a list.' + for v in value: + assert type(v) is tuple, 'warmstart must be a list of tuples (m, u).' + assert len(v) == 2, 'warmstart must be a list of tuples (m, u). YOURS IS NOT LENGTH 2!' + assert isinstance(v[0], np.ndarray), 'first warmstart value must be a model.' + self._warmstart = value + + def getFields(self, m, store=False, deleteWarmstart=True): + u = None + + for mtest, u_ofmtest in self.warmstart: + if m is mtest: + u = u_ofmtest + if self.debug: print 'InvProb is Warm Starting!' + break + + if u is None: + u = self.prob.fields(m) + + if deleteWarmstart: + self.warmstart = [] + if store: + self.warmstart += [(m,u)] + + return u + @Utils.timeIt def evalFunction(self, m, return_g=True, return_H=True): """evalFunction(m, return_g=True, return_H=True) """ - #TODO: check for warmstart self.curModel = m gc.collect() - u = self.prob.fields(m) + # Store fields if doing a line-search + u = self.getFields(m, store=(return_g==False and return_H==False)) phi_d = self.dmisfit.eval(m, u=u) phi_m = self.reg.eval(m)