Author: tn Date: Sun Apr 1 16:46:01 2012 New Revision: 1308151 URL: http://svn.apache.org/viewvc?rev=1308151&view=rev Log: Added FixedElapsedTime stopping condition. JIRA: MATH-773 contributed by Reid Hochstedler
Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/genetics/FixedElapsedTime.java (with props) commons/proper/math/trunk/src/test/java/org/apache/commons/math3/genetics/FixedElapsedTimeTest.java (with props) Modified: commons/proper/math/trunk/src/changes/changes.xml Modified: commons/proper/math/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1308151&r1=1308150&r2=1308151&view=diff ============================================================================== --- commons/proper/math/trunk/src/changes/changes.xml (original) +++ commons/proper/math/trunk/src/changes/changes.xml Sun Apr 1 16:46:01 2012 @@ -52,6 +52,9 @@ If the output is not quite correct, chec <body> <release version="3.1" date="TBD" description=" "> + <action dev="tn" type="add" issue="MATH-773" due-to="Reid Hochstedler"> + Added class FixedElapsedTime (new StoppingCondition for evolution of generations) to genetics package. + </action> <action dev="celestin" type="add" issue="MATH-756"> Added classes Decimal64 and Decimal64Field, which are wrapper classes around primitive doubles. These classes implement FieldElement and Field, respectively. </action> Added: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/genetics/FixedElapsedTime.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/genetics/FixedElapsedTime.java?rev=1308151&view=auto ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/genetics/FixedElapsedTime.java (added) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/genetics/FixedElapsedTime.java Sun Apr 1 16:46:01 2012 @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math3.genetics; + +import java.util.concurrent.TimeUnit; + +import org.apache.commons.math3.exception.NumberIsTooSmallException; + +/** + * Stops after a fixed amount of time has elapsed. + * + * <p> + * The first time {@link #isSatisfied(Population)} is invoked, the end time of + * the evolution is determined based on the provided <code>maxTime</code> value. + * Once the elapsed time reaches the configured <code>maxTime</code> value, + * {@link #isSatisfied(Population)} returns true. + * </p> + * + * @version $Id$ + * @since 3.1 + */ +public class FixedElapsedTime implements StoppingCondition { + /** Maximum allowed time period (in nanoseconds). */ + private final long maxTimePeriod; + + /** The predetermined termination time (stopping condition). */ + private long endTime = -1; + + /** + * Create a new {@link FixedElapsedTime} instance. + * + * @param maxTime maximum number of seconds generations are allowed to evolve + * @throws NumberIsTooSmallException if the provided time is < 0 + */ + public FixedElapsedTime(final long maxTime) { + this(maxTime, TimeUnit.SECONDS); + } + + /** + * Create a new {@link FixedElapsedTime} instance. + * + * @param maxTime maximum time generations are allowed to evolve + * @param unit {@link TimeUnit} of the maxTime argument + * @throws NumberIsTooSmallException if the provided time is < 0 + */ + public FixedElapsedTime(final long maxTime, final TimeUnit unit) { + if (maxTime < 0) { + throw new NumberIsTooSmallException(maxTime, 0, true); + } + maxTimePeriod = unit.toNanos(maxTime); + } + + /** + * Determine whether or not the maximum allowed time has passed. + * The termination time is determined after the first generation. + * + * @param population ignored (no impact on result) + * @return <code>true</code> IFF the maximum allowed time period has elapsed + */ + public boolean isSatisfied(final Population population) { + if (endTime < 0) { + endTime = System.nanoTime() + maxTimePeriod; + } + + return System.nanoTime() >= endTime; + } +} Propchange: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/genetics/FixedElapsedTime.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/genetics/FixedElapsedTime.java ------------------------------------------------------------------------------ svn:keywords = Id Revision HeadURL Propchange: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/genetics/FixedElapsedTime.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/genetics/FixedElapsedTimeTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/genetics/FixedElapsedTimeTest.java?rev=1308151&view=auto ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/genetics/FixedElapsedTimeTest.java (added) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/genetics/FixedElapsedTimeTest.java Sun Apr 1 16:46:01 2012 @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math3.genetics; + +import java.util.Iterator; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.math3.util.FastMath; +import org.junit.Assert; +import org.junit.Test; + +public class FixedElapsedTimeTest { + + @Test + public void testIsSatisfied() { + final Population pop = new Population() { + public void addChromosome(final Chromosome chromosome) { + // unimportant + } + public Chromosome getFittestChromosome() { + // unimportant + return null; + } + public int getPopulationLimit() { + // unimportant + return 0; + } + public int getPopulationSize() { + // unimportant + return 0; + } + public Population nextGeneration() { + // unimportant + return null; + } + public Iterator<Chromosome> iterator() { + // unimportant + return null; + } + }; + + final long start = System.nanoTime(); + final long duration = 3; + final FixedElapsedTime tec = new FixedElapsedTime(duration, TimeUnit.SECONDS); + + while (!tec.isSatisfied(pop)) { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // ignore + } + } + + final long end = System.nanoTime(); + final long elapsedTime = end - start; + final long diff = FastMath.abs(elapsedTime - TimeUnit.SECONDS.toNanos(duration)); + + Assert.assertTrue(diff < TimeUnit.MILLISECONDS.toNanos(100)); + } +} Propchange: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/genetics/FixedElapsedTimeTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/genetics/FixedElapsedTimeTest.java ------------------------------------------------------------------------------ svn:keywords = Id Revision HeadURL Propchange: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/genetics/FixedElapsedTimeTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain