pygimli.frameworks¶
Unified and method independent inversion frameworks.
Overview¶
Functions
|
Generic function fitter. |
|
GIMLi-based curve-fit by harmonic functions. |
|
Python-based curve-fit by harmonic functions. |
Classes
|
|
|
General forward operator for 1D layered models. |
|
Functor for harmonic functions plus offset and drift. |
|
Basic inversion framework. |
|
Cumulative (joint) forward operator. |
|
|
|
2D Laterally constrained inversion LCI framework. |
|
2D Laterally constrained (LC) modelling. |
|
Marquardt scheme (local damping with decreasing regularization strength |
|
|
|
|
|
General manager to maintenance a measurement method. |
|
Method Manager base class for managers on a 1d discretization. |
|
Abstract Forward Operator. |
|
Framework to invert unconstrained parameters. |
|
Model with symbolic parameter names instead of numbers |
|
|
|
Combine petrophysical relation with the modelling class f(p). |
Functions¶
fit¶
-
pygimli.frameworks.
fit
(funct, data, err=None, **kwargs)[source]¶ Generic function fitter.
Fit data to a given function.
- Parameters
funct (callable) – Function with the first argmument as data space, e.g., x, t, f, Nr. .. Any following arguments are the parameters to be fit. Except if a verbose flag if used.
data (iterable (float)) – Data values
err (iterable (float) [None]) – Data error values in %/100. Default is 1% if None are given.
- Other Parameters
*dataSpace* (iterable) – Keyword argument of the data space of len(data). The name need to fit the first argument of funct.
- Returns
model (array) – Fitted model parameter.
response (array) – Model response.
Example
>>> import pygimli as pg >>> >>> func = lambda t, a, b: a*np.exp(b*t) >>> t = np.linspace(1, 2, 20) >>> data = func(t, 1.1, 2.2) >>> model, response = pg.frameworks.fit(func, data, t=t) >>> print(pg.core.round(model, 1e-5)) 2 [1.1, 2.2] >>> _ = pg.plt.plot(t, data, 'o', label='data') >>> _ = pg.plt.plot(t, response, label='response') >>> _ = pg.plt.legend()
harmfit¶
-
pygimli.frameworks.
harmfit
(y, x=None, error=None, nc=42, resample=None, lam=0.1, window=None, verbose=False, dosave=False, lineSearch=True, robust=False, maxiter=20)[source]¶ GIMLi-based curve-fit by harmonic functions.
- Parameters
y (1d-array - values to be fitted) –
x (1d-array(len(y)) - data abscissa data. default: [0 .. len(y))) –
error (1d-array(len(y)) error of y. default (absolute error = 0.01)) –
nc (int - Number of harmonic coefficients) –
resample (1d-array - resample y to x using fitting coeffients) –
window (int - just fit data inside window bounds) –
- Returns
response (1d-array(len(resample) or len(x)) - smoothed values)
coefficients (1d-array - fitting coefficients)
harmfitNative¶
-
pygimli.frameworks.
harmfitNative
(y, x=None, nc=None, xc=None, err=None)[source]¶ Python-based curve-fit by harmonic functions.
- Parameters
y (iterable) – values of a curve to be fitted
x (iterable) – abscissa, if none [0..len(y))
nc (int) – number of coefficients
err (iterable) – absolute data error
xc (iterable) – abscissa to predict y on (otherwise equal to x)
Classes¶
Block1DInversion
-
class
pygimli.frameworks.
Block1DInversion
(fop=None, **kwargs)[source]¶ Bases:
pygimli.frameworks.inversion.MarquardtInversion
- Variables
nLayers (int) –
-
fixLayers
(fixLayers)[source]¶ Fix layer thicknesses.
- Parameters
fixLayers (bool | [float]) – Fix all layers to the last value or set the fix layer thickness for all layers
-
run
(dataVals, errorVals, nLayers=None, fixLayers=None, layerLimits=None, paraLimits=None, **kwargs)[source]¶ - Parameters
nLayers (int [4]) – Number of layers.
fixLayers (bool | [thicknesses]) – See:
pygimli.modelling.Block1DInversion.fixLayers
For fixLayers=None, preset or defaults are uses.layerLimits ([min, max]) – Limits the thickness off all layers. For layerLimits=None, preset or defaults are uses.
paraLimits ([min, max] | [[min, max],..]) – Limits the range of the model parameter. If you have multiple parameters you can set them with a list of limits.
**kwargs – Forwarded to the parent class. See:
pygimli.modelling.MarquardtInversion
Block1DModelling
-
class
pygimli.frameworks.
Block1DModelling
(nPara=1, nLayers=4, **kwargs)[source]¶ Bases:
pygimli.frameworks.modelling.Modelling
General forward operator for 1D layered models.
Model space: [thickness_i, parameter_jk], with i = 0 - nLayers-1, j = (0 .. nLayers), k=(0 .. nPara)
-
drawData
(ax, data, err=None, label=None, **kwargs)[source]¶ Default data view.
Modelling creates the data and should know best how to draw them.
Probably ugly and you should overwrite it in your derived forward operator.
-
property
nLayers
¶
-
property
nPara
¶
-
HarmFunctor
-
class
pygimli.frameworks.
HarmFunctor
(A, coeff, xmin, xSpan)[source]¶ Bases:
object
Functor for harmonic functions plus offset and drift.
Inversion
-
class
pygimli.frameworks.
Inversion
(fop=None, inv=None, **kwargs)[source]¶ Bases:
object
Basic inversion framework.
Changes to prior Versions (remove me)
holds the starting model itself, fop only provide a creator for SM
fop.createStartModel(dataValues)
- Variables
startModel (array) – Holds the current starting model
model (array) – Holds the last active model
stopAtChi1 (bool [True]) – Stop iteration when chi² is one. If set to false the iteration stops after maxIter or convergence reached (self.inv.deltaPhiAbortPercent())
-
__init__
(fop=None, inv=None, **kwargs)[source]¶ Initialize self. See help(type(self)) for accurate signature.
-
property
dataErrs
¶
-
property
dataTrans
¶
-
property
dataVals
¶
-
property
debug
¶
-
property
errorVals
¶
-
property
fop
¶
-
property
inv
¶
-
property
maxIter
¶
-
property
minDPhi
¶
-
property
model
¶ The last active model.
-
property
modelTrans
¶
-
property
parameterCount
¶
-
property
response
¶
-
property
robustData
¶
-
run
(dataVals, errorVals, **kwargs)[source]¶ Run inversion.
The inversion will always start from the starting model taken from the forward operator. If you want to run the inversion from a specified prior model, e.g., from a other run, set this model as starting model to the FOP (fop.setStartModel). Any self.inv.setModel() settings will be overwritten.
-
showProgress
(style='all')[source]¶ Called if showProgress=True is set for the inversion run.
- TODO
- *Discuss .. its a useful function but breaks a little
the FrameWork work only concept.
-
property
startModel
¶ Gives the current default starting model.
Returns the current default starting model or call fop.createStartmodel() if non is defined.
-
property
stopAtChi1
¶
-
property
verbose
¶
JointModelling
-
class
pygimli.frameworks.
JointModelling
(fopList)[source]¶ Bases:
pygimli.frameworks.modelling.MeshModelling
Cumulative (joint) forward operator.
JointPetroInversionManager
-
class
pygimli.frameworks.
JointPetroInversionManager
(petros, mgrs)[source]¶ Bases:
pygimli.frameworks.methodManager.MeshMethodManager
LCInversion
-
class
pygimli.frameworks.
LCInversion
(fop=None, **kwargs)[source]¶ Bases:
pygimli.frameworks.inversion.Inversion
2D Laterally constrained inversion LCI framework.
-
run
(dataVals, errorVals, nLayers=4, **kwargs)[source]¶ Run inversion.
The inversion will always start from the starting model taken from the forward operator. If you want to run the inversion from a specified prior model, e.g., from a other run, set this model as starting model to the FOP (fop.setStartModel). Any self.inv.setModel() settings will be overwritten.
-
LCModelling
-
class
pygimli.frameworks.
LCModelling
(fop, **kwargs)[source]¶ Bases:
pygimli.frameworks.modelling.Modelling
2D Laterally constrained (LC) modelling.
2D Laterally constrained (LC) modelling based on BlockMatrices.
-
createDefaultStartModel
(models)[source]¶ Create the default startmodel as the median of the data values.
-
createParametrization
(nSoundings, nLayers=4, nPar=1)[source]¶ Create LCI mesh and suitable constraints informations.
-
MarquardtInversion
-
class
pygimli.frameworks.
MarquardtInversion
(fop=None, **kwargs)[source]¶ Bases:
pygimli.frameworks.inversion.Inversion
Marquardt scheme (local damping with decreasing regularization strength
MeshMethodManager
-
class
pygimli.frameworks.
MeshMethodManager
(**kwargs)[source]¶ Bases:
pygimli.frameworks.methodManager.MethodManager
-
__init__
(**kwargs)[source]¶ Constructor.
- mesh: pg.Mesh
Copy of the main Mesh. Will be distributet to inversion and the fop. You can overwrite it with invert(mesh=mesh).
-
invert
(data=None, mesh=None, zWeight=1.0, startModel=None, **kwargs)[source]¶ Run the full inversion.
- Parameters
- Keyword Arguments
to Inversion.run (forwarded) –
- Returns
model – Model mapped for match the paraDomain Cell markers. The calculated model is in self.fw.model.
- Return type
array
-
property
paraDomain
¶
-
MeshModelling
-
class
pygimli.frameworks.
MeshModelling
(**kwargs)[source]¶ Bases:
pygimli.frameworks.modelling.Modelling
-
__init__
(**kwargs)[source]¶ - Variables
fop (pg.frameworks.Modelling) –
data (pg.DataContainer) –
modelTrans ([pg.trans.TransLog()]) –
- Parameters
**kwargs – fop : Modelling
-
createRefinedFwdMesh
(mesh)[source]¶ Refine the current mesh for higher accuracy.
This is called automatic when accessing self.mesh() so it ensures any effect of changing region properties (background, single).
-
property
paraDomain
¶
-
MethodManager
-
class
pygimli.frameworks.
MethodManager
(fop=None, fw=None, data=None, **kwargs)[source]¶ Bases:
object
General manager to maintenance a measurement method.
Method Manager are the interface to end-user interaction and can be seen as simple but complete application classes which manage all tasks of geophysical data processing.
The method manager holds one instance of a forward operator and an appropriate inversion framework to handle modelling and data inversion.
Method Manager also helps with data import and export, handle measurement data error estimation as well as model and data visualization.
- Variables
fop (
pygimli.frameworks.Modelling
) – Forward Operator instance .. knows the physics. fop is initialized bypygimli.manager.MethodManager.initForwardOperator
and calls a validpygimli.manager.MethodManager.createForwardOperator
method in any derived classes.inv (
pygimli.frameworks.Inversion
.) – Inversion framework instance .. knows the reconstruction approach. The attribute inv is initialized by default but can be changed overwritingpygimli.manager.MethodManager.initInversionFramework
-
checkError
(err, dataVals=None)[source]¶ Return relative error. Default we assume ‘err’ are relative values. Overwrite is derived class if needed.
-
static
createArgParser
(dataSuffix='dat')[source]¶ Create default argument parser.
TODO move this to some kind of app class
Create default argument parser for the following options:
-Q, –quiet -R, –robustData: options.robustData -B, –blockyModel: options.blockyModel -l, –lambda: options.lam -i, –maxIter: options.maxIter –depth: options.depth
-
createForwardOperator
(**kwargs)[source]¶ Mandatory interface for derived classes.
Here you need to specify which kind of forward operator FOP you want to use. This is called by any initForwardOperator() call.
- Parameters
**kwargs – Any arguments that are necessary for your FOP creation.
- Returns
Instance of any kind of
pygimli.framework.Modelling
.- Return type
-
createInversionFramework
(**kwargs)[source]¶ Create default Inversion framework.
Derived classes may overwrite this method.
- Parameters
**kwargs – Any arguments that are necessary for your creation.
- Returns
Instance of any kind of
pygimli.framework.Inversion
.- Return type
-
property
debug
¶
-
estimateError
(data, errLevel=0.01, absError=None)[source]¶ Estimate data error.
Create an error of estimated measurement error. On default it returns an array of constant relative errors. More sophisticated error estimation should be done in specialized derived classes.
-
property
fop
¶
-
property
fw
¶
-
property
inv
¶
-
invert
(data=None, err=None, **kwargs)[source]¶ Invert the data.
Invert the data by calling self.inv.run() with mandatory data and error values.
- TODO
*need dataVals mandatory? what about already loaded data
- Parameters
dataVals (iterable) – Data values to be inverted.
errVals (iterable | float) – Error value for the given data. If errVals is float we assume this means to be a global relative error and force self.estimateError to be called.
-
property
model
¶
-
reinitForwardOperator
(**kwargs)[source]¶ Reinitialize the forward operator.
Sometimes it can be useful to reinitialize the forward operator. Keyword arguments will be forwarded to ‘self.createForwardOperator’.
-
showData
(data=None, ax=None, **kwargs)[source]¶ Show the data.
Draw data values into a given axes or show the data values from the last run. Forwards on default to the self.fop.drawData function of the modelling operator. If there is no given function given, you have to override this method.
- Parameters
ax (mpl axes) – Axes object to draw into. Create a new if its not given.
data (iterable | pg.DataContainer) – Data values to be draw.
- Returns
- Return type
ax, cbar
-
showModel
(model, ax=None, **kwargs)[source]¶ Show a model.
Draw model into a given axes or show inversion result from last run. Forwards on default to the self.fop.drawModel function of the modelling operator. If there is no function given, you have to override this method.
- Parameters
ax (mpl axes) – Axes object to draw into. Create a new if its not given.
model (iterable) – Model data to be draw.
- Returns
- Return type
ax, cbar
-
showResult
(model=None, ax=None, **kwargs)[source]¶ Show the last inversion result.
- Parameters
ax (mpl axes) – Axes object to draw into. Create a new if its not given.
model (iterable [None]) – Model values to be draw. Default is self.model from the last run
- Returns
- Return type
ax, cbar
-
property
verbose
¶
MethodManager1d
-
class
pygimli.frameworks.
MethodManager1d
(fop=None, **kwargs)[source]¶ Bases:
pygimli.frameworks.methodManager.MethodManager
Method Manager base class for managers on a 1d discretization.
Modelling
-
class
pygimli.frameworks.
Modelling
(**kwargs)[source]¶ Bases:
pygimli.core.ModellingBaseMT__
Abstract Forward Operator.
Abstract Forward Operator that is or can use a Modelling instance. Can be seen as some kind of proxy Forward Operator.
-
__init__
(**kwargs)[source]¶ - Variables
fop (pg.frameworks.Modelling) –
data (pg.DataContainer) –
modelTrans ([pg.trans.TransLog()]) –
- Parameters
**kwargs – fop : Modelling
-
createDefaultStartModel
(dataVals)[source]¶ Create the default startmodel as the median of the data values.
-
createStartModel
(dataVals=None)[source]¶ Create the default startmodel as the median of the data values.
Overwriting might be a good idea. Its used by inversion to create a valid startmodel if there are no starting values from the regions.
-
property
data
¶ Return the associated data container.
- C++ signature :
GIMLI::DataContainer {lvalue} data(GIMLI::ModellingBase {lvalue})
-
estimateError
(data, **kwargs)[source]¶ Create data error fallback when the data error is not known. Should be implemented method depending.
-
property
fop
¶
-
property
modelTrans
¶
-
ParameterInversionManager
-
class
pygimli.frameworks.
ParameterInversionManager
(funct=None, fop=None, **kwargs)[source]¶ Bases:
pygimli.frameworks.methodManager.MethodManager
Framework to invert unconstrained parameters.
ParameterModelling
-
class
pygimli.frameworks.
ParameterModelling
(funct=None, **kwargs)[source]¶ Bases:
pygimli.frameworks.modelling.Modelling
Model with symbolic parameter names instead of numbers
-
__init__
(funct=None, **kwargs)[source]¶ - Variables
fop (pg.frameworks.Modelling) –
data (pg.DataContainer) –
modelTrans ([pg.trans.TransLog()]) –
- Parameters
**kwargs – fop : Modelling
-
property
params
¶
-
response
((object)arg1, (object)model) → object :[source]¶ - C++ signature :
GIMLI::Vector<double> response(GIMLI::ModellingBase {lvalue},GIMLI::Vector<double>)
response( (object)arg1, (object)model) -> object :
- C++ signature :
GIMLI::Vector<double> response(ModellingBase_wrapper {lvalue},GIMLI::Vector<double>)
-
PetroInversionManager
-
class
pygimli.frameworks.
PetroInversionManager
(petro, mgr=None, **kwargs)[source]¶ Bases:
pygimli.frameworks.methodManager.MeshMethodManager
PetroModelling
-
class
pygimli.frameworks.
PetroModelling
(fop, petro, **kwargs)[source]¶ Bases:
pygimli.frameworks.modelling.MeshModelling
Combine petrophysical relation with the modelling class f(p).
Combine petrophysical relation \(p(m)\) with a modelling class \(f(p)\) to invert for the petrophysical model \(p\) instead of the geophysical model \(m\).
\(p\) be the petrophysical model, e.g., porosity, saturation, … \(m\) be the geophysical model, e.g., slowness, resistivity, …
-
__init__
(fop, petro, **kwargs)[source]¶ Save forward class and transformation, create Jacobian matrix.
-
createJacobian
(model)[source]¶ Fill the individual jacobian matrices. J = dF(m) / dm = dF(m) / dp * dp / dm
-
property
petro
¶
-