    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.linear;
    018
    019    import java.io.IOException;
    020    import java.io.ObjectInputStream;
    021    import java.io.ObjectOutputStream;
    022    import java.io.Serializable;
    023    import org.apache.commons.math3.analysis.MultivariateFunction;
    024    import org.apache.commons.math3.linear.MatrixUtils;
    025    import org.apache.commons.math3.linear.RealVector;
    026    import org.apache.commons.math3.linear.ArrayRealVector;
    027    import org.apache.commons.math3.optim.OptimizationData;
    028
    029    /**
    030     * An objective function for a linear optimization problem.
    031     * <p>
    032     * A linear objective function has one the form:
    033     * <pre>
    034     * c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> + d
    035     * </pre>
    036     * The c<sub>i</sub> and d are the coefficients of the equation,
    037     * the x<sub>i</sub> are the coordinates of the current point.
    038     * </p>
    039     *
    040     * @version $Id: LinearObjectiveFunction.java 1416643 2012-12-03 19:37:14Z tn $
    041     * @since 2.0
    042     */
    043    public class LinearObjectiveFunction
    044        implements MultivariateFunction,
    045                   OptimizationData,
    046                   Serializable {
    047        /** Serializable version identifier. */
    048        private static final long serialVersionUID = -4531815507568396090L;
    049        /** Coefficients of the linear equation (c<sub>i</sub>). */
    050        private final transient RealVector coefficients;
    051        /** Constant term of the linear equation. */
    052        private final double constantTerm;
    053
    054        /**
    055         * @param coefficients Coefficients for the linear equation being optimized.
    056         * @param constantTerm Constant term of the linear equation.
    057         */
    058        public LinearObjectiveFunction(double[] coefficients, double constantTerm) {
    059            this(new ArrayRealVector(coefficients), constantTerm);
    060        }
    061
    062        /**
    063         * @param coefficients Coefficients for the linear equation being optimized.
    064         * @param constantTerm Constant term of the linear equation.
    065         */
    066        public LinearObjectiveFunction(RealVector coefficients, double constantTerm) {
    067            this.coefficients = coefficients;
    068            this.constantTerm = constantTerm;
    069        }
    070
    071        /**
    072         * Gets the coefficients of the linear equation being optimized.
    073         *
    074         * @return coefficients of the linear equation being optimized.
    075         */
    076        public RealVector getCoefficients() {
    077            return coefficients;
    078        }
    079
    080        /**
    081         * Gets the constant of the linear equation being optimized.
    082         *
    083         * @return constant of the linear equation being optimized.
    084         */
    085        public double getConstantTerm() {
    086            return constantTerm;
    087        }
    088
    089        /**
    090         * Computes the value of the linear equation at the current point.
    091         *
    092         * @param point Point at which linear equation must be evaluated.
    093         * @return the value of the linear equation at the current point.
    094         */
    095        public double value(final double[] point) {
    096            return value(new ArrayRealVector(point, false));
    097        }
    098
    099        /**
    100         * Computes the value of the linear equation at the current point.
    101         *
    102         * @param point Point at which linear equation must be evaluated.
    103         * @return the value of the linear equation at the current point.
    104         */
    105        public double value(final RealVector point) {
    106            return coefficients.dotProduct(point) + constantTerm;
    107        }
    108
    109        @Override
    110        public boolean equals(Object other) {
    111            if (this == other) {
    112                return true;
    113            }
    114            if (other instanceof LinearObjectiveFunction) {
    115                LinearObjectiveFunction rhs = (LinearObjectiveFunction) other;
    116              return (constantTerm == rhs.constantTerm) && coefficients.equals(rhs.coefficients);
    117            }
    118
    119            return false;
    120        }
    121
    122        @Override
    123        public int hashCode() {
    124            return Double.valueOf(constantTerm).hashCode() ^ coefficients.hashCode();
    125        }
    126
    127        /**
    128         * Serialize the instance.
    129         * @param oos stream where object should be written
    130         * @throws IOException if object cannot be written to stream
    131         */
    132        private void writeObject(ObjectOutputStream oos)
    133            throws IOException {
    134            oos.defaultWriteObject();
    135            MatrixUtils.serializeRealVector(coefficients, oos);
    136        }
    137
    138        /**
    139         * Deserialize the instance.
    140         * @param ois stream from which the object should be read
    141         * @throws ClassNotFoundException if a class in the stream cannot be found
    142         * @throws IOException if object cannot be read from the stream
    143         */
    144        private void readObject(ObjectInputStream ois)
    145          throws ClassNotFoundException, IOException {
    146            ois.defaultReadObject();
    147            MatrixUtils.deserializeRealVector(this, "coefficients", ois);
    148        }
    149    }