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