Files
simpeg/SimPEG/Inversion.py
2016-07-16 14:17:02 -05:00

77 lines
2.3 KiB
Python

from __future__ import absolute_import
from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division
from future import standard_library
standard_library.install_aliases()
from builtins import object
import SimPEG
from SimPEG import Utils, sp, np
from .Optimization import Remember, IterationPrinters, StoppingCriteria
from . import Directives
from future.utils import with_metaclass
class BaseInversion(with_metaclass(Utils.SimPEGMetaClass, object)):
"""
Inversion Class.
"""
name = 'BaseInversion'
debug = False #: Print debugging information
counter = None #: Set this to a SimPEG.Utils.Counter() if you want to count things
@property
def directiveList(self):
if getattr(self,'_directiveList', None) is None:
self._directiveList = Directives.DirectiveList(inversion=self)
return self._directiveList
@directiveList.setter
def directiveList(self, value):
if type(value) is list:
value = Directives.DirectiveList(*value)
assert isinstance(value, Directives.DirectiveList), 'Must be a DirectiveList'
self._directiveList = value
self._directiveList.inversion = self
def __init__(self, invProb, directiveList=None, **kwargs):
if directiveList is None:
directiveList = []
self.directiveList = directiveList
Utils.setKwargs(self, **kwargs)
self.invProb = invProb
self.opt = invProb.opt
self.opt.callback = self._optCallback
self.stoppers = [StoppingCriteria.iteration]
# Check if we have inserted printers into the optimization
if IterationPrinters.phi_d not in self.opt.printers:
self.opt.printers.insert(1,IterationPrinters.beta)
self.opt.printers.insert(2,IterationPrinters.phi_d)
self.opt.printers.insert(3,IterationPrinters.phi_m)
@Utils.timeIt
def run(self, m0):
"""run(m0)
Runs the inversion!
"""
self.invProb.startup(m0)
self.directiveList.call('initialize')
self.m = self.opt.minimize(self.invProb.evalFunction, self.invProb.curModel)
self.directiveList.call('finish')
return self.m
def _optCallback(self, xt):
self.directiveList.call('endIter')