LinearConstraint.java
- /*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /*
- * This is not the original file distributed by the Apache Software Foundation
- * It has been modified by the Hipparchus project
- */
- package org.hipparchus.optim.linear;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
- import org.hipparchus.linear.ArrayRealVector;
- import org.hipparchus.linear.RealVector;
- /**
- * A linear constraint for a linear optimization problem.
- * <p>* A linear constraint has one of the forms:</p>
- * <ul>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> = v</li>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> <= v</li>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> >= v</li>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> =
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> <=
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> >=
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * </ul>
- * <p>The c<sub>i</sub>, l<sub>i</sub> or r<sub>i</sub> are the coefficients of the constraints, the x<sub>i</sub>
- * are the coordinates of the current point and v is the value of the constraint.
- * </p>
- *
- */
- public class LinearConstraint implements Serializable {
- /** Serializable version identifier. */
- private static final long serialVersionUID = -764632794033034092L;
- /** Coefficients of the constraint (left hand side). */
- private final transient RealVector coefficients;
- /** Relationship between left and right hand sides (=, <=, >=). */
- private final Relationship relationship;
- /** Value of the constraint (right hand side). */
- private final double value;
- /**
- * Build a constraint involving a single linear equation.
- * <p>A linear constraint with a single linear equation has one of the forms:</p>
- * <ul>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> = v</li>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> <= v</li>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> >= v</li>
- * </ul>
- * @param coefficients The coefficients of the constraint (left hand side)
- * @param relationship The type of (in)equality used in the constraint
- * @param value The value of the constraint (right hand side)
- */
- public LinearConstraint(final double[] coefficients,
- final Relationship relationship,
- final double value) {
- this(new ArrayRealVector(coefficients), relationship, value);
- }
- /**
- * Build a constraint involving a single linear equation.
- * <p>A linear constraint with a single linear equation has one of the forms:</p>
- * <ul>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> = v</li>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> <= v</li>
- * <li>c<sub>1</sub>x<sub>1</sub> + ... c<sub>n</sub>x<sub>n</sub> >= v</li>
- * </ul>
- * @param coefficients The coefficients of the constraint (left hand side)
- * @param relationship The type of (in)equality used in the constraint
- * @param value The value of the constraint (right hand side)
- */
- public LinearConstraint(final RealVector coefficients,
- final Relationship relationship,
- final double value) {
- this.coefficients = coefficients;
- this.relationship = relationship;
- this.value = value;
- }
- /**
- * Build a constraint involving two linear equations.
- * <p>A linear constraint with two linear equation has one of the forms:</p>
- * <ul>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> =
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> <=
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> >=
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * </ul>
- * @param lhsCoefficients The coefficients of the linear expression on the left hand side of the constraint
- * @param lhsConstant The constant term of the linear expression on the left hand side of the constraint
- * @param relationship The type of (in)equality used in the constraint
- * @param rhsCoefficients The coefficients of the linear expression on the right hand side of the constraint
- * @param rhsConstant The constant term of the linear expression on the right hand side of the constraint
- */
- public LinearConstraint(final double[] lhsCoefficients, final double lhsConstant,
- final Relationship relationship,
- final double[] rhsCoefficients, final double rhsConstant) {
- double[] sub = new double[lhsCoefficients.length];
- for (int i = 0; i < sub.length; ++i) {
- sub[i] = lhsCoefficients[i] - rhsCoefficients[i];
- }
- this.coefficients = new ArrayRealVector(sub, false);
- this.relationship = relationship;
- this.value = rhsConstant - lhsConstant;
- }
- /**
- * Build a constraint involving two linear equations.
- * <p>A linear constraint with two linear equation has one of the forms:</p>
- * <ul>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> =
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> <=
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * <li>l<sub>1</sub>x<sub>1</sub> + ... l<sub>n</sub>x<sub>n</sub> + l<sub>cst</sub> >=
- * r<sub>1</sub>x<sub>1</sub> + ... r<sub>n</sub>x<sub>n</sub> + r<sub>cst</sub></li>
- * </ul>
- * @param lhsCoefficients The coefficients of the linear expression on the left hand side of the constraint
- * @param lhsConstant The constant term of the linear expression on the left hand side of the constraint
- * @param relationship The type of (in)equality used in the constraint
- * @param rhsCoefficients The coefficients of the linear expression on the right hand side of the constraint
- * @param rhsConstant The constant term of the linear expression on the right hand side of the constraint
- */
- public LinearConstraint(final RealVector lhsCoefficients, final double lhsConstant,
- final Relationship relationship,
- final RealVector rhsCoefficients, final double rhsConstant) {
- this.coefficients = lhsCoefficients.subtract(rhsCoefficients);
- this.relationship = relationship;
- this.value = rhsConstant - lhsConstant;
- }
- /**
- * Gets the coefficients of the constraint (left hand side).
- *
- * @return the coefficients of the constraint (left hand side).
- */
- public RealVector getCoefficients() {
- return coefficients;
- }
- /**
- * Gets the relationship between left and right hand sides.
- *
- * @return the relationship between left and right hand sides.
- */
- public Relationship getRelationship() {
- return relationship;
- }
- /**
- * Gets the value of the constraint (right hand side).
- *
- * @return the value of the constraint (right hand side).
- */
- public double getValue() {
- return value;
- }
- /** {@inheritDoc} */
- @Override
- public boolean equals(Object other) {
- if (this == other) {
- return true;
- }
- if (other instanceof LinearConstraint) {
- LinearConstraint rhs = (LinearConstraint) other;
- return relationship == rhs.relationship &&
- value == rhs.value &&
- coefficients.equals(rhs.coefficients);
- }
- return false;
- }
- /** {@inheritDoc} */
- @Override
- public int hashCode() {
- return relationship.hashCode() ^
- Double.valueOf(value).hashCode() ^
- coefficients.hashCode();
- }
- /**
- * Serialize the instance.
- * @param oos stream where object should be written
- * @throws IOException if object cannot be written to stream
- */
- private void writeObject(ObjectOutputStream oos)
- throws IOException {
- oos.defaultWriteObject();
- final int n = coefficients.getDimension();
- oos.writeInt(n);
- for (int i = 0; i < n; ++i) {
- oos.writeDouble(coefficients.getEntry(i));
- }
- }
- /**
- * Deserialize the instance.
- * @param ois stream from which the object should be read
- * @throws ClassNotFoundException if a class in the stream cannot be found
- * @throws IOException if object cannot be read from the stream
- */
- private void readObject(ObjectInputStream ois)
- throws ClassNotFoundException, IOException {
- ois.defaultReadObject();
- // read the vector data
- final int n = ois.readInt();
- final double[] data = new double[n];
- for (int i = 0; i < n; ++i) {
- data[i] = ois.readDouble();
- }
- try {
- // create the instance
- ArrayRealVector vector = new ArrayRealVector(data, false);
- final java.lang.reflect.Field f = getClass().getDeclaredField("coefficients");
- f.setAccessible(true); // NOPMD
- f.set(this, vector);
- } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
- IOException ioe = new IOException();
- ioe.initCause(e);
- throw ioe;
- }
- }
- }