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