Пример #1
0
    def Run(self, params):
        print('running AcceptancePcn: %s' % jobs.params_to_string(params))

        # Get filenames for inputs.
        deps = self.Dependencies(params)

        df = pandas.DataFrame(columns=[
            'alg',
            'N',
            'rho',
            'iact_seconds',
        ])

        for dep in deps:
            dep_outputs = jobs.Outputs(dep)
            assert len(dep_outputs) == 1
            dep_output = dep_outputs[0]

            with h5py.File(dep_output) as hf:
                samples = np.array(hf['/samples'])
                acceptances = sum(samples[1:] != samples[:-1])
                rate = acceptances / (len(samples) - 1)

                label = nice_alg_name(dep.params)

                df = df.append({
                    'alg': label,
                    'N': dep.params['dataset']['N'],
                    'rho': dep.params['proposal']['params']['rho'],
                    'acceptance_rate': rate,
                }, ignore_index=True)

        print(df)

        hue_order = [
            'MH',
            'SMH-1',
            'SMH-2',
            'FlyMC',
        ]

        plt.figure(figsize=[6.4, 3.2])
        fig, subplots = plt.subplots(1, len(self.rhos))
        for i in range(len(self.rhos)):
            ax = subplots[i]
            rho = self.rhos[i]
            sns.pointplot(
                ax=ax,
                x='N',
                y='acceptance_rate',
                data=df[df['rho'] == rho],
                hue='alg',
                hue_order=hue_order,
                markers=[markers[k] for k in hue_order],
                linestyles=[linestyles[k] for k in hue_order],
                palette=palette,
            )
            current_axes = ax.axis()
            ax.axis([current_axes[0], current_axes[1], 0.0, 1.0])
            if i == 0:
                legend = ax.legend()
                legend.set_title('')
            else:
                ax.get_legend().remove()
                ax.set(ylabel='')
                ax.yaxis.set_ticks([])
                ax.yaxis.set_ticklabels([])

            ticklabels = ax.xaxis.get_ticklabels()
            num_ticks = len(ticklabels)
            ax.xaxis.set_ticks([0, num_ticks-1])
            ax.xaxis.set_ticklabels([ticklabels[0], ticklabels[-1]])

            for i, l in enumerate(ax.xaxis.get_ticklabels()):
                if i != 0 and i != len(ax.xaxis.get_ticklabels()) - 1:
                    l.set_visible(False)

            ax.set(xlabel=r'$n$')
            ax.set(ylabel=i == 0 and 'Acceptance Rate' or '')
            ax.set_title(r'$\rho=%0.1f$' % rho)

        plt.savefig(self.Outputs(params)[0],
                    bbox_inches='tight',
                    pad_inches=0)
Пример #2
0
    def Run(self, params):
        print('running EssRandomWalk: %s' % jobs.params_to_string(params))

        # Get filenames for inputs.
        deps = self.Dependencies(params)

        df = pandas.DataFrame(columns=[
            'alg',
            'N',
            'ess_seconds',
        ])

        for dep in deps:
            dep_outputs = jobs.Outputs(dep)
            assert len(dep_outputs) == 1
            dep_output = dep_outputs[0]

            label = nice_alg_name(dep.params)

            pickle_data = pickle.load(open(dep_output, 'rb'))

            # TODO rename this 'run' and restructure the pickled data
            for run in pickle_data['data']:
                df = df.append({
                    'alg': label,
                    'N': dep.params['dataset']['N'],
                    'ess_seconds': 1.0 / run['iact_seconds'],
                }, ignore_index=True)

        print(df)

        hue_order = [
            'MH',
            'SMH-1',
            'SMH-2',
            'FlyMC',
        ]
        if params['model_type'] == 'lr':
            hue_order.append('Zig-Zag')

        plt.figure(figsize=[6.4, 3.2])
        ax = sns.pointplot(
            x='N',
            y='ess_seconds',
            data=df,
            hue='alg',
            hue_order=hue_order,
            markers=[markers[k] for k in hue_order],
            linestyles=[linestyles[k] for k in hue_order],
            palette=palette,
        )
        ax.set(ylabel=r'Effective sample size per second')
        legend = ax.legend()
        legend.set_title('')
        ax.set(xlabel=r'$n$')
        ax.set(yscale='log')

        min_n = df['N'].min()
        max_n = df['N'].max()

        new_ticklabels = ax.xaxis.get_ticklabels()
        new_ticklabels[-2] = ''
        new_ticklabels[-4] = ''
        ax.xaxis.set_ticklabels(new_ticklabels)

        plt.savefig(self.Outputs(params)[0],
                    bbox_inches='tight',
                    pad_inches=0)
