コード例 #1
0
    def on_button_chooseassign_pressed(self):
        items = [c.id for c in self.criteria if c.disabled is True]
        if len(items) < 1:
            QtGui.QMessageBox.information(None, "Error",
                                          "No assignment column")
            return

        item, ok = QtGui.QInputDialog.getItem(self,
                                              "Select assignments column",
                                              "Column:", items, 0, False)
        if ok is False:
            return

        try:
            cid = item.toString()
        except:
            cid = str(item)

        ncat = len(self.bpt) + 1
        pt, aa = PerformanceTable(), AlternativesAssignments()
        for ap in self.pt:
            perf =  int(ap.performances[cid])
            if perf > 0 and perf < (ncat + 1):
                pt.append(ap)
                aa.append(AlternativeAssignment(ap.id, str(perf)))

        if len(pt) < 1:
            QtGui.QMessageBox.information(None, "Error",
                                          "No assignments examples found")
            return

        self.a_ref = Alternatives([Alternative(a.id) for a in aa])
        self.pt_ref = pt
        self.aa_ref = aa

        a = Alternatives([Alternative(aid) for aid in pt.keys()])

        self.table_refs.reset_table()

        self.table_refs.add_criteria(self.criteria)
        self.table_refs.add_pt(a, pt, False)
        self.__generate_category_colors()
        self.table_refs.add_assignments(aa, self.category_colors, True)

        self.button_zoom.setEnabled(True)
        self.button_show.setEnabled(True)

        self.button_infer.setEnabled(True)
コード例 #2
0
    def __show_model_learned(self, cv, bpt, lbda, a):
        dialog = InferenceDialog(self)
        dialog.setModal(True)
        self.connect(dialog,
                     QtCore.SIGNAL("accepted()"),
                     self.on_model_learned_accepted)
        dialog.show()

        model = ElectreTri(self.criteria, cv, bpt, lbda, self.cat_profiles)
        worst = self.pt.get_worst(self.criteria)
        best = self.pt.get_best(self.criteria)
        criteria_order = [c.id for c in self.criteria]
        graph = QGraphicsSceneEtri(model, worst, best,
                                   self.graph_plot.size(),
                                   criteria_order)
        dialog.graph_model.setScene(graph)
        dialog.label_lambda.setText("Lambda: %s" % str(lbda))

        a_incomp = Alternatives([aref for aref in self.a_ref
                                      if aref.id not in a.keys()])
        pt_incomp = PerformanceTable([ap for ap in self.pt_ref
                                      if ap.id in a_incomp.keys()])
        pt_comp = PerformanceTable([ap for ap in self.pt_ref
                                    if ap.id in a.keys()])

        dialog.table_comp.add_criteria(self.criteria)
        dialog.table_comp.add_pt(a, pt_comp)
        dialog.table_incomp.add_criteria(self.criteria)
        dialog.table_incomp.add_pt(a_incomp, pt_incomp)
コード例 #3
0
    def __fill_model_tables(self):
        self.layer_loaded = False

        self.table_criteria.add_criteria(self.criteria, self.cv)
        self.table_prof.add_criteria(self.criteria)

        self.table_indiff.add_criteria(self.criteria)
        self.table_pref.add_criteria(self.criteria)
        self.table_veto.add_criteria(self.criteria)

        self.table_prof.add_pt(self.balternatives, self.bpt)
        self.label_ncategories.setText("%d" % (len(self.bpt) + 1))

        if self.same_pqv_thresholds_for_all_profiles() is True:
            self.cbox_samethresholds.setChecked(True)
            balternatives = Alternatives([Alternative('b')])
        else:
            balternatives = self.balternatives

        if self.qpt is None and self.ppt is None:
            self.cbox_mrsort.setChecked(True)
        else:
            self.table_indiff.add_pt(balternatives, self.qpt)
            self.table_pref.add_pt(balternatives, self.ppt)

        if self.vpt is None:
           self.cbox_noveto.setChecked(True)
        else:
            self.table_veto.add_pt(balternatives, self.vpt)

        self.spinbox_cutlevel.setValue(self.lbda)

        self.__update_graph()

        self.layer_loaded = True
