package beast.evolution.tree.coalescent; import java.util.List; import beast.core.CalculationNode; import beast.core.Description; import beast.core.Input; import beast.core.Input.Validate; import beast.core.parameter.RealParameter; /** * @author Joseph Heled * Date: 2/03/2011 */ @Description("Scale a demographic function by a constant factor") public class ScaledPopulationFunction extends PopulationFunction.Abstract { final public Input<PopulationFunction> popParameterInput = new Input<>("population", "population function to scale. ", Validate.REQUIRED); final public Input<RealParameter> scaleFactorInput = new Input<>("factor", "scale population by this facor.", Validate.REQUIRED); public ScaledPopulationFunction() { } // Implementation of abstract methods @Override public List<String> getParameterIds() { List<String> ids = popParameterInput.get().getParameterIds(); ids.add(scaleFactorInput.get().getID()); return ids; } @Override public double getPopSize(double t) { return popParameterInput.get().getPopSize(t) * scaleFactorInput.get().getValue(); } @Override public double getIntensity(double t) { double intensity = popParameterInput.get().getIntensity(t); double scale = scaleFactorInput.get().getValue(); return intensity / scale; } @Override public double getInverseIntensity(double x) { throw new RuntimeException("unimplemented"); } @Override protected boolean requiresRecalculation() { return ((CalculationNode) popParameterInput.get()).isDirtyCalculation() || scaleFactorInput.get().somethingIsDirty(); } }