Пример #3
0
    def Run(self, params):
        print('running EssPcn: %s' % jobs.params_to_string(params))

        # Get filenames for inputs.
        deps = self.Dependencies(params)

        df = pandas.DataFrame(columns=[
            'alg',
            'N',
            'rho',
            'ess_seconds',
        ])

        for dep in deps:
            dep_outputs = jobs.Outputs(dep)
            assert len(dep_outputs) == 1
            dep_output = dep_outputs[0]

            label = nice_alg_name(dep.params)

            pickle_data = pickle.load(open(dep_output, 'rb'))

            print('pickle_data:')
            print(pickle_data)

            # TODO rename this 'run' and restructure the pickled data
            for run in pickle_data['data']:
                df = df.append({
                    'alg': label,
                    'N': dep.params['dataset']['N'],
                    'rho': dep.params['proposal']['params']['rho'],
                    'ess_seconds': 1.0 / run['iact_seconds'],
                }, ignore_index=True)

        print(df)

        hue_order = [
            'MH',
            'SMH-1',
            'SMH-2',
            'FlyMC',
        ]

        plt.figure(figsize=[6.4, 3.2])
        fig, subplots = plt.subplots(1, len(self.rhos))
        for i in range(len(self.rhos)):
            ax = subplots[i]
            rho = self.rhos[i]
            sns.pointplot(
                ax=ax,
                x='N',
                y='ess_seconds',
                data=df[df['rho'] == rho],
                hue='alg',
                hue_order=hue_order,
                markers=[markers[k] for k in hue_order],
                linestyles=[linestyles[k] for k in hue_order],
                palette=palette,
            )
            if i == 0:
                legend = ax.legend()
                legend.set_title('')
                ax.set(ylabel='First moment ESS per second')
            else:
                ax.get_legend().remove()
                ax.set(ylabel='')
                ax.yaxis.set_ticklabels([])
                ax.yaxis.set_ticklabels([], minor=True)

            ax.set_title(r'$\rho = %0.1f$' % rho)
            ax.set(xlabel=r'$n$')
            ax.set(yscale='log')

            ticklabels = ax.xaxis.get_ticklabels()
            num_ticks = len(ticklabels)
            ax.xaxis.set_ticks([0, num_ticks - 1])
            ax.xaxis.set_ticklabels([ticklabels[0], ticklabels[-1]])

            for j, l in enumerate(ax.xaxis.get_ticklabels()):
                if j != 0 and j != len(ax.xaxis.get_ticklabels()) - 1:
                    l.set_visible(False)

        # Square up axes.
        min_y = np.inf
        max_y = -np.inf
        for ax in subplots:
            axis = ax.axis()
            min_y = min(min_y, axis[2])
            max_y = max(max_y, axis[3])
        for ax in subplots:
            axis = ax.axis()
            ax.axis([axis[0], axis[1], min_y, max_y])

        for i, ax in enumerate(subplots):
            if i != 0:
                ax.yaxis.set_ticklabels([])
                ax.yaxis.set_ticklabels([], minor=True)

        plt.savefig(self.Outputs(params)[0],
                    bbox_inches='tight',
                    pad_inches=0)
Пример #4
0
    def Run(self, params):
        print('running LikelihoodsPerIterationPlot: %s' % jobs.params_to_string(params))

        # Get filenames for inputs.
        deps = self.Dependencies(params)

        df = pandas.DataFrame(columns=[
            'alg',
            'N',
            'likelihood_evaluations',
            'iterations',
        ])

        for dep in deps:
            dep_outputs = jobs.Outputs(dep)
            assert len(dep_outputs) == 1
            dep_output = dep_outputs[0]

            label = nice_alg_name(dep.params)

            with h5py.File(dep_output) as hf:
                df = df.append({
                    'alg': label,
                    'N': dep.params['dataset']['N'],
                    'iterations': np.array(hf['/samples']).shape[0],
                    'likelihood_evaluations': np.array(hf['/likelihood_evaluations'])[0],
                }, ignore_index=True)

        df['likelihoods_per_iteration'] = df['likelihood_evaluations'] / df['iterations']

        print(df)

        hue_order = [
            'MH',
            'SMH-1',
            'SMH-2',
        ]

        poster = False
        if poster:
            context = {
                'text.usetex': True,
                'text.latex.preamble': '\\RequirePackage{cmbright}\n\\RequirePackage[default]{lato}',
                'axes.facecolor': 'ffffff',
                'axes.edgecolor': '000000',
                'axes.labelcolor': 'ffffff',
                'xtick.color': 'ffffff',
                'ytick.color': 'ffffff',
                'legend.edgecolor': '000000',
                'legend.facecolor': 'ffffff',
                'text.color': '000000',
                'savefig.facecolor': '002147',
            }
        else:
            context = {}

        with plt.rc_context(context):
            fig = plt.figure(figsize=[6.4, 3.2])
            ax = sns.pointplot(
                x='N',
                y='likelihoods_per_iteration',
                data=df,
                hue='alg',
                hue_order=hue_order,
                markers=[markers[k] for k in hue_order],
                linestyles=[linestyles[k] for k in hue_order],
                palette=palette,
            )
            ax.set(ylabel=r'Likelihood evaluations per iteration')
            legend = ax.legend()
            legend.set_title('')
            ax.set(xlabel=r'$n$')
            ax.set(yscale='log')

            min_n = df['N'].min()
            max_n = df['N'].max()

            new_ticklabels = ax.xaxis.get_ticklabels()
            new_ticklabels[-2] = ''
            new_ticklabels[-4] = ''
            ax.xaxis.set_ticklabels(new_ticklabels)

            plt.savefig(self.Outputs(params)[0],
                        bbox_inches='tight',
                        pad_inches=0)