예제 #1
0
    def setUp(self):
        """
        Set up problem.
        """

        import numpy.random as rnd
        rnd.seed(1)
        self.inputs = samp.sample_set(1)
        self.outputs = samp.sample_set(1)
        self.lam_domain = np.zeros((1, 2))
        self.lam_domain[:, 0] = 0.0
        self.lam_domain[:, 1] = 1.0
        self.inputs.set_domain(self.lam_domain)
        self.inputs.set_values(rnd.rand(100,))
        self.num_l_emulate = 1001
        self.inputs = bsam.random_sample_set('r',
                                             self.inputs.get_domain(), num_samples=1001, globalize=True)
        self.outputs.set_values(2.0*self.inputs._values)
        Q_ref = np.mean(self.outputs._values, axis=0)
        self.inputs_emulated = bsam.random_sample_set('r',
                                                      self.inputs.get_domain(), num_samples=self.num_l_emulate,
                                                      globalize=True)
        self.output_prob = simpleFunP.regular_partition_uniform_distribution_rectangle_scaled(
            self.outputs, Q_ref=Q_ref, rect_scale=0.2, cells_per_dimension=1)
        self.disc = samp.discretization(input_sample_set=self.inputs,
                                        output_sample_set=self.outputs,
                                        output_probability_set=self.output_prob,
                                        emulated_input_sample_set=self.inputs_emulated)
예제 #2
0
    def setUp(self):
        """
        Set up problem.
        """

        import numpy.random as rnd
        rnd.seed(1)
        self.inputs = samp.sample_set(1)
        self.outputs = samp.sample_set(1)
        self.lam_domain = np.zeros((1, 2))
        self.lam_domain[:, 0] = 0.0
        self.lam_domain[:, 1] = 1.0
        self.inputs.set_domain(self.lam_domain)
        self.inputs.set_values(rnd.rand(100, ))
        self.num_l_emulate = 1001
        self.inputs = bsam.random_sample_set('r',
                                             self.inputs.get_domain(),
                                             num_samples=1001,
                                             globalize=True)
        self.outputs.set_values(2.0 * self.inputs._values)
        Q_ref = np.mean(self.outputs._values, axis=0)
        self.inputs_emulated = bsam.random_sample_set(
            'r',
            self.inputs.get_domain(),
            num_samples=self.num_l_emulate,
            globalize=True)
        self.output_prob = simpleFunP.regular_partition_uniform_distribution_rectangle_scaled(
            self.outputs, Q_ref=Q_ref, rect_scale=0.2, cells_per_dimension=1)
        self.disc = samp.discretization(
            input_sample_set=self.inputs,
            output_sample_set=self.outputs,
            output_probability_set=self.output_prob,
            emulated_input_sample_set=self.inputs_emulated)
예제 #3
0
 def Test_linears(self):
     """
     Test for piecewise linears.
     """
     iss = bsam.random_sample_set(
         'r',
         self.sur.input_disc._input_sample_set._domain,
         num_samples=20,
         globalize=False)
     sur_disc = self.sur.generate_for_input_set(iss, order=1)
     sur_disc.check_nums()
     self.assertEqual(sur_disc._output_sample_set._dim, 2)
     nptest.assert_array_equal(
         sur_disc._input_sample_set._domain,
         self.sur.input_disc._input_sample_set._domain)
     sur_disc._input_sample_set._values_local[0, :]
     s_set = sur_disc._input_sample_set.copy()
     sur_disc.set_io_ptr()
     regions_local = np.equal(sur_disc._io_ptr_local, 0)
     s_set.set_region_local(regions_local)
     s_set.local_to_global()
     s_set.check_num()
     self.sur.calculate_prob_for_sample_set_region(s_set,
                                                   regions=[0],
                                                   update_input=True)
