1 /* Copyright (c) 2011 Peter Troshin
\r
3 * JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0
\r
5 * This library is free software; you can redistribute it and/or modify it under the terms of the
\r
6 * Apache License version 2 as published by the Apache Software Foundation
\r
8 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
\r
9 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache
\r
10 * License for more details.
\r
12 * A copy of the license is in apache_license.txt. It is also available here:
\r
13 * @see: http://www.apache.org/licenses/LICENSE-2.0.txt
\r
15 * Any republication or derived work distributed in source code form
\r
16 * must include this copyright and license notice.
\r
19 package compbio.runner;
\r
21 import java.util.ArrayList;
\r
22 import java.util.HashMap;
\r
23 import java.util.List;
\r
24 import java.util.Map;
\r
25 import java.util.Random;
\r
27 import org.apache.log4j.Logger;
\r
29 import compbio.engine.client.Executable;
\r
30 import compbio.metadata.Option;
\r
31 import compbio.metadata.Parameter;
\r
32 import compbio.metadata.RunnerConfig;
\r
33 import compbio.metadata.ValueConstrain;
\r
34 import compbio.util.Util;
\r
35 import compbio.util.annotation.Immutable;
\r
38 * This class solve the following problems. Given the RunnerConfig
\r
40 * 1) generate a valid option string with all options and parameters in it
\r
42 * 2) Permute all possible combinations of options order and parameters values
\r
49 public final class OptionCombinator {
\r
51 private static Logger log = Logger.getLogger(OptionCombinator.class);
\r
52 private static final String MINVALUE = "-100";
\r
53 private static final String MAXVALUE = "100";
\r
55 private static final Random rand = new Random();
\r
56 private final RunnerConfig<? extends Executable<?>> rconfig;
\r
58 public OptionCombinator(RunnerConfig<? extends Executable<?>> rconfig) {
\r
59 if (rconfig == null) {
\r
60 throw new IllegalArgumentException("RunnerConfig must be provided!");
\r
62 this.rconfig = rconfig;
\r
65 public List<String> optionsToCommandString(List<Option<?>> options) {
\r
66 List<String> strOptions = new ArrayList<String>();
\r
67 for (Option<?> option : options) {
\r
68 strOptions.add(optionToCommandString(option));
\r
73 public List<String> getOptionsAtRandom() {
\r
74 return optionsToCommandString(getAllOptions());
\r
77 public List<Option<?>> getAllOptions() {
\r
78 return new ArrayList<Option<?>>(rconfig.getOptions());
\r
81 static String optionToCommandString(Option<?> option) {
\r
82 int size = option.getOptionNames().size();
\r
83 int idx = rand.nextInt(size);
\r
84 return option.getOptionNames().get(idx);
\r
87 public List<Parameter<?>> getAllParameters() {
\r
88 List<Parameter<?>> args = new ArrayList<Parameter<?>>();
\r
89 for (Parameter<?> prm : rconfig.getParameters()) {
\r
90 // Make sure there is a default value linked to the parameter to use later
\r
91 // prm.setDefaultValue(getValue(prm));
\r
97 public List<String> argumentsToCommandString(List<? extends Option<?>> arguments) {
\r
98 return argumentsToCommandString(arguments, rconfig);
\r
101 public static List<String> argumentsToCommandString(List<? extends Option<?>> arguments,RunnerConfig<? extends Executable<?>> rconfig) {
\r
102 if (arguments == null || rconfig == null) {
\r
103 throw new NullPointerException("Arguments and RunnerConfig objects must be provided!");
\r
106 List<String> command = new ArrayList<String>();
\r
107 for (Option<?> option : arguments) {
\r
108 if (option instanceof Parameter<?>) {
\r
109 Parameter<?> prm = (Parameter<?>) option;
\r
110 command.add(prm.getOptionName() + rconfig.getPrmSeparator() + getValue(prm));
\r
111 log.trace("Setting parameter " + prm);
\r
113 log.trace("Setting option " + option);
\r
114 command.add(optionToCommandString(option));
\r
120 public List<String> parametersToCommandString(List<Parameter<?>> orderedList, Map<Parameter<?>, String> prmValue) {
\r
121 List<String> args = new ArrayList<String>();
\r
122 for (Parameter<?> param : orderedList) {
\r
123 args.add(param.getOptionName() + rconfig.getPrmSeparator() + prmValue.get(param));
\r
128 public Map<Parameter<?>, String> getAllConstrainedParametersWithBorderValues( boolean minValue) {
\r
129 Map<Parameter<?>, String> paramValue = new HashMap<Parameter<?>, String>();
\r
130 for (Parameter<?> prm : rconfig.getParameters()) {
\r
131 ValueConstrain vc = prm.getValidValue();
\r
135 String value = getUpperBorderValue(prm);
\r
137 value = getLowBorderValue(prm);
\r
139 paramValue.put(prm, value);
\r
144 public Map<Parameter<?>, String> getAllConstrainedParametersWithRandomValues() {
\r
145 Map<Parameter<?>, String> paramValue = new HashMap<Parameter<?>, String>();
\r
146 for (Parameter<?> prm : rconfig.getParameters()) {
\r
147 ValueConstrain vc = prm.getValidValue();
\r
151 paramValue.put(prm, getRandomValue(prm));
\r
156 String getLowBorderValue(Parameter<?> param) {
\r
157 assert param != null;
\r
158 ValueConstrain vc = param.getValidValue();
\r
159 Number minVal = vc.getMin();
\r
160 return minVal == null ? MINVALUE : minVal.toString();
\r
163 String getUpperBorderValue(Parameter<?> param) {
\r
164 assert param != null;
\r
165 ValueConstrain vc = param.getValidValue();
\r
166 Number maxVal = vc.getMax();
\r
167 return maxVal == null ? MAXVALUE : maxVal.toString();
\r
170 String getRandomValue(Parameter<?> param) {
\r
171 assert param != null;
\r
172 String low = getLowBorderValue(param);
\r
173 String high = getUpperBorderValue(param);
\r
174 ValueConstrain vc = param.getValidValue();
\r
176 if (vc.getType() == ValueConstrain.Type.Float) {
\r
177 return new Double(Util.getRandomNumber(Double.parseDouble(low), Double.parseDouble(high))).toString();
\r
179 return new Integer(Util.getRandomNumber(Integer.parseInt(low), Integer.parseInt(high))).toString();
\r
182 static String getValue(Parameter<?> param) {
\r
183 assert param != null;
\r
184 if (param.getDefaultValue() != null) {
\r
185 log.trace("Returning default value: " + param.getDefaultValue());
\r
186 return param.getDefaultValue();
\r
188 // Some parameters do not have default values e.g. seq type - nuc or protein
\r
189 List<String> passValues = param.getPossibleValues();
\r
190 int idx = rand.nextInt(passValues.size());
\r
191 log.trace("Returning random value: " + passValues.get(idx));
\r
192 return passValues.get(idx);
\r