/*******************************************************************************
* Copyright (c) 2009 University of Edinburgh.
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the BSD Licence, which accompanies this feature
* and can be downloaded from http://groups.inf.ed.ac.uk/pepa/update/licence.txt
******************************************************************************/
package uk.ac.ed.inf.biopepa.core.sba;
import java.lang.reflect.Constructor;
import java.util.*;
public class Parameters {
Map<Parameter, Object> parameters = new HashMap<Parameter, Object>();
public Map<Parameter, Object> getParameters(){
return this.parameters;
}
public enum Parameter {
Start_Time("Start time", "start-time", Double.class, 0.00), Stop_Time("Stop time", "stop-time", Double.class,
100.0), Step_Size("Step size", "step-size", Double.class, 0.001), Data_Points("Number of data points",
"data-points", Integer.class, 100), Components("Components", "components",
(new String[] {}).getClass(), new String[] {}), Independent_Replications(
"Number of independent replications", "replications", Integer.class, 1), Relative_Error(
"Relative error", "relative-error", Double.class, 0.0001), Absolute_Error("Absolute error",
"absolute-error", Double.class, 0.0001), Confidence_Interval("Confidence interval",
"confidence-interval", Double.class, 0.05);
Class<?> parameterClass;
String argument, descriptiveName;
Object defaultValue;
Parameter(String name, String argument, Class<?> parameterClass, Object defaultValue) {
this.descriptiveName = name;
this.argument = argument;
this.parameterClass = parameterClass;
this.defaultValue = defaultValue;
}
public Object getDefault() {
return defaultValue;
}
public String getDescriptiveName(){
return this.descriptiveName;
}
public String toString() {
return descriptiveName;
}
public String getKey() {
return argument;
}
public Class<? extends Object> getType() {
return parameterClass;
}
public Object parseString(String value) {
try {
return parameterClass.getConstructor(String.class).newInstance(value);
} catch (Exception e) {
return null;
}
}
}
public Object getValue(Parameter parameter) {
return parameters.get(parameter);
}
public void setValue(Parameter parameter, Object value) {
if (parameter.parameterClass.isInstance(value))
parameters.put(parameter, value);
else if (parameter.equals(Parameter.Components) && value instanceof String) {
StringBuilder sb = new StringBuilder((String) value);
ArrayList<String> al = new ArrayList<String>();
int index, length;
try {
while (sb.length() > 0) {
index = sb.indexOf(":");
length = Integer.parseInt(sb.substring(0, index));
sb.delete(0, index + 1);
al.add(sb.substring(0, length));
sb.delete(0, length);
}
} catch (NumberFormatException e) {
throw new IllegalArgumentException(parameter.descriptiveName + " requires a legal bencoded string.");
}
parameters.put(parameter, al.toArray(new String[] {}));
} else if (value instanceof String) { // try and cast...
try {
Constructor<?> constructor = parameter.parameterClass.getConstructor(String.class);
Object o = constructor.newInstance(value);
parameters.put(parameter, o);
} catch (Exception e) {
throw new IllegalArgumentException("Value is not of type " + parameter.parameterClass.getName()
+ " and cannot be constructed using a String as a parameter.");
}
} else
throw new IllegalArgumentException("Value is not of type " + parameter.parameterClass.getName());
}
public Parameter[] arrayOfKeys() {
Parameter[] p = new Parameter[parameters.size()];
Parameter[] q = Parameter.values();
int i = 0;
for (Parameter param : q)
if (parameters.containsKey(param))
p[i++] = param;
return p;
}
public Set<Parameter> setOfKeys() {
return parameters.keySet();
}
void add(Parameter parameter) {
if (parameter == null)
throw new NullPointerException();
parameters.put(parameter, parameter.getDefault());
}
}