コード例 #1
0
    def on_cbox_mrsort_stateChanged(self, state):
        if state == QtCore.Qt.Checked:
            index = self.tab_thresholds.indexOf(self.tab_indiff)
            self.tab_thresholds.removeTab(index)
            intex = self.tab_thresholds.indexOf(self.tab_pref)
            self.tab_thresholds.removeTab(index)
            self.table_indiff.remove_all()
            self.table_pref.remove_all()
            self.qpt = None
            self.ppt = None
        else:
            self.tab_thresholds.insertTab(0, self.tab_indiff,
                                          "Indifference")
            self.tab_thresholds.insertTab(1, self.tab_pref, "Preference")

            self.qpt = PerformanceTable(id = 'q')
            self.ppt = PerformanceTable(id = 'p')
            if self.cbox_samethresholds.isChecked() is True:
                self.set_same_threshold_for_all_profiles(self.qpt,
                                                         self.table_indiff)
                self.set_same_threshold_for_all_profiles(self.ppt,
                                                         self.table_pref)
            else:
                self.set_one_threshold_per_profile(self.qpt,
                                                   self.table_indiff)
                self.set_one_threshold_per_profile(self.ppt,
                                                   self.table_pref)
コード例 #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 on_button_generate_pressed(self):
        active_criteria = self.criteria.get_active()
        if self.bpt.is_complete(active_criteria.keys()) is False:
            QtGui.QMessageBox.information(None, "Error",
                                          "Profile table is incomplete")
            return

        if self.cbox_samethresholds.isChecked() is True:
            if self.cbox_mrsort.isChecked() is False:
                qpt = PerformanceTable(id = 'q')
                ppt = PerformanceTable(id = 'p')
                for i in range(len(self.bpt)):
                    qp = next(self.qpt.itervalues()).copy()
                    pp = next(self.ppt.itervalues()).copy()
                    name = "b%d" % (i + 1)
                    qp.id, pp.id = name, name
                    qpt.append(qp), ppt.append(pp)
            else:
                qpt = None
                ppt = None

            if self.cbox_noveto.isChecked() is False:
                vpt = PerformanceTable(id = 'v')
                for i in range(len(self.bpt)):
                    vp = next(self.vpt.itervalues()).copy()
                    vp.id = "b%d" % (i + 1)
                    vpt.append(vp)
            else:
                vpt = None
        else:
            qpt = self.qpt
            ppt = self.ppt
            vpt = self.vpt

        lbda = self.spinbox_cutlevel.value()
        model = ElectreTri(self.criteria, self.cv, self.bpt, lbda,
                           self.cat_profiles, vpt, qpt, ppt)

        if self.combo_procedure.currentIndex() == COMBO_PROC_OPTIMIST:
            aa = model.optimist(self.pt)
        else:
            aa = model.pessimist(self.pt)

        (f, encoding) = saveDialog(self, "Save output shapefile",
                                   "Shapefiles (*.shp)", "shp",
                                   QtGui.QFileDialog.AcceptSave)
        if f is None or encoding is None:
            return

        generate_decision_map(self.layer.layer, aa, f, encoding)
        self.save_to_xmcda(os.path.splitext(f)[0] + ".xmcda")

        if self.iface is not None:
            addtocDialog(self, f, len(model.bpt))
コード例 #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
    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)
コード例 #7
0
    def on_cbox_noveto_stateChanged(self, state):
        if state == QtCore.Qt.Checked:
            index = self.tab_thresholds.indexOf(self.tab_veto)
            self.tab_thresholds.removeTab(index)
            self.table_veto.remove_all()
            self.vpt = None
        else:
            self.tab_thresholds.insertTab(2, self.tab_veto, "Veto")

            self.vpt = PerformanceTable(id = 'v')
            if self.cbox_samethresholds.isChecked() is True:
                self.set_same_threshold_for_all_profiles(self.vpt,
                                                         self.table_veto)
            else:
                self.set_one_threshold_per_profile(self.vpt,
                                                   self.table_veto)
コード例 #8
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))
コード例 #9
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)