예제 #4
0
def unit_center_set(dim=1, num_samples=100, delta=1, reg=False):
    r"""
    Make a unit hyper-rectangle sample set with positive probability
    inside an inscribed hyper-rectangle that has sidelengths delta,
    with its center at `np.array([[0.5]]*dim).
    (Useful for testing).

    :param int dim: dimension
    :param int num_samples: number of samples
    :param float delta: sidelength of region with positive probability
    :param bool reg: regular sampling (`num_samples` = per dimension)
    :rtype: :class:`bet.sample.sample_set`
    :returns: sample set object

    """
    s_set = sample.sample_set(dim)
    s_set.set_domain(np.array([[0, 1]] * dim))
    if reg:
        s = bsam.regular_sample_set(s_set, num_samples)
    else:
        s = bsam.random_sample_set('r', s_set, num_samples)
    dd = delta / 2.0
    if dim > 1:
        probs = 1 * (np.sum(np.logical_and(s._values <=
                                           (0.5 + dd), s._values >=
                                           (0.5 - dd)),
                            axis=1) >= dim)
    else:
        probs = 1 * (np.logical_and(s._values <= (0.5 + dd), s._values >=
                                    (0.5 - dd)))
    s.set_probabilities(probs / np.sum(probs))  # uniform probabilities
    s.estimate_volume_mc()
    s.global_to_local()
    return s
예제 #5
0
def unit_top_set(dim=1, num_samples=100, delta=1, reg=False):
    r"""
    First define a unit hyper-box sample set. Then, construct a hyper-box
    with a corner at ``np.array([[1.0]]*dim)`` with side-lengths ``delta``
    inside of this domain that has probability 1.
    (Useful for testing).

    :param int dim: dimension
    :param int num_samples: number of samples
    :param float delta: sidelength of region with positive probability
    :param bool reg: regular sampling (`num_samples` = per dimension)
    :rtype: :class:`bet.sample.sample_set`
    :returns: sample set object

    """
    s_set = sample.sample_set(dim)
    s_set.set_domain(np.array([[0, 1]] * dim))
    if reg:
        s = bsam.regular_sample_set(s_set, num_samples)
    else:
        s = bsam.random_sample_set('r', s_set, num_samples)

    dd = delta
    if dim == 1:
        probs = 1 * (s._values >= (1 - dd))
    else:
        probs = 1 * (np.sum(s._values >= (1 - dd), axis=1) >= dim)
    s.set_probabilities(probs / np.sum(probs))  # uniform probabilities
    s.estimate_volume_mc()
    s.global_to_local()
    return s
예제 #6
0
def compare(left_set, right_set, num_mc_points=1000, choice='input'):
    r"""
    This is a convience function to quickly instantiate and return
    a `~bet.postProcess.comparison` object.

    .. seealso::

        :class:`bet.compareP.comparison`
        :meth:`bet.compareP.compare_inputs`
        :meth:`bet.compareP.compare_outputs`

    :param left set: sample set in left position
    :type left set: :class:`bet.sample.sample_set_base`
    :param right set: sample set in right position
    :type right set: :class:`bet.sample.sample_set_base`
    :param int num_mc_points: number of values of sample set to return
    :param choice: If discretization, choose 'input' (default) or 'output'
    :type choice: string

    :rtype: :class:`~bet.postProcess.compareP.comparison`
    :returns: comparison object

    """
    # extract sample set
    if isinstance(left_set, samp.discretization):
        msg = 'Discretization passed. '
        if choice == 'input':
            msg += 'Using input sample set.'
            left_set = left_set.get_input_sample_set()
        else:
            msg += 'Using output sample set.'
            left_set = left_set.get_output_sample_set()
        logging.info(msg)

    if isinstance(right_set, samp.discretization):
        msg = 'Discretization passed. '
        if choice == 'input':
            msg += 'Using input sample set.'
            right_set = right_set.get_input_sample_set()
        else:
            msg += 'Using output sample set.'
            right_set = right_set.get_output_sample_set()
        logging.info(msg)

    if not num_mc_points > 0:
        raise ValueError("Please specify positive num_mc_points")

    # make integration sample set
    assert left_set.get_dim() == right_set.get_dim()
    assert np.array_equal(left_set.get_domain(), right_set.get_domain())
    comp_set = samp.sample_set(left_set.get_dim())
    comp_set.set_domain(right_set.get_domain())
    comp_set = bsam.random_sample_set('r', comp_set, num_mc_points)

    # to be generating a new random sample set pass an integer argument
    comp = comparison(comp_set, left_set, right_set)

    return comp