コード例 #4
0
    def __generate_initial_model(self):
        crit_min = {}
        crit_max = {}
        for altp in self.pt:
            for crit in self.criteria:
                d = crit.direction
                if crit_min.has_key(crit.id) is False:
                    crit_min[crit.id] = altp.performances[crit.id]
                elif crit_min[crit.id]*d > altp(crit.id)*d:
                    crit_min[crit.id] = altp.performances[crit.id]

                if crit_max.has_key(crit.id) is False:
                    crit_max[crit.id] = altp.performances[crit.id]
                elif crit_max[crit.id]*d < altp(crit.id)*d:
                    crit_max[crit.id] = altp.performances[crit.id]

        self.cv = CriteriaValues()
        b1 = AlternativePerformances('b1', {})
        for crit in self.criteria:
            b1.performances[crit.id] = (crit_max[crit.id]
                                        - crit_min[crit.id]) / 2
            cv = CriterionValue(crit.id, 1)
            self.cv.append(cv)

        self.balternatives = Alternatives([Alternative('b1', 'b1')])
        self.bpt = PerformanceTable([b1])
        self.cbox_mrsort.setChecked(True)
        self.cbox_noveto.setChecked(True)

        # Categories Profiles
        self.categories = generate_categories(len(self.bpt) + 1,
                                              prefix = "")
        self.cat_profiles = generate_categories_profiles(self.categories)

        self.lbda = 0.75
コード例 #5
0
ファイル: layer.py プロジェクト: aitmlouk/qgis-etri
    def get_features_ids(self, aids):
        provider = self.layer.dataProvider()
        self.alternatives = Alternatives([])
        self.pt = PerformanceTable([])

        features = []
        for feat in provider.getFeatures():
            featid = str(feat.id())
            if featid in aids:
                features.append(feat.id())

        return features
コード例 #6
0
ファイル: layer.py プロジェクト: aitmlouk/qgis-etri
    def get_alternatives_and_pt(self):
        provider = self.layer.dataProvider()
        self.alternatives = Alternatives([])
        self.pt = PerformanceTable([])

        for feat in provider.getFeatures():
            featid = str(feat.id())
            perfs = {}
            for criterion in self.criteria:
                try:
                    perfs[criterion.id] = float(feat[criterion.id])
                except:
                    perfs[criterion.id] = feat[criterion.id].toDouble()[0]

            self.alternatives.append(Alternative(featid, featid))
            self.pt.append(AlternativePerformances(featid, perfs))
コード例 #7
0
    def __load_from_xmcda(self, xmcda_file):
        tree = ElementTree.parse(xmcda_file)
        root = tree.getroot()
#        ElementTree.dump(root)
        xmcda_formatversion = root.find('.//formatversion')
        xmcda_crit = root.find('.//criteria')
        xmcda_critval = root.find('.//criteriaValues')
        xmcda_b = root.find('.//alternatives')
        xmcda_pt = root.findall('.//performanceTable')
        xmcda_lbda = root.find('.//methodParameters/parameter/value/real')

        # Update criteria direction
        criteria = Criteria().from_xmcda(xmcda_crit)
        for c in criteria:
            if c.id in self.criteria:
                self.criteria[c.id].disabled = c.disabled
                self.criteria[c.id].direction = c.direction

        # Remove criteria values that are not in the vector layer
        cvs = CriteriaValues()
        cvs.from_xmcda(xmcda_critval)
        for cv in cvs:
            if cv.id not in self.criteria:
                cvs.remove(cv.id)

        for c in self.criteria:
            # Disable criteria for which there are no weights
            if c.id not in cvs:
                c.disabled = True
                cvs.append(CriterionValue(c.id, 0))

        balternatives = Alternatives()
        balternatives.from_xmcda(xmcda_b)

        bpt = PerformanceTable()
        qpt, ppt, vpt = None, None, None

        for xmcda in xmcda_pt:
            if xmcda.get('id') is None:
                bpt.from_xmcda(xmcda)
                for bp, c in product(bpt, self.criteria.get_active()):
                    perfs = bp.performances
                    if c.id not in perfs or perfs[c.id] is None:
                        perfs[c.id] = 0
            elif xmcda.get('id') == 'q':
                qpt = PerformanceTable(id = 'q')
                qpt.from_xmcda(xmcda)
            elif xmcda.get('id') == 'p':
                ppt = PerformanceTable(id = 'p')
                ppt.from_xmcda(xmcda)
            elif xmcda.get('id') == 'v':
                vpt = PerformanceTable(id = 'v')
                vpt.from_xmcda(xmcda)

        if qpt is not None and len(qpt) == 0 and len(ppt) > 0:
            qpt = ppt.copy()
            qpt.id = "q"

        if ppt is not None and len(ppt) == 0 and len(qpt) > 0:
            ppt = qpt.copy()
            ppt.id = "p"

        lbda = float(xmcda_lbda.text)

        self.__check_params_consistency(bpt, qpt, ppt, vpt)

        # Everything is fine
        self.cv = cvs
        self.balternatives = balternatives
        self.bpt = bpt
        self.qpt = qpt
        self.ppt = ppt
        self.vpt = vpt
        self.lbda = lbda

        # Categories Profiles
        self.categories = generate_categories(len(self.bpt) + 1,
                                              prefix = "")
        self.cat_profiles = generate_categories_profiles(self.categories)