package beast.evolution.operators; import java.util.List; import beast.core.Description; import beast.core.parameter.Parameter; @Description("A temporary helper class to solve compound state nodes for operators, " + "but it cannot be used as input, before the framework is modified.") public class CompoundParameterHelper<T> { protected int[] parameterIndex; // store the index of parameter list final List<Parameter<T>> parameterList; public CompoundParameterHelper(final List<Parameter<T>> parameterList) { this.parameterList = parameterList; if (parameterList == null || parameterList.size() < 1) { throw new IllegalArgumentException("There is no parameter inputted into CompoundParameter !"); } int dim = 0; for (final Parameter<T> para : parameterList) { dim += para.getDimension(); } parameterIndex = new int[dim]; for (int y = 0; y < parameterList.size(); y++) { final Parameter<T> para = parameterList.get(y); for (int d = 0; d < para.getDimension(); d++) { parameterIndex[y + d] = y; } } } public int getDimension() { return parameterIndex.length; } public void setValue(final int param, final T value) { final Parameter<T> para = parameterList.get(getY(param)); para.setValue(getX(param), value); } public T getValue(final int param) { return parameterList.get(getY(param)).getValue(getX(param)); } public T getLower(final int param) { return parameterList.get(getY(param)).getLower(); } public T getUpper(final int param) { return parameterList.get(getY(param)).getUpper(); } // given {{?,?,?,?}{?,?}{?,?,?}}, parameterIndex[] is 0 0 0 0 1 1 2 2 2, param starts from 0; // if param < 4, then getX(param) = param; // if param >= 4, then getX(param) = param - the sum of previous dimensions // for example, param = 7, then getX = 7 - (4 + 2) = 1 protected int getX(final int param) { int sumPrevDim = parameterList.get(0).getDimension(); if (param < sumPrevDim) { return param; } for (int y = 1; y < getY(param); y++) { sumPrevDim += parameterList.get(y).getDimension(); } return param - sumPrevDim; } // the index of parameter list protected int getY(final int param) { return parameterIndex[param]; } }