Ejemplo n.º 1
0
    def __init__(self, extractions):
        QWidget.__init__(self)

        self.extractions = extractions

        layout = QVBoxLayout()
        self.setLayout(layout)

        self.fig = plt.figure()
        self.canvas = FigureCanvas(self.fig)
        layout.addWidget(self.canvas)

        self.graph = self.fig.add_subplot(111,
                                          position=[0.15, 0.15, 0.75, 0.75])

        if pms.DYNAMIC_TYPE == pms.DISCRETE:
            self.graph.set_xlim(-1, pms.NOMBRE_PERIODES + 1)
            self.graph.set_xlabel(trans_CO(u"Periods"))
            self.graph.set_xticks(range(0, pms.NOMBRE_PERIODES + 1), 5)
            curve_marker = "*"

        elif pms.DYNAMIC_TYPE == pms.CONTINUOUS:
            self.graph.set_xlim(
                -5,
                pms.CONTINUOUS_TIME_DURATION.total_seconds() + 5)
            self.graph.set_xticks(
                range(0,
                      int(pms.CONTINUOUS_TIME_DURATION.total_seconds()) + 1,
                      30))
            self.graph.set_xlabel(trans_CO(u"Time (seconds)"))
            curve_marker = ""

        # curves
        if self.extractions.curve is None:
            self.extractions.curve, = self.graph.plot(self.extractions.xdata,
                                                      self.extractions.ydata,
                                                      "-k",
                                                      marker=curve_marker)

        self.graph.set_ylim(-0.1, pms.DECISION_MAX + 0.1)
        self.graph.set_yticks(np.arange(0, pms.DECISION_MAX + 0.1, 0.2))
        self.graph.set_ylabel("")
        self.graph.set_title(trans_CO(u"Extraction"))
        self.graph.grid()
        self.canvas.draw()
Ejemplo n.º 2
0
    def __init__(self, payoffs):
        super(PlotPayoff, self).__init__()

        self.payoffs = payoffs

        layout = QVBoxLayout()
        self.setLayout(layout)

        self.fig = plt.figure()
        self.canvas = FigureCanvas(self.fig)
        layout.addWidget(self.canvas)

        self.graph = self.fig.add_subplot(111,
                                          position=[0.15, 0.15, 0.75, 0.75])

        if pms.DYNAMIC_TYPE == pms.DISCRETE:
            self.graph.set_xlim(-1, pms.NOMBRE_PERIODES + 1)
            self.graph.set_xlabel(trans_CO(u"Periods"))
            self.graph.set_xticks(range(0, pms.NOMBRE_PERIODES + 1), 5)
            curve_marker = "*"

        elif pms.DYNAMIC_TYPE == pms.CONTINUOUS:
            self.graph.set_xlim(
                -5,
                pms.CONTINUOUS_TIME_DURATION.total_seconds() + 5)
            self.graph.set_xticks(
                range(0,
                      int(pms.CONTINUOUS_TIME_DURATION.total_seconds()) + 1,
                      30))
            self.graph.set_xlabel(trans_CO(u"Time (seconds)"))
            curve_marker = ""

        if self.payoffs.curve is None:
            self.payoffs.curve, = self.graph.plot(self.payoffs.xdata,
                                                  self.payoffs.ydata,
                                                  "-k",
                                                  marker=curve_marker)

        self.graph.set_ylim(0, 250)
        self.graph.set_yticks(range(0, 271, 20))
        self.graph.set_ylabel("")
        self.graph.set_title(trans_CO(u"Part payoff"))
        self.graph.grid()
        self.canvas.draw()
Ejemplo n.º 3
0
    def __init__(self, resource):
        QWidget.__init__(self)

        self.resource = resource

        layout = QVBoxLayout()
        self.setLayout(layout)

        self.fig = plt.figure()
        self.canvas = FigureCanvas(self.fig)
        layout.addWidget(self.canvas)

        self.graph = self.fig.add_subplot(111,
                                          position=[0.15, 0.15, 0.75, 0.75])

        if pms.DYNAMIC_TYPE == pms.DISCRETE:
            self.graph.set_xlim(-1, pms.NOMBRE_PERIODES + 1)
            self.graph.set_xlabel(trans_CO(u"Periods"))
            self.graph.set_xticks(range(0, pms.NOMBRE_PERIODES + 1), 5)
            curve_marker = "*"

        elif pms.DYNAMIC_TYPE == pms.CONTINUOUS:
            self.graph.set_xlim(
                -5,
                pms.CONTINUOUS_TIME_DURATION.total_seconds() + 5)
            self.graph.set_xticks(
                range(0,
                      int(pms.CONTINUOUS_TIME_DURATION.total_seconds()) + 1,
                      30))
            self.graph.set_xlabel(trans_CO(u"Time (seconds)"))
            curve_marker = ""

        if self.resource.curve is None:
            self.resource.curve, = self.graph.plot(self.resource.xdata,
                                                   self.resource.ydata,
                                                   "-k",
                                                   marker=curve_marker)

        self.graph.set_ylim(0, pms.RESOURCE_INITIAL_STOCK * 3)
        self.graph.set_yticks(range(0, pms.RESOURCE_INITIAL_STOCK * 3 + 1, 5))
        self.graph.set_ylabel("")
        self.graph.set_title(trans_CO(u"Available resource"))
        self.graph.grid()
        self.canvas.draw()
