示例#1
0
    def Test_model_error(self):
        """
        Testing :meth:`bet.calculateP.calculateError.model_error`
        """
        num = self.disc.check_nums()
        m_error = calculateError.model_error(self.disc)
        er_est = m_error.calculate_for_contour_events()

        s_set = self.disc._input_sample_set.copy()
        regions_local = np.equal(self.disc._io_ptr_local, 0)
        s_set.set_region_local(regions_local)
        s_set.local_to_global()
        er_est2 = m_error.calculate_for_sample_set_region(s_set, 1)
        self.assertAlmostEqual(er_est[0], er_est2)
        error_id_sum_local = np.sum(
            self.disc._input_sample_set._error_id_local)
        error_id_sum = comm.allreduce(error_id_sum_local, op=MPI.SUM)
        self.assertAlmostEqual(er_est2, error_id_sum)

        emulated_set = self.disc._input_sample_set
        er_est3 = m_error.calculate_for_sample_set_region(
            s_set, 1, emulated_set=emulated_set)
        self.assertAlmostEqual(er_est[0], er_est3)
        self.disc.set_emulated_input_sample_set(self.disc._input_sample_set)
        m_error = calculateError.model_error(self.disc)
        er_est4 = m_error.calculate_for_sample_set_region(s_set, 1)
        self.assertAlmostEqual(er_est[0], er_est4)
示例#2
0
    def Test_model_error(self):
        """
        Testing :meth:`bet.calculateP.calculateError.model_error`
        """
        num = self.disc.check_nums()
        m_error = calculateError.model_error(self.disc)
        er_est = m_error.calculate_for_contour_events()

        s_set = self.disc._input_sample_set.copy()
        regions_local = np.equal(self.disc._io_ptr_local, 0)
        s_set.set_region_local(regions_local)
        s_set.local_to_global()
        er_est2 = m_error.calculate_for_sample_set_region(s_set,
                                                          1)
        self.assertAlmostEqual(er_est[0], er_est2)
        error_id_sum_local = np.sum(
            self.disc._input_sample_set._error_id_local)
        error_id_sum = comm.allreduce(error_id_sum_local, op=MPI.SUM)
        self.assertAlmostEqual(er_est2, error_id_sum)

        emulated_set = self.disc._input_sample_set
        er_est3 = m_error.calculate_for_sample_set_region(s_set,
                                                          1,
                                                          emulated_set=emulated_set)
        self.assertAlmostEqual(er_est[0], er_est3)
        self.disc.set_emulated_input_sample_set(self.disc._input_sample_set)
        m_error = calculateError.model_error(self.disc)
        er_est4 = m_error.calculate_for_sample_set_region(s_set,
                                                          1)
        self.assertAlmostEqual(er_est[0], er_est4)
示例#3
0
    def calculate_prob_for_sample_set_region(self,
                                             s_set,
                                             regions,
                                             update_input=True):
        """
        Solves stochastic inverse problem based on surrogate points and the
        MC assumption. Calculates the probability of a regions of input space
        and error estimates for those probabilities.

        :param: s_set: sample set for which to calculate error
        :type s_set: :class:`bet.sample.sample_set_base`
        :param region: list of regions of s_set for which to calculate error
        :type region: list
        :param update_input: whether or not to update probabilities and
            errror identifiers for input discretization
        :type update_input: bool

        :rtype: tuple
        :returns: (probabilities, ``error_estimates``), the probability and
            error estimates for the region
        
        """
        if not hasattr(self, 'surrogate_discretization'):
            msg = "surrogate discretization has not been created"
            raise calculateError.wrong_argument_type(msg)
        if not isinstance(s_set, sample.sample_set_base):
            msg = "s_set must be of type bet.sample.sample_set_base"
            raise calculateError.wrong_argument_type(msg)

        # Calculate probability of region
        if self.surrogate_discretization._input_sample_set._volumes_local\
                is None:
            self.surrogate_discretization._input_sample_set.\
                    estimate_volume_mc(globalize=False)
        calculateP.prob(self.surrogate_discretization, globalize=False)
        prob_new_values = calculateP.prob_from_sample_set(\
                self.surrogate_discretization._input_sample_set, s_set)

        # Calculate for each region
        probabilities = []
        error_estimates = []
        for region in regions:
            marker = np.equal(s_set._region, region)
            probability = np.sum(prob_new_values[marker])

            # Calculate error estimate for region
            model_error = calculateError.model_error(\
                    self.surrogate_discretization)
            error_estimate = model_error.calculate_for_sample_set_region_mc(\
                    s_set, region)
            probabilities.append(probability)
            error_estimates.append(error_estimate)
        # Update input only if 1 region is given
        if update_input:
            num = self.input_disc._input_sample_set.check_num()
            prob = np.zeros((num, ))
            error_id = np.zeros((num, ))
            for i in range(num):
                Itemp = np.equal(self.dummy_disc._emulated_ii_ptr_local, i)
                prob_sum = np.sum(self.surrogate_discretization.\
                        _input_sample_set._probabilities_local[Itemp])
                prob[i] = comm.allreduce(prob_sum, op=MPI.SUM)
                error_id_sum = np.sum(self.surrogate_discretization.\
                        _input_sample_set._error_id_local[Itemp])
                error_id[i] = comm.allreduce(error_id_sum, op=MPI.SUM)
            self.input_disc._input_sample_set.set_probabilities(prob)
            self.input_disc._input_sample_set.set_error_id(error_id)

        return (probabilities, error_estimates)
