我通过 Julia/JuMP 中的 AMPL 接口使用 SCIP,我想将控制台输出重定向到文件。是否有捷径可寻?使用 Gurobi 和 IPOPT,我可以将所需的文件名作为选项传递。我没有在 SCIP 选项中看到类似的内容。
谢谢,Alex(新 SCIP 用户)
我通过 Julia/JuMP 中的 AMPL 接口使用 SCIP,我想将控制台输出重定向到文件。是否有捷径可寻?使用 Gurobi 和 IPOPT,我可以将所需的文件名作为选项传递。我没有在 SCIP 选项中看到类似的内容。
谢谢,Alex(新 SCIP 用户)
如果 JuMP 没有为您提供捕获求解器的标准输出的选项,那么目前无法在不修改源的情况下执行此操作。如果您可以修改源代码,那么这里有一个简单的补丁,可以将输出附加到文件 foo.txt 中:
--- a/interfaces/ampl/src/cmain.c
+++ b/interfaces/ampl/src/cmain.c
@@ -43,6 +43,8 @@ SCIP_RETCODE run(
/* setup SCIP and print version information */
SCIP_CALL( SCIPcreate(&scip) );
+
+ SCIPsetMessagehdlrLogfile(scip, "foo.txt");
SCIPprintVersion(scip, NULL);
SCIPinfoMessage(scip, NULL, "\n");
此补丁将添加一个选项“显示/日志文件”来设置日志文件的名称。但是,您不会将日志的开头(SCIP 版本和外部代码)放入该文件中。如果您需要这个,只需相应地重新排序 cmain.c。
--- a/interfaces/ampl/src/cmain.c
+++ b/interfaces/ampl/src/cmain.c
@@ -38,6 +38,7 @@ SCIP_RETCODE run(
SCIP* scip;
char buffer[SCIP_MAXSTRLEN];
SCIP_Bool printstat;
+ char* logfile = NULL;
assert(nlfile != NULL);
@@ -57,6 +58,11 @@ SCIP_RETCODE run(
"whether to print statistics on a solve",
NULL, FALSE, FALSE, NULL, NULL) );
+ SCIP_CALL( SCIPaddStringParam(scip, "display/logfile",
+ "file to additionally write log to",
+ &logfile, FALSE, "", NULL, NULL) );
+ assert(logfile != NULL);
+
SCIPprintExternalCodes(scip, NULL);
SCIPinfoMessage(scip, NULL, "\n");
@@ -65,6 +71,8 @@ SCIP_RETCODE run(
{
SCIP_CALL( SCIPreadParams(scip, setfile) );
}
+ if( *logfile )
+ SCIPsetMessagehdlrLogfile(scip, logfile);
SCIP_CALL( SCIPgetBoolParam(scip, "display/statistics", &printstat) );