1 /* 2 * Copyright (C) 2012 Alberto Irurueta Carro (alberto@irurueta.com) 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.irurueta.numerical.optimization; 17 18 import com.irurueta.numerical.LockedException; 19 import com.irurueta.numerical.NotReadyException; 20 21 /** 22 * Abstract class to find function minima. Implementations will take into account whether the function is single or 23 * multi-dimension, and will use different algorithms to find minima. 24 */ 25 public abstract class Optimizer { 26 27 /** 28 * Boolean indicating whether this instance is locked because computations are being done. 29 */ 30 protected boolean locked; 31 32 /** 33 * Listener to handle minimization events. 34 */ 35 protected OnIterationCompletedListener iterationCompletedListener; 36 37 /** 38 * Empty constructor. 39 */ 40 protected Optimizer() { 41 locked = false; 42 } 43 44 /** 45 * Gets listener to handle minimization events. 46 * 47 * @return listener to handle minimization events. 48 */ 49 public OnIterationCompletedListener getOnIterationCompletedListener() { 50 return iterationCompletedListener; 51 } 52 53 /** 54 * Sets listener to handle minimization events. 55 * 56 * @param iterationCompletedListener listener to handle minimization events. 57 * @throws LockedException Raised if this instance is locked, because estimation is being computed. 58 */ 59 public void setOnIterationCompletedListener(final OnIterationCompletedListener iterationCompletedListener) 60 throws LockedException { 61 if (locked) { 62 throw new LockedException(); 63 } 64 this.iterationCompletedListener = iterationCompletedListener; 65 } 66 67 /** 68 * Returns boolean indicating whether this instance is locked. This instance will be locked while computations are being done. Attempting 69 * to change any parameter while this instance is locked will raise a LockedException. 70 * 71 * @return True if this instance is locked, false otherwise. 72 */ 73 public boolean isLocked() { 74 return locked; 75 } 76 77 /** 78 * This function estimates a function minimum. Implementations of this class will usually search a local minimum within a bracket of input 79 * values. Because this is an abstract class, this method is meant to be overridden, otherwise a NotReadyException will always be thrown. 80 * 81 * @throws LockedException Raised if this instance is locked, because estimation is being computed. 82 * @throws NotReadyException Raised if this instance is not ready, usually because listener has not yet been provided. 83 * @throws OptimizationException Raised if the algorithm failed because of lack of convergence or because function couldn't be 84 * evaluated. 85 */ 86 public void minimize() throws LockedException, NotReadyException, OptimizationException { 87 throw new NotReadyException(); 88 } 89 90 /** 91 * Returns boolean indicating whether this instance is ready. Usually an instance will be ready once its listener has been provided. 92 * Because this is an abstract class, it will always return false; 93 * 94 * @return True if this instance is ready, false otherwise. 95 */ 96 public boolean isReady() { 97 return false; 98 } 99 }