我通过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");
此补丁将添加一个选项'display / logfile'来设置日志文件的名称 . 但是,您不会将日志的开头(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) );
2 回答
如果JuMP没有为您提供捕获解算器的标准输出的选项,那么在没有修改源的情况下,目前无法执行此操作 . 如果你可以修改源代码,那么这里有一个简单的补丁,可以将输出输出到文件foo.txt中:
此补丁将添加一个选项'display / logfile'来设置日志文件的名称 . 但是,您不会将日志的开头(SCIP版本和外部代码)放到该文件中 . 如果需要,只需相应地重新排序cmain.c .