def genMod(self, individual): """Generate (GA) model from random vector (0-1) using model bounds.""" model = np.asarray(individual) * (self.lUB - self.lLB) + self.lLB if self.logpar: return pg.exp(model) else: return model
def genMod(self, individual): """ generate (GA) model from random vector (0-1) using model bounds """ model = np.asarray(individual) * (self.lUB - self.lLB) + self.lLB if self.logpar: return pg.exp(model) else: return model
def genMods( individual ): """ generate MRS and VES models from unit vector """ model = pg.asvector( individual ) * ( self.lUB - self.lLB ) + self.lLB if self.logpar: model = pg.exp( model ) modMRS = model(0,nlay*3-1) modVES = pg.cat(model(0,nlay-1),model(nlay*3-1,nlay*4-1)) return modMRS, modVES
def genMods(individual): """generate MRS and VES models from unit vector""" model = individual * (self.lUB - self.lLB) + self.lLB # model = pg.asvector(individual) * (self.lUB - self.lLB) + self.lLB if self.logpar: model = pg.exp(model) modMRS = model(0, nlay * 3 - 1) modVES = pg.cat(model(0, nlay - 1), model(nlay * 3 - 1, nlay * 4 - 1)) return modMRS, modVES
def invert(self, data, values=None, verbose=0, **kwargs): """ Invert the given data. A parametric mesh for the inversion will be created if non is given before. Parameters ---------- """ self.fop.setVerbose(verbose) self.inv.setVerbose(verbose) self.inv.setMaxIter(kwargs.pop('maxiter', 10)) self.inv.setLambda(kwargs.pop('lambd', 10)) if self.paraMesh is None: self.paraMesh = createParaMesh2dGrid(data.sensorPositions(), **kwargs) self.setParaMesh(self.paraMesh) if verbose: print(self.paraMesh) # pg.show(self.paraMesh) err = data('err') rhoa = data('rhoa') startModel = pg.RVector(self.fop.regionManager().parameterCount(), pg.median(rhoa)) self.fop.setData(data) self.inv.setForwardOperator(self.fop) # check err here self.inv.setData(rhoa) self.inv.setError(err) self.inv.setModel(startModel) model = self.inv.run() if values is not None: if isinstance(values, pg.RVector): values = [values] elif isinstance(values, np.ndarray): if values.ndim == 1: values = [values] allModel = pg.RMatrix(len(values), len(model)) self.inv.setVerbose(False) for i in range(len(values)): print(i) tic = time.time() self.inv.setModel(model) self.inv.setReferenceModel(model) dData = pg.abs(values[i] / rhoa) relModel = self.inv.invSubStep(pg.log(dData)) allModel[i] = model * pg.exp(relModel) print(i, "/", len(values), " : ", time.time()-tic, "s min/max: ", min(allModel[i]), max(allModel[i])) return allModel return model
def invert(self, data, values=None, verbose=0, **kwargs): """ Invert the given data. A parametric mesh for the inversion will be created if non is given before. Parameters ---------- """ self.fop.setVerbose(verbose) self.inv.setVerbose(verbose) self.inv.setMaxIter(kwargs.pop('maxiter', 10)) self.inv.setLambda(kwargs.pop('lambd', 10)) if self.paraMesh is None: self.paraMesh = createParaMesh2dGrid(data.sensorPositions(), **kwargs) self.setParaMesh(self.paraMesh) if verbose: print(self.paraMesh) # pg.show(self.paraMesh) err = data('err') rhoa = data('rhoa') startModel = pg.RVector(self.fop.regionManager().parameterCount(), pg.median(rhoa)) self.fop.setData(data) self.inv.setForwardOperator(self.fop) # check err here self.inv.setData(rhoa) self.inv.setError(err) self.inv.setModel(startModel) model = self.inv.run() if values is not None: if isinstance(values, pg.RVector): values = [values] elif isinstance(values, np.ndarray): if values.ndim == 1: values = [values] allModel = pg.RMatrix(len(values), len(model)) self.inv.setVerbose(False) for i in range(len(values)): print(i) tic = time.time() self.inv.setModel(model) self.inv.setReferenceModel(model) dData = pg.abs(values[i] / rhoa) relModel = self.inv.invSubStep(pg.log(dData)) allModel[i] = model * pg.exp(relModel) print(i, "/", len(values), " : ", time.time() - tic, "s min/max: ", min(allModel[i]), max(allModel[i])) return allModel return model
def response(self, model): return model[0] * pg.exp(-self.x / model[1])
def genMod( self, individual ): model = pg.asvector( individual ) * ( self.lUB - self.lLB ) + self.lLB if self.logpar: return pg.exp( model ) else: return model