update solver wrappers

This commit is contained in:
Laurent Perron
2023-11-17 14:16:17 +01:00
parent d5b3107434
commit 803e3d95a0
8 changed files with 314 additions and 130 deletions

View File

@@ -12,6 +12,7 @@
# limitations under the License.
load("@rules_cc//cc:defs.bzl", "cc_proto_library")
load("@rules_python//python:proto.bzl", "py_proto_library")
package(
default_visibility = ["//visibility:public"],
@@ -27,6 +28,11 @@ cc_proto_library(
deps = [":gscip_proto"],
)
py_proto_library(
name = "gscip_proto_py_pb2",
deps = [":gscip_proto"],
)
# NOTE(user): this file should ideally not have a compile time dependency on
# SCIP, so it can be used in client code.
cc_library(

View File

@@ -1001,6 +1001,7 @@ absl::StatusOr<GScipResult> GScip::Solve(
stats->set_total_lp_iterations(SCIPgetNLPIterations(scip_));
stats->set_primal_simplex_iterations(SCIPgetNPrimalLPIterations(scip_));
stats->set_dual_simplex_iterations(SCIPgetNDualLPIterations(scip_));
stats->set_barrier_iterations(SCIPgetNBarrierLPIterations(scip_));
stats->set_deterministic_time(SCIPgetDeterministicTime(scip_));
}
result.gscip_output.set_status(ConvertStatus(SCIPgetStatus(scip_)));

View File

@@ -131,10 +131,16 @@ message GScipSolvingStats {
// Returns +inf for maximization and -inf for minimization if no bound was
// found. Equivalent to SCIPgetDualBound().
double best_bound = 2;
// nprimallpiterations in SCIP. The number of primal simplex LP iterations.
int64 primal_simplex_iterations = 3;
// nduallpiterations in SCIP. The number of dual simplex LP iterations.
int64 dual_simplex_iterations = 4;
// nlp_iterations in SCIP. The total number of LP steps taken, i.e. primal
// simplex iterations + dual simplex iterations + barrier iterations.
// nbarrierlpiterations. The number of barrier LP iterations.
int64 barrier_iterations = 10;
// nlp_iterations in SCIP. The total number of LP steps taken. Note that this
// number be at least (and often strictly greater than)
// primal_simplex_iterations + dual simplex iterations + barrier iterations,
// as it includes other types of iterations (e.g. see ndivinglpiterations).
int64 total_lp_iterations = 5;
// NTotalNodes in SCIP.
// This is the total number of nodes used in the solve, potentially across

View File

@@ -34,3 +34,14 @@ cc_library(
"@com_google_absl//absl/types:optional",
],
)
cc_library(
name = "gurobi_util",
srcs = ["gurobi_util.cc"],
hdrs = ["gurobi_util.h"],
deps = [
":environment",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:str_format",
],
)

View File

@@ -198,6 +198,18 @@ std::function<int(GRBenv* env, const char* paramname, double* valueP)>
GRBgetdblparam = nullptr;
std::function<int(GRBenv* env, const char* paramname, char* valueP)>
GRBgetstrparam = nullptr;
std::function<int(GRBenv* env, const char* paramname, int* valueP, int* minP,
int* maxP, int* defP)>
GRBgetintparaminfo = nullptr;
std::function<int(GRBenv* env, const char* paramname, double* valueP,
double* minP, double* maxP, double* defP)>
GRBgetdblparaminfo = nullptr;
std::function<int(GRBenv* env, const char* paramname, char* valueP, char* defP)>
GRBgetstrparaminfo = nullptr;
std::function<int(GRBenv* env, const char* paramname)> GRBgetparamtype =
nullptr;
std::function<int(GRBenv* env, int i, char** paramnameP)> GRBgetparamname =
nullptr;
std::function<int(GRBenv* env, const char* paramname, const char* value)>
GRBsetparam = nullptr;
std::function<int(GRBenv* env, const char* paramname, int value)>
@@ -208,6 +220,8 @@ std::function<int(GRBenv* env, const char* paramname, const char* value)>
GRBsetstrparam = nullptr;
std::function<int(GRBenv* env)> GRBresetparams = nullptr;
std::function<int(GRBenv* dest, GRBenv* src)> GRBcopyparams = nullptr;
std::function<int(GRBenv* env)> GRBgetnumparams = nullptr;
std::function<int(GRBenv** envP)> GRBemptyenv = nullptr;
std::function<int(GRBenv** envP, const char* logfilename)> GRBloadenv = nullptr;
std::function<GRBenv*(GRBmodel* model)> GRBgetenv = nullptr;
std::function<void(GRBenv* env)> GRBfreeenv = nullptr;
@@ -309,6 +323,16 @@ void LoadGurobiFunctions(DynamicLibrary* gurobi_dynamic_library) {
gurobi_dynamic_library->GetFunction(&GRBresetparams, "GRBresetparams");
gurobi_dynamic_library->GetFunction(&GRBcopyparams, "GRBcopyparams");
gurobi_dynamic_library->GetFunction(&GRBloadenv, "GRBloadenv");
gurobi_dynamic_library->GetFunction(&GRBemptyenv, "GRBemptyenv");
gurobi_dynamic_library->GetFunction(&GRBgetnumparams, "GRBgetnumparams");
gurobi_dynamic_library->GetFunction(&GRBgetparamname, "GRBgetparamname");
gurobi_dynamic_library->GetFunction(&GRBgetparamtype, "GRBgetparamtype");
gurobi_dynamic_library->GetFunction(&GRBgetintparaminfo,
"GRBgetintparaminfo");
gurobi_dynamic_library->GetFunction(&GRBgetdblparaminfo,
"GRBgetdblparaminfo");
gurobi_dynamic_library->GetFunction(&GRBgetstrparaminfo,
"GRBgetstrparaminfo");
gurobi_dynamic_library->GetFunction(&GRBgetenv, "GRBgetenv");
gurobi_dynamic_library->GetFunction(&GRBfreeenv, "GRBfreeenv");
gurobi_dynamic_library->GetFunction(&GRBgeterrormsg, "GRBgeterrormsg");

View File

@@ -147,106 +147,106 @@ extern std::function<int(void *cbdata, int where, int what, void *resultP)> GRBc
extern std::function<int(void *cbdata, const double *solution, double *objvalP)> GRBcbsolution;
extern std::function<int(void *cbdata, int cutlen, const int *cutind, const double *cutval,char cutsense, double cutrhs)> GRBcbcut;
extern std::function<int(void *cbdata, int lazylen, const int *lazyind,const double *lazyval, char lazysense, double lazyrhs)> GRBcblazy;
#define GRB_INT_ATTR_NUMCONSTRS "NumConstrs"
#define GRB_INT_ATTR_NUMVARS "NumVars"
#define GRB_INT_ATTR_NUMSOS "NumSOS"
#define GRB_INT_ATTR_NUMQCONSTRS "NumQConstrs"
#define GRB_INT_ATTR_NUMGENCONSTRS "NumGenConstrs"
#define GRB_INT_ATTR_NUMNZS "NumNZs"
#define GRB_DBL_ATTR_DNUMNZS "DNumNZs"
#define GRB_INT_ATTR_NUMQNZS "NumQNZs"
#define GRB_INT_ATTR_NUMQCNZS "NumQCNZs"
#define GRB_INT_ATTR_NUMINTVARS "NumIntVars"
#define GRB_INT_ATTR_NUMBINVARS "NumBinVars"
#define GRB_INT_ATTR_NUMPWLOBJVARS "NumPWLObjVars"
#define GRB_STR_ATTR_MODELNAME "ModelName"
#define GRB_INT_ATTR_MODELSENSE "ModelSense"
#define GRB_DBL_ATTR_OBJCON "ObjCon"
#define GRB_INT_ATTR_IS_MIP "IsMIP"
#define GRB_INT_ATTR_IS_QP "IsQP"
#define GRB_INT_ATTR_IS_QCP "IsQCP"
#define GRB_INT_ATTR_IS_MULTIOBJ "IsMultiObj"
#define GRB_INT_ATTR_LICENSE_EXPIRATION "LicenseExpiration"
#define GRB_INT_ATTR_NUMTAGGED "NumTagged"
#define GRB_INT_ATTR_FINGERPRINT "Fingerprint"
#define GRB_INT_ATTR_NUMCONSTRS "NumConstrs"
#define GRB_INT_ATTR_NUMVARS "NumVars"
#define GRB_INT_ATTR_NUMSOS "NumSOS"
#define GRB_INT_ATTR_NUMQCONSTRS "NumQConstrs"
#define GRB_INT_ATTR_NUMGENCONSTRS "NumGenConstrs"
#define GRB_INT_ATTR_NUMNZS "NumNZs"
#define GRB_DBL_ATTR_DNUMNZS "DNumNZs"
#define GRB_INT_ATTR_NUMQNZS "NumQNZs"
#define GRB_INT_ATTR_NUMQCNZS "NumQCNZs"
#define GRB_INT_ATTR_NUMINTVARS "NumIntVars"
#define GRB_INT_ATTR_NUMBINVARS "NumBinVars"
#define GRB_INT_ATTR_NUMPWLOBJVARS "NumPWLObjVars"
#define GRB_STR_ATTR_MODELNAME "ModelName"
#define GRB_INT_ATTR_MODELSENSE "ModelSense"
#define GRB_DBL_ATTR_OBJCON "ObjCon"
#define GRB_INT_ATTR_IS_MIP "IsMIP"
#define GRB_INT_ATTR_IS_QP "IsQP"
#define GRB_INT_ATTR_IS_QCP "IsQCP"
#define GRB_INT_ATTR_IS_MULTIOBJ "IsMultiObj"
#define GRB_INT_ATTR_LICENSE_EXPIRATION "LicenseExpiration"
#define GRB_INT_ATTR_NUMTAGGED "NumTagged"
#define GRB_INT_ATTR_FINGERPRINT "Fingerprint"
#define GRB_INT_ATTR_BATCHERRORCODE "BatchErrorCode"
#define GRB_STR_ATTR_BATCHERRORMESSAGE "BatchErrorMessage"
#define GRB_STR_ATTR_BATCHID "BatchID"
#define GRB_INT_ATTR_BATCHSTATUS "BatchStatus"
#define GRB_DBL_ATTR_LB "LB"
#define GRB_DBL_ATTR_UB "UB"
#define GRB_DBL_ATTR_OBJ "Obj"
#define GRB_CHAR_ATTR_VTYPE "VType"
#define GRB_DBL_ATTR_START "Start"
#define GRB_DBL_ATTR_PSTART "PStart"
#define GRB_INT_ATTR_BRANCHPRIORITY "BranchPriority"
#define GRB_STR_ATTR_VARNAME "VarName"
#define GRB_INT_ATTR_PWLOBJCVX "PWLObjCvx"
#define GRB_DBL_ATTR_VARHINTVAL "VarHintVal"
#define GRB_INT_ATTR_VARHINTPRI "VarHintPri"
#define GRB_INT_ATTR_PARTITION "Partition"
#define GRB_INT_ATTR_POOLIGNORE "PoolIgnore"
#define GRB_STR_ATTR_VTAG "VTag"
#define GRB_STR_ATTR_CTAG "CTag"
#define GRB_DBL_ATTR_RHS "RHS"
#define GRB_DBL_ATTR_DSTART "DStart"
#define GRB_CHAR_ATTR_SENSE "Sense"
#define GRB_STR_ATTR_CONSTRNAME "ConstrName"
#define GRB_INT_ATTR_LAZY "Lazy"
#define GRB_STR_ATTR_QCTAG "QCTag"
#define GRB_DBL_ATTR_QCRHS "QCRHS"
#define GRB_CHAR_ATTR_QCSENSE "QCSense"
#define GRB_STR_ATTR_QCNAME "QCName"
#define GRB_INT_ATTR_GENCONSTRTYPE "GenConstrType"
#define GRB_STR_ATTR_GENCONSTRNAME "GenConstrName"
#define GRB_INT_ATTR_FUNCPIECES "FuncPieces"
#define GRB_DBL_ATTR_FUNCPIECEERROR "FuncPieceError"
#define GRB_DBL_ATTR_FUNCPIECELENGTH "FuncPieceLength"
#define GRB_DBL_ATTR_FUNCPIECERATIO "FuncPieceRatio"
#define GRB_DBL_ATTR_MAX_COEFF "MaxCoeff"
#define GRB_DBL_ATTR_MIN_COEFF "MinCoeff"
#define GRB_DBL_ATTR_MAX_BOUND "MaxBound"
#define GRB_DBL_ATTR_MIN_BOUND "MinBound"
#define GRB_DBL_ATTR_MAX_OBJ_COEFF "MaxObjCoeff"
#define GRB_DBL_ATTR_MIN_OBJ_COEFF "MinObjCoeff"
#define GRB_DBL_ATTR_MAX_RHS "MaxRHS"
#define GRB_DBL_ATTR_MIN_RHS "MinRHS"
#define GRB_DBL_ATTR_MAX_QCCOEFF "MaxQCCoeff"
#define GRB_DBL_ATTR_MIN_QCCOEFF "MinQCCoeff"
#define GRB_DBL_ATTR_MAX_QOBJ_COEFF "MaxQObjCoeff"
#define GRB_DBL_ATTR_MIN_QOBJ_COEFF "MinQObjCoeff"
#define GRB_DBL_ATTR_MAX_QCLCOEFF "MaxQCLCoeff"
#define GRB_DBL_ATTR_MIN_QCLCOEFF "MinQCLCoeff"
#define GRB_DBL_ATTR_MAX_QCRHS "MaxQCRHS"
#define GRB_DBL_ATTR_MIN_QCRHS "MinQCRHS"
#define GRB_DBL_ATTR_RUNTIME "Runtime"
#define GRB_DBL_ATTR_WORK "Work"
#define GRB_INT_ATTR_STATUS "Status"
#define GRB_DBL_ATTR_OBJVAL "ObjVal"
#define GRB_DBL_ATTR_OBJBOUND "ObjBound"
#define GRB_DBL_ATTR_OBJBOUNDC "ObjBoundC"
#define GRB_DBL_ATTR_POOLOBJBOUND "PoolObjBound"
#define GRB_DBL_ATTR_POOLOBJVAL "PoolObjVal"
#define GRB_DBL_ATTR_MIPGAP "MIPGap"
#define GRB_INT_ATTR_SOLCOUNT "SolCount"
#define GRB_DBL_ATTR_ITERCOUNT "IterCount"
#define GRB_INT_ATTR_BARITERCOUNT "BarIterCount"
#define GRB_DBL_ATTR_NODECOUNT "NodeCount"
#define GRB_DBL_ATTR_OPENNODECOUNT "OpenNodeCount"
#define GRB_INT_ATTR_HASDUALNORM "HasDualNorm"
#define GRB_INT_ATTR_CONCURRENTWINMETHOD "ConcurrentWinMethod"
#define GRB_DBL_ATTR_X "X"
#define GRB_DBL_ATTR_XN "Xn"
#define GRB_DBL_ATTR_BARX "BarX"
#define GRB_DBL_ATTR_RC "RC"
#define GRB_DBL_ATTR_VDUALNORM "VDualNorm"
#define GRB_INT_ATTR_VBASIS "VBasis"
#define GRB_DBL_ATTR_PI "Pi"
#define GRB_DBL_ATTR_QCPI "QCPi"
#define GRB_DBL_ATTR_SLACK "Slack"
#define GRB_DBL_ATTR_QCSLACK "QCSlack"
#define GRB_DBL_ATTR_CDUALNORM "CDualNorm"
#define GRB_INT_ATTR_CBASIS "CBasis"
#define GRB_DBL_ATTR_LB "LB"
#define GRB_DBL_ATTR_UB "UB"
#define GRB_DBL_ATTR_OBJ "Obj"
#define GRB_CHAR_ATTR_VTYPE "VType"
#define GRB_DBL_ATTR_START "Start"
#define GRB_DBL_ATTR_PSTART "PStart"
#define GRB_INT_ATTR_BRANCHPRIORITY "BranchPriority"
#define GRB_STR_ATTR_VARNAME "VarName"
#define GRB_INT_ATTR_PWLOBJCVX "PWLObjCvx"
#define GRB_DBL_ATTR_VARHINTVAL "VarHintVal"
#define GRB_INT_ATTR_VARHINTPRI "VarHintPri"
#define GRB_INT_ATTR_PARTITION "Partition"
#define GRB_INT_ATTR_POOLIGNORE "PoolIgnore"
#define GRB_STR_ATTR_VTAG "VTag"
#define GRB_STR_ATTR_CTAG "CTag"
#define GRB_DBL_ATTR_RHS "RHS"
#define GRB_DBL_ATTR_DSTART "DStart"
#define GRB_CHAR_ATTR_SENSE "Sense"
#define GRB_STR_ATTR_CONSTRNAME "ConstrName"
#define GRB_INT_ATTR_LAZY "Lazy"
#define GRB_STR_ATTR_QCTAG "QCTag"
#define GRB_DBL_ATTR_QCRHS "QCRHS"
#define GRB_CHAR_ATTR_QCSENSE "QCSense"
#define GRB_STR_ATTR_QCNAME "QCName"
#define GRB_INT_ATTR_GENCONSTRTYPE "GenConstrType"
#define GRB_STR_ATTR_GENCONSTRNAME "GenConstrName"
#define GRB_INT_ATTR_FUNCPIECES "FuncPieces"
#define GRB_DBL_ATTR_FUNCPIECEERROR "FuncPieceError"
#define GRB_DBL_ATTR_FUNCPIECELENGTH "FuncPieceLength"
#define GRB_DBL_ATTR_FUNCPIECERATIO "FuncPieceRatio"
#define GRB_DBL_ATTR_MAX_COEFF "MaxCoeff"
#define GRB_DBL_ATTR_MIN_COEFF "MinCoeff"
#define GRB_DBL_ATTR_MAX_BOUND "MaxBound"
#define GRB_DBL_ATTR_MIN_BOUND "MinBound"
#define GRB_DBL_ATTR_MAX_OBJ_COEFF "MaxObjCoeff"
#define GRB_DBL_ATTR_MIN_OBJ_COEFF "MinObjCoeff"
#define GRB_DBL_ATTR_MAX_RHS "MaxRHS"
#define GRB_DBL_ATTR_MIN_RHS "MinRHS"
#define GRB_DBL_ATTR_MAX_QCCOEFF "MaxQCCoeff"
#define GRB_DBL_ATTR_MIN_QCCOEFF "MinQCCoeff"
#define GRB_DBL_ATTR_MAX_QOBJ_COEFF "MaxQObjCoeff"
#define GRB_DBL_ATTR_MIN_QOBJ_COEFF "MinQObjCoeff"
#define GRB_DBL_ATTR_MAX_QCLCOEFF "MaxQCLCoeff"
#define GRB_DBL_ATTR_MIN_QCLCOEFF "MinQCLCoeff"
#define GRB_DBL_ATTR_MAX_QCRHS "MaxQCRHS"
#define GRB_DBL_ATTR_MIN_QCRHS "MinQCRHS"
#define GRB_DBL_ATTR_RUNTIME "Runtime"
#define GRB_DBL_ATTR_WORK "Work"
#define GRB_INT_ATTR_STATUS "Status"
#define GRB_DBL_ATTR_OBJVAL "ObjVal"
#define GRB_DBL_ATTR_OBJBOUND "ObjBound"
#define GRB_DBL_ATTR_OBJBOUNDC "ObjBoundC"
#define GRB_DBL_ATTR_POOLOBJBOUND "PoolObjBound"
#define GRB_DBL_ATTR_POOLOBJVAL "PoolObjVal"
#define GRB_DBL_ATTR_MIPGAP "MIPGap"
#define GRB_INT_ATTR_SOLCOUNT "SolCount"
#define GRB_DBL_ATTR_ITERCOUNT "IterCount"
#define GRB_INT_ATTR_BARITERCOUNT "BarIterCount"
#define GRB_DBL_ATTR_NODECOUNT "NodeCount"
#define GRB_DBL_ATTR_OPENNODECOUNT "OpenNodeCount"
#define GRB_INT_ATTR_HASDUALNORM "HasDualNorm"
#define GRB_INT_ATTR_CONCURRENTWINMETHOD "ConcurrentWinMethod"
#define GRB_DBL_ATTR_X "X"
#define GRB_DBL_ATTR_XN "Xn"
#define GRB_DBL_ATTR_BARX "BarX"
#define GRB_DBL_ATTR_RC "RC"
#define GRB_DBL_ATTR_VDUALNORM "VDualNorm"
#define GRB_INT_ATTR_VBASIS "VBasis"
#define GRB_DBL_ATTR_PI "Pi"
#define GRB_DBL_ATTR_QCPI "QCPi"
#define GRB_DBL_ATTR_SLACK "Slack"
#define GRB_DBL_ATTR_QCSLACK "QCSlack"
#define GRB_DBL_ATTR_CDUALNORM "CDualNorm"
#define GRB_INT_ATTR_CBASIS "CBasis"
#define GRB_DBL_ATTR_MAX_VIO "MaxVio"
#define GRB_DBL_ATTR_BOUND_VIO "BoundVio"
#define GRB_DBL_ATTR_BOUND_SVIO "BoundSVio"
@@ -295,19 +295,19 @@ extern std::function<int(void *cbdata, int lazylen, const int *lazyind,const dou
#define GRB_DBL_ATTR_SA_UBUP "SAUBUp"
#define GRB_DBL_ATTR_SA_RHSLOW "SARHSLow"
#define GRB_DBL_ATTR_SA_RHSUP "SARHSUp"
#define GRB_INT_ATTR_IIS_MINIMAL "IISMinimal"
#define GRB_INT_ATTR_IIS_LB "IISLB"
#define GRB_INT_ATTR_IIS_UB "IISUB"
#define GRB_INT_ATTR_IIS_CONSTR "IISConstr"
#define GRB_INT_ATTR_IIS_SOS "IISSOS"
#define GRB_INT_ATTR_IIS_QCONSTR "IISQConstr"
#define GRB_INT_ATTR_IIS_GENCONSTR "IISGenConstr"
#define GRB_INT_ATTR_IIS_LBFORCE "IISLBForce"
#define GRB_INT_ATTR_IIS_UBFORCE "IISUBForce"
#define GRB_INT_ATTR_IIS_CONSTRFORCE "IISConstrForce"
#define GRB_INT_ATTR_IIS_SOSFORCE "IISSOSForce"
#define GRB_INT_ATTR_IIS_QCONSTRFORCE "IISQConstrForce"
#define GRB_INT_ATTR_IIS_GENCONSTRFORCE "IISGenConstrForce"
#define GRB_INT_ATTR_IIS_MINIMAL "IISMinimal"
#define GRB_INT_ATTR_IIS_LB "IISLB"
#define GRB_INT_ATTR_IIS_UB "IISUB"
#define GRB_INT_ATTR_IIS_CONSTR "IISConstr"
#define GRB_INT_ATTR_IIS_SOS "IISSOS"
#define GRB_INT_ATTR_IIS_QCONSTR "IISQConstr"
#define GRB_INT_ATTR_IIS_GENCONSTR "IISGenConstr"
#define GRB_INT_ATTR_IIS_LBFORCE "IISLBForce"
#define GRB_INT_ATTR_IIS_UBFORCE "IISUBForce"
#define GRB_INT_ATTR_IIS_CONSTRFORCE "IISConstrForce"
#define GRB_INT_ATTR_IIS_SOSFORCE "IISSOSForce"
#define GRB_INT_ATTR_IIS_QCONSTRFORCE "IISQConstrForce"
#define GRB_INT_ATTR_IIS_GENCONSTRFORCE "IISGenConstrForce"
#define GRB_INT_ATTR_TUNE_RESULTCOUNT "TuneResultCount"
#define GRB_DBL_ATTR_FARKASDUAL "FarkasDual"
#define GRB_DBL_ATTR_FARKASPROOF "FarkasProof"
@@ -316,25 +316,25 @@ extern std::function<int(void *cbdata, int lazylen, const int *lazyind,const dou
#define GRB_INT_ATTR_UNBDVAR "UnbdVar"
#define GRB_INT_ATTR_VARPRESTAT "VarPreStat"
#define GRB_DBL_ATTR_PREFIXVAL "PreFixVal"
#define GRB_DBL_ATTR_OBJN "ObjN"
#define GRB_DBL_ATTR_OBJNVAL "ObjNVal"
#define GRB_DBL_ATTR_OBJNCON "ObjNCon"
#define GRB_DBL_ATTR_OBJNWEIGHT "ObjNWeight"
#define GRB_INT_ATTR_OBJNPRIORITY "ObjNPriority"
#define GRB_DBL_ATTR_OBJNRELTOL "ObjNRelTol"
#define GRB_DBL_ATTR_OBJNABSTOL "ObjNAbsTol"
#define GRB_STR_ATTR_OBJNNAME "ObjNName"
#define GRB_DBL_ATTR_SCENNLB "ScenNLB"
#define GRB_DBL_ATTR_SCENNUB "ScenNUB"
#define GRB_DBL_ATTR_SCENNOBJ "ScenNObj"
#define GRB_DBL_ATTR_SCENNRHS "ScenNRHS"
#define GRB_STR_ATTR_SCENNNAME "ScenNName"
#define GRB_DBL_ATTR_SCENNX "ScenNX"
#define GRB_DBL_ATTR_SCENNOBJBOUND "ScenNObjBound"
#define GRB_DBL_ATTR_SCENNOBJVAL "ScenNObjVal"
#define GRB_INT_ATTR_NUMOBJ "NumObj"
#define GRB_INT_ATTR_NUMSCENARIOS "NumScenarios"
#define GRB_INT_ATTR_NUMSTART "NumStart"
#define GRB_DBL_ATTR_OBJN "ObjN"
#define GRB_DBL_ATTR_OBJNVAL "ObjNVal"
#define GRB_DBL_ATTR_OBJNCON "ObjNCon"
#define GRB_DBL_ATTR_OBJNWEIGHT "ObjNWeight"
#define GRB_INT_ATTR_OBJNPRIORITY "ObjNPriority"
#define GRB_DBL_ATTR_OBJNRELTOL "ObjNRelTol"
#define GRB_DBL_ATTR_OBJNABSTOL "ObjNAbsTol"
#define GRB_STR_ATTR_OBJNNAME "ObjNName"
#define GRB_DBL_ATTR_SCENNLB "ScenNLB"
#define GRB_DBL_ATTR_SCENNUB "ScenNUB"
#define GRB_DBL_ATTR_SCENNOBJ "ScenNObj"
#define GRB_DBL_ATTR_SCENNRHS "ScenNRHS"
#define GRB_STR_ATTR_SCENNNAME "ScenNName"
#define GRB_DBL_ATTR_SCENNX "ScenNX"
#define GRB_DBL_ATTR_SCENNOBJBOUND "ScenNObjBound"
#define GRB_DBL_ATTR_SCENNOBJVAL "ScenNObjVal"
#define GRB_INT_ATTR_NUMOBJ "NumObj"
#define GRB_INT_ATTR_NUMSCENARIOS "NumScenarios"
#define GRB_INT_ATTR_NUMSTART "NumStart"
#define GRB_GENCONSTR_MAX 0
#define GRB_GENCONSTR_MIN 1
#define GRB_GENCONSTR_ABS 2
@@ -714,6 +714,13 @@ extern std::function<int(GRBenv *env, const char *paramname, const char *value)>
extern std::function<int(GRBenv *env)> GRBresetparams;
extern std::function<int(GRBenv *dest, GRBenv *src)> GRBcopyparams;
extern std::function<int(GRBenv **envP, const char *logfilename)> GRBloadenv;
extern std::function<int(GRBenv **envP)> GRBemptyenv;
extern std::function<int(GRBenv *envP)> GRBgetnumparams;
extern std::function<int(GRBenv *envP, int i, char **paramnameP)> GRBgetparamname;
extern std::function<int(GRBenv *envP, const char *paramname)> GRBgetparamtype;
extern std::function<int(GRBenv *envP, const char *paramname, int *valueP, int *minP, int *maxP, int *defP)> GRBgetintparaminfo;
extern std::function<int(GRBenv *envP, const char *paramname, double *valueP, double *minP, double *maxP, double *defP)> GRBgetdblparaminfo;
extern std::function<int(GRBenv *envP, const char *paramname, char *valueP, char *defP)> GRBgetstrparaminfo;
extern std::function<GRBenv *(GRBmodel *model)> GRBgetenv;
extern std::function<void(GRBenv *env)> GRBfreeenv;
extern std::function<const char *(GRBenv *env)> GRBgeterrormsg;

View File

@@ -0,0 +1,98 @@
// Copyright 2010-2022 Google LLC
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "ortools/gurobi/gurobi_util.h"
#include <cstring>
#include <string>
#include <vector>
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/str_join.h"
#include "ortools/gurobi/environment.h"
namespace operations_research {
std::string GurobiParamInfoForLogging(GRBenv* grb, bool one_liner_output) {
const absl::ParsedFormat<'s', 's', 's'> kExtendedFormat(
" Parameter: '%s' value: %s default: %s");
const absl::ParsedFormat<'s', 's', 's'> kOneLinerFormat("'%s':%s (%s)");
const absl::ParsedFormat<'s', 's', 's'>& format =
one_liner_output ? kOneLinerFormat : kExtendedFormat;
std::vector<std::string> changed_parameters;
const int num_parameters = GRBgetnumparams(grb);
for (int i = 0; i < num_parameters; ++i) {
char* param_name = nullptr;
GRBgetparamname(grb, i, &param_name);
const int param_type = GRBgetparamtype(grb, param_name);
switch (param_type) {
case 1: // integer parameters.
{
int default_value;
int min_value;
int max_value;
int current_value;
GRBgetintparaminfo(grb, param_name, &current_value, &min_value,
&max_value, &default_value);
if (current_value != default_value) {
changed_parameters.push_back(
absl::StrFormat(format, param_name, absl::StrCat(current_value),
absl::StrCat(default_value)));
}
break;
}
case 2: // double parameters.
{
double default_value;
double min_value;
double max_value;
double current_value;
GRBgetdblparaminfo(grb, param_name, &current_value, &min_value,
&max_value, &default_value);
if (current_value != default_value) {
changed_parameters.push_back(
absl::StrFormat(format, param_name, absl::StrCat(current_value),
absl::StrCat(default_value)));
}
break;
}
case 3: // string parameters.
{
char current_value[GRB_MAX_STRLEN + 1];
char default_value[GRB_MAX_STRLEN + 1];
GRBgetstrparaminfo(grb, param_name, current_value, default_value);
// This ensure that strcmp does not go beyond the end of the char
// array.
current_value[GRB_MAX_STRLEN] = '\0';
default_value[GRB_MAX_STRLEN] = '\0';
if (std::strcmp(current_value, default_value) != 0) {
changed_parameters.push_back(absl::StrFormat(
format, param_name, current_value, default_value));
}
break;
}
default: // unknown parameter types
changed_parameters.push_back(absl::StrFormat(
"Parameter '%s' of unknown type %d", param_name, param_type));
}
}
if (changed_parameters.empty()) return "";
if (one_liner_output) {
return absl::StrCat("GurobiParams{",
absl::StrJoin(changed_parameters, ", "), "}");
}
return absl::StrJoin(changed_parameters, "\n");
}
} // namespace operations_research

View File

@@ -0,0 +1,31 @@
// Copyright 2010-2022 Google LLC
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef OR_TOOLS_GUROBI_GUROBI_UTIL_H_
#define OR_TOOLS_GUROBI_GUROBI_UTIL_H_
#include <string>
#include "ortools/gurobi/environment.h"
namespace operations_research {
// Returns a human-readable listing of all gurobi parameters that are set to
// non-default values, and their current value in the given environment. If all
// parameters are at their default value, returns the empty string.
// To produce a one-liner string, use `one_liner_output=true`.
std::string GurobiParamInfoForLogging(GRBenv* grb,
bool one_liner_output = false);
} // namespace operations_research
#endif // OR_TOOLS_GUROBI_GUROBI_UTIL_H_