def test_exception_invalid_distribution_function(): """ Ensure an exception is thrown if the provided function does not return the expected data type. """ def invalid_distribution_function(): return [1, 2, 3] with pytest.raises(TypeError): invalid_sampler = RandomInput(invalid_distribution_function) invalid_sampler.draw_samples(5)
def test_extra_distribution_function_parameters(): """ Test ability to specify optional distribution function parameters. """ np.random.seed(1) normal_sampler = RandomInput(np.random.normal, loc=1.) sample = normal_sampler.draw_samples(100) assert isinstance(sample, np.ndarray) assert sample.shape == (100, 1) assert np.abs(np.mean(sample) - 1.) < .2
def test_distribution_exception_if_size_parameter_not_accepted(): """ Ensure an exception occurs if the distribution function does not accept a size parameter. """ def invalid_distribution_function(): return np.zeros(5) invalid_input = \ RandomInput(distribution_function=invalid_distribution_function) with pytest.raises(TypeError): invalid_input.draw_samples(10)
def test_init_invalid_input(): """ Ensure an exception is raised if an object that is not a function is provided. """ with pytest.raises(TypeError): RandomInput(1)
def beta_distribution_input(): """ Creates a RandomInput object that produces samples from a beta distribution. """ np.random.seed(1) def beta_distribution(shift, scale, alpha, beta, size): return shift + scale * np.random.beta(alpha, beta, size) return RandomInput(distribution_function=beta_distribution, shift=1.0, scale=2.5, alpha=3., beta=2.)
def test_setting_random_seed(): """ Test setting of random seed by taking samples, resetting seed, then drawing again to see if the samples match. """ random_input = RandomInput(np.random.uniform, random_seed=1) num_samples = 5 samples1 = np.zeros(num_samples) samples2 = np.zeros(num_samples) for i in range(num_samples): samples1[i] = random_input.draw_samples(1) random_input.reset_sampling() for i in range(num_samples): samples2[i] = random_input.draw_samples(1) assert np.array_equal(samples1, samples2)
def random_input(): """ Creates a RandomInput object that produces samples from a uniform distribution. """ return RandomInput()
on level 0 and level 1. This provides the reference solution for the test: "test_hard_coded_spring_mass_random_input" ''' # Step 1 - Define random variable for spring stiffness: # Need to provide a sampleable function to create RandomInput instance in MLMCPy np.random.seed(1) def beta_distribution(shift, scale, alpha, beta, size): return shift + scale * np.random.beta(alpha, beta, size) stiffness_distribution = RandomInput(distribution_function=beta_distribution, shift=1.0, scale=2.5, alpha=3., beta=2.) # Step 2 - Initialize spring-mass models. Here using three levels with MLMC. # defined by different time steps model_level1 = SpringMassModel(mass=1.5, time_step=1.0, cost=1.0) model_level2 = SpringMassModel(mass=1.5, time_step=0.1, cost=10.0) # Step 3 - Initialize MLMC & predict max displacement to specified error. #These numbers were generated for epsilon=0.1 N0 = 1113 N1 = 34 #Level 0
in files as inputs. p ''' # Step 1 - Define random variable for spring stiffness: # Need to provide a sampleable function to create RandomInput instance in MLMCPy def beta_distribution(shift, scale, alpha, beta, size): return shift + scale * np.random.beta(alpha, beta, size) np.random.seed(1) stiffness_distribution = RandomInput(distribution_function=beta_distribution, shift=1.0, scale=2.5, alpha=3., beta=2., random_seed=1) # Step 2: Run standard Monte Carlo to generate a reference solution and target # precision num_samples = 5000 model = SpringMassModel(mass=1.5, time_step=0.01) input_samples = stiffness_distribution.draw_samples(num_samples) output_samples_mc = np.zeros(num_samples) start_mc = timeit.default_timer() for i, sample in enumerate(input_samples): output_samples_mc[i] = model.evaluate([sample])