def parse_xmcda_files(in_dir): xml_crit = PyXMCDA.parseValidate(in_dir+"/criteria.xml") xml_alt = PyXMCDA.parseValidate(in_dir+"/alternatives.xml") xml_pt = PyXMCDA.parseValidate(in_dir+"/perfs_table.xml") xml_assign = PyXMCDA.parseValidate(in_dir+"/assign.xml") xml_cat = PyXMCDA.parseValidate(in_dir+"/categories.xml") if xml_crit == None: error_list.append("Invalid criteria file") return if xml_alt == None: error_list.append("Invalid alternative file") return if xml_pt == None: error_list.append("Invalid performance table file") return if xml_assign == None: error_list.append("Invalid assignment file") return if xml_cat == None: error_list.append("Invalid categories file") return try: alt_id = PyXMCDA.getAlternativesID(xml_alt) crit_id = PyXMCDA.getCriteriaID(xml_crit) pt = PyXMCDA.getPerformanceTable(xml_pt, alt_id, crit_id) cat_id = PyXMCDA.getCategoriesID(xml_cat) cat_rank = PyXMCDA.getCategoriesRank(xml_cat, cat_id) assign = PyXMCDA.getAlternativesAffectations(xml_assign) pref_dir = PyXMCDA.getCriteriaPreferenceDirections(xml_crit, crit_id) except: error_list.append("Failed to parse one or more file") return return (alt_id, crit_id, pt, cat_id, cat_rank, assign, pref_dir)
def main(argv=None): if argv is None: argv = sys.argv parser = OptionParser() parser.add_option("-i", "--in", dest="in_dir") parser.add_option("-o", "--out", dest="out_dir") (options, args) = parser.parse_args(argv[1:]) in_dir = options.in_dir out_dir = options.out_dir # Creating a list for error messages errorList = [] if not in_dir: errorList.append("option --in is missing") if not out_dir: errorList.append("option --out is missing") if not errorList: if not os.path.isfile (in_dir+"/alternatives.xml"): errorList.append("alternatives.xml is missing") if not os.path.isfile (in_dir+"/preferenceRelation.xml"): errorList.append("preferenceRelation.xml is missing") if not os.path.isfile (in_dir+"/alternativesAffectations.xml"): errorList.append("alternativesAffectations.xml is missing") if not os.path.isfile (in_dir+"/clustersRelations.xml"): errorList.append("clustersRelations.xml is missing") if not os.path.isfile (in_dir+"/clustersRelationsDetailed.xml"): errorList.append("clustersRelationsDetailed.xml is missing") if not errorList: # We parse all the mandatory input files xmltree_alternatives = PyXMCDA.parseValidate(in_dir+"/alternatives.xml") xmltree_preferenceRelation = PyXMCDA.parseValidate(in_dir+"/preferenceRelation.xml") xmltree_alternativesAffectations = PyXMCDA.parseValidate(in_dir+"/alternativesAffectations.xml") xmltree_clustersRelations = PyXMCDA.parseValidate(in_dir+"/clustersRelations.xml") xmltree_clustersRelationsDetailed = PyXMCDA.parseValidate(in_dir+"/clustersRelationsDetailed.xml") # We check if all mandatory input files are valid if xmltree_alternatives == None : errorList.append("alternatives.xml can't be validated.") if xmltree_preferenceRelation == None : errorList.append("preferenceRelation.xml can't be validated.") if xmltree_alternativesAffectations == None : errorList.append("alternativesAffectations.xml can't be validated.") if xmltree_clustersRelations == None : errorList.append("clustersRelations.xml can't be validated.") if xmltree_clustersRelationsDetailed == None : errorList.append("clustersRelationsDetailed.xml can't be validated.") if not errorList : alternativesId = PyXMCDA.getAlternativesID(xmltree_alternatives) alternativesRel = PyXMCDA.getAlternativesComparisonsValues(xmltree_preferenceRelation, alternativesId) if not alternativesId : errorList.append("No active alternatives found.") if not alternativesRel : errorList.append("Problems between relation and alternatives.") missing_eval = False for o in alternativesId: if not (o in alternativesRel): missing_eval = True break else: for p in alternativesId: if not (p in alternativesRel[o]): missing_eval = True break else: if not ('i' in alternativesRel[o][p]): missing_eval = True break if not ('p+' in alternativesRel[o][p]): missing_eval = True break if not ('p-' in alternativesRel[o][p]): missing_eval = True break if not ('j' in alternativesRel[o][p]): missing_eval = True break if missing_eval: errorList.append("Not all alternatives from alternatives.xml contain evaluations in preferenceRelation.xml, or evaluations are incomplete. Possible inputs from different sources") alternativesAffectations = PyXMCDA.getAlternativesAffectations(xmltree_alternativesAffectations) Knames = [] for o in alternativesId: clusterId = alternativesAffectations[o] if not (clusterId in Knames): Knames.append(clusterId) if Knames == []: errorList.append("No clusters found.") K = {} for clusterId in Knames: K[clusterId] = [] for o in alternativesId: K[alternativesAffectations[o]].append(o) clustersRel = PyXMCDA.getCategoriesComparisonsValues(xmltree_clustersRelations, Knames) if not clustersRel : errorList.append("Problems with clusters relations.") RK = {} for cid1 in Knames: RK[cid1] = {} for cid2 in Knames: if cid1 == cid2: RK[cid1][cid2] = 'i' else: RK[cid1][cid2] = '' missing_eval = False for cid1 in Knames: for cid2 in Knames: if cid1 != cid2: found = False if cid1 in clustersRel: if cid2 in clustersRel[cid1]: found = True RK[cid1][cid2] = clustersRel[cid1][cid2] if clustersRel[cid1][cid2] == 'p+': RK[cid2][cid1] = 'p-' elif clustersRel[cid1][cid2] == 'p-': RK[cid2][cid1] = 'p+' else: RK[cid2][cid1] = clustersRel[cid1][cid2] if not found and cid2 in clustersRel: if cid1 in clustersRel[cid2]: found = True RK[cid2][cid1] = clustersRel[cid2][cid1] if clustersRel[cid2][cid1] == 'p+': RK[cid1][cid2] = 'p-' elif clustersRel[cid2][cid1] == 'p-': RK[cid1][cid2] = 'p+' else: RK[cid1][cid2] = clustersRel[cid2][cid1] if not found: missing_eval = True break if missing_eval: errorList.append("Incomplete clusters relations.") RKsum = PyXMCDA.getCategoriesComparisonsAllValues(xmltree_clustersRelationsDetailed, Knames) if not RKsum : errorList.append("Problems with detailed clusters relations.") missing_eval = False for k1 in Knames: if not (k1 in RKsum): missing_eval = True break else: for k2 in Knames: if not (k2 in RKsum[k1]): missing_eval = True break else: if not ('i' in RKsum[k1][k2]): missing_eval = True break if not ('p+' in RKsum[k1][k2]): missing_eval = True break if not ('p-' in RKsum[k1][k2]): missing_eval = True break if not ('j' in RKsum[k1][k2]): missing_eval = True break if missing_eval: errorList.append("Incomplete clusters relations summary.") if not errorList : PC = PlotClusters(alternativesId, alternativesRel, Knames, K, RK, RKsum) try: PC.PlotKideal(out_dir) fo = open(out_dir+"/Kideal.xml",'w') PyXMCDA.writeHeader(fo) fo.write('<alternativeValue mcdaConcept="Ideal Relations between Clusters">\n') fo.write('\t<value>\n') fo.write('\t\t<image>') fo.write(base64.b64encode(open(out_dir+"/Kideal.png","rb").read())) fo.write('</image>\n') fo.write('\t</value>\n') fo.write('</alternativeValue>\n') PyXMCDA.writeFooter(fo) fo.close() os.remove(out_dir+'/Kideal.png') PC.PlotKreal(out_dir) fo = open(out_dir+"/Kreal.xml",'w') PyXMCDA.writeHeader(fo) fo.write('<alternativeValue mcdaConcept="Real Relations between Clusters">\n') fo.write('\t<value>\n') fo.write('\t\t<image>') fo.write(base64.b64encode(open(out_dir+"/Kreal.png","rb").read())) fo.write('</image>\n') fo.write('\t</value>\n') fo.write('</alternativeValue>\n') PyXMCDA.writeFooter(fo) fo.close() os.remove(out_dir+'/Kreal.png') PC.PlotKidealsum(out_dir) fo = open(out_dir+"/Kidealsum.xml",'w') PyXMCDA.writeHeader(fo) fo.write('<alternativeValue mcdaConcept="Summary of Ideal Relations between Clusters">\n') fo.write('\t<value>\n') fo.write('\t\t<image>') fo.write(base64.b64encode(open(out_dir+"/Kidealsum.png","rb").read())) fo.write('</image>\n') fo.write('\t</value>\n') fo.write('</alternativeValue>\n') PyXMCDA.writeFooter(fo) fo.close() os.remove(out_dir+'/Kidealsum.png') PC.PlotKrealsum(out_dir) fo = open(out_dir+"/Krealsum.xml",'w') PyXMCDA.writeHeader(fo) fo.write('<alternativeValue mcdaConcept="Summary of Real Relations between Clusters">\n') fo.write('\t<value>\n') fo.write('\t\t<image>') fo.write(base64.b64encode(open(out_dir+"/Krealsum.png","rb").read())) fo.write('</image>\n') fo.write('\t</value>\n') fo.write('</alternativeValue>\n') PyXMCDA.writeFooter(fo) fo.close() os.remove(out_dir+'/Krealsum.png') except Exception as e: import traceback traceback.print_exc() errorList.append("Could not plot clusters.") # Creating log and error file, messages.xml fileMessages = open(out_dir+"/messages.xml", 'w') PyXMCDA.writeHeader (fileMessages) if not errorList : PyXMCDA.writeLogMessages (fileMessages, ["Execution ok"]) else : PyXMCDA.writeErrorMessages (fileMessages, errorList) PyXMCDA.writeFooter(fileMessages) fileMessages.close()
def main(argv=None): if argv is None: argv = sys.argv parser = OptionParser() parser.add_option("-i", "--in", dest="in_dir") parser.add_option("-o", "--out", dest="out_dir") (options, args) = parser.parse_args(argv[1:]) in_dir = options.in_dir out_dir = options.out_dir # Creating a list for error messages errorList = [] if not in_dir: errorList.append("option --in is missing") if not out_dir: errorList.append("option --out is missing") if not errorList: if not os.path.isfile (in_dir+"/alternatives.xml"): errorList.append("alternatives.xml is missing") if not os.path.isfile (in_dir+"/preferenceRelation.xml"): errorList.append("preferenceRelation.xml is missing") if not os.path.isfile (in_dir+"/alternativesAffectations.xml"): errorList.append("alternativesAffectations.xml is missing") if not errorList: # We parse all the mandatory input files xmltree_alternatives = PyXMCDA.parseValidate(in_dir+"/alternatives.xml") xmltree_preferenceRelation = PyXMCDA.parseValidate(in_dir+"/preferenceRelation.xml") xmltree_alternativesAffectations = PyXMCDA.parseValidate(in_dir+"/alternativesAffectations.xml") # We check if all mandatory input files are valid if xmltree_alternatives == None : errorList.append("alternatives.xml can't be validated.") if xmltree_preferenceRelation == None : errorList.append("preferenceRelation.xml can't be validated.") if xmltree_alternativesAffectations == None : errorList.append("alternativesAffectations.xml can't be validated.") if not errorList : alternativesId = PyXMCDA.getAlternativesID(xmltree_alternatives) alternativesRel = PyXMCDA.getAlternativesComparisonsValues(xmltree_preferenceRelation, alternativesId) if not alternativesId : errorList.append("No active alternatives found.") if not alternativesRel : errorList.append("Problems between relation and alternatives.") missing_eval = False for o in alternativesId: if not (o in alternativesRel): missing_eval = True break else: for p in alternativesId: if not (p in alternativesRel[o]): missing_eval = True break else: if not ('i' in alternativesRel[o][p]): missing_eval = True break if not ('p+' in alternativesRel[o][p]): missing_eval = True break if not ('p-' in alternativesRel[o][p]): missing_eval = True break if not ('j' in alternativesRel[o][p]): missing_eval = True break if missing_eval: errorList.append("Not all alternatives from alternatives.xml contain evaluations in preferenceRelation.xml, or evaluations are incomplete. Possible inputs from different sources") alternativesAffectations = PyXMCDA.getAlternativesAffectations(xmltree_alternativesAffectations) Knames = [] for o in alternativesId: clusterId = alternativesAffectations[o] if not (clusterId in Knames): Knames.append(clusterId) if Knames == []: errorList.append("No clusters found.") K = {} for clusterId in Knames: K[clusterId] = [] for o in alternativesId: K[alternativesAffectations[o]].append(o) if not errorList : CRS = ClustersRelationSummary(alternativesId, alternativesRel) RKsum = CRS.RKSummary(K) L = ['i','p+','p-','j'] fo = open(out_dir+"/clustersRelationsDetailed.xml",'w') PyXMCDA.writeHeader(fo) fo.write('<categoriesComparisons>\n') fo.write('\t<pairs>\n') for i in Knames: for j in Knames: fo.write('\t\t<pair>\n') fo.write('\t\t\t<initial>\n') fo.write('\t\t\t\t<categoryID>'+i+'</categoryID>\n') fo.write('\t\t\t</initial>\n') fo.write('\t\t\t<terminal>\n') fo.write('\t\t\t\t<categoryID>'+j+'</categoryID>\n') fo.write('\t\t\t</terminal>\n') fo.write('\t\t\t<values>\n') for l in L: fo.write('\t\t\t\t<value id="'+ l +'">\n') fo.write('\t\t\t\t\t<real>'+str(RKsum[i][j][l])+'</real>\n') fo.write('\t\t\t\t</value>\n') fo.write('\t\t\t</values>\n') fo.write('\t\t</pair>\n') fo.write('\t</pairs>\n') fo.write('</categoriesComparisons>\n') PyXMCDA.writeFooter(fo) fo.close() # Creating log and error file, messages.xml fileMessages = open(out_dir+"/messages.xml", 'w') PyXMCDA.writeHeader (fileMessages) if not errorList : PyXMCDA.writeLogMessages (fileMessages, ["Execution ok"]) else : PyXMCDA.writeErrorMessages (fileMessages, errorList) PyXMCDA.writeFooter(fileMessages) fileMessages.close()
def main(argv=None): if argv is None: argv = sys.argv parser = OptionParser() parser.add_option("-i", "--in", dest="in_dir") parser.add_option("-o", "--out", dest="out_dir") (options, args) = parser.parse_args(argv[1:]) in_dir = options.in_dir out_dir = options.out_dir # Creating a list for error messages errorList = [] if not in_dir: errorList.append("option --in is missing") if not out_dir: errorList.append("option --out is missing") # Creating a list for log messages logList = [] if not errorList: if not os.path.isfile (in_dir+"/alternatives.xml"): errorList.append("alternatives.xml is missing") if not os.path.isfile (in_dir+"/preferenceRelation.xml"): errorList.append("preferenceRelation.xml is missing") if not os.path.isfile (in_dir+"/alternativesAffectations.xml"): errorList.append("alternativesAffectations.xml is missing") if not os.path.isfile (in_dir+"/clustersRelations.xml"): errorList.append("clustersRelations.xml is missing") if not errorList: # We parse all the mandatory input files xmltree_alternatives = PyXMCDA.parseValidate(in_dir+"/alternatives.xml") xmltree_preferenceRelation = PyXMCDA.parseValidate(in_dir+"/preferenceRelation.xml") xmltree_alternativesAffectations = PyXMCDA.parseValidate(in_dir+"/alternativesAffectations.xml") xmltree_clustersRelations = PyXMCDA.parseValidate(in_dir+"/clustersRelations.xml") # We check if all mandatory input files are valid if xmltree_alternatives == None : errorList.append("alternatives.xml can't be validated.") if xmltree_preferenceRelation == None : errorList.append("preferenceRelation.xml can't be validated.") if xmltree_alternativesAffectations == None : errorList.append("alternativesAffectations.xml can't be validated.") if xmltree_clustersRelations == None : errorList.append("clustersRelations.xml can't be validated.") if not errorList : alternativesId = PyXMCDA.getAlternativesID(xmltree_alternatives) alternativesRel = PyXMCDA.getAlternativesComparisonsValues(xmltree_preferenceRelation, alternativesId) if not alternativesId : errorList.append("No active alternatives found.") if not alternativesRel : errorList.append("Problems between relation and alternatives.") missing_eval = False for o in alternativesId: if not (o in alternativesRel): missing_eval = True break else: for p in alternativesId: if not (p in alternativesRel[o]): missing_eval = True break else: if not ('i' in alternativesRel[o][p]): missing_eval = True break if not ('p+' in alternativesRel[o][p]): missing_eval = True break if not ('p-' in alternativesRel[o][p]): missing_eval = True break if not ('j' in alternativesRel[o][p]): missing_eval = True break if missing_eval: errorList.append("Not all alternatives from alternatives.xml contain evaluations in preferenceRelation.xml, or evaluations are incomplete. Possible inputs from different sources") alternativesAffectations = PyXMCDA.getAlternativesAffectations(xmltree_alternativesAffectations) Knames = [] for o in alternativesId: clusterId = alternativesAffectations[o] if not (clusterId in Knames): Knames.append(clusterId) if Knames == []: errorList.append("No clusters found.") K = {} for clusterId in Knames: K[clusterId] = [] for o in alternativesId: K[alternativesAffectations[o]].append(o) clustersRel = PyXMCDA.getCategoriesComparisonsValues(xmltree_clustersRelations, Knames) if not clustersRel : errorList.append("Problems with clusters relations.") RK = {} for cid1 in Knames: RK[cid1] = {} for cid2 in Knames: if cid1 == cid2: RK[cid1][cid2] = 'i' else: RK[cid1][cid2] = '' missing_eval = False for cid1 in Knames: for cid2 in Knames: if cid1 != cid2: found = False if cid1 in clustersRel: if cid2 in clustersRel[cid1]: found = True RK[cid1][cid2] = clustersRel[cid1][cid2] if clustersRel[cid1][cid2] == 'p+': RK[cid2][cid1] = 'p-' elif clustersRel[cid1][cid2] == 'p-': RK[cid2][cid1] = 'p+' else: RK[cid2][cid1] = clustersRel[cid1][cid2] if not found and cid2 in clustersRel: if cid1 in clustersRel[cid2]: found = True RK[cid2][cid1] = clustersRel[cid2][cid1] if clustersRel[cid2][cid1] == 'p+': RK[cid1][cid2] = 'p-' elif clustersRel[cid2][cid1] == 'p-': RK[cid1][cid2] = 'p+' else: RK[cid1][cid2] = clustersRel[cid2][cid1] if not found: missing_eval = True break if missing_eval: errorList.append("Incomplete clusters relations. Each pair needs an evaluation.") if not errorList : E = MccEval(alternativesId, alternativesRel, Knames, K, RK) o_nr,o_r,o_t,o_q = E.GetPerformances() logList.append("%.2f %% (%d/%d) relations in accordance to the Non-Relational Clustering problematic"%(200*o_nr/len(alternativesId)/(len(alternativesId) - 1),o_nr,len(alternativesId)*(len(alternativesId) - 1)/2)) logList.append("%.2f %% (%d/%d) relations in accordance to the Relational Clustering problematic"%(200*o_r/len(alternativesId)/(len(alternativesId) - 1),o_r,len(alternativesId)*(len(alternativesId) - 1)/2)) logList.append("%d cycles detected"%(o_t)) logList.append("%d relations in discordance to the {p+,p-}-exclusivity property"%(o_q)) if not errorList : # Output results, results.xml output = open(out_dir+"/results.xml", 'w') PyXMCDA.writeHeader (output) PyXMCDA.writeLogMessages (output, logList) PyXMCDA.writeFooter(output) output.close() # Creating log and error file, messages.xml fileMessages = open(out_dir+"/messages.xml", 'w') PyXMCDA.writeHeader (fileMessages) if not errorList : PyXMCDA.writeLogMessages (fileMessages, ["Execution ok"]) else : PyXMCDA.writeErrorMessages (fileMessages, errorList) PyXMCDA.writeFooter(fileMessages) fileMessages.close()