Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions java/jscip/Scip.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
1 change: 1 addition & 0 deletions src/scipjni.i
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down