diff --git a/java/jscip/Scip.java b/java/jscip/Scip.java index 0a39a0a..cd0710b 100644 --- a/java/jscip/Scip.java +++ b/java/jscip/Scip.java @@ -1497,6 +1497,36 @@ public double getSolVal(Solution sol, Variable var) return SCIPJNI.SCIPgetSolVal(_scipptr, sol.getPtr(), var.getPtr()); } + /** wraps SCIPgetSolVals(); use as a more efficient way of reading of many variable values than getSolVal() */ + public double[] getSolVals(Solution sol, Variable[] vars) + { + int nvars = vars.length; + if (nvars == 0) { + return new double[0]; + } + + SWIGTYPE_p_p_SCIP_VAR varsptr = SCIPJNI.new_SCIP_VAR_array(nvars); + SWIGTYPE_p_double valsptr = SCIPJNI.new_double_array(nvars); + + try { + for (int i = 0; i < nvars; ++i) { + SCIPJNI.SCIP_VAR_array_setitem(varsptr, i, vars[i].getPtr()); + } + + CHECK_RETCODE(SCIPJNI.SCIPgetSolVals(_scipptr, sol.getPtr(), nvars, varsptr, valsptr)); + + double[] vals = new double[nvars]; + for (int i = 0; i < nvars; ++i) { + vals[i] = SCIPJNI.double_array_getitem(valsptr, i); + } + + return vals; + } finally { + SCIPJNI.delete_double_array(valsptr); + SCIPJNI.delete_SCIP_VAR_array(varsptr); + } + } + /** wraps SCIPgetSolOrigObj() */ public double getSolOrigObj(Solution sol) { diff --git a/src/scipjni.i b/src/scipjni.i index 4977496..b72f75e 100644 --- a/src/scipjni.i +++ b/src/scipjni.i @@ -738,6 +738,7 @@ SCIP_SOL** SCIPgetSols(SCIP* scip); int SCIPgetNSols(SCIP* scip); SCIP_SOL* SCIPgetBestSol(SCIP* scip); SCIP_Real SCIPgetSolVal(SCIP* scip, SCIP_SOL* sol, SCIP_VAR* var); +SCIP_RETCODE SCIPgetSolVals(SCIP* scip, SCIP_SOL* sol, int nvars, SCIP_VAR** vars, SCIP_Real* vals); SCIP_Real SCIPgetSolOrigObj(SCIP* scip, SCIP_SOL* sol); SCIP_Real SCIPinfinity(SCIP* scip); SCIP_Real SCIPepsilon(SCIP* scip);