Ejemplo n.º 4
0
 def _accept(self):
     try:
         self.timer_automatique.stop()
     except AttributeError:
         pass
     val = self.slider_area.slider.value() / int(1 / pms.DECISION_STEP)
     if not self.remote.le2mclt.automatique:
         confirmation = QMessageBox.question(
             self, "Confirmation", trans_CO(u"Do you confirm your choice?"),
             QMessageBox.No | QMessageBox.Yes)
         if confirmation != QMessageBox.Yes:
             return
     self.accept()
     logger.info("send {}".format(val))
     self.defered.callback(val)
Ejemplo n.º 5
0
    def __init__(self, remote, defered):
        super(GuiDecision, self).__init__(remote.le2mclt.screen)

        # ----------------------------------------------------------------------
        # main attributes
        # ----------------------------------------------------------------------
        self.remote = remote
        self.defered = defered

        layout = QVBoxLayout(self)

        # ----------------------------------------------------------------------
        # HEAD AREA
        # ----------------------------------------------------------------------
        layout_head = QHBoxLayout()
        layout.addLayout(layout_head, 0)

        if pms.DYNAMIC_TYPE == pms.DISCRETE:
            self.label_period = QLabel(
                le2mtrans(u"Period") +
                u" {}".format(self.remote.currentperiod))
            layout_head.addWidget(self.label_period, 0, Qt.AlignLeft)

        self.compte_rebours = None
        if pms.DYNAMIC_TYPE == pms.CONTINUOUS:
            self.compte_rebours = WCompterebours(self,
                                                 pms.CONTINUOUS_TIME_DURATION,
                                                 lambda: None)
        elif pms.DYNAMIC_TYPE == pms.DISCRETE:
            time = timedelta(seconds=7) if self.remote.le2mclt.automatique else \
                pms.DISCRETE_DECISION_TIME
            self.compte_rebours = WCompterebours(self, time, self.send_extrac)
        layout_head.addWidget(self.compte_rebours, 0, Qt.AlignLeft)
        layout_head.addStretch()

        # ----------------------------------------------------------------------
        # GRAPHICAL AREA
        # ----------------------------------------------------------------------

        self.plot_layout = QGridLayout()
        layout.addLayout(self.plot_layout)
        # extraction
        self.plot_extraction = PlotExtraction(self.remote.extractions)
        self.plot_layout.addWidget(self.plot_extraction, 0, 0)
        # part payoff
        self.plot_payoff = PlotPayoff(self.remote.payoff_part)
        self.plot_layout.addWidget(self.plot_payoff, 0, 1)
        # available resource
        self.plot_resource = PlotResource(self.remote.resource)
        self.plot_layout.addWidget(self.plot_resource, 1, 0)
        # value in text mode
        widget_infos = QWidget()
        widget_infos.setLayout(QVBoxLayout())
        self.textEdit_infos = QTextEdit()
        self.textEdit_infos.setReadOnly(True)
        self.textEdit_infos.setHtml(self.remote.text_infos)
        widget_infos.layout().addWidget(self.textEdit_infos)
        self.plot_layout.addWidget(widget_infos, 1, 1)
        self.plot_layout.setColumnStretch(0, 1)
        self.plot_layout.setColumnStretch(1, 1)

        # ----------------------------------------------------------------------
        # DECISION AREA
        # ----------------------------------------------------------------------

        self.extract_dec = MySlider()
        player_extrac = self.remote.extractions.ydata[-1]
        self.extract_dec.slider.setValue(player_extrac * 100)
        self.extract_dec.lcd.display(player_extrac)
        layout.addWidget(self.extract_dec)

        # ----------------------------------------------------------------------
        # FOOT AREA
        # ----------------------------------------------------------------------

        self.setWindowTitle(trans_CO(u"Decision"))

        if pms.DYNAMIC_TYPE == pms.CONTINUOUS:
            self.extract_dec.slider.sliderReleased.connect(self.send_extrac)
            if self.remote.le2mclt.automatique:
                self.extract_dec.slider.valueChanged.connect(self.send_extrac)
            self.timer_continuous = QTimer()
            self.timer_continuous.timeout.connect(self.update_data_and_graphs)
            self.timer_continuous.start(
                int(pms.TIMER_UPDATE.total_seconds()) * 1000)

        if pms.DYNAMIC_TYPE == pms.DISCRETE and self.remote.le2mclt.automatique:
            self.extract_dec.slider.setValue(
                random.randint(pms.DECISION_MIN,
                               pms.DECISION_MAX * int(1 / pms.DECISION_STEP)))

        self.remote.end_of_time.connect(self.end_of_time)
    def remote_update_data(self, player_extraction, the_time):
        """
        called by the server:
        - every second if dynamic == continuous
        - every period if dynamic == discrete
        :param player_extraction: the player's extraction
        :param the_time: the time of the update
        :return:
        """

        # ----------------------------------------------------------------------
        # we set the same time for every player in the group
        # ----------------------------------------------------------------------
        if self.currentperiod == 0:
            xdata = 0
        else:
            if pms.DYNAMIC_TYPE == pms.DISCRETE:
                xdata = self.currentperiod
            elif pms.DYNAMIC_TYPE == pms.CONTINUOUS:
                xdata = the_time

        # ----------------------------------------------------------------------
        # player extraction
        # ----------------------------------------------------------------------
        self.extractions.add_x(xdata)
        self.extractions.add_y(player_extraction["CO_extraction"])
        try:
            self.extractions.update_curve()
        except AttributeError:
            pass

        # ----------------------------------------------------------------------
        # resource
        # ----------------------------------------------------------------------
        self.resource.add_x(xdata)
        self.resource.add_y(player_extraction["CO_resource"])

        # ----------------------------------------------------------------------
        # cost
        # ----------------------------------------------------------------------
        self.cost.add_x(xdata)
        self.cost.add_y(player_extraction["CO_cost"])

        # ----------------------------------------------------------------------
        # player payoff
        # ----------------------------------------------------------------------
        self.payoff_instant.add_x(xdata)
        self.payoff_instant.add_y(player_extraction["CO_payoff"])
        self.payoff_instant_discounted.add_x(xdata)
        if pms.DYNAMIC_TYPE == pms.CONTINUOUS:
            self.payoff_instant_discounted.add_y(
                np.exp(-pms.param_r * xdata) * self.payoff_instant.ydata[-1])
        else:  # discrete
            pass  # todo: discounted payoff for discrete dynamic
        cumulative_payoff = np.sum(self.payoff_instant_discounted.ydata)
        infinite_payoff = pms.get_infinite_payoff(
            xdata, player_extraction["CO_resource"],
            player_extraction["CO_extraction"])
        self.payoff_part.add_x(xdata)
        self.payoff_part.add_y(cumulative_payoff + infinite_payoff)

        # ----------------------------------------------------------------------
        # update curves
        # ----------------------------------------------------------------------
        try:
            self.extractions.update_curve()
            self.resource.update_curve()
            self.payoff_part.update_curve()
        except AttributeError:  # if period==0
            pass

        # ----------------------------------------------------------------------
        # text information
        # ----------------------------------------------------------------------
        old = self.text_infos
        the_time_str = texts_CO.trans_CO(u"Instant") if \
            pms.DYNAMIC_TYPE == pms.CONTINUOUS else \
            texts_CO.trans_CO(u"Period")
        self.text_infos = the_time_str + u": {}".format(int(xdata)) + \
            u"<br>" + texts_CO.trans_CO(u"Extraction") + \
            u": {:.2f}".format(self.extractions.ydata[-1]) + \
            u"<br>" + texts_CO.trans_CO(u"Available resource") + \
            u": {:.2f}".format(self.resource.ydata[-1]) + \
            u"<br>" + texts_CO.trans_CO(u"Instant payoff") + \
            u": {:.2f}".format(self.payoff_instant.ydata[-1]) + \
            u"<br>" + texts_CO.trans_CO(u"Discounted payoff") + \
            u": {:.4f}".format(self.payoff_instant_discounted.ydata[-1]) + \
            u"<br>" + texts_CO.trans_CO(u"Cumulative payoff") + \
            u": {:.2f}".format(cumulative_payoff) + \
            u"<br>" + texts_CO.trans_CO(u"Part payoff") + \
            u": {:.2f}".format(self.payoff_part.ydata[-1])
        self.text_infos += u"<br>{}<br>{}".format(20 * "-", old)

        # ----------------------------------------------------------------------
        # log
        # ----------------------------------------------------------------------
        logger.info("{} update data extraction: {:.2f} "
                    "resource: {:.2f} payoff: {:.2f}".format(
                        self.le2mclt, self.extractions.ydata[-1],
                        self.resource.ydata[-1], self.payoff_part.ydata[-1]))
