/*
* This file is part of JGAP.
*
* JGAP offers a dual license model containing the LGPL as well as the MPL.
*
* For licensing information please see the file license.txt included with JGAP
* or have a look at the top of class org.jgap.Chromosome which representatively
* includes the JGAP license policy applicable for any file delivered with JGAP.
*/
package org.jgap.gp;
import org.jgap.*;
import org.jgap.gp.impl.*;
/**
* Abstract base class for GP-commands with a dynamic number of children.
*
* @author Klaus Meffert
* @since 3.4
*/
public abstract class CommandDynamicArity
extends CommandGene {
/** String containing the CVS revision. Read out via reflection!*/
private static final String CVS_REVISION = "$Revision: 1.2 $";
/**
* Default constructor, only for dynamic instantiation.
*
* @throws Exception
*
* @author Klaus Meffert
* @since 3.4
*/
public CommandDynamicArity()
throws Exception {
super();
}
public CommandDynamicArity(final GPConfiguration a_conf, int a_arityInitial,
int a_arityMin, int a_arityMax, Class a_returnType)
throws InvalidConfigurationException {
this(a_conf, a_arityInitial, a_arityMin, a_arityMax, a_returnType, 0);
}
public CommandDynamicArity(final GPConfiguration a_conf, int a_arityInitial,
int a_arityMin, int a_arityMax, Class a_returnType,
int a_subReturnType)
throws InvalidConfigurationException {
this(a_conf, a_arityInitial, a_arityMin, a_arityMax, a_returnType,
a_subReturnType, null);
}
/**
* Allows specifying a sub return type and sub child types.
*
* @param a_conf the configuration to use
* @param a_arityInitial the number of children of the node
* @param a_arityMin the minimum arity allowed/required
* @param a_arityMax the maximum arity allowed/required
* @param a_returnType type of the return value of the node
* @param a_subReturnType sub type of the return type, optional usage
* @param a_subChildTypes sub type of a child, optional usage
* @throws InvalidConfigurationException
*
* @author Klaus Meffert
* @since 3.4
*/
public CommandDynamicArity(final GPConfiguration a_conf, int a_arityInitial,
int a_arityMin, int a_arityMax, Class a_returnType,
int a_subReturnType, int[] a_subChildTypes)
throws InvalidConfigurationException {
super(a_conf, a_arityInitial, a_returnType, a_subReturnType,
a_subChildTypes);
if (a_arityMin < 1) {
throw new RuntimeException("Minimum arity must not be less than one!");
}
if (a_arityMax < a_arityMin) {
throw new RuntimeException(
"Minimum arity must be less than maximum arity!");
}
if (a_arityInitial < a_arityMin || a_arityInitial > a_arityMax) {
throw new RuntimeException("Initial arity must be between minimum and"
+ " maximum arity!");
}
setArityMin(a_arityMin);
setArityMax(a_arityMax);
}
/**
* Adaptation of the arity so that it represents a value within the interval
* [m_arityMin, m_arityMax].
*
* @author Klaus Meffert
* @since 3.4
*/
public void dynamizeArity() {
int arity = getArityMin()
+ getGPConfiguration().getRandomGenerator().nextInt(getArityMax()
- getArityMin() + 1);
setArity(arity);
}
}