summaryrefslogtreecommitdiff
path: root/build/cpp/cpp_intfmincon.cpp
diff options
context:
space:
mode:
authorHarpreet2016-08-04 15:25:44 +0530
committerHarpreet2016-08-04 15:25:44 +0530
commit9fd2976931c088dc523974afb901e96bad20f73c (patch)
tree22502de6e6988d5cd595290d11266f8432ad825b /build/cpp/cpp_intfmincon.cpp
downloadFOSSEE-Optim-toolbox-development-9fd2976931c088dc523974afb901e96bad20f73c.tar.gz
FOSSEE-Optim-toolbox-development-9fd2976931c088dc523974afb901e96bad20f73c.tar.bz2
FOSSEE-Optim-toolbox-development-9fd2976931c088dc523974afb901e96bad20f73c.zip
initial add
Diffstat (limited to 'build/cpp/cpp_intfmincon.cpp')
-rw-r--r--build/cpp/cpp_intfmincon.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/build/cpp/cpp_intfmincon.cpp b/build/cpp/cpp_intfmincon.cpp
new file mode 100644
index 0000000..50270cf
--- /dev/null
+++ b/build/cpp/cpp_intfmincon.cpp
@@ -0,0 +1,191 @@
+// Copyright (C) 2016 - IIT Bombay - FOSSEE
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution. The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+// Author: Harpreet Singh
+// Organization: FOSSEE, IIT Bombay
+// Email: toolbox@scilab.in
+
+#include "CoinPragma.hpp"
+#include "CoinTime.hpp"
+#include "CoinError.hpp"
+
+#include "BonOsiTMINLPInterface.hpp"
+#include "BonIpoptSolver.hpp"
+#include "minconTMINLP.hpp"
+#include "BonCbc.hpp"
+#include "BonBonminSetup.hpp"
+
+#include "BonOACutGenerator2.hpp"
+#include "BonEcpCuts.hpp"
+#include "BonOaNlpOptim.hpp"
+
+#include "sci_iofunc.hpp"
+extern "C"
+{
+#include "call_scilab.h"
+#include <api_scilab.h>
+#include <Scierror.h>
+#include <BOOL.h>
+#include <localization.h>
+#include <sciprint.h>
+
+int cpp_intfmincon(char *fname)
+{
+ using namespace Ipopt;
+ using namespace Bonmin;
+
+ CheckInputArgument(pvApiCtx, 13, 13);
+ CheckOutputArgument(pvApiCtx, 3, 3);
+
+ // Input arguments
+ Number *integertolerance=NULL, *maxnodes=NULL, *allowablegap=NULL, *cputime=NULL,*max_iter=NULL;
+ Number *x0 = NULL, *lb = NULL, *ub = NULL,*conLb = NULL, *conUb = NULL,*LC = NULL;
+ static unsigned int nVars = 0,nCons = 0;
+ unsigned int temp1 = 0,temp2 = 0, iret = 0;
+ int x0_rows, x0_cols,intconSize;
+ Number *intcon = NULL,*options=NULL, *ifval=NULL;
+
+ // Output arguments
+ Number *fX = NULL, ObjVal=0,iteration=0,cpuTime=0,fobj_eval=0;
+ Number dual_inf, constr_viol, complementarity, kkt_error;
+ int rstatus = 0;
+
+ if(getDoubleMatrixFromScilab(6, &nVars, &x0_cols, &x0))
+ {
+ return 1;
+ }
+
+ if(getDoubleMatrixFromScilab(7, &x0_rows, &x0_cols, &lb))
+ {
+ return 1;
+ }
+
+ if(getDoubleMatrixFromScilab(8, &x0_rows, &x0_cols, &ub))
+ {
+ return 1;
+ }
+
+ if(getDoubleMatrixFromScilab(9, &nCons, &x0_cols, &conLb))
+ {
+ return 1;
+ }
+
+ if(getDoubleMatrixFromScilab(10, &x0_rows, &x0_cols, &conUb))
+ {
+ return 1;
+ }
+
+ // Getting intcon
+ if (getDoubleMatrixFromScilab(11,&intconSize,&temp2,&intcon))
+ {
+ return 1;
+ }
+
+ if (getDoubleMatrixFromScilab(13,&temp1,&temp2,&LC))
+ {
+ return 1;
+ }
+
+ //Initialization of parameters
+ temp1 = 1;
+ temp2 = 1;
+
+ //Getting parameters
+ if (getFixedSizeDoubleMatrixInList(12,2,temp1,temp2,&integertolerance))
+ {
+ return 1;
+ }
+ if (getFixedSizeDoubleMatrixInList(12,4,temp1,temp2,&maxnodes))
+ {
+ return 1;
+ }
+ if (getFixedSizeDoubleMatrixInList(12,6,temp1,temp2,&cputime))
+ {
+ return 1;
+ }
+ if (getFixedSizeDoubleMatrixInList(12,8,temp1,temp2,&allowablegap))
+ {
+ return 1;
+ }
+ if (getFixedSizeDoubleMatrixInList(12,10,temp1,temp2,&max_iter))
+ {
+ return 1;
+ }
+
+ SmartPtr<minconTMINLP> tminlp = new minconTMINLP(nVars,x0,lb,ub,(unsigned int)LC,nCons,conLb,conUb,intconSize,intcon);
+
+ BonminSetup bonmin;
+ bonmin.initializeOptionsAndJournalist();
+ bonmin.options()->SetStringValue("mu_oracle","loqo");
+ bonmin.options()->SetNumericValue("bonmin.integer_tolerance", *integertolerance);
+ bonmin.options()->SetIntegerValue("bonmin.node_limit", (int)*maxnodes);
+ bonmin.options()->SetNumericValue("bonmin.time_limit", *cputime);
+ bonmin.options()->SetNumericValue("bonmin.allowable_gap", *allowablegap);
+ bonmin.options()->SetIntegerValue("bonmin.iteration_limit", (int)*max_iter);
+
+ //Now initialize from tminlp
+ bonmin.initialize(GetRawPtr(tminlp));
+
+ //Set up done, now let's branch and bound
+ try {
+ Bab bb;
+ bb(bonmin);//process parameter file using Ipopt and do branch and bound using Cbc
+ }
+ catch(TNLPSolver::UnsolvedError *E) {
+ Scierror(999, "\nIpopt has failed to solve the problem!\n");
+ }
+ catch(OsiTMINLPInterface::SimpleError &E) {
+ Scierror(999, "\nFailed to solve a problem!\n");
+ }
+ catch(CoinError &E) {
+ Scierror(999, "\nFailed to solve a problem!\n");
+ }
+ rstatus=tminlp->returnStatus();
+
+ if(rstatus==0 ||rstatus== 3)
+ {
+ fX = tminlp->getX();
+ ObjVal = tminlp->getObjVal();
+ if (returnDoubleMatrixToScilab(1, nVars, 1, fX))
+ {
+ return 1;
+ }
+
+ if (returnDoubleMatrixToScilab(2, 1, 1, &ObjVal))
+ {
+ return 1;
+ }
+
+ if (returnIntegerMatrixToScilab(3, 1, 1, &rstatus))
+ {
+ return 1;
+ }
+
+ }
+ else
+ {
+ if (returnDoubleMatrixToScilab(1, 0, 0, fX))
+ {
+ return 1;
+ }
+
+ if (returnDoubleMatrixToScilab(2, 1, 1, &ObjVal))
+ {
+ return 1;
+ }
+
+ if (returnIntegerMatrixToScilab(3, 1, 1, &rstatus))
+ {
+ return 1;
+ }
+
+ }
+
+ return 0;
+ }
+}
+