Adding reflections library to dynamically look up classes that implement a certain type

Changing CLI implementation to provide first parameters
This commit is contained in:
Fabian Becker 2013-10-01 21:57:18 +02:00
parent 099601cf2a
commit 05cb20f64c
2 changed files with 74 additions and 26 deletions

View File

@ -48,6 +48,11 @@
<version>2.2.4</version> <version>2.2.4</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.9-RC1</version>
</dependency>
</dependencies> </dependencies>

View File

@ -1,23 +1,41 @@
package eva2.cli; package eva2.cli;
import eva2.optimization.problems.InterfaceOptimizationProblem;
import eva2.optimization.strategies.DifferentialEvolution; import eva2.optimization.strategies.DifferentialEvolution;
import eva2.optimization.strategies.InterfaceOptimizer; import eva2.optimization.strategies.InterfaceOptimizer;
import eva2.util.annotation.Parameter; import eva2.util.annotation.Parameter;
import org.apache.commons.cli.*; import org.apache.commons.cli.*;
import eva2.optimization.OptimizationStateListener; import eva2.optimization.OptimizationStateListener;
import org.reflections.Reflections;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
public class Main implements OptimizationStateListener { public class Main implements OptimizationStateListener {
private Options createCommandLineOptions() { private static Options createDefaultCommandLineOptions() {
Options opt = new Options(); Options opt = new Options();
OptionGroup optGroup = new OptionGroup();
return null; opt.addOption(OptionBuilder
.withLongOpt("optimizer")
.withDescription("Optimizer")
.create("op")
);
opt.addOption("ps", "popsize", true, "Population size");
opt.addOption(OptionBuilder
.withLongOpt("help")
.withDescription("Shows this help message or specific help for [optimizer]")
.hasOptionalArgs(1)
.create('h')
);
return opt;
} }
@Override @Override
@ -57,37 +75,62 @@ public class Main implements OptimizationStateListener {
System.out.print("\r" + bar.toString()); System.out.print("\r" + bar.toString());
} }
public static Map<String, Class<? extends InterfaceOptimizer>> createOptimizerList() {
Map<String, Class<? extends InterfaceOptimizer>>optimizerList = new HashMap<String, Class<? extends InterfaceOptimizer>>();
Reflections reflections = new Reflections("eva2.optimization.strategies");
Set<Class<? extends InterfaceOptimizer>> optimizers = reflections.getSubTypesOf(InterfaceOptimizer.class);
for(Class<? extends InterfaceOptimizer> optimizer : optimizers) {
optimizerList.put(optimizer.getName(), optimizer);
}
return optimizerList;
}
public static void showHelp(Options options) {
HelpFormatter helpFormatter = new HelpFormatter();
helpFormatter.printHelp("eva2", "", options, "", true);
}
public static void main(String[] args) { public static void main(String[] args) {
Options defaultOptions = createDefaultCommandLineOptions();
Map<String, Class<? extends InterfaceOptimizer>> optimizerList = new HashMap<String, Class<? extends InterfaceOptimizer>>(); CommandLineParser cliParser = new BasicParser();
CommandLine commandLine = null;
optimizerList.put("Differential Evolution", eva2.optimization.strategies.DifferentialEvolution.class); try {
optimizerList.put("Particle Swarm Optimization", eva2.optimization.strategies.ParticleSwarmOptimization.class); commandLine = cliParser.parse(defaultOptions, args);
optimizerList.put("Genetic Algorithm", eva2.optimization.strategies.GeneticAlgorithm.class); } catch (ParseException e) {
optimizerList.put("Evolution Strategies", eva2.optimization.strategies.EvolutionStrategies.class); showHelp(defaultOptions);
System.exit(-1);
eva2.optimization.strategies.DifferentialEvolution de = new DifferentialEvolution(); }
for(Field field : de.getClass().getDeclaredFields()) {
Parameter p;
if((p = field.getAnnotation(Parameter.class)) != null) {
System.out.println(p.name() + " -> " + p.description());
if(commandLine.hasOption("help")) {
String helpOption = commandLine.getOptionValue("help");
if("optimizer".equals(helpOption)) {
showOptimizerHelp();
} else if ("problem".equals(helpOption)) {
showProblemHelp();
} else {
showHelp(defaultOptions);
} }
} }
}
/* private static void showOptimizerHelp() {
List<String> classes = GenericObjectEditor.getClassesFromClassPath("eva2.optimization.strategies.InterfaceOptimizer", null); Map<String, Class<? extends InterfaceOptimizer>> optimizerList = createOptimizerList();
for(String classA : classes) {
System.out.println(classA); System.out.println("Available Optimizers:");
for(String name : optimizerList.keySet()) {
System.out.printf("\t%s\n", name);
} }
}
List<String> problems = GenericObjectEditor.getClassesFromClassPath("eva2.optimization.problems.InterfaceOptimizationProblem", null); private static void showProblemHelp() {
for(String problem : problems) { System.out.println("Available Problems:");
System.out.println(problem); Reflections reflections = new Reflections("eva2.optimization.problems");
} */ Set<Class<? extends InterfaceOptimizationProblem>> problemsList = reflections.getSubTypesOf(InterfaceOptimizationProblem.class);
for(int i = 0; i<= 100; i++) { for(Class<? extends InterfaceOptimizationProblem> problem : problemsList) {
printProgressBar(i);
System.out.printf("\t%s\n", problem.getSimpleName());
} }
} }
} }