/* * 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.function.*; import org.jgap.gp.impl.*; import org.jgap.gp.terminal.*; import junit.framework.*; /** * Tests the CommandDynamicArity class and the dynamic arity concept. * * @author Klaus Meffert * @since 3.4 */ public class CommandDynamicArityTest extends GPTestCase { /** String containing the CVS revision. Read out via reflection!*/ private final static String CVS_REVISION = "$Revision: 1.4 $"; public static Test suite() { TestSuite suite = new TestSuite(CommandDynamicArityTest.class); return suite; } /** * Following should be possible without exception. * * @throws Exception * * @author Klaus Meffert * @since 3.4 */ public void testConstruct_0() throws Exception { assertNotNull(new CommandDynamicArityTest()); assertNotNull(new CommandDynamicArityImpl(m_gpconf, 2, 1, 3)); } /** * @throws Exception * * @author Klaus Meffert * @since 3.4 */ public void testConstruct_1() throws Exception { try { new CommandDynamicArityImpl(m_gpconf, 2, 4, 5); } catch (RuntimeException rex) { ; //this is expected } } /** * @throws Exception * * @author Klaus Meffert * @since 3.4 */ public void testConstruct_2() throws Exception { try { new CommandDynamicArityImpl(m_gpconf, 2, 0, 5); } catch (RuntimeException rex) { ; //this is expected } } /** * @throws Exception * * @author Klaus Meffert * @since 3.4 */ public void testConstruct_3() throws Exception { try { new CommandDynamicArityImpl(m_gpconf, 3, 2, 1); } catch (RuntimeException rex) { ; //this is expected } } public void testExecution_0() throws Exception { getRandomGenerator().setNextFloatSequence(new float[] { 0.01f, //compared against crossover prob. 0.20f, //function probability 1 0.20f, //function probability 2 }); getRandomGenerator().setNextIntSequence(new int[] { 2, 1, 3, 0, 4, 6, 2, 5, 0, 5, 1, 1, 3, 0, 4, 9, 11, 45, 7, 3, 13, 2, 0, 0, 0, 1 }); GPGenotype gp; Class[] types = { Void.class}; Class[][] argTypes = { {} }; CommandGene[][] nodeSets = { { new SubProgram(m_gpconf, new Class[] {Void.class, Void.class}), new SubProgram(m_gpconf, new Class[] {Void.class, Void.class, Void.class}), new IfDyn(m_gpconf, Void.class, 1, 1, 4), new NOP(m_gpconf, Void.class, 0), new Terminal(m_gpconf, int.class), new True(m_gpconf, Boolean.class), } }; gp = GPGenotype.randomInitialGenotype(m_gpconf, types, argTypes, nodeSets, 20, true); gp.setVerboseOutput(false); gp.evolve(1); // Verify arity of IfDyn. // ---------------------- GPPopulation pop = gp.getGPPopulation(); int index = 0; for (int i = 0; i < pop.size(); i++) { CommandGene gene = pop.getGPProgram(i).getChromosome(0).getGene(0); if (IfDyn.class.isAssignableFrom(gene.getClass())) { IfDyn ifdyn = (IfDyn) gene; int arity = ifdyn.getArity(null); switch (index) { case 0: assertEquals(4, arity); break; case 1: assertEquals(4, arity); break; case 2: assertEquals(4, arity); break; case 3: assertEquals(4, arity); break; case 4: assertEquals(5, arity); break; case 5: assertEquals(3, arity); break; } index++; } } } /** * Test implementation extending abstract CommandDynamicArity class. * * @author Klaus Meffert * @since 3.4 */ class CommandDynamicArityImpl extends CommandDynamicArity { public CommandDynamicArityImpl(final GPConfiguration a_config, int a_arityInitial, int a_arityMin, int a_arityMax) throws InvalidConfigurationException { super(a_config, a_arityInitial, a_arityMin, a_arityMax, Void.class); } protected Gene newGeneInternal() { return null; } public Class getChildType(IGPProgram a_ind, int a_chromNum) { return null; } public String toString() { return "test"; } } }