package aima.gui.fx.framework; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * Parameter for simulation experiments. A parameter has a unique name, a finite * sequence of values, and a finite sequence of value names. A default value can * be specified. Otherwise the first value is the default value. If value names * are not specified, a default value description is generated following a * name-value equation pattern. * * @author Ruediger Lunde */ public class Parameter { private String name; private List<Object> values; private List<String> valueNames; private int defaultValueIndex; private String dependsOnParam; private List<String> dependsOnValues; public static Optional<Parameter> find(List<Parameter> params, String paramName) { return params.stream().filter(p -> p.getName().equals(paramName)).findFirst(); } public static int indexOf(List<Parameter> params, String paramName) { for (int i = 0; i < params.size(); i++) if (params.get(i).getName().equals(paramName)) return i; return -1; } public Parameter(String name, Object... values) { this.name = name; setValues(values); } public void setValues(Object... values) { this.values = Arrays.asList(values); valueNames = this.values.stream().map(v -> name + "=" + v).collect(Collectors.toList()); } public void setValueNames(String... valueNames) { this.valueNames = Arrays.asList(valueNames); if (values != null && values.size() != this.valueNames.size()) throw new IllegalArgumentException("Different number of values and value names for parameter " + name); } public void setDefaultValueIndex(int idx) { defaultValueIndex = idx; } /** * Indicates that this parameter is only relevant, if one of the specified * values has been assigned to another parameter. */ public void setDependency(String paramName, String... values) { dependsOnParam = paramName; dependsOnValues = Arrays.asList(values); } public String getName() { return name; } public List<String> getValueNames() { return valueNames; } public List<Object> getValues() { return values; } public int getDefaultValueIndex() { return defaultValueIndex; } public String getDependencyParameter() { return dependsOnParam; } public List<String> getDependencyValues() { return dependsOnValues; } }