Пример #1
0
    def compute_mu_derived_trace(self, solution):
        from taurex.util.util import quantile_corner
        from taurex.constants import AMU
        sigma_frac = self._sigma_fraction
        self._sigma_fraction = 1.0
        mu_trace = []
        weights = []
        self.info('Computing derived mu......')
        disableLogging()
        for parameters, weight in self.sample_parameters(solution):
            self.update_model(parameters)
            self._model.initialize_profiles()
            mu_trace.append(self._model.chemistry.muProfile[0] / AMU)
            weights.append(weight)
        enableLogging()

        self.info('Done!')

        self._sigma_fraction = sigma_frac

        q_16, q_50, q_84 = \
            quantile_corner(np.array(mu_trace), [0.16, 0.5, 0.84],
                            weights=np.array(weights))

        mean = np.average(mu_trace, weights=weights, axis=0)

        mu_derived = {
            'value': q_50,
            'sigma_m': q_50 - q_16,
            'sigma_p': q_84 - q_50,
            'trace': mu_trace,
            'mean': mean
        }
        return mu_derived
Пример #2
0
        def sample_iter():
            for parameters, weight in sample_list[rank::size]:
                self.update_model(parameters)
                enableLogging()
                if rank == 0 and count % 10 == 0 and count > 0:

                    self.info('Progress {}%'.format(count * 100.0 /
                                                    (len(sample_list) / size)))
                disableLogging()
                yield weight
Пример #3
0
    def fit(self, output_size=OutputSize.heavy):
        import time
        """

        Performs fit.

        """
        from tabulate import tabulate
        self.compile_params()

        fit_names = self.fit_names
        fit_boundaries = self.fit_boundaries

        fit_min = [x[0] for x in fit_boundaries]
        fit_max = [x[1] for x in fit_boundaries]

        fit_values = self.fit_values
        self.info('')
        self.info('-------------------------------------')
        self.info('------Retrieval Parameters-----------')
        self.info('-------------------------------------')
        self.info('')
        self.info('Dimensionality of fit: %s', len(fit_names))
        self.info('')

        output = tabulate(zip(fit_names, fit_values, fit_min, fit_max),
                          headers=['Param', 'Value', 'Bound-min', 'Bound-max'])

        self.info('\n%s\n\n', output)
        self.info('')
        start_time = time.time()
        disableLogging()
        # Compute fit here
        self.compute_fit()

        enableLogging()
        end_time = time.time()
        self.info('Sampling time %s s', end_time - start_time)
        solution = self.generate_solution(output_size=output_size)
        self.info('')
        self.info('-------------------------------------')
        self.info('------Final results------------------')
        self.info('-------------------------------------')
        self.info('')
        self.info('Dimensionality of fit: %s', len(fit_names))
        self.info('')
        for idx, optimized_map, optimized_median, values in self.get_solution(
        ):
            self.info('\n%s', '---Solution {}------'.format(idx))
            output = tabulate(zip(fit_names, optimized_map, optimized_median),
                              headers=['Param', 'MAP', 'Median'])
            self.info('\n%s\n\n', output)
        return solution
Пример #4
0
    def fit(self, output_size=OutputSize.heavy):
        import time
        """

        Performs fit.

        """
        from tabulate import tabulate
        self.compile_params()

        fit_names = self.fit_names

        prior_type = [p.__class__.__name__ for p in self.fitting_priors]
        args = [p.params() for p in self.fitting_priors] 

        fit_values = self.fit_values
        self.info('')
        self.info('-------------------------------------')
        self.info('------Retrieval Parameters-----------')
        self.info('-------------------------------------')
        self.info('')
        self.info('Dimensionality of fit: %s', len(fit_names))
        self.info('')

        output = tabulate(zip(fit_names, fit_values, prior_type, args),
                          headers=['Param', 'Value', 'Type', 'Args'])

        self.info('\n%s\n\n', output)
        self.info('')
        start_time = time.time()
        disableLogging()
        # Compute fit here
        self.compute_fit()

        enableLogging()
        end_time = time.time()
        self.info('Sampling time %s s', end_time-start_time)
        solution = self.generate_solution(output_size=output_size)
        self.info('')
        self.info('-------------------------------------')
        self.info('------Final results------------------')
        self.info('-------------------------------------')
        self.info('')
        self.info('Dimensionality of fit: %s', len(fit_names))
        self.info('')
        for idx, optimized_map, optimized_median, values in self.get_solution():
            self.info('\n%s', '---Solution {}------'.format(idx))
            output = tabulate(zip(fit_names, optimized_map, optimized_median), headers=[
                              'Param', 'MAP', 'Median'])
            self.info('\n%s\n\n', output)
        return solution