示例#4
0
    def calculate_prob_for_sample_set_region(self, s_set, 
                                             regions, update_input=True):
        """
        Solves stochastic inverse problem based on surrogate points and the
        MC assumption. Calculates the probability of a regions of input space
        and error estimates for those probabilities.

        :param: s_set: sample set for which to calculate error
        :type s_set: :class:`bet.sample.sample_set_base`
        :param region: list of regions of s_set for which to calculate error
        :type region: list
        :param update_input: whether or not to update probabilities and
            errror identifiers for input discretization
        :type update_input: bool

        :rtype: tuple
        :returns: (probabilities, ``error_estimates``), the probability and
            error estimates for the region
        
        """
        if not hasattr(self, 'surrogate_discretization'):
            msg = "surrogate discretization has not been created"
            raise calculateError.wrong_argument_type(msg)
        if not isinstance(s_set, sample.sample_set_base):
            msg = "s_set must be of type bet.sample.sample_set_base"
            raise calculateError.wrong_argument_type(msg)
            
        # Calculate probability of region 
        if self.surrogate_discretization._input_sample_set._volumes_local\
                is None:
            self.surrogate_discretization._input_sample_set.\
                    estimate_volume_mc(globalize=False)
        calculateP.prob(self.surrogate_discretization, globalize=False)
        prob_new_values = calculateP.prob_from_sample_set(\
                self.surrogate_discretization._input_sample_set, s_set)
        
        # Calculate for each region
        probabilities = []
        error_estimates = []
        for region in regions:
            marker = np.equal(s_set._region, region)
            probability = np.sum(prob_new_values[marker])

            # Calculate error estimate for region
            model_error = calculateError.model_error(\
                    self.surrogate_discretization)
            error_estimate = model_error.calculate_for_sample_set_region_mc(\
                    s_set, region)
            probabilities.append(probability)
            error_estimates.append(error_estimate)
        # Update input only if 1 region is given
        if update_input:
            num = self.input_disc._input_sample_set.check_num()
            prob = np.zeros((num,))
            error_id = np.zeros((num,))
            for i in range(num):
                Itemp = np.equal(self.dummy_disc._emulated_ii_ptr_local, i)
                prob_sum = np.sum(self.surrogate_discretization.\
                        _input_sample_set._probabilities_local[Itemp])
                prob[i] = comm.allreduce(prob_sum, op=MPI.SUM)
                error_id_sum = np.sum(self.surrogate_discretization.\
                        _input_sample_set._error_id_local[Itemp])
                error_id[i] = comm.allreduce(error_id_sum, op=MPI.SUM)
            self.input_disc._input_sample_set.set_probabilities(prob)
            self.input_disc._input_sample_set.set_error_id(error_id)
                    
        return (probabilities, error_estimates)
P_approx  = calculateP.prob_from_sample_set(my_disc._input_sample_set,
                                             s_set)[0]
if comm.rank == 0:
    print "Approximate probability: ",  P_approx

# Calculate sampling error
samp_er = calculateError.sampling_error(my_disc)
(up, low) = samp_er.calculate_for_sample_set_region(s_set, 
                                                    region=0, emulated_set=emulated_inputs)
if comm.rank == 0:
    print "Sampling error upper bound: ", up
    print "Sampling error lower bound: ", low


# Calculate modeling error
mod_er = calculateError.model_error(my_disc)
er_est = mod_er.calculate_for_sample_set_region(s_set, 
                    region=0, emulated_set=emulated_inputs)
if comm.rank == 0:
    print "Modeling error estimate: ", er_est

# Make piecewise constant surrogate of discretization
sur = surrogates.piecewise_polynomial_surrogate(my_disc)
sur_disc_constant = sur.generate_for_input_set(emulated_inputs, order=0)
# Calculate probability and error estimate
(P2, er_est2) = sur.calculate_prob_for_sample_set_region(s_set, 
                                                         regions=[0])
if comm.rank == 0:
    print "Piecewise constant surrogate probability: ", P2[0]
    print "Piecewise constant error estimate ",  er_est2[0]
    print "Piecewise constant corrected probability: ", P2[0]-er_est2[0]
P_approx = calculateP.prob_from_sample_set(my_disc._input_sample_set, s_set)[0]
if comm.rank == 0:
    print "Approximate probability: ", P_approx

# Calculate sampling error
samp_er = calculateError.sampling_error(my_disc)
(up,
 low) = samp_er.calculate_for_sample_set_region(s_set,
                                                region=0,
                                                emulated_set=emulated_inputs)
if comm.rank == 0:
    print "Sampling error upper bound: ", up
    print "Sampling error lower bound: ", low

# Calculate modeling error
mod_er = calculateError.model_error(my_disc)
er_est = mod_er.calculate_for_sample_set_region(s_set,
                                                region=0,
                                                emulated_set=emulated_inputs)
if comm.rank == 0:
    print "Modeling error estimate: ", er_est

# Make piecewise constant surrogate of discretization
sur = surrogates.piecewise_polynomial_surrogate(my_disc)
sur_disc_constant = sur.generate_for_input_set(emulated_inputs, order=0)
# Calculate probability and error estimate
(P2, er_est2) = sur.calculate_prob_for_sample_set_region(s_set, regions=[0])
if comm.rank == 0:
    print "Piecewise constant surrogate probability: ", P2[0]
    print "Piecewise constant error estimate ", er_est2[0]
    print "Piecewise constant corrected probability: ", P2[0] - er_est2[0]