Show useful info for classes with subtypes.
closes #35 - Show assignable subtypes - Rename YamlStatistics to CommandLineStatistics
This commit is contained in:
parent
e5c8322d78
commit
7f5f3c5cea
@ -12,10 +12,12 @@ import eva2.optimization.statistics.*;
|
||||
import eva2.optimization.strategies.InterfaceOptimizer;
|
||||
import eva2.problems.InterfaceAdditionalPopulationInformer;
|
||||
import eva2.problems.InterfaceOptimizationProblem;
|
||||
import eva2.tools.ReflectPackage;
|
||||
import eva2.util.annotation.Description;
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
@ -35,7 +37,7 @@ public class Main {
|
||||
Class<?> clazz = Class.forName(className);
|
||||
printHelpFor(clazz);
|
||||
} catch (ClassNotFoundException e) {
|
||||
System.out.printf("Class %s does not exist.\n", className);
|
||||
System.out.printf("No help available for %s.\n", className);
|
||||
}
|
||||
System.exit(-1);
|
||||
} else {
|
||||
@ -51,13 +53,49 @@ public class Main {
|
||||
printHelpFor(StatisticsParameters.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints formatted help output for a specific class.
|
||||
*
|
||||
* If the class is an interface or abstract class additional information
|
||||
* on assignable subclasses will be shown.
|
||||
*
|
||||
* @param clazz The class to show help for.
|
||||
*/
|
||||
private static void printHelpFor(Class<?> clazz) {
|
||||
System.out.println(clazz.getName() + "\n");
|
||||
if (clazz.isAnnotationPresent(Description.class)) {
|
||||
Description description = clazz.getAnnotation(Description.class);
|
||||
System.out.println(description.value());
|
||||
System.out.printf("%s\n\n", description.value());
|
||||
}
|
||||
|
||||
/**
|
||||
* In case we have an Abstract class or Interface show available
|
||||
* sub types.
|
||||
*/
|
||||
if (clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers())) {
|
||||
Class<?>[] subTypes = ReflectPackage.getAssignableClassesInPackage(clazz.getPackage().getName(), clazz, true, true);
|
||||
if (subTypes.length > 0) {
|
||||
System.out.printf("Available types for %s\n\n", clazz.getName());
|
||||
for (Class<?> type : subTypes) {
|
||||
if (Modifier.isAbstract(type.getModifiers())) {
|
||||
continue;
|
||||
}
|
||||
Description description = clazz.getAnnotation(Description.class);
|
||||
System.out.printf("\t\033[1m%s\033[0m\n", type.getName());
|
||||
if (description != null) {
|
||||
System.out.printf("\t\t%s", description.value());
|
||||
} else {
|
||||
System.out.println("\t\tNo description available.");
|
||||
}
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get available parameters for this class and list them with their
|
||||
* description.
|
||||
*/
|
||||
ParameterGenerator generator = new ParameterGenerator(clazz, false);
|
||||
generator.generate();
|
||||
Map<String, List<Parameter>> paramList = generator.getParameterList();
|
||||
@ -67,13 +105,35 @@ public class Main {
|
||||
System.out.println("Options:");
|
||||
|
||||
for (Parameter key : parameters) {
|
||||
System.out.printf("\t\033[1m--%s\033[0m \033[4m%s\033[0m\n", key.getName(), key.getType().getName());
|
||||
Class<?> type = key.getType();
|
||||
String typeDefinition;
|
||||
if (type.isEnum()) {
|
||||
Enum[] enumConstants = (Enum[])type.getEnumConstants();
|
||||
typeDefinition = "{";
|
||||
for (int i = 0; i < enumConstants.length; i++) {
|
||||
typeDefinition += enumConstants[i].name();
|
||||
if (i != enumConstants.length - 1) {
|
||||
typeDefinition += ",";
|
||||
}
|
||||
}
|
||||
typeDefinition += "}";
|
||||
} else {
|
||||
typeDefinition = key.getType().getName();
|
||||
}
|
||||
System.out.printf("\t\033[1m--%s\033[0m \033[4m%s\033[0m\n", key.getName(), typeDefinition);
|
||||
System.out.printf("\t\t%s\n", key.getDescription());
|
||||
}
|
||||
}
|
||||
System.out.print("\n\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* This method takes a set of command line arguments and tries to construct
|
||||
* OptimizationParameters and StatisticsParameters from it. It will use defaults if
|
||||
* not otherwise configured.
|
||||
*
|
||||
* @param args Command line arguments
|
||||
*/
|
||||
private static void executeArguments(String[] args) {
|
||||
InterfaceOptimizationParameters parameters = OptimizationBuilder.parseOptimizerArguments(args);
|
||||
InterfaceStatisticsParameters statisticsParameters = OptimizationBuilder.parseStatisticsArguments(args);
|
||||
@ -88,7 +148,7 @@ public class Main {
|
||||
optimizationLog.put("numberOfRuns", statisticsParameters.getMultiRuns());
|
||||
optimizationLog.put("seed", parameters.getRandomSeed());
|
||||
|
||||
YamlStatistics yamlStatistics = new YamlStatistics(statisticsParameters);
|
||||
CommandLineStatistics yamlStatistics = new CommandLineStatistics(statisticsParameters);
|
||||
|
||||
/**
|
||||
* Runs optimization
|
||||
@ -115,7 +175,10 @@ public class Main {
|
||||
}
|
||||
}
|
||||
|
||||
final class YamlStatistics implements InterfaceStatistics {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
final class CommandLineStatistics implements InterfaceStatistics {
|
||||
private InterfaceStatisticsParameters statisticsParameters;
|
||||
private List<LinkedHashMap<String, Object>> runs;
|
||||
private LinkedHashMap<String, Object> currentRun;
|
||||
@ -124,7 +187,7 @@ final class YamlStatistics implements InterfaceStatistics {
|
||||
private int currentGeneration;
|
||||
|
||||
|
||||
public YamlStatistics(InterfaceStatisticsParameters statisticsParameters) {
|
||||
public CommandLineStatistics(InterfaceStatisticsParameters statisticsParameters) {
|
||||
super();
|
||||
this.statisticsParameters = statisticsParameters;
|
||||
this.runs = new ArrayList<>(statisticsParameters.getMultiRuns());
|
||||
|
@ -170,10 +170,8 @@ public final class OptimizationBuilder {
|
||||
} else if (type.isArray() && ((ArgumentTree)tree.get(name)).getValue() != null) {
|
||||
// ToDo: Implement array parsing
|
||||
} else if (type.isEnum() && ((ArgumentTree)tree.get(name)).getValue() != null) {
|
||||
int enumIndex = Integer.parseInt((String)((ArgumentTree)tree.get(name)).getValue());
|
||||
|
||||
// ToDo: Properly check
|
||||
obj = type.getEnumConstants()[enumIndex];
|
||||
String enumName = (String)((ArgumentTree)tree.get(name)).getValue();
|
||||
obj = Enum.valueOf((Class<Enum>)type, enumName);
|
||||
} else {
|
||||
// The subtree has the name of the class
|
||||
String className = (String)((ArgumentTree)tree.get(name)).getValue();
|
||||
|
@ -79,7 +79,7 @@ public class ParameterGenerator {
|
||||
}
|
||||
parameter = new Parameter(name, param.description(), type);
|
||||
} else {
|
||||
parameter = new Parameter(name, "No description available", type);
|
||||
parameter = new Parameter(name, "No description available.", type);
|
||||
}
|
||||
|
||||
parameters.add(parameter);
|
||||
|
Loading…
x
Reference in New Issue
Block a user