def compare_analytical_and_finite(obs, hkl, d_star_sq, params, out):
  grads_fin = d_target_d_params_finite(
    obs=obs, hkl=hkl, d_star_sq=d_star_sq, params=params)
  print >> out, "grads_fin:", pack_gradients(grads_fin)
  sf = structure_factor(hkl=hkl, d_star_sq=d_star_sq, params=params)
  target = least_squares(obs=obs, calc=sf.f())
  grads_ana = sf.d_target_d_params(target=target)
  print >> out, "grads_ana:", pack_gradients(grads_ana)
  assert approx_equal(pack_gradients(grads_ana), pack_gradients(grads_fin))
  curvs_fin = d2_target_d_params_finite(
    obs=obs, hkl=hkl, d_star_sq=d_star_sq, params=params)
  print >> out, "curvs_fin:", curvs_fin
  curvs_ana = sf.d2_target_d_params(target=target)
  print >> out, "curvs_ana:", curvs_ana
  assert approx_equal(curvs_ana, curvs_fin, 1.e-5)
  print >> out
def compare_analytical_and_finite(obs, hkl, d_star_sq, params, out):
    grads_fin = d_target_d_params_finite(obs=obs,
                                         hkl=hkl,
                                         d_star_sq=d_star_sq,
                                         params=params)
    print >> out, "grads_fin:", pack_gradients(grads_fin)
    sf = structure_factor(hkl=hkl, d_star_sq=d_star_sq, params=params)
    target = least_squares(obs=obs, calc=sf.f())
    grads_ana = sf.d_target_d_params(target=target)
    print >> out, "grads_ana:", pack_gradients(grads_ana)
    assert approx_equal(pack_gradients(grads_ana), pack_gradients(grads_fin))
    curvs_fin = d2_target_d_params_finite(obs=obs,
                                          hkl=hkl,
                                          d_star_sq=d_star_sq,
                                          params=params)
    print >> out, "curvs_fin:", curvs_fin
    curvs_ana = sf.d2_target_d_params(target=target)
    print >> out, "curvs_ana:", curvs_ana
    assert approx_equal(curvs_ana, curvs_fin, 1.e-5)
    print >> out
def d2_target_d_params_finite(obs, hkl, d_star_sq, params, eps=1.e-8):
  result = []
  params_eps = copy.deepcopy(params)
  for i_param in xrange(len(params)):
    for ix in xrange(7):
      gs = []
      for signed_eps in [eps, -eps]:
        pi_eps = params[i_param].as_list()
        pi_eps[ix] += signed_eps
        params_eps[i_param] = parameters(pi_eps[:3], *pi_eps[3:])
        sf = structure_factor(hkl=hkl, d_star_sq=d_star_sq, params=params_eps)
        target = least_squares(obs=obs, calc=sf.f())
        dp = sf.d_target_d_params(target=target)
        gs.append(pack_gradients(dp))
      result.append([(gp-gm)/(2*eps) for gp,gm in zip(gs[0],gs[1])])
    params_eps[i_param] = params[i_param]
  return result
def d2_target_d_params_finite(obs, hkl, d_star_sq, params, eps=1.e-8):
    result = []
    params_eps = copy.deepcopy(params)
    for i_param in xrange(len(params)):
        for ix in xrange(7):
            gs = []
            for signed_eps in [eps, -eps]:
                pi_eps = params[i_param].as_list()
                pi_eps[ix] += signed_eps
                params_eps[i_param] = parameters(pi_eps[:3], *pi_eps[3:])
                sf = structure_factor(hkl=hkl,
                                      d_star_sq=d_star_sq,
                                      params=params_eps)
                target = least_squares(obs=obs, calc=sf.f())
                dp = sf.d_target_d_params(target=target)
                gs.append(pack_gradients(dp))
            result.append([(gp - gm) / (2 * eps)
                           for gp, gm in zip(gs[0], gs[1])])
        params_eps[i_param] = params[i_param]
    return result