package org.kevoree.library.reasoner.ecj; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.XMIResource; import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; import org.kevoree.ContainerRoot; import org.kevoree.KevoreePackage; import org.kevoree.tools.marShell.parser.ParserUtil; public class GeneticAlgorithm { public static void main(String[] args){ String basePath = GeneticAlgorithm.class.getClassLoader().getResource(".").getPath(); ContainerRoot myModel = load(basePath+"baseMyNode.kev"); ParserUtil.save(basePath +"kevoreeIndividualModel.kev", myModel); KevoreeGeneticAlgorithm kga = new KevoreeGeneticAlgorithm (); KevoreeIndividual ki = kga.start(); if (ki!=null){ ParserUtil.save(basePath +"kevoreeIndividualModel.kev", ki.myModel); App.startEditor(basePath+"kevoreeIndividualModel.kev"); KevoreeMultipleGeneticAlgorithm kmga = new KevoreeMultipleGeneticAlgorithm (); deleteAllOldModels(); printBestParetoFront(); } } private static void deleteAllOldModels() { File myFile = new File("Models"); if (myFile.isDirectory()){ myFile.delete(); } } public static ContainerRoot load(String uri) { ResourceSetImpl rs = new ResourceSetImpl(); rs.getResourceFactoryRegistry().getExtensionToFactoryMap().put("kev", new XMIResourceFactoryImpl()); rs.getPackageRegistry().put(KevoreePackage.eNS_URI, KevoreePackage.eINSTANCE); Resource res = rs.getResource(URI.createURI(uri), true); ((XMIResource) res).getDefaultLoadOptions().put(XMLResource.OPTION_ENCODING, "UTF-8"); ((XMIResource) res).getDefaultSaveOptions().put(XMLResource.OPTION_ENCODING, "UTF-8"); Object result = res.getContents().get(0); //println(res) return (ContainerRoot) result; } private static void printBestParetoFront() { File myStatFile = new File("out.stat"); String[] bestsIndividualsFile = retrieveBestIndividuals(myStatFile); System.out.println("Number of best individuals identified : " + bestsIndividualsFile.length); if (bestsIndividualsFile.length <= 20) { for (String path : bestsIndividualsFile) { App.startEditor(path); } }else { for (int i=0; i<10; i++){ App.startEditor(bestsIndividualsFile[i]); } } } private static String[] retrieveBestIndividuals(File myStatFile) { List<String> bestIndividualsFile = new ArrayList<String>(); List<KevoreeMultipleRepresentation> paretoFront = new ArrayList<KevoreeMultipleRepresentation>(); try{ InputStream ips=new FileInputStream(myStatFile); InputStreamReader ipsr=new InputStreamReader(ips); BufferedReader br=new BufferedReader(ipsr); String line; boolean pareto = false, evaluated = false, fitness = false, rank = false, file = false; KevoreeMultipleRepresentation current = new KevoreeMultipleRepresentation(); while ((line=br.readLine())!=null){ if (!pareto && line.contains("Pareto Front of Subpopulation 0")){ pareto = true; evaluated = true; } else if (pareto && evaluated){ current = new KevoreeMultipleRepresentation(); evaluated = false; fitness = true; } else if (pareto && fitness){ line = line.substring(line.indexOf("[")+1, line.indexOf("min]")); String[] toto = line.split(" "); float[] fit = new float[toto.length]; for (int i = 0; i < toto.length; i++) { fit[i] = new Float(toto[i]); } current.setFitness(fit); fitness = false; rank = true; } else if (pareto && rank){ //nothing to do rank = false; file = true; } else if (pareto && file) { current.setPathToFile(line); paretoFront.add(current); file = false; evaluated = true; } } br.close(); } catch (Exception e){ e.printStackTrace(); } if (!paretoFront.isEmpty()){ float minFitness = paretoFront.get(0).getFitness()[0]; for (KevoreeMultipleRepresentation kevoreeMultipleRepresentation : paretoFront) { if (minFitness > kevoreeMultipleRepresentation.getFitness()[0]){ minFitness = kevoreeMultipleRepresentation.getFitness()[0]; } } // List<float[]> representativeBestFitness = new ArrayList<float[]>(); for (KevoreeMultipleRepresentation kevoreeMultipleRepresentation : paretoFront) { if (minFitness == kevoreeMultipleRepresentation.getFitness()[0]){ // for (float[] fs : representativeBestFitness) { // kevoreeMultipleRepresentation.getFitness().equals(fs); // } kevoreeMultipleRepresentation.getFitness(); bestIndividualsFile.add(kevoreeMultipleRepresentation.getPathToFile()); } } } return bestIndividualsFile.toArray(new String[bestIndividualsFile.size()]); } }