From 7b9accd4bd59d554f7609c154724f7f62bd0f17d Mon Sep 17 00:00:00 2001
From: Claus Jonathan Fritzemeier <clausjonathan.fritzemeier@hhu.de>
Date: Fri, 22 Jun 2018 13:27:57 +0200
Subject: [PATCH] added new function

---
 DESCRIPTION  |  6 ++--
 NAMESPACE    |  6 ++++
 R/clpAPI.R   | 63 ++++++++++++++++++++++++++++++++++++++++
 inst/NEWS.Rd |  8 +++++
 src/clpAPI.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/clpAPI.h | 18 ++++++++++++
 src/init.c   |  6 ++++
 7 files changed, 186 insertions(+), 3 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
index 4cec144..460ab84 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,8 +1,8 @@
 Package: clpAPI
 Type: Package
 Title: R Interface to C API of COIN-OR Clp
-Version: 1.2.7
-Date: 2016-04-18
+Version: 1.2.8
+Date: 2018-02-28
 Authors@R: c(person(c("C.", "Jonathan"), "Fritzemeier", role = c("cre", "ctb"), email = "clausjonathan.fritzemeier@uni-duesseldorf.de"),
                          person("Gabriel", "Gelius-Dietrich", role = c("aut"), email = "geliudie@uni-duesseldorf.de"))
 Depends: R (>= 2.6.0)
@@ -17,4 +17,4 @@ Author: C. Jonathan Fritzemeier [cre, ctb], Gabriel Gelius-Dietrich [aut]
 Maintainer: C. Jonathan Fritzemeier <clausjonathan.fritzemeier@uni-duesseldorf.de>
 NeedsCompilation: yes
 Repository: CRAN
-Date/Publication: 2016-04-18 09:33:15
+Date/Publication: 2018-02-28 09:33:15
diff --git a/NAMESPACE b/NAMESPACE
index cb546f1..c46671d 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -33,6 +33,9 @@ getColUpperCLP,
 getIndCLP,
 getLogLevelCLP,
 getNnzCLP,
+getMaximumIterationsCLP,
+getMaximumSecondsCLP,
+getHitMaximumIterationsCLP,
 getNumColsCLP,
 getNumNnzCLP,
 getNumRowsCLP,
@@ -62,6 +65,9 @@ return_codeCLP,
 #rowNameCLP,
 saveModelCLP,
 scaleModelCLP,
+setNumberIterationsCLP,
+setMaximumIterationsCLP,
+setMaximumSecondsCLP,
 setLogLevelCLP,
 setObjDirCLP,
 solveInitialBarrierCLP,
diff --git a/R/clpAPI.R b/R/clpAPI.R
index 95644a5..ce15e74 100644
--- a/R/clpAPI.R
+++ b/R/clpAPI.R
@@ -368,10 +368,38 @@ loadMatrixCLP <- function(lp, ncols, nrows, ia, ja, ra) {
     )
 
 }
+#------------------------------------------------------------------------------#
+
+getMaximumIterationsCLP <- function(lp) {
+
+    nnz <- .Call("getMaximumIterations", PACKAGE = "clpAPI",
+                 clpPointer(lp)
+                )
+    return(nnz)
 
+}
+
+#------------------------------------------------------------------------------#
+
+getMaximumSecondsCLP <- function(lp) {
+
+    nnz <- .Call("getMaximumSeconds", PACKAGE = "clpAPI",
+                 clpPointer(lp)
+                )
+    return(nnz)
 
+}
 #------------------------------------------------------------------------------#
 
