    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;
    018
    019    import java.util.Arrays;
    020
    021    /**
    022     * Simple optimization constraints: lower and upper bounds.
    023     * The valid range of the parameters is an interval that can be infinite
    024     * (in one or both directions).
    025     * <br/>
    026     * Immutable class.
    027     *
    028     * @version $Id: SimpleBounds.java 1416643 2012-12-03 19:37:14Z tn $
    029     * @since 3.1
    030     */
    031    public class SimpleBounds implements OptimizationData {
    032        /** Lower bounds. */
    033        private final double[] lower;
    034        /** Upper bounds. */
    035        private final double[] upper;
    036
    037        /**
    038         * @param lB Lower bounds.
    039         * @param uB Upper bounds.
    040         */
    041        public SimpleBounds(double[] lB,
    042                            double[] uB) {
    043            lower = lB.clone();
    044            upper = uB.clone();
    045        }
    046
    047        /**
    048         * Gets the lower bounds.
    049         *
    050         * @return the lower bounds.
    051         */
    052        public double[] getLower() {
    053            return lower.clone();
    054        }
    055        /**
    056         * Gets the upper bounds.
    057         *
    058         * @return the upper bounds.
    059         */
    060        public double[] getUpper() {
    061            return upper.clone();
    062        }
    063
    064        /**
    065         * Factory method that creates instance of this class that represents
    066         * unbounded ranges.
    067         *
    068         * @param dim Number of parameters.
    069         * @return a new instance suitable for passing to an optimizer that
    070         * requires bounds specification.
    071         */
    072        public static SimpleBounds unbounded(int dim) {
    073            final double[] lB = new double[dim];
    074            Arrays.fill(lB, Double.NEGATIVE_INFINITY);
    075            final double[] uB = new double[dim];
    076            Arrays.fill(uB, Double.POSITIVE_INFINITY);
    077
    078            return new SimpleBounds(lB, uB);
    079        }
    080    }