Skip to content

Commit 33aa5d8

Browse files
authored
Merge pull request #110 from MiraGeoscience/GEOPY-2182
GEOPY-2182: Parallelize 1D simulations
2 parents d794a0b + ba4afa9 commit 33aa5d8

6 files changed

Lines changed: 234 additions & 124 deletions

File tree

simpeg/dask/electromagnetics/time_domain/simulation_1d.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def Jmatrix(self):
1313
"""
1414
if getattr(self, "_Jmatrix", None) is None:
1515
Jmat = self.getJ(self.model)
16-
self._Jmatrix = Jmat["ds"]
16+
self._Jmatrix = Jmat["ds"] * self.sigmaDeriv
1717

1818
return self._Jmatrix
1919

simpeg/dask/inverse_problem.py

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,67 @@
11
from ..inverse_problem import BaseInvProblem
22
import numpy as np
33

4-
from .objective_function import DaskComboMisfits
4+
from .objective_function import DistributedComboMisfits
55
from scipy.sparse.linalg import LinearOperator
66
from ..regularization import WeightedLeastSquares, Sparse
77
from ..objective_function import ComboObjectiveFunction
88
from simpeg.utils import call_hooks
99
from simpeg.version import __version__ as simpeg_version
1010

1111

12-
def get_dpred(self, m, f=None):
12+
def get_nested_predicted(objfcts, m, f=None, return_residuals=False):
1313
dpreds = []
14+
residuals = []
15+
for objfct in objfcts:
16+
17+
if isinstance(objfct, ComboObjectiveFunction):
18+
nesting = get_nested_predicted(
19+
objfct.objfcts, m, f=f, return_residuals=return_residuals
20+
)
1421

15-
if isinstance(self.dmisfit, DaskComboMisfits):
16-
return self.dmisfit.get_dpred(m, f=f)
22+
if return_residuals:
23+
dpreds += nesting[0]
24+
residuals += nesting[1]
25+
else:
26+
dpreds += nesting
27+
else:
28+
dpred = objfct.simulation.dpred(m, f=f)
29+
dpreds += [np.asarray(dpred)]
1730

18-
for objfct in self.dmisfit.objfcts:
19-
dpred = objfct.simulation.dpred(m, f=f)
20-
dpreds += [np.asarray(dpred)]
31+
if return_residuals:
32+
residual = objfct.W * (objfct.data.dobs - dpred)
33+
residuals += [np.asarray(residual)]
2134

35+
if return_residuals:
36+
return dpreds, residuals
2237
return dpreds
2338

2439

40+
def get_dpred(self, m, f=None, return_residuals=False):
41+
if isinstance(self.dmisfit, DistributedComboMisfits):
42+
results = self.dmisfit.get_dpred(m, f=f, return_residuals=return_residuals)
43+
else:
44+
results = get_nested_predicted(
45+
self.dmisfit.objfcts, m, f=f, return_residuals=return_residuals
46+
)
47+
48+
if return_residuals:
49+
return np.hstack(results[0]), np.hstack(results[1])
50+
51+
return np.hstack(results)
52+
53+
2554
BaseInvProblem.get_dpred = get_dpred
2655

2756

2857
def dask_evalFunction(self, m, return_g=True, return_H=True):
2958
"""evalFunction(m, return_g=True, return_H=True)"""
30-
self.model = m
31-
self.dpred = self.get_dpred(m)
32-
residuals = []
3359

34-
if isinstance(self.dmisfit, DaskComboMisfits):
35-
residuals = self.dmisfit.residuals(m)
36-
else:
37-
for (_, objfct), pred in zip(self.dmisfit, self.dpred):
38-
residuals.append(objfct.W * (objfct.data.dobs - pred))
60+
if not np.allclose(self.model, m):
61+
self.model = m
62+
self.dpred, self.residuals = self.get_dpred(m, return_residuals=True)
3963

40-
phi_d = 0.0
41-
for residual in residuals:
42-
phi_d += np.vdot(residual, residual)
64+
phi_d = np.vdot(self.residuals, self.residuals)
4365

4466
reg2Deriv = []
4567
if isinstance(self.reg, ComboObjectiveFunction):

0 commit comments

Comments
 (0)