package org.jactr.tools.itr; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.antlr.runtime.tree.CommonTree; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jactr.core.model.IModel; import org.jactr.core.utils.parameter.IParameterized; import org.jactr.entry.iterative.IIterativeRunListener; import org.jactr.entry.iterative.TerminateIterativeRunException; /** * base class for an iterative listener that can modify a parameter value in a * model. * * @author harrison */ public abstract class AbstractParameterModifier implements IIterativeRunListener, IParameterized, IParameterModifier { /** * Logger definition */ static private transient Log LOGGER = LogFactory .getLog(AbstractParameterModifier.class); private String _parameterName; private List<String> _parameterValues; public AbstractParameterModifier() { _parameterName = ""; _parameterValues = new ArrayList<String>(); } public void exceptionThrown(int index, IModel model, Throwable thrown) throws TerminateIterativeRunException { // NoOp } public void preLoad(int currentRunIndex, int totalRuns) throws TerminateIterativeRunException { } public void postRun(int currentRunIndex, int totalRuns, Collection<IModel> models) throws TerminateIterativeRunException { // NoOp } public List<String> getParameterValues() { return Collections.unmodifiableList(_parameterValues); } public void setParameterValues(Collection<String> values) { _parameterValues.clear(); _parameterValues.addAll(values); } public void setParameterName(String name) { _parameterName = name; } public String getParameterName() { return _parameterName; } public String getParameterDisplayName() { return _parameterName; } public void setParameter(CommonTree modelDescriptor, String parameterValue) { setParameter(modelDescriptor, _parameterName, parameterValue); } abstract protected void setParameter(CommonTree modelDescriptor, String parameter, String value); public void setParameter(CommonTree modelDescriptor, int parameterValueIndex) { if(parameterValueIndex>= _parameterValues.size()) { LOGGER.warn("Cannot set "+_parameterName+" value at index "+parameterValueIndex+" values:"+_parameterValues); return; } setParameter(modelDescriptor, _parameterValues.get(parameterValueIndex)); } public void preBuild(int currentRunIndex, int totalRuns, Collection<CommonTree> modelDescriptors) throws TerminateIterativeRunException { // no parameters to set if (_parameterValues.size() == 0) return; int parameterValueIndex = Math.min(_parameterValues.size() - 1, (currentRunIndex - 1) / (totalRuns / _parameterValues.size())); _parameterValues.get(parameterValueIndex); for (CommonTree modelDescriptor : modelDescriptors) setParameter(modelDescriptor, parameterValueIndex); } public void preRun(int currentRunIndex, int totalRuns, Collection<IModel> models) throws TerminateIterativeRunException { // NoOp } public void start(int totalRuns) throws TerminateIterativeRunException { // NoOp } public void stop() { // NoOp } public String getParameter(String key) { // NoOp this will never be queried during normal run.. return null; } public Collection<String> getPossibleParameters() { return getSetableParameters(); } public Collection<String> getSetableParameters() { Collection<String> rtn = new ArrayList<String>(); rtn.add(PARAMETER_VALUES); rtn.add(PARAMETER_NAME); return rtn; } public void setParameter(String key, String value) { if (PARAMETER_NAME.equalsIgnoreCase(key)) _parameterName = value; else if (PARAMETER_VALUES.equalsIgnoreCase(key)) { String[] values = value.split(","); _parameterValues.clear(); for (String v : values) { v = v.trim(); if (v.length() != 0) _parameterValues.add(v); } } } }