package de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters; /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures Copyright (C) 2015 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ import de.lmu.ifi.dbs.elki.math.random.RandomFactory; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.ParameterException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.WrongParameterValueException; /** * Parameter for random generators and/or random seeds. * * @author Erich Schubert */ public class RandomParameter extends AbstractParameter { /** * Seed value, if used */ Long seed = null; /** * Constructor without default. * * @param optionID Option ID */ public RandomParameter(OptionID optionID) { super(optionID, RandomFactory.DEFAULT); } /** * Constructor with default value. The default value may be {@code null}, * which means a new random will be generated. * * @param optionID Option ID * @param defaultValue Default value. If {@code null}, a new random object * will be created. */ public RandomParameter(OptionID optionID, RandomFactory defaultValue) { super(optionID, defaultValue); } /** * Constructor with default seed value. * * @param optionID Option ID * @param seed Default seed. */ public RandomParameter(OptionID optionID, long seed) { super(optionID, true); this.seed = Long.valueOf(seed); } @Override public String getSyntax() { return ""; } @Override public void setValue(Object obj) throws ParameterException { // This is a bit hackish. Set both seed and random (via super.setValue()) if (obj instanceof RandomFactory) { seed = null; } else if (obj instanceof Long) { seed = (Long) obj; obj = RandomFactory.get(seed); } else if (obj instanceof Number) { seed = Long.valueOf(((Number) obj).longValue()); obj = RandomFactory.get(seed); } else if ("global random".equals(obj)) { obj = RandomFactory.DEFAULT; } else { try { seed = Long.valueOf(obj.toString()); obj = RandomFactory.get(seed); } catch (NullPointerException e) { throw new WrongParameterValueException("Wrong parameter format! Parameter \"" + getName() + "\" requires a long seed value or a random generator factory, read: " + obj + "!\n"); } catch (NumberFormatException e) { throw new WrongParameterValueException("Wrong parameter format! Parameter \"" + getName() + "\" requires a long seed value or a random generator factory, read: " + obj + "!\n"); } } super.setValue(obj); } @Override protected RandomFactory parseValue(Object obj) throws ParameterException { if (obj instanceof RandomFactory) { return (RandomFactory) obj; } if (obj instanceof Long) { return RandomFactory.get((Long) obj); } if (obj instanceof Number) { return RandomFactory.get(Long.valueOf(((Number) obj).longValue())); } try { return RandomFactory.get(Long.valueOf(obj.toString())); } catch (NullPointerException e) { throw new WrongParameterValueException("Wrong parameter format! Parameter \"" + getName() + "\" requires a long seed value or a random generator factory, read: " + obj + "!\n"); } catch (NumberFormatException e) { throw new WrongParameterValueException("Wrong parameter format! Parameter \"" + getName() + "\" requires a long seed value or a random generator factory, read: " + obj + "!\n"); } } @Override public Object getGivenValue() { Object r = super.getGivenValue(); if (r != null && seed != null) { super.givenValue = RandomFactory.get(seed); r = super.givenValue; } return r; } @Override public String getValueAsString() { return (seed != null) ? seed.toString() : "null"; } @Override public String getDefaultValueAsString() { if (defaultValue == RandomFactory.DEFAULT) { return "global random"; } return super.getDefaultValueAsString(); } }