def compute_functional_and_gradients(self): self.unpack_x() self.u_min = tuple([max(self.u_min_min, min(self.u_min_max, v)) for v in self.u_min]) if(self.b_min > self.b_sol_max): self.b_min = self.b_sol_max if(self.b_min < self.b_sol_min): self.b_min = self.b_sol_min self.k_min = [max(self.k_sol_min, min(self.k_sol_max, v)) for v in self.k_min] if(self.twin_fraction is None): self.fmodel_core_data.update(k_sols = self.k_min, b_sol = self.b_min, u_star = self.u_min) tg = bulk_solvent.bulk_solvent_and_aniso_scale_target_and_grads_ls( fm = self.fmodel_core_data.data, fo = self.f_obs.data(), compute_k_sol_grad = self.refine_k, compute_b_sol_grad = self.refine_b, compute_u_star_grad = self.refine_u) else: self.fmodel_core_data.update(k_sols = self.k_min, b_sol = self.b_min, u_star = self.u_min) self.fmodel_core_data_twin.update(k_sols = self.k_min, b_sol = self.b_min, u_star = self.u_min) tg = bulk_solvent.bulk_solvent_and_aniso_scale_target_and_grads_ls( fm1 = self.fmodel_core_data.data, fm2 = self.fmodel_core_data_twin.data, twin_fraction = self.twin_fraction, fo = self.f_obs.data(), compute_k_sol_grad = self.refine_k, compute_b_sol_grad = self.refine_b, compute_u_star_grad = self.refine_u) self.f = tg.target() gk=[0.0]*self.n_shells gb=0 gu=[0,0,0,0,0,0] if(self.refine_k or self.refine_b): gk = list(tg.grad_k_sols()) assert len(gk) == self.n_shells gb = tg.grad_b_sol() if(self.refine_u): gu = list(tg.grad_u_star()) if(self.symmetry_constraints_on_b_cart and self.refine_u): independent_params = flex.double( self.adp_constraints.independent_gradients(all_gradients=gu)) self.g = self.pack( u=independent_params, k=gk, b=gb, u_factor=1/self.u_factor) else: self.g = self.pack(u=gu, k=gk, b=gb, u_factor=1/self.u_factor) return self.f, self.g
def compute_functional_and_gradients(self): self.unpack_x() self.u_min = tuple([max(self.u_min_min, min(self.u_min_max, v)) for v in self.u_min]) self.fmodel_core_data.update(k_sols = [0], b_sol = 0, u_star = self.u_min) tg = bulk_solvent.bulk_solvent_and_aniso_scale_target_and_grads_ls( fm = self.fmodel_core_data.data, fo = self.f_obs.data(), compute_k_sol_grad = False, compute_b_sol_grad = False, compute_u_star_grad = self.refine_u) self.f = tg.target() gu=[0,0,0,0,0,0] if(self.refine_u): gu = list(tg.grad_u_star()) if(self.symmetry_constraints_on_b_cart and self.refine_u): independent_params = flex.double( self.adp_constraints.independent_gradients(all_gradients=gu)) self.g = self.pack( u=independent_params, u_factor=1/self.u_factor) else: self.g = self.pack(u=gu, u_factor=1/self.u_factor) return self.f, self.g