package bsearch.space; import java.util.ArrayList; import java.util.List; public strictfp class SearchSpace { private final ArrayList<ParameterSpec> paramSpecs; public SearchSpace(List<String> paramSpecStrings) { this.paramSpecs = new ArrayList<ParameterSpec>(); for (String spec: paramSpecStrings) { if (spec.trim().length() > 0) { addParamSpec(ParameterSpec.fromString(spec)); } } } public List<ParameterSpec> getParamSpecs() { return paramSpecs; } // private, so that after a SearchSpace is immutable after creation. private void addParamSpec(ParameterSpec pspec) { paramSpecs.add(pspec); } /** * @return the size of the search space, or -1 if the size is (nearly) infinite, * due to the use of real-valued parameters. * (Note: This is the size of the phenotype space (parameter space) * the genotype space can be larger, if several genotypes map to the same phenotype.) */ public long size() { long size = 1; for (ParameterSpec p : paramSpecs) { long n = p.choiceCount(); if (n < 0) { return -1; } size *= n; } return size; } /** * @return a textual representation of the size of the search space * Example: if there are two 10-choice discrete parameters and 3 continuous parameters, the result would be "100 * R^3" */ public String sizeText() { long size = 1; int continuousCount = 0; for (ParameterSpec p : paramSpecs) { long n = p.choiceCount(); if (n < 0) { continuousCount++; } else { size *= n; } } String text = Long.toString(size); if (continuousCount > 0) { text += "* R^" + continuousCount; } return text; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (ParameterSpec p : paramSpecs) { sb.append( p.toString() + "\n" ); } return sb.toString(); } }