From 3509c47947f87329a4c4da98ad84a9cfc1235a49 Mon Sep 17 00:00:00 2001
From: Claus Jonathan Fritzemeier <clausjonathan.fritzemeier@hhu.de>
Date: Wed, 18 Jan 2017 11:21:16 +0100
Subject: [PATCH] getNumQConstrsCPLEX function added

---
 NAMESPACE                  |  1 +
 R/cplexAPI.R               | 13 +++++++++
 inst/NEWS.Rd               |  2 ++
 inst/c2r.map               |  1 +
 man/getNumQConstrsCPLEX.Rd | 55 ++++++++++++++++++++++++++++++++++++++
 src/cplexAPI.c             | 19 +++++++++++++
 src/cplexAPI.h             |  3 +++
 src/init.c                 |  1 +
 8 files changed, 95 insertions(+)
 create mode 100644 man/getNumQConstrsCPLEX.Rd

diff --git a/NAMESPACE b/NAMESPACE
index 5206eea..4096934 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -126,6 +126,7 @@ getMIPstartsCPLEX,
 getNumColsCPLEX,
 getNumMIPstartsCPLEX,
 getNumNnzCPLEX,
+getNumQConstrsCPLEX,
 getNumQuadCPLEX,
 getOrderCPLEX,
 getQConstrCPLEX,
diff --git a/R/cplexAPI.R b/R/cplexAPI.R
index 3a9cd87..848895d 100644
--- a/R/cplexAPI.R
+++ b/R/cplexAPI.R
@@ -3063,6 +3063,19 @@ readCopyOrderCPLEX <- function(env, lp, fname) {
 }
 
 
