2

我通过 Julia/JuMP 中的 AMPL 接口使用 SCIP,我想将控制台输出重定向到文件。是否有捷径可寻?使用 Gurobi 和 IPOPT,我可以将所需的文件名作为选项传递。我没有在 SCIP 选项中看到类似的内容。

谢谢,Alex(新 SCIP 用户)

4

2 回答 2

1

如果 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");
于 2016-08-18T17:17:36.017 回答
1

此补丁将添加一个选项“显示/日志文件”来设置日志文件的名称。但是,您不会将日志的开头(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) );
于 2016-08-20T14:58:01.777 回答