예제 #7
0
파일: Q_1D.py 프로젝트: outsidercherry/BET
def postprocess(station_nums, ref_num):

    filename = 'P_q' + str(station_nums[0] + 1) + '_q'
    if len(station_nums) == 3:
        filename += '_q' + str(station_nums[2] + 1)
    filename += '_ref_' + str(ref_num + 1)

    data = Q[:, station_nums]
    output_sample_set = sample.sample_set(data.shape[1])
    output_sample_set.set_values(data)
    q_ref = Q_ref[ref_num, station_nums]

    # Create Simple function approximation
    # Save points used to parition D for simple function approximation and the
    # approximation itself (this can be used to make close comparisions...)
    output_probability_set = sfun.regular_partition_uniform_distribution_rectangle_scaled(
        output_sample_set, q_ref, rect_scale=0.15,
        cells_per_dimension=np.ones((data.shape[1],)))

    num_l_emulate = 1e4
    set_emulated = bsam.random_sample_set('r', lam_domain, num_l_emulate)
    my_disc = sample.discretization(input_sample_set, output_sample_set,
                                    output_probability_set, emulated_input_sample_set=set_emulated)

    print("Finished emulating lambda samples")

    # Calculate P on lambda emulate
    print("Calculating prob_on_emulated_samples")
    calcP.prob_on_emulated_samples(my_disc)
    sample.save_discretization(
        my_disc,
        filename,
        "prob_on_emulated_samples_solution")

    # Calclate P on the actual samples with assumption that voronoi cells have
    # equal size
    input_sample_set.estimate_volume_mc()
    print("Calculating prob")
    calcP.prob(my_disc)
    sample.save_discretization(my_disc, filename, "prob_solution")

    # Calculate P on the actual samples estimating voronoi cell volume with MC
    # integration
    calcP.prob_with_emulated_volumes(my_disc)
    print("Calculating prob_with_emulated_volumes")
    sample.save_discretization(
        my_disc,
        filename,
        "prob_with_emulated_volumes_solution")
예제 #8
0
파일: Q_1D.py 프로젝트: leiyangcq/BET
def postprocess(station_nums, ref_num):
    
    filename = 'P_q'+str(station_nums[0]+1)+'_q'
    if len(station_nums) == 3:
        filename += '_q'+str(station_nums[2]+1)
    filename += '_ref_'+str(ref_num+1)

    data = Q[:, station_nums]
    output_sample_set = sample.sample_set(data.shape[1])
    output_sample_set.set_values(data)
    q_ref = Q_ref[ref_num, station_nums]

    # Create Simple function approximation
    # Save points used to parition D for simple function approximation and the
    # approximation itself (this can be used to make close comparisions...)
    output_probability_set = sfun.regular_partition_uniform_distribution_rectangle_scaled(\
            output_sample_set, q_ref, rect_scale=0.15,
            cells_per_dimension=np.ones((data.shape[1],)))

    num_l_emulate = 1e4
    set_emulated = bsam.random_sample_set('r', lam_domain, num_l_emulate)
    my_disc = sample.discretization(input_sample_set, output_sample_set,
            output_probability_set, emulated_input_sample_set=set_emulated)

    print "Finished emulating lambda samples"

    # Calculate P on lambda emulate
    print "Calculating prob_on_emulated_samples"
    calcP.prob_on_emulated_samples(my_disc)
    sample.save_discretization(my_disc, filename, "prob_on_emulated_samples_solution")

    # Calclate P on the actual samples with assumption that voronoi cells have
    # equal size
    input_sample_set.estimate_volume_mc()
    print "Calculating prob"
    calcP.prob(my_disc)
    sample.save_discretization(my_disc, filename, "prob_solution")

    # Calculate P on the actual samples estimating voronoi cell volume with MC
    # integration
    calcP.prob_with_emulated_volumes(my_disc)
    print "Calculating prob_with_emulated_volumes"
    sample.save_discretization(my_disc, filename, "prob_with_emulated_volumes_solution")