Пример #5
0
    def generate_profiles(self, solution, binning):
        from taurex import mpi
        """Generates sigma plots for profiles"""

        sample_list = None

        if mpi.get_rank() == 0:
            sample_list = list(self.sample_parameters(solution))

        sample_list = mpi.broadcast(sample_list)

        self.debug('We all got %s', sample_list)

        self.info('------------Variance generation step------------------')

        self.info('We are sampling %s points for the profiles',
                  len(sample_list))

        rank = mpi.get_rank()
        size = mpi.nprocs()

        enableLogging()

        self.info(
            'I will only iterate through partitioned %s '
            'points (the rest is in parallel)',
            len(sample_list) // size)

        disableLogging()
        count = 0

        def sample_iter():
            for parameters, weight in sample_list[rank::size]:
                self.update_model(parameters)
                enableLogging()
                if rank == 0 and count % 10 == 0 and count > 0:

                    self.info('Progress {}%'.format(count * 100.0 /
                                                    (len(sample_list) / size)))
                disableLogging()
                yield weight

        return self._model.compute_error(sample_iter,
                                         wngrid=binning,
                                         binner=self._binner)
Пример #6
0
    def compute_derived_trace(self, solution):
        from taurex.util.util import quantile_corner
        from taurex.constants import AMU
        from taurex import mpi
        enableLogging()

        samples = self.get_samples(solution)
        weights = self.get_weights(solution)
        len_samples = len(samples)

        rank = mpi.get_rank()

        num_procs = mpi.nprocs()

        count = 0

        derived_param = {p: ([],[]) for p in self.derived_names}

        weight_comb = []

        if len(self.derived_names) == 0:
            return

        self.info('Computing derived parameters......')
        disableLogging()
        for idx in range(rank, len_samples, num_procs):
            enableLogging()
            if rank == 0 and count % 10 == 0 and count > 0:

                self.info('Progress {}%'.format(
                    idx*100.0 / len_samples))
            disableLogging()

            parameters = samples[idx]
            weight = weights[idx]
            self.update_model(parameters)
            self._model.initialize_profiles()
            for p, v in zip(self.derived_names, self.derived_values):
                derived_param[p][0].append(v)
                derived_param[p][1].append(weight)
            
        result_dict = {}

        sorted_weights = weights.argsort()

        for param, (trace, w) in derived_param.items():
            
            all_trace = np.array(mpi.allreduce(trace, op='SUM'))  # I cant remember why this works
            all_weight = np.array(mpi.allreduce(w, op='SUM'))  # I cant remember why this works

            all_weight_sort = all_weight.argsort()

            # Sort them into the right order
            all_weight[sorted_weights] = all_weight[all_weight_sort]
            all_trace[sorted_weights] = all_trace[all_weight_sort]

            q_16, q_50, q_84 = \
                quantile_corner(np.array(all_trace), [0.16, 0.5, 0.84],
                                weights=np.array(all_weight))

            mean = np.average(all_trace, weights=all_weight, axis=0)

            derived = {
                'value': q_50,
                'sigma_m': q_50-q_16,
                'sigma_p': q_84-q_50,
                'trace': all_trace,
                'mean': mean
            }
            result_dict[f'{param}_derived'] = derived
        return result_dict