    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.math.optimization.linear;
    019
    020    import java.io.IOException;
    021    import java.io.ObjectInputStream;
    022    import java.io.ObjectOutputStream;
    023    import java.io.Serializable;
    024
    025    import org.apache.commons.math.linear.MatrixUtils;
    026    import org.apache.commons.math.linear.RealVector;
    027    import org.apache.commons.math.linear.ArrayRealVector;
    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     * @version $Revision: 922713 $ $Date: 2010-03-14 02:26:13 +0100 (dim. 14 mars 2010) $
    040     * @since 2.0
    041     */
    042    public class LinearObjectiveFunction implements Serializable {
    043
    044        /** Serializable version identifier. */
    045        private static final long serialVersionUID = -4531815507568396090L;
    046
    047        /** Coefficients of the constraint (c<sub>i</sub>). */
    048        private final transient RealVector coefficients;
    049
    050        /** Constant term of the linear equation. */
    051        private final double constantTerm;
    052
    053        /**
    054         * @param coefficients The coefficients for the linear equation being optimized
    055         * @param constantTerm The constant term of the linear equation
    056         */
    057        public LinearObjectiveFunction(double[] coefficients, double constantTerm) {
    058            this(new ArrayRealVector(coefficients), constantTerm);
    059        }
    060
    061        /**
    062         * @param coefficients The coefficients for the linear equation being optimized
    063         * @param constantTerm The constant term of the linear equation
    064         */
    065        public LinearObjectiveFunction(RealVector coefficients, double constantTerm) {
    066            this.coefficients = coefficients;
    067            this.constantTerm = constantTerm;
    068        }
    069
    070        /**
    071         * Get the coefficients of the linear equation being optimized.
    072         * @return coefficients of the linear equation being optimized
    073         */
    074        public RealVector getCoefficients() {
    075            return coefficients;
    076        }
    077
    078        /**
    079         * Get the constant of the linear equation being optimized.
    080         * @return constant of the linear equation being optimized
    081         */
    082        public double getConstantTerm() {
    083            return constantTerm;
    084        }
    085
    086        /**
    087         * Compute the value of the linear equation at the current point
    088         * @param point point at which linear equation must be evaluated
    089         * @return value of the linear equation at the current point
    090         */
    091        public double getValue(final double[] point) {
    092            return coefficients.dotProduct(point) + constantTerm;
    093        }
    094
    095        /**
    096         * Compute the value of the linear equation at the current point
    097         * @param point point at which linear equation must be evaluated
    098         * @return value of the linear equation at the current point
    099         */
    100        public double getValue(final RealVector point) {
    101            return coefficients.dotProduct(point) + constantTerm;
    102        }
    103
    104        /** {@inheritDoc} */
    105        @Override
    106        public boolean equals(Object other) {
    107
    108          if (this == other) {
    109            return true;
    110          }
    111
    112          if (other instanceof LinearObjectiveFunction) {
    113              LinearObjectiveFunction rhs = (LinearObjectiveFunction) other;
    114              return (constantTerm == rhs.constantTerm) && coefficients.equals(rhs.coefficients);
    115          }
    116
    117          return false;
    118        }
    119
    120        /** {@inheritDoc} */
    121        @Override
    122        public int hashCode() {
    123            return Double.valueOf(constantTerm).hashCode() ^ coefficients.hashCode();
    124        }
    125
    126        /** Serialize the instance.
    127         * @param oos stream where object should be written
    128         * @throws IOException if object cannot be written to stream
    129         */
    130        private void writeObject(ObjectOutputStream oos)
    131            throws IOException {
    132            oos.defaultWriteObject();
    133            MatrixUtils.serializeRealVector(coefficients, oos);
    134        }
    135
    136        /** Deserialize the instance.
    137         * @param ois stream from which the object should be read
    138         * @throws ClassNotFoundException if a class in the stream cannot be found
    139         * @throws IOException if object cannot be read from the stream
    140         */
    141        private void readObject(ObjectInputStream ois)
    142          throws ClassNotFoundException, IOException {
    143            ois.defaultReadObject();
    144            MatrixUtils.deserializeRealVector(this, "coefficients", ois);
    145        }
    146
    147    }