예제 #9
0
    def setUp(self):
        self.inputs = samp.sample_set(3)
        self.outputs = samp.sample_set(2)
        self.inputs.set_values(np.loadtxt(data_path + "/3to2_samples.txt.gz"))
        self.outputs.set_values(np.loadtxt(data_path + "/3to2_data.txt.gz"))
        Q_ref = np.array([0.422, 0.9385])
        self.output_prob = simpleFunP.regular_partition_uniform_distribution_rectangle_scaled(
            self.outputs, Q_ref=Q_ref, rect_scale=0.2, cells_per_dimension=1)

        self.inputs.set_domain(np.array([[0.0, 1.0],
                                         [0.0, 1.0],
                                         [0.0, 1.0]]))
        import numpy.random as rnd
        rnd.seed(1)
        self.inputs_emulated = bsam.random_sample_set('r',
                                                      self.inputs.get_domain(), num_samples=1001, globalize=True)
        self.disc = samp.discretization(input_sample_set=self.inputs,
                                        output_sample_set=self.outputs,
                                        output_probability_set=self.output_prob,
                                        emulated_input_sample_set=self.inputs_emulated)
예제 #10
0
 def Test_linears(self):
     """
     Test for piecewise linears.
     """
     iss = bsam.random_sample_set('r',
                                  self.sur.input_disc._input_sample_set._domain,
                                  num_samples = 10,
                                  globalize=False)
     sur_disc = self.sur.generate_for_input_set(iss, order=1)
     sur_disc.check_nums()
     self.assertEqual(sur_disc._output_sample_set._dim, 2)
     nptest.assert_array_equal(sur_disc._input_sample_set._domain,
                               self.sur.input_disc._input_sample_set._domain)
     sur_disc._input_sample_set._values_local[0,:]
     s_set = sur_disc._input_sample_set.copy()
     sur_disc.set_io_ptr()
     regions_local = np.equal(sur_disc._io_ptr_local, 0)
     s_set.set_region_local(regions_local)
     s_set.local_to_global()
     s_set.check_num()
     self.sur.calculate_prob_for_sample_set_region(s_set, 
                                                   regions=[0],
                                                   update_input=True)
'''
This script solves a poisson equation with a random field.
  (\grad \dot (rand_field \grad(u)) = -f)
The random field is approximated using simple functions
'''

# Load all the data that are fixed for this problem
execfile("examples/Porous_Media_SimpleFuncs/loadData.py")

# create a simple function object
rect_simple_func = rectSimpleFunc(mesh, partition, dimension)

param_dim = rect_simple_func.num_basis
lam_domain = np.repeat([[1.0, 2.0]], param_dim, axis=0)

inp_samples = bs.random_sample_set(r, lam_domain, numSamplesSimple)

coeff_samples = inp_samples.get_values()
coeff_samples = coeff_samples.transpose()
print np.shape(coeff_samples)

# coeff_samples = calculateP.emulate_iid_lebesgue(lam_domain=lam_domain,
# num_l_emulate=numSamplesSimple)
# coeff_samples = coeff_samples.transpose()
"""
for each sample of the coefficients, generate the simple function
field and solve the pde.
"""

