def _sort_modelproposal(self, model): """ Return the sorted proposal model. This method is necessary, if the z_vnoi from the new proposal model are not ordered, i.e. if one z_vnoi value is added or strongly modified. """ n, vs, z_vnoi = Model.split_modelparams(model) if np.all(np.diff(z_vnoi) > 0): # monotone increasing return model else: ind = np.argsort(z_vnoi) model_sort = np.concatenate((vs[ind], z_vnoi[ind])) return model_sort
def _model_layerdeath(self, model): """ Remove a random voronoi nucleus depth from model. Delete corresponding Vs from model. """ n, vs_vnoi, z_vnoi = Model.split_modelparams(model) ind_death = self.rstate.randint(low=0, high=(z_vnoi.size)) z_before = z_vnoi[ind_death] vs_before = vs_vnoi[ind_death] z_new = np.delete(z_vnoi, ind_death) vs_new = np.delete(vs_vnoi, ind_death) ind = np.argmin((abs(z_new - z_before))) vs_after = vs_new[ind] self.dvs2 = np.square(vs_after - vs_before) return np.concatenate((vs_new, z_new))
def _model_layerbirth(self, model): """ Draw a random voronoi nucleus depth from z and assign a new Vs. The new Vs is based on the before Vs value at the drawn z_vnoi position (self.propdist[2]). """ n, vs_vnoi, z_vnoi = Model.split_modelparams(model) # new voronoi depth zmin, zmax = self.priors['z'] z_birth = self.rstate.uniform(low=zmin, high=zmax) ind = np.argmin((abs(z_vnoi - z_birth))) # closest z_vnoi vs_before = vs_vnoi[ind] vs_birth = vs_before + self.rstate.normal(0, self.propdist[2]) z_new = np.concatenate((z_vnoi, [z_birth])) vs_new = np.concatenate((vs_vnoi, [vs_birth])) self.dvs2 = np.square(vs_birth - vs_before) return np.concatenate((vs_new, z_new))