def exercise_variate_generators(): from scitbx.random \ import variate, normal_distribution, bernoulli_distribution, \ gamma_distribution, poisson_distribution for i in range(10): scitbx.random.set_random_seed(0) g = variate(normal_distribution()) assert approx_equal(g(), -0.917787219374) assert approx_equal( g(10), (1.21838707856, 1.732426915, 0.838038157555, -0.296895169923, 0.246451144946, -0.635474652255, -0.0980626986425, 0.36458295417, 0.534073780268, -0.665073136294)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 0, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) assert approx_equal(stat.skew, 0, eps=0.005) assert approx_equal(stat.kurtosis, 3, eps=0.005) bernoulli_seq = variate(bernoulli_distribution(0.1)) for b in itertools.islice(bernoulli_seq, 10): assert b in (True, False) bernoulli_sample = flex.bool(itertools.islice(bernoulli_seq, 10000)) assert approx_equal(bernoulli_sample.count(True) / len(bernoulli_sample), 0.1, eps=0.01) # Boost 1.64 changes the exponential distribution to use Ziggurat algorithm scitbx.random.set_random_seed(0) g = variate(gamma_distribution()) if (boost_version < 106400): assert approx_equal(g(), 0.79587450456577546) assert approx_equal(g(2), (0.89856038848394115, 1.2559307580473893)) else: assert approx_equal(g(), 0.864758191783) assert approx_equal(g(2), (1.36660841837, 2.26740986094)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 1, eps=0.005) assert approx_equal(stat.skew, 2, eps=0.01) assert approx_equal(stat.biased_variance, 1, eps=0.005) scitbx.random.set_random_seed(0) g = variate(gamma_distribution(alpha=2, beta=3)) assert approx_equal(g(), 16.670850592722729) assert approx_equal(g(2), (10.03662877519449, 3.9357158398972873)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 6, eps=0.005) assert approx_equal(stat.skew, 2 / math.sqrt(2), eps=0.05) assert approx_equal(stat.biased_variance, 18, eps=0.05) mean = 10.0 pv = variate(poisson_distribution(mean)) draws = pv(1000000).as_double() m = flex.mean(draws) v = flex.mean(draws * draws) - m * m assert approx_equal(m, mean, eps=0.05) assert approx_equal(v, mean, eps=0.05)
def exercise_variate_generators(): from scitbx.random \ import variate, normal_distribution, bernoulli_distribution, \ gamma_distribution, poisson_distribution for i in xrange(10): scitbx.random.set_random_seed(0) g = variate(normal_distribution()) assert approx_equal(g(), -1.2780081289048213) assert approx_equal(g(10), (-0.40474189234755492, -0.41845505596083288, -1.8825790263067721, -1.5779112018107659, -1.1888174422378859, -1.8619619179878537, -0.53946818661388318, -1.2400941724410812, 0.64511959841907285, -0.59934120033270688)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 0, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) assert approx_equal(stat.skew, 0, eps=0.005) assert approx_equal(stat.kurtosis, 3, eps=0.005) bernoulli_seq = variate(bernoulli_distribution(0.1)) for b in itertools.islice(bernoulli_seq, 10): assert b in (True, False) bernoulli_sample = flex.bool(itertools.islice(bernoulli_seq, 10000)) assert approx_equal( bernoulli_sample.count(True)/len(bernoulli_sample), 0.1, eps = 0.01) scitbx.random.set_random_seed(0) g = variate(gamma_distribution()) assert approx_equal(g(), 0.79587450456577546) assert approx_equal(g(2), (0.89856038848394115, 1.2559307580473893)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 1, eps=0.005) assert approx_equal(stat.skew, 2, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) scitbx.random.set_random_seed(0) g = variate(gamma_distribution(alpha=2, beta=3)) assert approx_equal(g(), 16.670850592722729) assert approx_equal(g(2), (10.03662877519449, 3.9357158398972873)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 6, eps=0.005) assert approx_equal(stat.skew, 2/math.sqrt(2), eps=0.05) assert approx_equal(stat.biased_variance, 18, eps=0.05) mean = 10.0 pv = variate(poisson_distribution(mean)) draws = pv(1000000).as_double() m = flex.mean(draws) v = flex.mean(draws*draws) - m*m assert approx_equal(m,mean,eps=0.05) assert approx_equal(v,mean,eps=0.05)
def exercise_variate_generators(): from scitbx.random \ import variate, normal_distribution, bernoulli_distribution, \ gamma_distribution, poisson_distribution for i in xrange(10): scitbx.random.set_random_seed(0) g = variate(normal_distribution()) assert approx_equal(g(), -1.2780081289048213) assert approx_equal( g(10), (-0.40474189234755492, -0.41845505596083288, -1.8825790263067721, -1.5779112018107659, -1.1888174422378859, -1.8619619179878537, -0.53946818661388318, -1.2400941724410812, 0.64511959841907285, -0.59934120033270688)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 0, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) assert approx_equal(stat.skew, 0, eps=0.005) assert approx_equal(stat.kurtosis, 3, eps=0.005) bernoulli_seq = variate(bernoulli_distribution(0.1)) for b in itertools.islice(bernoulli_seq, 10): assert b in (True, False) bernoulli_sample = flex.bool(itertools.islice(bernoulli_seq, 10000)) assert approx_equal(bernoulli_sample.count(True) / len(bernoulli_sample), 0.1, eps=0.01) scitbx.random.set_random_seed(0) g = variate(gamma_distribution()) assert approx_equal(g(), 0.79587450456577546) assert approx_equal(g(2), (0.89856038848394115, 1.2559307580473893)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 1, eps=0.005) assert approx_equal(stat.skew, 2, eps=0.005) assert approx_equal(stat.biased_variance, 1, eps=0.005) scitbx.random.set_random_seed(0) g = variate(gamma_distribution(alpha=2, beta=3)) assert approx_equal(g(), 16.670850592722729) assert approx_equal(g(2), (10.03662877519449, 3.9357158398972873)) stat = basic_statistics(flex.double(itertools.islice(g, 1000000))) assert approx_equal(stat.mean, 6, eps=0.005) assert approx_equal(stat.skew, 2 / math.sqrt(2), eps=0.05) assert approx_equal(stat.biased_variance, 18, eps=0.05) mean = 10.0 pv = variate(poisson_distribution(mean)) draws = pv(1000000).as_double() m = flex.mean(draws) v = flex.mean(draws * draws) - m * m assert approx_equal(m, mean, eps=0.05) assert approx_equal(v, mean, eps=0.05)
def __init__(self, space_group_info, **kwds): libtbx.adopt_optional_init_args(self, kwds) self.space_group_info = space_group_info self.structure = random_structure.xray_structure( space_group_info, elements=self.elements, volume_per_atom=20., min_distance=1.5, general_positions_only=True, use_u_aniso=False, u_iso=adptbx.b_as_u(10), ) self.structure.set_inelastic_form_factors(1.54, "sasaki") self.scale_factor = 0.05 + 10 * flex.random_double() fc = self.structure.structure_factors(anomalous_flag=True, d_min=self.d_min, algorithm="direct").f_calc() fo = fc.as_amplitude_array() fo.set_observation_type_xray_amplitude() if self.use_students_t_errors: nu = random.uniform(1, 10) normal_g = variate(normal_distribution()) gamma_g = variate(gamma_distribution(0.5 * nu, 2)) errors = normal_g(fc.size()) / flex.sqrt(2 * gamma_g(fc.size())) else: # use gaussian errors g = variate(normal_distribution()) errors = g(fc.size()) fo2 = fo.as_intensity_array() self.fo2 = fo2.customized_copy( data=(fo2.data() + errors) * self.scale_factor, sigmas=flex.double(fc.size(), 1), ) self.fc = fc xs_i = self.structure.inverse_hand() self.fc_i = xs_i.structure_factors(anomalous_flag=True, d_min=self.d_min, algorithm="direct").f_calc() fo2_twin = self.fc.customized_copy( data=self.fc.data() + self.fc_i.data()).as_intensity_array() self.fo2_twin = fo2_twin.customized_copy( data=(errors + fo2_twin.data()) * self.scale_factor, sigmas=self.fo2.sigmas())
def __init__(self, space_group_info, **kwds): libtbx.adopt_optional_init_args(self, kwds) self.space_group_info = space_group_info self.structure = random_structure.xray_structure( space_group_info, elements=self.elements, volume_per_atom=20., min_distance=1.5, general_positions_only=True, use_u_aniso=False, u_iso=adptbx.b_as_u(10), ) self.structure.set_inelastic_form_factors(1.54, "sasaki") self.scale_factor = 0.05 + 10 * flex.random_double() fc = self.structure.structure_factors( anomalous_flag=True, d_min=self.d_min, algorithm="direct").f_calc() fo = fc.as_amplitude_array() fo.set_observation_type_xray_amplitude() if self.use_students_t_errors: nu = random.uniform(1, 10) normal_g = variate(normal_distribution()) gamma_g = variate(gamma_distribution(0.5*nu, 2)) errors = normal_g(fc.size())/flex.sqrt(2*gamma_g(fc.size())) else: # use gaussian errors g = variate(normal_distribution()) errors = g(fc.size()) fo2 = fo.as_intensity_array() self.fo2 = fo2.customized_copy( data=(fo2.data()+errors)*self.scale_factor, sigmas=flex.double(fc.size(), 1), ) self.fc = fc xs_i = self.structure.inverse_hand() self.fc_i = xs_i.structure_factors( anomalous_flag=True, d_min=self.d_min, algorithm="direct").f_calc() fo2_twin = self.fc.customized_copy( data=self.fc.data()+self.fc_i.data()).as_intensity_array() self.fo2_twin = fo2_twin.customized_copy( data=(errors + fo2_twin.data()) * self.scale_factor, sigmas=self.fo2.sigmas())