+
+
+#------------------------------------------------------------------------------#
+getNumQConstrsCPLEX <- function(env, lp) {
+
+    nq <- .Call("getNumQConstrs", PACKAGE = "cplexAPI",
+                cplexPointer(env),
+                cplexPointer(lp)
+          )
+
+    return(nq)
+}
+
 #------------------------------------------------------------------------------#
 
 addQConstrCPLEX <- function(env, lp, lzn, qzn, rhs, sense,
diff --git a/inst/NEWS.Rd b/inst/NEWS.Rd
index b5a0cd4..4db336b 100644
--- a/inst/NEWS.Rd
+++ b/inst/NEWS.Rd
@@ -8,6 +8,8 @@
 \section{Changes in version 1.3.2 2016-11-16}{
   \itemize{
     \item Fixed a bug in \code{getQuad()}. Thx to Florian Schwendinger.
+    \item Added function \code{getNumQConstrsCPLEX} to access cplex function
+    	\code{CPXgetnumqconstrs}
   }
 }
 
diff --git a/inst/c2r.map b/inst/c2r.map
index bf4b041..4dced44 100644
--- a/inst/c2r.map
+++ b/inst/c2r.map
@@ -95,6 +95,7 @@ CPXgetdj                     <- cplexAPI::getDjCPLEX
 CPXgeterrorstring            <- cplexAPI::getErrorStrCPLEX
 CPXgetgrad                   <- cplexAPI::getGradCPLEX
 CPXgetindconstr              <- cplexAPI::getIndConstrCPLEX
+CPXgetnumqconstrs            <- cplexAPI::getNumQConstrsCPLEX
 CPXinfodblparam              <- cplexAPI::getInfoDblParmCPLEX
 CPXinfointparam              <- cplexAPI::getInfoIntParmCPLEX
 CPXinfolongparam             <- cplexAPI::getInfoLongParmCPLEX
diff --git a/man/getNumQConstrsCPLEX.Rd b/man/getNumQConstrsCPLEX.Rd
new file mode 100644
index 0000000..da5c456
--- /dev/null
+++ b/man/getNumQConstrsCPLEX.Rd
@@ -0,0 +1,55 @@
+\name{getNumQConstrsCPLEX}
+\alias{getNumQConstrsCPLEX}
+\alias{CPXgetnumqconstrs}
+
+\title{
+  Return the Number of quadratic constraints.
+}
+
+\description{
+  Low level interface function to the IBM ILOG CPLEX function
+  \code{CPXgetnumqconstrs}.  Consult the IBM ILOG CPLEX documentation for more
+  detailed information.
+}
+
+\usage{
+  getNumQConstrsCPLEX(env, lp)
+}
+
+\arguments{
+  \item{env}{
+    An object of class \code{"\linkS4class{cplexPtr}"} as returned by
+    \code{\link{openEnvCPLEX}}. This is basically a pointer to an
+    IBM ILOG CPLEX environment.
+  }
+  \item{lp}{
+    An object of class \code{"\linkS4class{cplexPtr}"} as returned by
+    \code{\link{initProbCPLEX}}. This is basically a pointer to an
+    IBM ILOG CPLEX problem object.
+  }
+}
+
+\details{
+  Interface to the C function \code{getNumQConstrs} which calls the CPLEX
+  function \code{CPXgetnumqconstrs}.
+}
+
+\value{
+  If successful the number of quadratic constraints is returned. 
+  If \code{env} or \code{lp} do not exist, zero is
+  returned.
+}
+
+\references{
+  The IBM ILOG CPLEX home page at
+  \url{https://www.ibm.com/developerworks/university/academicinitiative/}.
+}
+
+\author{
+  Claus Jonathan Fritzemeier <clausjonathan.fritzemeier@uni-duesseldorf.de>
+
+  Maintainer: Claus Jonathan Fritzemeier <clausjonathan.fritzemeier@uni-duesseldorf.de>
+}
+
+
+\keyword{ optimize }
diff --git a/src/cplexAPI.c b/src/cplexAPI.c
index 496e559..7228412 100644
--- a/src/cplexAPI.c
+++ b/src/cplexAPI.c
@@ -6195,6 +6195,7 @@ SEXP ordWrite(SEXP env, SEXP lp, SEXP fname) {
 }
 
 
+
 /* -------------------------------------------------------------------------- */
 /* read ORD file and copy priority order information into a problem object */
 SEXP readCopyOrder(SEXP env, SEXP lp, SEXP fname) {
@@ -6218,6 +6219,24 @@ SEXP readCopyOrder(SEXP env, SEXP lp, SEXP fname) {
 }
 
 
+/* -------------------------------------------------------------------------- */
+/* get number of quadratic constraint of a specified CPLEX problem object */
+SEXP getNumQConstrs(SEXP env, SEXP lp) {
+
+    SEXP out = R_NilValue;
+    int qconstrs = 0;
+
+    checkEnv(env);
+    checkProb(lp);
+
+    qconstrs = CPXgetnumqconstrs(R_ExternalPtrAddr(env),
+    R_ExternalPtrAddr(lp));
+
+    out = Rf_ScalarInteger(qconstrs);
+
+    return out;
+}
+
 /* -------------------------------------------------------------------------- */
 /* add quadratic constraint to a specified CPLEX problem object */
 SEXP addQConstr(SEXP env, SEXP lp, SEXP lzn, SEXP qzn,
diff --git a/src/cplexAPI.h b/src/cplexAPI.h
index ccfd9cf..cb0d774 100644
--- a/src/cplexAPI.h
+++ b/src/cplexAPI.h
@@ -678,6 +678,9 @@ SEXP ordWrite(SEXP env, SEXP lp, SEXP fname);
 /* read ORD file and copy priority order information into a problem object */
 SEXP readCopyOrder(SEXP env, SEXP lp, SEXP fname);
 
+/* get number of quadratic constraint of a specified CPLEX problem object */
+SEXP getNumQConstrs(SEXP env, SEXP lp);
+
 /* add quadratic constraint to a specified CPLEX problem object */
 SEXP addQConstr(SEXP env, SEXP lp, SEXP lzn, SEXP qzn,
                 SEXP rhs, SEXP sense,
diff --git a/src/init.c b/src/init.c
index daddb10..e0c37eb 100644
--- a/src/init.c
+++ b/src/init.c
@@ -220,6 +220,7 @@ static const R_CallMethodDef callMethods[] = {
     {"getOrder",                  (DL_FUNC) &getOrder,                  2},
     {"ordWrite",                  (DL_FUNC) &ordWrite,                  3},
     {"readCopyOrder",             (DL_FUNC) &readCopyOrder,             3},
+    {"getNumQConstrs",            (DL_FUNC) &getNumQConstrs,            2},
     {"addQConstr",                (DL_FUNC) &addQConstr,               12},
     {"delQConstrs",               (DL_FUNC) &delQConstrs,               4},
     {"getQConstr",                (DL_FUNC) &getQConstr,                3},
-- 
GitLab