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