def _do_stats(self, period):
        # stats
        self._le2mserv.gestionnaire_graphique.infoserv(
            trans_CPR(u"Av. for the period"))
        dataperiod = [p.currentperiod.todict(p.joueur) for p in self._tous]
        df_dataperiod = pd.DataFrame(dataperiod)
        df_dataperiod = df_dataperiod.groupby(["CPR_group"]).mean()
        self._le2mserv.gestionnaire_graphique.infoserv(
            df_dataperiod["CPR_decision"].to_string())

        # graph period
        if self._fig is None:  # first period
            self._fig, self._graph = plt.subplots()
            self._graph.set_ylim(0, pms.DOTATION)
            self._graph.set_xlim(1, pms.NOMBRE_PERIODES)
            self._graph.set_ylabel("Amount put in the public account")
            self._graph.set_xlabel("Periods")
            self._groups = df_dataperiod.index
            self._colors = ('b', 'g', 'r', 'c', 'm', 'y', 'k')
            self._xval = range(len(self._groups))
            self._yval = range(len(self._groups))
            for g in range(len(self._groups)):
                self._xval[g] = []
                self._yval[g] = []
        del self._graph.lines[:]
        for c, g in enumerate(self._groups):
            self._xval[c].append(period)
            self._yval[c].append(df_dataperiod["CPR_decision"].loc[g])
            self._graph.plot(self._xval[c], self._yval[c], color=self._colors[c],
                             label="G{}".format(g.split("_")[2]))
        if len(self._xval[0]) == 1:
            self._graph.legend(loc=9, ncol=len(self._groups), frameon=False,
                               fontsize=10)
        self._fig.canvas.draw()
        self._data.extend(dataperiod)
    def __init__(self, le2mserv):
        self._le2mserv = le2mserv

        # creation of the menu (will be placed in the "part" menu on the
        # server screen
        actions = OrderedDict()
        actions[trans_CPR(u"Configure")] = self._configure
        actions[trans_CPR(u"Display parameters")] = \
            lambda _: self._le2mserv.gestionnaire_graphique. \
            display_information2(
                utiltools.get_module_info(pms), u"Paramètres")
        actions[trans_CPR(u"Start")] = lambda _: self._demarrer()
        actions[trans_CPR(u"Display payoffs")] = \
            lambda _: self._le2mserv.gestionnaire_experience.\
            display_payoffs_onserver("CommonPoolResource")
        actions[trans_CPR(u"Show graph")] = self._show_fig
        self._le2mserv.gestionnaire_graphique.add_topartmenu(
            u"Common Pool Resource", actions)

        self._fig = None
    def _demarrer(self):
        """
        Start the part
        :return:
        """

        # check conditions =====================================================
        if self._le2mserv.gestionnaire_joueurs.nombre_joueurs % \
                pms.TAILLE_GROUPES != 0:
            self._le2mserv.gestionnaire_graphique.display_error(
                trans_CPR(u"The number of players is not compatible with the "
                          u"size of groups"))
            return

        confirmation = self._le2mserv.gestionnaire_graphique.\
            question(trans_CPR(u"Start CommonPoolResource?"))
        if not confirmation:
            return

        # init part ============================================================
        yield (self._le2mserv.gestionnaire_experience.init_part(
            "CommonPoolResource", "PartieCPR", "RemoteCPR", pms))
        self._tous = self._le2mserv.gestionnaire_joueurs.get_players(
            'CommonPoolResource')

        # groups
        self._le2mserv.gestionnaire_groupes.former_groupes(
            self._le2mserv.gestionnaire_joueurs.get_players(),
            pms.TAILLE_GROUPES, forcer_nouveaux=True)

        # set parameters on remotes
        yield (self._le2mserv.gestionnaire_experience.run_func(
            self._tous, "configure"))

        # stats
        self._fig = None
        self._data = []
    
        # start of repetitions =================================================
        for period in xrange(1 if pms.NOMBRE_PERIODES else 0,
                        pms.NOMBRE_PERIODES + 1):

            if self._le2mserv.gestionnaire_experience.stop_repetitions:
                break

            # init period
            self._le2mserv.gestionnaire_graphique.infoserv(
                [None, trans_CPR(u"Period {}").format(period)])
            self._le2mserv.gestionnaire_graphique.infoclt(
                [None, trans_CPR(u"Period {}").format(period)], fg="white", bg="gray")
            yield (self._le2mserv.gestionnaire_experience.run_func(
                self._tous, "newperiod", period))
            
            # decision
            yield(self._le2mserv.gestionnaire_experience.run_step(
                trans_CPR(u"Decision"), self._tous, "display_decision"))

            self._le2mserv.gestionnaire_graphique.infoserv(
                trans_CPR(u"Sum of decisions"))
            for g, p in self._le2mserv.gestionnaire_groupes. \
                    get_groupes("CommonPoolResource").iteritems():
                total = sum([i.currentperiod.CPR_decision for i in p])
                for i in p:
                    i.currentperiod.CPR_decisiongroup = total
                self._le2mserv.gestionnaire_graphique.infoserv("G{}: {}".format(
                    g.split("_")[2], total))
            
            # period payoff
            self._le2mserv.gestionnaire_experience.compute_periodpayoffs(
                "CommonPoolResource")

            # stats
            self._do_stats(period)
        
            # summary
            yield(self._le2mserv.gestionnaire_experience.run_step(
                trans_CPR(u"Summary"), self._tous, "display_summary"))

        # End of part ==========================================================
        # stats
        self._le2mserv.gestionnaire_graphique.infoserv(
            [None, trans_CPR(u"Av. for the whole game")])
        datapandall = pd.DataFrame(self._data)
        datapandall = datapandall.groupby(datapandall.CPR_group)
        self._le2mserv.gestionnaire_graphique.infoserv(
            datapandall.mean()["CPR_decision"].to_string())
        # finalization
        yield (self._le2mserv.gestionnaire_experience.finalize_part(
            "CommonPoolResource"))