From bc71b184aafa5c8a22bd8d59b05bee9a3cbb10d1 Mon Sep 17 00:00:00 2001 From: Rowan Cockett Date: Thu, 7 Nov 2013 16:27:12 -0800 Subject: [PATCH] Brought inversion into line with optimize changes. --- SimPEG/inverse/Inversion.py | 30 ++++++++++-------------------- SimPEG/inverse/Optimize.py | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/SimPEG/inverse/Inversion.py b/SimPEG/inverse/Inversion.py index 414ca1c6..32663213 100644 --- a/SimPEG/inverse/Inversion.py +++ b/SimPEG/inverse/Inversion.py @@ -1,6 +1,7 @@ import numpy as np import scipy.sparse as sp -from SimPEG.utils import sdiag, mkvc, setKwargs +import SimPEG +from SimPEG.utils import sdiag, mkvc, setKwargs, checkStoppers class Inversion(object): """docstring for Inversion""" @@ -15,21 +16,14 @@ class Inversion(object): self.opt = opt self.opt.parent = self - # Check if we have inserted printers into the optimization - haveInserted = False - for printer in self.opt.printers: - haveInserted = haveInserted or printer["title"] == 'phi_d' + self.stoppers = [SimPEG.inverse.StoppingCriteria.iteration, SimPEG.inverse.StoppingCriteria.phi_d_target_Inversion] - if not haveInserted: - self.opt.printers.insert(1,{"title": "beta", - "value": lambda M: M.parent._beta, - "width": 10, "format": "%1.2e"}) - self.opt.printers.insert(2,{"title": "phi_d", - "value": lambda M: M.parent.phi_d, - "width": 10, "format": "%1.2e"}) - self.opt.printers.insert(3,{"title": "phi_m", - "value": lambda M: M.parent.phi_m, - "width": 10, "format": "%1.2e"}) + # Check if we have inserted printers into the optimization + if not np.any([p is SimPEG.inverse.IterationPrinters.phi_d for p in self.opt.printers]): + self.opt.printers.insert(1,SimPEG.inverse.IterationPrinters.beta) + self.opt.printers.insert(2,SimPEG.inverse.IterationPrinters.phi_d) + self.opt.printers.insert(3,SimPEG.inverse.IterationPrinters.phi_m) + self.opt.stoppers.append(SimPEG.inverse.StoppingCriteria.phi_d_target_Minimize) @property def Wd(self): @@ -77,11 +71,7 @@ class Inversion(object): return self._beta / self.beta_coolingFactor def stoppingCriteria(self): - self._STOP = np.zeros(2,dtype=bool) - self._STOP[0] = self._iter >= self.maxIter - self._STOP[1] = self.phi_d <= self.phi_d_target - return np.any(self._STOP) - + return checkStoppers(self, self.stoppers) def evalFunction(self, m, return_g=True, return_H=True): diff --git a/SimPEG/inverse/Optimize.py b/SimPEG/inverse/Optimize.py index e5edcebb..4bc8bd0a 100644 --- a/SimPEG/inverse/Optimize.py +++ b/SimPEG/inverse/Optimize.py @@ -51,6 +51,15 @@ class StoppingCriteria(object): "left": lambda M: M._LS_xt.size, "right": lambda M: np.sum(M.bindingSet(M._LS_xt)), "stopType": "critical"} + phi_d_target_Minimize = { "str": "%d : phi_d = %1.4e <= phi_d_target = %1.4e ", + "left": lambda M: M.parent.phi_d, "right": lambda M: M.parent.phi_d_target, + "stopType": "critical"} + + phi_d_target_Inversion = { "str": "%d : phi_d = %1.4e <= phi_d_target = %1.4e ", + "left": lambda I: I.phi_d, "right": lambda I: I.phi_d_target, + "stopType": "critical"} + + class IterationPrinters(object): """docstring for IterationPrinters""" @@ -69,6 +78,11 @@ class IterationPrinters(object): bSet = {"title": "bSet", "value": lambda M: np.sum(M.bindingSet(M.xc)), "width": 8, "format": "%d"} comment = {"title": "Comment", "value": lambda M: M.projComment, "width": 7, "format": "%s"} + beta = {"title": "beta", "value": lambda M: M.parent._beta, "width": 10, "format": "%1.2e"} + phi_d = {"title": "phi_d", "value": lambda M: M.parent.phi_d, "width": 10, "format": "%1.2e"} + phi_m = {"title": "phi_m", "value": lambda M: M.parent.phi_m, "width": 10, "format": "%1.2e"} + + class Minimize(object): """ @@ -393,6 +407,7 @@ class Minimize(object): :rtype: numpy.ndarray,bool :return: (xt, breakCaught) """ + self.printDone(inLS=True) print 'The linesearch got broken. Boo.' return p, False