向所有现有文件添加行

问题描述 投票:0回答:1

我目前正在研究一个优化问题,我想通过使用回调函数将每次 IPOPT 迭代的一些信息添加到文件中。我能够收集我需要的信息,但是当我尝试将它添加到文件时,它只会添加一些奇怪的迭代。这就是我正在做的(简化)

我有一个外部迭代循环 (k) 和一个内部(IPOPT 迭代)

thefile = "output.txt".      # Create a new file 
f = open(thefile, "w").      # The header to my new file 
@printf(f,"%-10s %-10s %-10s\n ", "outer", "inner", "objval" )

k = 0
while k <= 100 
      iter = []
      objValVector = []

      function my_callback( alg_mod::Cint,
        iter_count::Cint,
        obj_value::Float64,
        inf_pr::Float64,
        inf_du::Float64,
        mu::Float64,
        d_norm::Float64,
        regularization_size::Float64,
        alpha_du::Float64,
        alpha_pr::Float64,
        ls_trials::Cint)                # Using the call back function to get the obj.val
         append!(objValvector, obj_value)
         append!(iter, iter_count)
         return true
      end 
 MOI.set(model, Ipopt.CallbackFunction(), my_callback)
 optimize!(model); 

 f = open(thefile, "a");         # Open the file in append "mode" to add to the existing file
 for i in 1:length(iter)
     @printf(f, "%-10s %-10s %-10s\n", 
            k, iter[i], objValvector[i])
 end

Do something...
k += 1; 


end

我真的不明白为什么这不起作用? 该文件如下所示:

optimization julia writetofile ipopt
1个回答
0
投票

你打开同一个文件两次(这不应该发生)。 而且您没有

flush
缓冲区。 因此,您会看到对磁盘产生的影响和对磁盘产生的影响的混合。

close(f)
在第四行和代码末尾。或者只打开一次。根据您的其他代码和场景,您可能也想要
flush(f)

© www.soinside.com 2019 - 2024. All rights reserved.