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.util.ArrayList;
021    import java.util.Collection;
022    
023    import org.apache.commons.math.TestUtils;
024    import org.apache.commons.math.optimization.GoalType;
025    
026    import junit.framework.TestCase;
027    
028    public class SimplexTableauTest extends TestCase {
029    
030        public void testInitialization() {    
031            LinearObjectiveFunction f = createFunction();
032            Collection<LinearConstraint> constraints = createConstraints();
033            SimplexTableau tableau =
034                new SimplexTableau(f, constraints, GoalType.MAXIMIZE, false, 1.0e-6);
035            double[][] expectedInitialTableau = {
036                                                 {-1, 0,  -1,  -1,  2, 0, 0, 0, -4},
037                                                 { 0, 1, -15, -10, 25, 0, 0, 0,  0},
038                                                 { 0, 0,   1,   0, -1, 1, 0, 0,  2},
039                                                 { 0, 0,   0,   1, -1, 0, 1, 0,  3},
040                                                 { 0, 0,   1,   1, -2, 0, 0, 1,  4}
041            };
042            assertMatrixEquals(expectedInitialTableau, tableau.getData());
043        }
044    
045        public void testdiscardArtificialVariables() {    
046            LinearObjectiveFunction f = createFunction();
047            Collection<LinearConstraint> constraints = createConstraints();
048            SimplexTableau tableau =
049                new SimplexTableau(f, constraints, GoalType.MAXIMIZE, false, 1.0e-6);
050            double[][] expectedTableau = {
051                                          { 1, -15, -10, 25, 0, 0, 0},
052                                          { 0,   1,   0, -1, 1, 0, 2},
053                                          { 0,   0,   1, -1, 0, 1, 3},
054                                          { 0,   1,   1, -2, 0, 0, 4}
055            };
056            tableau.discardArtificialVariables();
057            assertMatrixEquals(expectedTableau, tableau.getData());
058        }
059    
060        public void testTableauWithNoArtificialVars() {
061            LinearObjectiveFunction f = new LinearObjectiveFunction(new double[] {15, 10}, 0);
062            Collection<LinearConstraint> constraints = new ArrayList<LinearConstraint>();
063            constraints.add(new LinearConstraint(new double[] {1, 0}, Relationship.LEQ, 2));
064            constraints.add(new LinearConstraint(new double[] {0, 1}, Relationship.LEQ, 3));
065            constraints.add(new LinearConstraint(new double[] {1, 1}, Relationship.LEQ, 4));    
066            SimplexTableau tableau =
067                new SimplexTableau(f, constraints, GoalType.MAXIMIZE, false, 1.0e-6);
068            double[][] initialTableau = {
069                                         {1, -15, -10, 25, 0, 0, 0, 0},
070                                         {0,   1,   0, -1, 1, 0, 0, 2},
071                                         {0,   0,   1, -1, 0, 1, 0, 3},
072                                         {0,   1,   1, -2, 0, 0, 1, 4}
073            };
074            assertMatrixEquals(initialTableau, tableau.getData());
075        }
076    
077        public void testSerial() {
078            LinearObjectiveFunction f = createFunction();
079            Collection<LinearConstraint> constraints = createConstraints();
080            SimplexTableau tableau =
081                new SimplexTableau(f, constraints, GoalType.MAXIMIZE, false, 1.0e-6);
082            assertEquals(tableau, TestUtils.serializeAndRecover(tableau));
083        }
084        private LinearObjectiveFunction createFunction() {
085            return new LinearObjectiveFunction(new double[] {15, 10}, 0);
086        }
087    
088        private Collection<LinearConstraint> createConstraints() {
089            Collection<LinearConstraint> constraints = new ArrayList<LinearConstraint>();
090            constraints.add(new LinearConstraint(new double[] {1, 0}, Relationship.LEQ, 2));
091            constraints.add(new LinearConstraint(new double[] {0, 1}, Relationship.LEQ, 3));
092            constraints.add(new LinearConstraint(new double[] {1, 1}, Relationship.EQ, 4));
093            return constraints;
094        }
095    
096        private void assertMatrixEquals(double[][] expected, double[][] result) {
097            assertEquals("Wrong number of rows.", expected.length, result.length);
098            for (int i = 0; i < expected.length; i++) {
099                assertEquals("Wrong number of columns.", expected[i].length, result[i].length);
100                for (int j = 0; j < expected[i].length; j++) {
101                    assertEquals("Wrong value at position [" + i + "," + j + "]", expected[i][j], result[i][j]);
102                }
103            }
104        }
105    
106    }