package de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization; /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures Copyright (C) 2012 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 java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; 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.parameters.Flag; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter; import de.lmu.ifi.dbs.elki.utilities.pairs.Pair; /** * Parameterization handler using a List and OptionIDs, for programmatic use. * * @author Erich Schubert */ public class ListParameterization extends AbstractParameterization { /** * The actual parameters, for storage */ LinkedList> parameters = new LinkedList>(); /** * Default constructor. */ public ListParameterization() { super(); } /** * Constructor with an existing collection. * * @param dbParameters existing parameter collection */ public ListParameterization(Collection> dbParameters) { this(); for (Pair pair : dbParameters) { addParameter(pair.first, pair.second); } } /** * Add a flag to the parameter list * * @param optionid Option ID */ public void addFlag(OptionID optionid) { parameters.add(new Pair(optionid, Flag.SET)); } /** * Add a parameter to the parameter list * * @param optionid Option ID * @param value Value */ public void addParameter(OptionID optionid, Object value) { parameters.add(new Pair(optionid, value)); } /** * Convenience - add a Flag option directly. * * @param flag Flag to add, if set */ public void forwardOption(Flag flag) { if (flag.isDefined() && flag.getValue().booleanValue()) { addFlag(flag.getOptionID()); } } /** * Convenience - add a Parameter for forwarding * * @param param Parameter to add */ public void forwardOption(Parameter param) { if (param.isDefined()) { addParameter(param.getOptionID(), param.getValue()); } } @Override public boolean setValueForOption(Parameter opt) throws ParameterException { Iterator> iter = parameters.iterator(); while(iter.hasNext()) { Pair pair = iter.next(); if(pair.first == opt.getOptionID()) { iter.remove(); opt.setValue(pair.second); return true; } } return false; } /** * Return the yet unused parameters. * * @return Unused parameters. */ public List> getRemainingParameters() { return parameters; } @Override public boolean hasUnusedParameters() { return (parameters.size() > 0); } /** {@inheritDoc} * Default implementation, for flat parameterizations. */ @Override public Parameterization descend(Object option) { return this; } @Override public String toString() { StringBuilder buf = new StringBuilder(); for (Pair pair : parameters) { buf.append('-').append(pair.getFirst().toString()).append(' '); buf.append(pair.getSecond().toString()).append(' '); } return buf.toString(); } /** * Serialize parameters. * * @return Array list of parameters */ public ArrayList serialize() { ArrayList params = new ArrayList(); for (Pair pair : parameters) { params.add("-" + pair.getFirst().toString()); params.add(pair.getSecond().toString()); } return params; } }