print " Start sampling simple functions "
for i in range(0, numSamplesSimple):
예제 #12
0
# Interface BET to the approximate model and create discretization object.
sampler = bsam.sampler(lb_model, error_estimates=True, jacobians=True)
input_samples = samp.sample_set(3)
input_samples.set_domain(np.array([[0.0, 1.0],
                                   [0.0, 1.0],
                                   [0.0, 1.0]]))
my_disc = sampler.create_random_discretization("random", input_samples, num_samples=1000)

# Define output probability
rect_domain = np.array([[0.5, 1.5], [1.25, 2.25]])
simpleFunP.regular_partition_uniform_distribution_rectangle_domain( data_set=my_disc, rect_domain=rect_domain)

# Make emulated input sets
emulated_inputs = bsam.random_sample_set('r',
                                         my_disc._input_sample_set._domain,
                                         num_samples = 10001,
                                         globalize=False)

emulated_inputs2 = bsam.random_sample_set('r',
                                         my_disc._input_sample_set._domain,
                                         num_samples = 10001,
                                          globalize=False)


# Make exact discretization
my_disc_exact = my_disc.copy()
my_disc_exact._output_sample_set._values_local = my_disc._output_sample_set._values_local + my_disc._output_sample_set._error_estimates_local
my_disc_exact._output_sample_set._error_estimates_local = np.zeros(my_disc_exact._output_sample_set._error_estimates_local.shape)
my_disc_exact._output_sample_set.local_to_global()
my_disc_exact.set_emulated_input_sample_set(emulated_inputs2)
예제 #13
0
# Interface BET to the approximate model and create discretization object.
sampler = bsam.sampler(lb_model, error_estimates=True, jacobians=True)
input_samples = samp.sample_set(3)
input_samples.set_domain(np.array([[0.0, 1.0], [0.0, 1.0], [0.0, 1.0]]))
my_disc = sampler.create_random_discretization("random",
                                               input_samples,
                                               num_samples=1000)

# Define output probability
rect_domain = np.array([[0.5, 1.5], [1.25, 2.25]])
simpleFunP.regular_partition_uniform_distribution_rectangle_domain(
    data_set=my_disc, rect_domain=rect_domain)

# Make emulated input sets
emulated_inputs = bsam.random_sample_set('r',
                                         my_disc._input_sample_set._domain,
                                         num_samples=10001,
                                         globalize=False)

emulated_inputs2 = bsam.random_sample_set('r',
                                          my_disc._input_sample_set._domain,
                                          num_samples=10001,
                                          globalize=False)

# Make exact discretization
my_disc_exact = my_disc.copy()
my_disc_exact._output_sample_set._values_local = my_disc._output_sample_set._values_local + my_disc._output_sample_set._error_estimates_local
my_disc_exact._output_sample_set._error_estimates_local = np.zeros(
    my_disc_exact._output_sample_set._error_estimates_local.shape)
my_disc_exact._output_sample_set.local_to_global()
my_disc_exact.set_emulated_input_sample_set(emulated_inputs2)
'''
This script solves a poisson equation with a random field.
  (\grad \dot (rand_field \grad(u)) = -f)
The random field is approximated using simple functions
'''

# Load all the data that are fixed for this problem
execfile("examples/Porous_Media_SimpleFuncs/loadData.py")

# create a simple function object
rect_simple_func = rectSimpleFunc(mesh, partition, dimension)

param_dim = rect_simple_func.num_basis
lam_domain = np.repeat([[1.0, 2.0]], param_dim, axis=0)

inp_samples = bs.random_sample_set(r, lam_domain, numSamplesSimple)

coeff_samples = inp_samples.get_values()
coeff_samples = coeff_samples.transpose()
print np.shape(coeff_samples)

# coeff_samples = calculateP.emulate_iid_lebesgue(lam_domain=lam_domain,
                                                # num_l_emulate=numSamplesSimple)
# coeff_samples = coeff_samples.transpose()

"""
for each sample of the coefficients, generate the simple function
field and solve the pde.
"""

print " Start sampling simple functions "