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)
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)
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))
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
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
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)
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)
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))
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)