code: /*
  	This software is a Java wrapper for the lp_solve optimization library.
  	
  	Copyright (C) 2004  Juergen Ebert (juergen.ebert@web.de)
  
  	This library is free software; you can redistribute it and/or
  	modify it under the terms of the GNU Lesser General Public
  	License as published by the Free Software Foundation; either
  	version 2.1 of the License, or (at your option) any later version.
  
  	This library is distributed in the hope that it will be useful,
  	but WITHOUT ANY WARRANTY; without even the implied warranty of
  	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  	Lesser General Public License for more details.
  
  	You should have received a copy of the GNU Lesser General Public
  	License along with this library; if not, write to the Free Software
  	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  
  import lpsolve.*;
  
  /**
   * Java version of the C Demo program that comes with the lp_solve software.
   * 
   * @author Juergen Ebert
   */
  public class Demo {
  
  	public Demo() {
  	}
  
  	public void execute() throws LpSolveException {
  		VersionInfo info = LpSolve.lpSolveVersion();
  		System.out.println("This demo (Java version) will show most of the features of lp_solve " 
  			+ info.getMajorversion()
  			+ "." + info.getMinorversion()
  			+ "." + info.getRelease()
  			+ "." + info.getBuild());
  		pressRet();
  		
  		System.out.println("We start by creating a new problem with 4 variables "
  			+ "and 0 constraints");
  		System.out.println("We use: LpSolve problem = LpSolve.makeLp(0, 4);");
  		LpSolve problem = LpSolve.makeLp(0, 4);
  		pressRet();
  		
  		/* Let's first demonstrate the logfunc callback feature */
  	    LogListener logfunc = new LogListener() {
  	        public void logfunc(LpSolve problem, Object handle, String buf) {
  	        	System.out.println(buf);
  	        }
  	    };
  	    problem.putLogfunc(logfunc, null);
  	    problem.solve(); /* just to see that a message is send via the logfunc routine ... */
  	    problem.putLogfunc(null, null); /* ok, that is enough, no more callback */
  
  	    /* Set an abort function. This is optional */
  	    AbortListener abortfunc = new AbortListener() {
  	        public boolean abortfunc(LpSolve problem, Object handle) {
  	        	/* If set to true, then solve is aborted and returncode will indicate this. */
  	        	return false;
  	        }
  	    };
  	    problem.putAbortfunc(abortfunc, null);
  
  	    /* Set a message function. Again optional */
  	    MsgListener msgfunc = new MsgListener() {
  	        public void msgfunc(LpSolve problem, Object handle, int msg) {
  	        	// System.out.println("Message = " + msg);
  	        }
  	    };
  	    problem.putMsgfunc(msgfunc, null, 
  	    		LpSolve.MSG_PRESOLVE | LpSolve.MSG_LPFEASIBLE | LpSolve.MSG_LPOPTIMAL 
  				| LpSolve.MSG_MILPEQUAL | LpSolve.MSG_MILPFEASIBLE | LpSolve.MSG_MILPBETTER);
  
  	    System.out.println("We can show the current problem with problem.printLp()");
  		problem.printLp();
  		pressRet();
  
  		System.out.println("Now we add some constraints:");
  		System.out.println("problem.strAddConstraint(\"3 2 2 1\", LpSolve.LE, 4);");
  		problem.strAddConstraint("3 2 2 1", LpSolve.LE, 4);
  		problem.printLp();
  		pressRet();
  		
  		System.out.println("problem.strAddConstraint(\"0 4 3 1\", LpSolve.GE, 3);");
  		problem.strAddConstraint("0 4 3 1", LpSolve.GE, 3);
  		problem.printLp();
  		pressRet();
  			
  		System.out.println("Set the objective function:");
  		System.out.println("problem.strSetObjFn(\"2 3 -2 3\");");
  		problem.strSetObjFn("2 3 -2 3");
  		problem.printLp();
  		pressRet();
  		
  		System.out.println("Now solve the problem with System.out.println(problem.solve());");
  		System.out.println(problem.solve());
  		pressRet();
  		
  		System.out.println("The value is 0, this means we found an optimal solution.");
  		System.out.println("We can display the solution with problem.printObjective(), "
  			+ "problem.printSolution(1), and problem.printConstraints(1)");		
  		problem.printObjective();
  		problem.printSolution(1);
  		problem.printConstraints(1);
  		pressRet();
  		
  		System.out.println("The dual variables of the solution are printed with "
  			+ "problem.printDuals()");
  		problem.printDuals();
  		pressRet();
  				
  		System.out.println("We can change a single element in the matix with "
  			+ "problem.setMat(2, 1, 0.5)");
  		problem.setMat(2, 1, 0.5);
  		problem.printLp();
  		pressRet();
  		
  		System.out.println("If we want to maximize the objective function use "
  			+ "problem.setMaxim()");
  		problem.setMaxim();		
  		problem.printLp();
  		pressRet();
  				
  		System.out.println("After solving this gives us:");
  		problem.solve();
  		problem.printObjective();
  		problem.printSolution(1);
  		problem.printConstraints(1);
  		problem.printDuals();
  		pressRet();
  		
  		System.out.println("Change the value of a rhs element with problem.setRh(1, 7.45)");
  		problem.setRh(1, 7.45);
  		problem.printLp();
  		problem.solve();
  		problem.printObjective();
  		problem.printSolution(1);
  		problem.printConstraints(1);
  		pressRet();
  	
  		System.out.println("We change " + problem.getColName(4) 
  			+ " to the integer type with problem.setInt(4, true)");
  		problem.setInt(4, true);
  		problem.printLp();
  		System.out.println("We set branch & bound debugging on with problem.setDebug(true)");
  		problem.setDebug(true);
  		System.out.println("and solve...");
  		pressRet();
  		
  		problem.solve();
  		problem.printObjective();
  		problem.printSolution(1);
  		problem.printConstraints(1);
  		pressRet();
  	
  		System.out.println("We can set bounds on the variables with "
  			+ "problem.setLowbo(2, 2) & problem.setUpbo(4, 5.3)");
  		problem.setLowbo(2, 2);
  		problem.setUpbo(4, 5.3);
  		problem.printLp();
  		pressRet();
  	
  		problem.solve();
  		problem.printObjective();
  		problem.printSolution(1);
  		problem.printConstraints(1);
  		pressRet();
  	
  		System.out.println("Now remove a constraint with problem.delConstraint(1)");
  		problem.delConstraint(1);
  		problem.printLp();
  		pressRet();
  
  		System.out.println("Add an equality constraint:\n" 
  			+ "problem.strAddConstraint(\"1 2 1 4\", LpSolve.EQ, 8)");
  		problem.strAddConstraint("1 2 1 4", LpSolve.EQ, 8);
  		problem.printLp();
  		pressRet();
  		
  		System.out.println("A column can be added with problem.strAddColumn(\"3 2 2\")");
  		problem.strAddColumn("3 2 2");
  		problem.printLp();
  		pressRet();
  	
  		System.out.println("A column can be removed with problem.delColumn(3)");
  		problem.delColumn(3);
  		problem.printLp();
  		pressRet();
  		
  		System.out.println("We can use automatic scaling with problem.setScaling(LpSolve.SCALE_MEAN)");
  		problem.setScaling(LpSolve.SCALE_MEAN);
  		problem.printLp();
  		pressRet();
  	
  		System.out.println("The function matElm returns a single matrix element.");
  		System.out.println("problem.getMat(2, 3) returns " + problem.getMat(2, 3));
  		System.out.println("problem.getMat(1, 1) returns " + problem.getMat(1, 1));
  		System.out.println("Notice that getMat returns the value of the "
  			+ "original unscaled problem");
  		pressRet();
  
  		System.out.println("If there are any integer type variables, then only "
  			+ " the rows are scaled.");
  		System.out.println("problem.setScaling(LpSolve.SCALE_MEAN);");		
  		problem.setScaling(LpSolve.SCALE_MEAN);
  		System.out.println("problem.setInt(3, false);");		
  		problem.setInt(3, false);
  		problem.printLp();
  		pressRet();
  		
  		System.out.println("printObjective, printSolution gives the solution to the "
  			+ "original problem");
  		problem.solve();
  		problem.printObjective();
  		problem.printSolution(1);
  		problem.printConstraints(1);
  		pressRet();
  
  		System.out.println("Scaling is turned off with problem.unscale()");
  		problem.unscale();
  		problem.printLp();
  		pressRet();
  
  		System.out.println("Now turn B&B debugging off and simplex tracing on with");
  		System.out.println("problem.setDebug(false), problem.setTrace(true) and solve.");
  		problem.setDebug(false);
  		problem.setTrace(true);
  		pressRet();
  
  		problem.solve();
  		System.out.println("Where possible, lp_solve will start at the last found basis.");
  		System.out.println("We can reset the problem to the initial basis with");
  		System.out.println("problem.resetBasis(). Now solve it again ...");
  		pressRet();
  
  		problem.resetBasis();
  		problem.solve();
  		System.out.println("It is possible to give variables and constraints names.");
  		System.out.println("problem.setRowName(1, \"speed\") & problem.setColName(2, \"money\")");
  		problem.setRowName(1, "speed");
  		problem.setColName(2, "money");
  		problem.printLp();
  		System.out.println("As you can see, all column and rows are assigned default names");
  		System.out.println("If a column or constraint is deleted, the names shift place also:");
  		pressRet();
  		
  		System.out.println("problem.delColumn(1)");
  		problem.delColumn(1);
  		problem.printLp();
  		pressRet();
  		
  		// delete the problem 
  		problem.deleteLp();
  	}
  
  	private void pressRet() {
  		System.out.print("\n[Press return to continue or type 'q' to quit] ");
  		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  		try {
  			String line = br.readLine();
  			if (line == null || "q".equals(line.trim())) {
  				System.out.println("Demo terminated.");
  				System.exit(0);
  			}
  		} 
  		catch (IOException e) {
  			System.exit(0);
  		}
  		System.out.println("");
  	}
  
  	public static void main(String[] args) {
  		try {
  			new Demo().execute();
  		} 
  		catch (LpSolveException e) {
  			e.printStackTrace();
  		}
  	}
  }
  