Ejemplo n.º 7
0
    def demarrer(self):
        # ----------------------------------------------------------------------
        # check conditions
        # ----------------------------------------------------------------------

        if not self.le2mserv.gestionnaire_graphique.question(
                le2mtrans("Start") + " Control Optimal?"):
            return

        # ----------------------------------------------------------------------
        # init part
        # ----------------------------------------------------------------------

        self.current_sequence += 1
        self.current_period = 0

        # __ creates parts ___
        yield (self.le2mserv.gestionnaire_experience.init_part(
            "controlOptimal",
            "PartieCO",
            "RemoteCO",
            pms,
            current_sequence=self.current_sequence))
        self.all = self.le2mserv.gestionnaire_joueurs.get_players(
            'controlOptimal')

        # __ set parameters on remotes (has to be after group formation) __
        yield (self.le2mserv.gestionnaire_experience.run_step(
            le2mtrans(u"Configure"), self.all, "configure"))

        # ----------------------------------------------------------------------
        # SELECT THE INITIAL EXTRACTION
        # ----------------------------------------------------------------------

        self.le2mserv.gestionnaire_experience.run_func(self.all, "newperiod",
                                                       0)
        yield (self.le2mserv.gestionnaire_experience.run_step(
            trans_CO(u"Initial extraction"), self.all,
            "set_initial_extraction"))
        self.le2mserv.gestionnaire_experience.run_func(self.all, "update_data")

        # ----------------------------------------------------------------------
        # DEPENDS ON TREATMENT
        # ----------------------------------------------------------------------

        if pms.DYNAMIC_TYPE == pms.CONTINUOUS:

            txt = le2mtrans(u"Period") + u" 1"
            self.le2mserv.gestionnaire_graphique.infoserv(txt,
                                                          fg="white",
                                                          bg="gray")
            self.le2mserv.gestionnaire_graphique.infoclt(txt,
                                                         fg="white",
                                                         bg="gray")
            yield (self.le2mserv.gestionnaire_experience.run_func(
                self.all, "newperiod", 1))

            # __ timer continuous part __
            QTimer.singleShot(
                pms.CONTINUOUS_TIME_DURATION.total_seconds() * 1000 + 1000,
                self.slot_time_elapsed)
            time_start = datetime.now()
            self.le2mserv.gestionnaire_graphique.infoserv(
                "Start time: {}".format(time_start.strftime("%H:%M:%S")))
            for j in self.all:
                j.time_start = time_start
                j.timer_update.start()
            yield (self.le2mserv.gestionnaire_experience.run_step(
                trans_CO("Decision"), self.all, "display_decision",
                time_start))

        elif pms.DYNAMIC_TYPE == pms.DISCRETE:

            for period in range(1, pms.NOMBRE_PERIODES + 1):

                if self.le2mserv.gestionnaire_experience.stop_repetitions:
                    break

                # init period
                txt = le2mtrans(u"Period") + u" {}".format(period)
                self.le2mserv.gestionnaire_graphique.infoserv([txt],
                                                              fg="white",
                                                              bg="gray")
                self.le2mserv.gestionnaire_graphique.infoclt([txt],
                                                             fg="white",
                                                             bg="gray")
                yield (self.le2mserv.gestionnaire_experience.run_func(
                    self.all, "newperiod", period))

                # decision
                time_start = datetime.now()
                yield (self.le2mserv.gestionnaire_experience.run_step(
                    "Decision", self.all, "display_decision", time_start))

                self.le2mserv.gestionnaire_experience.run_func(
                    self.all, "update_data")

            self.slot_time_elapsed()

        # ----------------------------------------------------------------------
        # summary
        # ----------------------------------------------------------------------

        yield (self.le2mserv.gestionnaire_experience.run_step(
            le2mtrans(u"Summary"), self.all, "display_summary"))

        # ----------------------------------------------------------------------
        # End of part
        # ----------------------------------------------------------------------

        yield (self.le2mserv.gestionnaire_experience.finalize_part(
            "controlOptimal"))