+getHitMaximumIterationsCLP <- function(lp) {
+
+    nnz <- .Call("getHitMaximumIterations", PACKAGE = "clpAPI",
+                 clpPointer(lp)
+                )
+    return(nnz)
+
+}
+#------------------------------------------------------------------------------#
 getNumNnzCLP <- function(lp) {
 
     nnz <- .Call("getNumNnz", PACKAGE = "clpAPI",
@@ -442,10 +470,45 @@ printModelCLP <- function(lp, prefix = "CLPmodel") {
     )
 
 }
+#------------------------------------------------------------------------------#
+
+setNumberIterationsCLP <- function(lp, iterations) {
+
+    invisible(
+        .Call("setNumberIterations", PACKAGE = "clpAPI",
+              clpPointer(lp),
+              as.integer(iterations)
+        )
+    )
+
+}
+
+#------------------------------------------------------------------------------#
+
+setMaximumIterationsCLP <- function(lp, iterations) {
+
+    invisible(
+        .Call("setMaximumIterations", PACKAGE = "clpAPI",
+              clpPointer(lp),
+              as.integer(iterations)
+        )
+    )
 
+}
 
 #------------------------------------------------------------------------------#
 
+setMaximumSecondsCLP <- function(lp, seconds) {
+
+    invisible(
+        .Call("setMaximumSeconds", PACKAGE = "clpAPI",
+              clpPointer(lp),
+              as.numeric(seconds)
+        )
+    )
+
+}
+#------------------------------------------------------------------------------#
 setLogLevelCLP <- function(lp, amount) {
 
     invisible(
diff --git a/inst/NEWS.Rd b/inst/NEWS.Rd
index 206ab03..66a5e0a 100644
--- a/inst/NEWS.Rd
+++ b/inst/NEWS.Rd
@@ -3,6 +3,14 @@
 \name{NEWS}
 \title{clpAPI News}
 \encoding{UTF-8}
+% ---------------------------------------------------------------------------- %
+\section{Changes in version 1.2.8 2018-02-28}{
+  \itemize{
+    \item Added the functions \code{setNumberIterationsCLP}, \code{setMaximumIterationsCLP}, 
+    \code{setMaximumSecondsCLP}, \code{getMaximumIterationsCLP}, 
+    \code{getMaximumSecondsCLP}, and \code{getHitMaximumIterationsCLP}.
+  }
+}
 
 % ---------------------------------------------------------------------------- %
 \section{Changes in version 1.2.7 2016-04-18}{
diff --git a/src/clpAPI.c b/src/clpAPI.c
index 8b590e8..8974756 100644
--- a/src/clpAPI.c
+++ b/src/clpAPI.c
@@ -230,7 +230,53 @@ SEXP addCols(SEXP lp, SEXP ncols,
 
     return out;
 }
+/* -------------------------------------------------------------------------- */
+/* get maximum number of iterations */
+SEXP getMaximumIterations(SEXP lp) {
+
+    SEXP out = R_NilValue;
+    int iterations = 0;
+
+    checkProb(lp);
+
+    iterations = maximumIterations(R_ExternalPtrAddr(lp));
+
+    out = Rf_ScalarInteger(iterations);
+
+    return out;
+}
+
+/* -------------------------------------------------------------------------- */
+/* get maximum number of seconds */
+SEXP getMaximumSeconds(SEXP lp) {
+
+    SEXP out = R_NilValue;
+    double seconds = 0;
+
+    checkProb(lp);
+
+    seconds = Clp_maximumSeconds(R_ExternalPtrAddr(lp));
+
+    out = Rf_ScalarReal(seconds);
+
+    return out;
+}
+
+/* -------------------------------------------------------------------------- */
+/* get if maxium iteration bound was hit*/
+SEXP getHitMaximumIterations(SEXP lp) {
+
+    SEXP out = R_NilValue;
+    int iterations = 0;
+
+    checkProb(lp);
+
+    iterations = Clp_hitMaximumIterations(R_ExternalPtrAddr(lp));
+
+    out = Rf_ScalarInteger(iterations);
 
+    return out;
+}
 
 /* -------------------------------------------------------------------------- */
 /* get number of rows */
@@ -676,6 +722,42 @@ SEXP printModel(SEXP lp, SEXP prefix) {
     return out;
 }
 
+/* -------------------------------------------------------------------------- */
+/* set number of iterations */
+SEXP setNumberIterations(SEXP lp, SEXP iterations) {
+
+    SEXP out = R_NilValue;
+
+    checkProb(lp);
+
+    Clp_setNumberIterations(R_ExternalPtrAddr(lp), Rf_asInteger(iterations));
+
+    return out;
+}
+/* -------------------------------------------------------------------------- */
+/* set maximal number of iterations */
+SEXP setMaximumIterations(SEXP lp, SEXP iterations) {
+
+    SEXP out = R_NilValue;
+
+    checkProb(lp);
+
+    Clp_setMaximumIterations(R_ExternalPtrAddr(lp), Rf_asInteger(iterations));
+
+    return out;
+}
+/* -------------------------------------------------------------------------- */
+/* set maximal duration in seconds */
+SEXP setMaximumSeconds(SEXP lp, SEXP seconds) {
+
+    SEXP out = R_NilValue;
+
+    checkProb(lp);
+
+    Clp_setMaximumSeconds(R_ExternalPtrAddr(lp), Rf_asReal(seconds));
+
+    return out;
+}
 
 /* -------------------------------------------------------------------------- */
 /* amount of print out */
diff --git a/src/clpAPI.h b/src/clpAPI.h
index 043c1cb..51e6116 100644
--- a/src/clpAPI.h
+++ b/src/clpAPI.h
@@ -67,6 +67,15 @@ SEXP addRows(SEXP lp, SEXP nrows,
 SEXP addCols(SEXP lp, SEXP ncols,
              SEXP lb, SEXP ub, SEXP obj, SEXP colst, SEXP rows, SEXP val);
 
+/* get maximum number of iterations */
+SEXP getMaximumIterations(SEXP lp);
+
+/* get maximum number of seconds */
+SEXP getMaximumSeconds(SEXP lp);
+
+/* get if maxium iteration bound was hit*/
+SEXP getHitMaximumIterations(SEXP lp);
+
 /* get number of rows */
 SEXP getNumRows(SEXP lp);
 
@@ -129,6 +138,15 @@ SEXP getNnz(SEXP lp);
 /* print model */
 SEXP printModel(SEXP lp, SEXP prefix);
 
+/* set number of iterations */
+SEXP setNumberIterations(SEXP lp, SEXP iterations);
+
+/* set maximal number of iterations */
+SEXP setMaximumIterations(SEXP lp, SEXP iterations);
+
+/* set maximal duration in seconds */
+SEXP setMaximumSeconds(SEXP lp, SEXP seconds);
+
 /* amount of print out */
 SEXP setLogLevel(SEXP lp, SEXP amount);
 
diff --git a/src/init.c b/src/init.c
index 8304575..ca231a2 100644
--- a/src/init.c
+++ b/src/init.c
@@ -90,6 +90,12 @@ static const R_CallMethodDef callMethods[] = {
     {"rowName",                    (DL_FUNC) &rowName,                    3},
     {"colName",                    (DL_FUNC) &colName,                    3},
     {"probName",                   (DL_FUNC) &probName,                   3},
+    {"setNumberIterations",        (DL_FUNC) &setNumberIterations,        2},
+    {"setMaximumIterations",       (DL_FUNC) &setMaximumIterations,       2},
+    {"setMaximumSeconds",          (DL_FUNC) &setMaximumSeconds,          2},
+    {"getMaximumIterations",       (DL_FUNC) &getMaximumIterations,       1},
+    {"getMaximumSeconds",          (DL_FUNC) &getMaximumSeconds,          1},
+    {"getHitMaximumIterations",    (DL_FUNC) &getHitMaximumIterations,    1},
     {NULL, NULL, 0}
 };
 
-- 
GitLab