/* Copyright 2006 by Sean Luke Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ package ec.gp; import ec.*; import ec.util.*; import java.util.Hashtable; import java.util.Enumeration; /* * GPSetType.java * * Created: Fri Aug 27 20:55:42 1999 * By: Sean Luke */ /** * A GPSetType is a GPType which contains GPAtomicTypes in a set, and is used * as a generic GP type. For more information, see GPType * * GPSetTypes implement their set using both a hash table and an array. * if the size of the set is "significantly big", then the hash table * is used to look up membership in the set (O(1), but with a big constant). * If the size is small, then the array is used (O(n)). The dividing line * is determined by the constant START_USING_HASH_BEYOND, which you might * play with to optimize for your system. * * @see ec.gp.GPType * @author Sean Luke * @version 1.0 */ public final class GPSetType extends GPType { public static final String P_MEMBER = "member"; public static final String P_SIZE = "size"; /** A packed, sorted array of atomic types in the set */ public int[] types_packed; /** A sparse array of atomic types in the set */ public boolean[] types_sparse; /** The hashtable of types in the set */ public Hashtable types_h; /** You should not construct new types. */ public GPSetType() { } /** Sets up the packed and sparse arrays based on the hashtable */ public void postProcessSetType(int totalAtomicTypes) { // load the hashtable into the arrays int x=0; types_packed = new int[types_h.size()]; types_sparse = new boolean[totalAtomicTypes]; Enumeration e = types_h.elements(); while(e.hasMoreElements()) { GPAtomicType t = (GPAtomicType)(e.nextElement()); types_packed[x++] = t.type; types_sparse[t.type] = true; } // Sort the packed array java.util.Arrays.sort(types_packed); } public void setup(final EvolutionState state, Parameter base) { super.setup(state,base); // Make my Hashtable types_h = new Hashtable(); // How many atomic types do I have? int len = state.parameters.getInt(base.push(P_SIZE),null,1); if (len<=0) state.output.fatal("The number of atomic types in the GPSetType " + name + " must be >= 1.",base.push(P_SIZE)); // Load the GPAtomicTypes for(int x=0;x