Home | History | Annotate | Download | only in linear
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one or more
      3  * contributor license agreements.  See the NOTICE file distributed with
      4  * this work for additional information regarding copyright ownership.
      5  * The ASF licenses this file to You under the Apache License, Version 2.0
      6  * (the "License"); you may not use this file except in compliance with
      7  * the License.  You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package org.apache.commons.math.optimization.linear;
     19 
     20 import java.io.IOException;
     21 import java.io.ObjectInputStream;
     22 import java.io.ObjectOutputStream;
     23 import java.io.Serializable;
     24 
     25 import org.apache.commons.math.linear.MatrixUtils;
     26 import org.apache.commons.math.linear.RealVector;
     27 import org.apache.commons.math.linear.ArrayRealVector;
     28 
     29 /**
     30  * An objective function for a linear optimization problem.
     31  * <p>
     32  * A linear objective function has one the form:
     33  * <pre>
     34  * c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> + d
     35  * </pre>
     36  * The c<sub>i</sub> and d are the coefficients of the equation,
     37  * the x<sub>i</sub> are the coordinates of the current point.
     38  * </p>
     39  * @version $Revision: 922713 $ $Date: 2010-03-14 02:26:13 +0100 (dim. 14 mars 2010) $
     40  * @since 2.0
     41  */
     42 public class LinearObjectiveFunction implements Serializable {
     43 
     44     /** Serializable version identifier. */
     45     private static final long serialVersionUID = -4531815507568396090L;
     46 
     47     /** Coefficients of the constraint (c<sub>i</sub>). */
     48     private final transient RealVector coefficients;
     49 
     50     /** Constant term of the linear equation. */
     51     private final double constantTerm;
     52 
     53     /**
     54      * @param coefficients The coefficients for the linear equation being optimized
     55      * @param constantTerm The constant term of the linear equation
     56      */
     57     public LinearObjectiveFunction(double[] coefficients, double constantTerm) {
     58         this(new ArrayRealVector(coefficients), constantTerm);
     59     }
     60 
     61     /**
     62      * @param coefficients The coefficients for the linear equation being optimized
     63      * @param constantTerm The constant term of the linear equation
     64      */
     65     public LinearObjectiveFunction(RealVector coefficients, double constantTerm) {
     66         this.coefficients = coefficients;
     67         this.constantTerm = constantTerm;
     68     }
     69 
     70     /**
     71      * Get the coefficients of the linear equation being optimized.
     72      * @return coefficients of the linear equation being optimized
     73      */
     74     public RealVector getCoefficients() {
     75         return coefficients;
     76     }
     77 
     78     /**
     79      * Get the constant of the linear equation being optimized.
     80      * @return constant of the linear equation being optimized
     81      */
     82     public double getConstantTerm() {
     83         return constantTerm;
     84     }
     85 
     86     /**
     87      * Compute the value of the linear equation at the current point
     88      * @param point point at which linear equation must be evaluated
     89      * @return value of the linear equation at the current point
     90      */
     91     public double getValue(final double[] point) {
     92         return coefficients.dotProduct(point) + constantTerm;
     93     }
     94 
     95     /**
     96      * Compute the value of the linear equation at the current point
     97      * @param point point at which linear equation must be evaluated
     98      * @return value of the linear equation at the current point
     99      */
    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 }
    148