Author: luc
Date: Wed Aug 26 08:43:27 2009
New Revision: 807923

URL: http://svn.apache.org/viewvc?rev=807923&view=rev
Log:
fixed an error with negative constraints and unfeasible solution
JIRA: MATH-290

Modified:
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/linear/SimplexTableau.java
    commons/proper/math/trunk/src/site/xdoc/changes.xml
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/linear/SimplexSolverTest.java

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/linear/SimplexTableau.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/linear/SimplexTableau.java?rev=807923&r1=807922&r2=807923&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/linear/SimplexTableau.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/optimization/linear/SimplexTableau.java
 Wed Aug 26 08:43:27 2009
@@ -69,7 +69,7 @@
     private final LinearObjectiveFunction f;
 
     /** Linear constraints. */
-    private final Collection<LinearConstraint> constraints;
+    private final List<LinearConstraint> constraints;
 
     /** Whether to restrict the variables to non-negative values. */
     private final boolean restrictToNonNegative;
@@ -103,7 +103,7 @@
                    final GoalType goalType, final boolean 
restrictToNonNegative,
                    final double epsilon) {
         this.f                      = f;
-        this.constraints            = constraints;
+        this.constraints            = normalizeConstraints(constraints);
         this.restrictToNonNegative  = restrictToNonNegative;
         this.epsilon                = epsilon;
         this.numDecisionVariables   = getNumVariables() + 
(restrictToNonNegative ? 0 : 1);
@@ -123,7 +123,6 @@
     protected double[][] createTableau(final boolean maximize) {
 
         // create a matrix of the correct size
-        List<LinearConstraint> constraints = getNormalizedConstraints();
         int width = numDecisionVariables + numSlackVariables +
         numArtificialVariables + getNumObjectiveFunctions() + 1; // + 1 is for 
RHS
         int height = constraints.size() + getNumObjectiveFunctions();
@@ -192,9 +191,10 @@
 
     /**
      * Get new versions of the constraints which have positive right hand 
sides.
+     * @param constraints original (not normalized) constraints
      * @return new versions of the constraints
      */
-    public List<LinearConstraint> getNormalizedConstraints() {
+    public List<LinearConstraint> 
normalizeConstraints(Collection<LinearConstraint> constraints) {
         List<LinearConstraint> normalized = new ArrayList<LinearConstraint>();
         for (LinearConstraint constraint : constraints) {
             normalized.add(normalize(constraint));

Modified: commons/proper/math/trunk/src/site/xdoc/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/changes.xml?rev=807923&r1=807922&r2=807923&view=diff
==============================================================================
--- commons/proper/math/trunk/src/site/xdoc/changes.xml (original)
+++ commons/proper/math/trunk/src/site/xdoc/changes.xml Wed Aug 26 08:43:27 2009
@@ -39,6 +39,10 @@
   </properties>
   <body>
     <release version="2.1" date="TBD" description="TBD">
+      <action dev="luc" type="fix" issue="MATH-290" due-to="Benjamin McCann">
+        Fixed a NullPointerException when no solution is possible and some 
constraints
+        are negative
+      </action>
       <action dev="luc" type="fix" issue="MATH-288" due-to="Benjamin McCann">
         Fixed an error induced by entries set to 0
       </action>

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/linear/SimplexSolverTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/linear/SimplexSolverTest.java?rev=807923&r1=807922&r2=807923&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/linear/SimplexSolverTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/optimization/linear/SimplexSolverTest.java
 Wed Aug 26 08:43:27 2009
@@ -18,6 +18,7 @@
 package org.apache.commons.math.optimization.linear;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -74,6 +75,16 @@
     }
 
     @Test
+    public void testMath290() throws OptimizationException {
+        LinearObjectiveFunction f = new LinearObjectiveFunction(new double[] { 
1, 5 }, 0 );
+        Collection<LinearConstraint> constraints = new 
ArrayList<LinearConstraint>();
+        constraints.add(new LinearConstraint(new double[] { 2, 0 }, 
Relationship.GEQ, -1.0));
+        SimplexSolver solver = new SimplexSolver();
+        RealPointValuePair solution = solver.optimize(f, constraints, 
GoalType.MINIMIZE, true);
+        assertNotNull(solution);
+    }
+
+    @Test
     public void testSimplexSolver() throws OptimizationException {
         LinearObjectiveFunction f =
             new LinearObjectiveFunction(new double[] { 15, 10 }, 7);


Reply via email to