    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    package org.apache.commons.math3.optim.univariate;
    018
    019    import org.apache.commons.math3.optim.OptimizationData;
    020    import org.apache.commons.math3.exception.NumberIsTooLargeException;
    021    import org.apache.commons.math3.exception.OutOfRangeException;
    022
    023    /**
    024     * Search interval and (optional) start value.
    025     * <br/>
    026     * Immutable class.
    027     *
    028     * @version $Id$
    029     * @since 3.1
    030     */
    031    public class SearchInterval implements OptimizationData {
    032        /** Lower bound. */
    033        private final double lower;
    034        /** Upper bound. */
    035        private final double upper;
    036        /** Start value. */
    037        private final double start;
    038
    039        /**
    040         * @param lo Lower bound.
    041         * @param hi Upper bound.
    042         * @param init Start value.
    043         * @throws NumberIsTooLargeException if {@code lo >= hi}.
    044         * @throws OutOfRangeException if {@code init < lo} or {@code init > hi}.
    045         */
    046        public SearchInterval(double lo,
    047                              double hi,
    048                              double init) {
    049            if (lo >= hi) {
    050                throw new NumberIsTooLargeException(lo, hi, false);
    051            }
    052            if (init < lo ||
    053                init > hi) {
    054                throw new OutOfRangeException(init, lo, hi);
    055            }
    056
    057            lower = lo;
    058            upper = hi;
    059            start = init;
    060        }
    061
    062        /**
    063         * @param lo Lower bound.
    064         * @param hi Upper bound.
    065         * @throws NumberIsTooLargeException if {@code lo >= hi}.
    066         */
    067        public SearchInterval(double lo,
    068                              double hi) {
    069            this(lo, hi, 0.5 * (lo + hi));
    070        }
    071
    072        /**
    073         * Gets the lower bound.
    074         *
    075         * @return the lower bound.
    076         */
    077        public double getMin() {
    078            return lower;
    079        }
    080        /**
    081         * Gets the upper bound.
    082         *
    083         * @return the upper bound.
    084         */
    085        public double getMax() {
    086            return upper;
    087        }
    088        /**
    089         * Gets the start value.
    090         *
    091         * @return the start value.
    092         */
    093        public double getStartValue() {
    094            return start;
    095        }
    096    }