Major Changes
Composable objective functions
PR 511 (commits from: lheagy, rowanc1, fourndo reviews from: rowanc1, fourndo, leouieda, sgkang, jcapriot)
- wrote a base objective function class that allows for composable objective functions, so you can now say
python
phi = alpha_s * Regularization.Smallness(mesh) + alpha_x * Regularization.Smoothness(mesh)
- regularization and datamisfit now inherit from this. This results in several namespace changes
- `reg.eval(m)` --> `reg(m)`, `dmisfit.eval(m)` --> `dmisfit(m)`
- `reg.evalDeriv(m)` --> `reg.deriv(m)`, `dmisfit.evalDerivl(m)` --> `dmisfit.deriv(m)`
- `reg.eval2Deriv(m)` --> `reg.deriv(m)`, `dmisfit.eval2Derivl(m)` --> `dmisfit.deriv(m)`
- all regularizations and datamisfit now each have their own individual `W` matrix. There are no longer differently named W's, eg
- `dmistfit.Wd = Utils.sdiag(1/wd)` --> `dmisfit.W = Utils.sdiag(1/wd)`
Regularization
- regularization refactor to be more modular.
- For example, `Regularization.Tikhonov` is now a composite regularization that has an objective function list (`reg.objfcts`) consisting of `Regularization.Smallness`, `Regularization.Smooth_x`, `Regularization.Smooth_y`, `Regularization.Smooth_z`, `Regularization.Smooth_xx`, `Regularization.Smooth_yy`, `Regularization.Smooth_zz`.
- implemented properties in regularization (requires dev right now) for
- `indActive`
- `mref`
- `cell_weights`
- `mrefInSmooth`
- `alpha_?` (x, y, ...)
- any time properites are updated on a `CompositeRegularization`, those changes are propagated to the objective functions that make it up.
Other impacts
- update IRLS directive to hold the `l2model` (the directive should keep track of that model, it does not need to be stored on the regularization) cc fourndo
- updated `Props` to include a `SimPEGArray` and `SimPEGFloat` that allow `Utils.Zero` and `Utils.Identity` rowanc1
- [non-backwards-compatible] update examples to set data weights on `dmisfit.W` instead of `dmisfit.Wd` as that will depreciate on these changes
InvProb Compatibility with Composable Objective functions
- allow both `dmisfit` to be either a base objective function or a base data misfit
- extend invProb in cases where `dmisfit` is a combo objective function so that it can stash multiple fields from different problems
Additions
Straight Ray Tomography
PR 511
- implement `SEIS.StraightRay`, `Problem`, `Survey`, `Src` and `Rx`
- example: SEIS_StraightRayTomo.py
![image](https://cloud.githubusercontent.com/assets/6361812/23388723/c4d508e6-fd18-11e6-9f38-ff080cf906e6.png)
Example Joint Inversion
PR 511
- include an example "joint" inversion (consists of 2 data misfit terms and a regularization) based on the Heagy et. al., 2014 SEG abstract http://library.seg.org/doi/abs/10.1190/segam2014-1639.1: SEIS_VolumeRegularization.py
![image](https://cloud.githubusercontent.com/assets/6361812/23390208/7b891458-fd21-11e6-864c-ee43e8bd2a27.png)
Minor Changes
Distribution
PR 576 (commits from: lheagy. reviews from: rowanc1)
- build universal wheel for SimPEG on travis whenever a tag is submitted
- similar to simpeg/discretize44, however since SimPEG is now pure python, a universal wheel can instead be used. https://packaging.python.org/distributing/#universal-wheels
Sphinx Gallery
PR 588 (commits from lheagy. reviews from rowanc1)
- minor docs updates to align with sphinx-gallery/sphinx-gallery151
Survey Pairs
PR 583 (commits from: lheagy)
- have the survey check if it is already paired to problem and raise an error if it is. Use`survey.unpair()` if you are re-using the same survey more than once.
- whitespace cleanup in Survey.py
Docs enhancement
PR 595 (commits from lheagy, reviews from rowanc1)
Bring in the documentation pages from the previous SimPEG tutorials (as per 544):
- "Getting Started for Developers"
- "Practices"
![image](https://cloud.githubusercontent.com/assets/6361812/25649499/e01916e8-2f8a-11e7-864d-9222abde9c8e.png)
Remote Download
PR 598 (commits from: lheagy, reviews from: rowanc1, fourndo)
modify the `remoteDownload` utils so that more of the string handling is done by the util as per 596
Before
basePath = os.path.sep.join(os.path.abspath(os.getenv('HOME')).split(os.path.sep)+['Downloads']+['SimPEGtemp'])
basePath = os.path.abspath(remoteDownload(url, cloudfiles, basePath=basePath+os.path.sep))
After
basePath = download(url, path='~/Downloads', overwrite=True)
Breaks Backwards compatibility
- `dmisfit.Wd` is now `dmisfit.W`
- `Utils.remoteDownload` is now `Utils.download`