/***************************************************************************************\
* Name:        MipSolPool.java                                   Fair Isaac 13/06/2008 *
* Purpose:     All solutions with the MIP solution pool                                *
* Description: We take the power generation problem stored in hpw15.mps which seeks to *
*              optimise the operating pattern of a group of electricity generators. We *
*              solve the problem collecting all solutions found during the MIP search. *
*              The optimal solution's objective and solution values are printed to     *
*              screen.                                                                 *
* Input:       hpw15.mps                                                               *
\***************************************************************************************/

import java.io.*;
import com.dashoptimization.*;

public class MipSolPool {
	public static void main(String[] args) throws Exception {
        String model = args.length == 0 ? "../data/hpw15" : args[0];
        try (XPRSprob prob = new XPRSprob(null)) {
			prob.addMsgHandlerListener(System.out);

			XPRSmipsolpool msp = new XPRSmipsolpool();

			msp.probAttach(prob);

			prob.readProb(model);

			prob.mipOptimize("g");

			int nSols = msp.attributes().getSolutions();

			if (nSols>0) {
				IntHolder iSolutionId = new IntHolder();
				DoubleHolder dObj = new DoubleHolder();
				msp.getDblAttribProbExtreme(prob,0,iSolutionId, XPRS.MSP_SOLPRB_OBJ, dObj);

				System.out.println("Optimal Solution ID: " + iSolutionId.value);
				System.out.println("Optimal Objective  : " + dObj.value);


				int nCols = msp.getIntAttribSol(iSolutionId.value, null, XPRS.MSP_SOL_COLS);
				for (int i=0;i<nCols;i++) {
					double[] dSol = new double[1];
					msp.getSol(iSolutionId.value,null,dSol,i,i,null);
					System.out.println(i + " = " + dSol[0]);
				}
			}

		}
	}
}
