001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.math3.optimization.linear;
019    
020    import java.util.Collection;
021    import java.util.Collections;
022    
023    import org.apache.commons.math3.exception.MathIllegalStateException;
024    import org.apache.commons.math3.exception.MaxCountExceededException;
025    import org.apache.commons.math3.optimization.GoalType;
026    import org.apache.commons.math3.optimization.PointValuePair;
027    
028    /**
029     * Base class for implementing linear optimizers.
030     * <p>
031     * This base class handles the boilerplate methods associated to thresholds
032     * settings and iterations counters.
033     *
034     * @version $Id: AbstractLinearOptimizer.java 1422230 2012-12-15 12:11:13Z erans $
035     * @deprecated As of 3.1 (to be removed in 4.0).
036     * @since 2.0
037     */
038    @Deprecated
039    public abstract class AbstractLinearOptimizer implements LinearOptimizer {
040    
041        /** Default maximal number of iterations allowed. */
042        public static final int DEFAULT_MAX_ITERATIONS = 100;
043    
044        /**
045         * Linear objective function.
046         * @since 2.1
047         */
048        private LinearObjectiveFunction function;
049    
050        /**
051         * Linear constraints.
052         * @since 2.1
053         */
054        private Collection<LinearConstraint> linearConstraints;
055    
056        /**
057         * Type of optimization goal: either {@link GoalType#MAXIMIZE} or {@link GoalType#MINIMIZE}.
058         * @since 2.1
059         */
060        private GoalType goal;
061    
062        /**
063         * Whether to restrict the variables to non-negative values.
064         * @since 2.1
065         */
066        private boolean nonNegative;
067    
068        /** Maximal number of iterations allowed. */
069        private int maxIterations;
070    
071        /** Number of iterations already performed. */
072        private int iterations;
073    
074        /**
075         * Simple constructor with default settings.
076         * <p>The maximal number of evaluation is set to its default value.</p>
077         */
078        protected AbstractLinearOptimizer() {
079            setMaxIterations(DEFAULT_MAX_ITERATIONS);
080        }
081    
082        /**
083         * @return {@code true} if the variables are restricted to non-negative values.
084         */
085        protected boolean restrictToNonNegative() {
086            return nonNegative;
087        }
088    
089        /**
090         * @return the optimization type.
091         */
092        protected GoalType getGoalType() {
093            return goal;
094        }
095    
096        /**
097         * @return the optimization type.
098         */
099        protected LinearObjectiveFunction getFunction() {
100            return function;
101        }
102    
103        /**
104         * @return the optimization type.
105         */
106        protected Collection<LinearConstraint> getConstraints() {
107            return Collections.unmodifiableCollection(linearConstraints);
108        }
109    
110        /** {@inheritDoc} */
111        public void setMaxIterations(int maxIterations) {
112            this.maxIterations = maxIterations;
113        }
114    
115        /** {@inheritDoc} */
116        public int getMaxIterations() {
117            return maxIterations;
118        }
119    
120        /** {@inheritDoc} */
121        public int getIterations() {
122            return iterations;
123        }
124    
125        /**
126         * Increment the iterations counter by 1.
127         * @exception MaxCountExceededException if the maximal number of iterations is exceeded
128         */
129        protected void incrementIterationsCounter()
130            throws MaxCountExceededException {
131            if (++iterations > maxIterations) {
132                throw new MaxCountExceededException(maxIterations);
133            }
134        }
135    
136        /** {@inheritDoc} */
137        public PointValuePair optimize(final LinearObjectiveFunction f,
138                                       final Collection<LinearConstraint> constraints,
139                                       final GoalType goalType, final boolean restrictToNonNegative)
140            throws MathIllegalStateException {
141    
142            // store linear problem characteristics
143            this.function          = f;
144            this.linearConstraints = constraints;
145            this.goal              = goalType;
146            this.nonNegative       = restrictToNonNegative;
147    
148            iterations  = 0;
149    
150            // solve the problem
151            return doOptimize();
152    
153        }
154    
155        /**
156         * Perform the bulk of optimization algorithm.
157         * @return the point/value pair giving the optimal value for objective function
158         * @exception MathIllegalStateException if no solution fulfilling the constraints
159         * can be found in the allowed number of iterations
160         */
161        protected abstract PointValuePair doOptimize() throws MathIllegalStateException;
162    
163    }