def exercise_restrained_refinement(options): import random random.seed(1) flex.set_random_seed(1) xs0 = smtbx.development.random_xray_structure( sgtbx.space_group_info('P1'), n_scatterers=options.n_scatterers, elements="random") for sc in xs0.scatterers(): sc.flags.set_grad_site(True) sc0 = xs0.scatterers() uc = xs0.unit_cell() mi = xs0.build_miller_set(anomalous_flag=False, d_min=options.resolution) fo_sq = mi.structure_factors_from_scatterers( xs0, algorithm="direct").f_calc().norm() fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1)) i, j, k, l = random.sample(xrange(options.n_scatterers), 4) bond_proxies = geometry_restraints.shared_bond_simple_proxy() w = 1e9 d_ij = uc.distance(sc0[i].site, sc0[j].site) * 0.8 bond_proxies.append( geom.bond_simple_proxy(i_seqs=(i, j), distance_ideal=d_ij, weight=w)) d_jk = uc.distance(sc0[j].site, sc0[k].site) * 0.85 bond_proxies.append( geom.bond_simple_proxy(i_seqs=(j, k), distance_ideal=d_jk, weight=w)) d_ki = min( uc.distance(sc0[k].site, sc0[i].site) * 0.9, (d_ij + d_jk) * 0.8) bond_proxies.append( geom.bond_simple_proxy(i_seqs=(k, i), distance_ideal=d_ki, weight=w)) d_jl = uc.distance(sc0[j].site, sc0[l].site) * 0.9 bond_proxies.append( geom.bond_simple_proxy(i_seqs=(j, l), distance_ideal=d_jl, weight=w)) d_lk = min( uc.distance(sc0[l].site, sc0[k].site) * 0.8, 0.75 * (d_jk + d_jl)) bond_proxies.append( geom.bond_simple_proxy(i_seqs=(l, k), distance_ideal=d_jl, weight=w)) restraints_manager = restraints.manager(bond_proxies=bond_proxies) xs1 = xs0.deep_copy_scatterers() xs1.shake_sites_in_place(rms_difference=0.1) def ls_problem(): xs = xs1.deep_copy_scatterers() reparametrisation = constraints.reparametrisation( structure=xs, constraints=[], connectivity_table=smtbx.utils.connectivity_table(xs), temperature=20) return least_squares.crystallographic_ls( fo_sq.as_xray_observations(), reparametrisation=reparametrisation, restraints_manager=restraints_manager) gradient_threshold, step_threshold = 1e-6, 1e-6 eps = 5e-3 ls = ls_problem() t = wall_clock_time() cycles = normal_eqns_solving.naive_iterations( ls, gradient_threshold=gradient_threshold, step_threshold=step_threshold, track_all=True) if options.verbose: print "%i %s steps in %.6f s" % (cycles.n_iterations, cycles, t.elapsed()) sc = ls.xray_structure.scatterers() for p in bond_proxies: d = uc.distance(*[sc[i_pair].site for i_pair in p.i_seqs]) assert approx_equal(d, p.distance_ideal, eps) ls = ls_problem() t = wall_clock_time() cycles = normal_eqns_solving.levenberg_marquardt_iterations( ls, gradient_threshold=gradient_threshold, step_threshold=step_threshold, tau=1e-3, track_all=True) if options.verbose: print "%i %s steps in %.6f s" % (cycles.n_iterations, cycles, t.elapsed()) sc = ls.xray_structure.scatterers() sc = ls.xray_structure.scatterers() for p in bond_proxies: d = uc.distance(*[sc[i].site for i in p.i_seqs]) assert approx_equal(d, p.distance_ideal, eps)
def exercise_restrained_refinement(options): import random random.seed(1) flex.set_random_seed(1) xs0 = smtbx.development.random_xray_structure( sgtbx.space_group_info('P1'), n_scatterers=options.n_scatterers, elements="random") for sc in xs0.scatterers(): sc.flags.set_grad_site(True) sc0 = xs0.scatterers() uc = xs0.unit_cell() mi = xs0.build_miller_set(anomalous_flag=False, d_min=options.resolution) fo_sq = mi.structure_factors_from_scatterers( xs0, algorithm="direct").f_calc().norm() fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1)) i, j, k, l = random.sample(xrange(options.n_scatterers), 4) bond_proxies = geometry_restraints.shared_bond_simple_proxy() w = 1e9 d_ij = uc.distance(sc0[i].site, sc0[j].site)*0.8 bond_proxies.append(geom.bond_simple_proxy( i_seqs=(i, j), distance_ideal=d_ij, weight=w)) d_jk = uc.distance(sc0[j].site, sc0[k].site)*0.85 bond_proxies.append(geom.bond_simple_proxy( i_seqs=(j, k), distance_ideal=d_jk, weight=w)) d_ki = min(uc.distance(sc0[k].site, sc0[i].site)*0.9, (d_ij + d_jk)*0.8) bond_proxies.append(geom.bond_simple_proxy( i_seqs=(k, i), distance_ideal=d_ki, weight=w)) d_jl = uc.distance(sc0[j].site, sc0[l].site)*0.9 bond_proxies.append(geom.bond_simple_proxy( i_seqs=(j, l), distance_ideal=d_jl, weight=w)) d_lk = min(uc.distance(sc0[l].site, sc0[k].site)*0.8, 0.75*(d_jk + d_jl)) bond_proxies.append(geom.bond_simple_proxy( i_seqs=(l, k), distance_ideal=d_jl, weight=w)) restraints_manager = restraints.manager(bond_proxies=bond_proxies) xs1 = xs0.deep_copy_scatterers() xs1.shake_sites_in_place(rms_difference=0.1) def ls_problem(): xs = xs1.deep_copy_scatterers() reparametrisation = constraints.reparametrisation( structure=xs, constraints=[], connectivity_table=smtbx.utils.connectivity_table(xs), temperature=20) return least_squares.crystallographic_ls( fo_sq.as_xray_observations(), reparametrisation=reparametrisation, restraints_manager=restraints_manager) gradient_threshold, step_threshold = 1e-6, 1e-6 eps = 5e-3 ls = ls_problem() t = wall_clock_time() cycles = normal_eqns_solving.naive_iterations( ls, gradient_threshold=gradient_threshold, step_threshold=step_threshold, track_all=True) if options.verbose: print "%i %s steps in %.6f s" % (cycles.n_iterations, cycles, t.elapsed()) sc = ls.xray_structure.scatterers() for p in bond_proxies: d = uc.distance(*[ sc[i_pair].site for i_pair in p.i_seqs ]) assert approx_equal(d, p.distance_ideal, eps) ls = ls_problem() t = wall_clock_time() cycles = normal_eqns_solving.levenberg_marquardt_iterations( ls, gradient_threshold=gradient_threshold, step_threshold=step_threshold, tau=1e-3, track_all=True) if options.verbose: print "%i %s steps in %.6f s" % (cycles.n_iterations, cycles, t.elapsed()) sc = ls.xray_structure.scatterers() sc = ls.xray_structure.scatterers() for p in bond_proxies: d = uc.distance(*[ sc[i].site for i in p.i_seqs ]) assert approx_equal(d, p.distance_ideal, eps)
def exercise_direct(space_group_info, elements, anomalous_flag=False, use_random_u_iso=False, verbose=0): xs = random_structure.xray_structure( space_group_info=space_group_info, elements=elements, random_u_iso=use_random_u_iso, volume_per_atom=18.6, min_distance=1.2) #show_diagnostics(xs) reciprocal_volume = xs.unit_cell().reciprocal().volume() times = [] cuda_platform = direct_summation_cuda_platform() cuda_platform_float = direct_summation_cuda_platform(float_t="float") direct_reference = True for x in xrange(1,7): print "There are %d scatterers"%len(elements) number_of_reflections = pow(10.,x) Volume = number_of_reflections * reciprocal_volume * 2. #2 P1 asymmetric units Volume *= space_group_info.group().order_z() # take space group into acct. recip_radius = pow(3.*Volume/(4.*pi),1./3.) d_min = 1./recip_radius if 0: cos_sin_table = math_module.cos_sin_table(2**10) if 1: cos_sin_table = False if direct_reference: timer = wall_clock_time() cpu_direct = xs.structure_factors(d_min=d_min,algorithm="direct", cos_sin_table=cos_sin_table) cpu_time = timer.elapsed() cpu_direct_f = cpu_direct.f_calc() timer = wall_clock_time() simple_direct = xs.structure_factors(d_min=d_min,algorithm=direct_summation_simple()) simple_time = timer.elapsed() simple_direct_f = simple_direct.f_calc() else: cpu_time=0 simple_time=0 timer = wall_clock_time() gpu_direct = xs.structure_factors(d_min=d_min,algorithm=cuda_platform) gpu_time = timer.elapsed() gpu_direct_f = gpu_direct.f_calc() gpu_amplitude = gpu_direct_f.as_amplitude_array() sum_amp = flex.sum(gpu_amplitude.data()) timer = wall_clock_time() gpuf_direct = xs.structure_factors(d_min=d_min,algorithm=cuda_platform_float) gpuf_time = timer.elapsed() gpuf_direct_f = gpuf_direct.f_calc() gpuf_amplitude = gpuf_direct_f.as_amplitude_array() abs_diff = flex.abs(gpuf_amplitude.data() - gpu_amplitude.data()) sum_diff = flex.sum(abs_diff) gpuf_Rfactor = 100.*sum_diff/sum_amp timer = wall_clock_time() fft_algorithm = xs.structure_factors(d_min=d_min,algorithm="fft") fft_time = timer.elapsed() fft_f = fft_algorithm.f_calc() fft_amplitude = fft_f.as_amplitude_array() abs_diff = flex.abs(fft_amplitude.data() - gpu_amplitude.data()) sum_diff = flex.sum(abs_diff) fft_Rfactor = 100.*sum_diff/sum_amp times.append((number_of_reflections,cpu_time,d_min, gpu_time, gpuf_time,gpuf_Rfactor, simple_time, fft_time,fft_Rfactor)) # doesn't assert correctly: assert approx_equal(cpu_direct_f.data(), fft_f.data()) if direct_reference: assert approx_equal(cpu_direct_f.data(), gpu_direct_f.data(), eps=1e-6) assert approx_equal(cpu_direct_f.data(), simple_direct_f.data(), eps=1e-6) show_times_vs_complexity(times, header="run time vs. # reflections")
def exercise_direct(space_group_info, elements, anomalous_flag=False, use_random_u_iso=False, verbose=0): xs = random_structure.xray_structure(space_group_info=space_group_info, elements=elements, random_u_iso=use_random_u_iso, volume_per_atom=18.6, min_distance=1.2) #show_diagnostics(xs) reciprocal_volume = xs.unit_cell().reciprocal().volume() times = [] cuda_platform = direct_summation_cuda_platform() cuda_platform_float = direct_summation_cuda_platform(float_t="float") direct_reference = True for x in range(1, 7): print("There are %d scatterers" % len(elements)) number_of_reflections = pow(10., x) Volume = number_of_reflections * reciprocal_volume * 2. #2 P1 asymmetric units Volume *= space_group_info.group().order_z( ) # take space group into acct. recip_radius = pow(3. * Volume / (4. * pi), 1. / 3.) d_min = 1. / recip_radius if 0: cos_sin_table = math_module.cos_sin_table(2**10) if 1: cos_sin_table = False if direct_reference: timer = wall_clock_time() cpu_direct = xs.structure_factors(d_min=d_min, algorithm="direct", cos_sin_table=cos_sin_table) cpu_time = timer.elapsed() cpu_direct_f = cpu_direct.f_calc() timer = wall_clock_time() simple_direct = xs.structure_factors( d_min=d_min, algorithm=direct_summation_simple()) simple_time = timer.elapsed() simple_direct_f = simple_direct.f_calc() else: cpu_time = 0 simple_time = 0 timer = wall_clock_time() gpu_direct = xs.structure_factors(d_min=d_min, algorithm=cuda_platform) gpu_time = timer.elapsed() gpu_direct_f = gpu_direct.f_calc() gpu_amplitude = gpu_direct_f.as_amplitude_array() sum_amp = flex.sum(gpu_amplitude.data()) timer = wall_clock_time() gpuf_direct = xs.structure_factors(d_min=d_min, algorithm=cuda_platform_float) gpuf_time = timer.elapsed() gpuf_direct_f = gpuf_direct.f_calc() gpuf_amplitude = gpuf_direct_f.as_amplitude_array() abs_diff = flex.abs(gpuf_amplitude.data() - gpu_amplitude.data()) sum_diff = flex.sum(abs_diff) gpuf_Rfactor = 100. * sum_diff / sum_amp timer = wall_clock_time() fft_algorithm = xs.structure_factors(d_min=d_min, algorithm="fft") fft_time = timer.elapsed() fft_f = fft_algorithm.f_calc() fft_amplitude = fft_f.as_amplitude_array() abs_diff = flex.abs(fft_amplitude.data() - gpu_amplitude.data()) sum_diff = flex.sum(abs_diff) fft_Rfactor = 100. * sum_diff / sum_amp times.append( (number_of_reflections, cpu_time, d_min, gpu_time, gpuf_time, gpuf_Rfactor, simple_time, fft_time, fft_Rfactor)) # doesn't assert correctly: assert approx_equal(cpu_direct_f.data(), fft_f.data()) if direct_reference: assert approx_equal(cpu_direct_f.data(), gpu_direct_f.data(), eps=1e-6) assert approx_equal(cpu_direct_f.data(), simple_direct_f.data(), eps=1e-6) show_times_vs_complexity(times, header="run time vs. # reflections")