2014-02-14 86 views
5

當運行以下優化任務(R v.3.0.2)DEoptim堆棧不平衡問題

library(DEoptim) 

x <- seq(-6,6,length=100); y <- tanh(x) 
goal <- function(par) return(1-abs(cor(x*par,y,method='spearman'))) 

ctrl <- DEoptim::DEoptim.control(VTR=0, trace=FALSE) 

res <- DEoptim::DEoptim(goal,lower=-1,upper=1, ctrl)     

我得到堆棧不平衡警告

Warning: stack imbalance in '<-', 14 then 13 
Warning: stack imbalance in 'withVisible', 7 then 6 

unprotect()錯誤。如果VTR設置爲0(即不可能獲得的值),那麼問題就會消失,但是由於性能問題,我寧願不這樣做。

即使出現錯誤,結果也會返回,但我擔心它可能不穩定/不正確。任何想法如何解決這個問題?

回答

6

這是C代碼中的問題,而不是您可以修復的問題。但這是我可以解決的問題,它在R-Forge上修訂爲116版。這裏的補丁:

Index: DEoptim/src/de4_0.c 
=================================================================== 
--- DEoptim/src/de4_0.c (revision 115) 
+++ DEoptim/src/de4_0.c (working copy) 
@@ -423,7 +423,6 @@ 

    /*------Trial mutation now in t_tmpP-----------------*/ 
    /* evaluate mutated population */ 
- if(i_iter > 1) UNPROTECT(1); // previous iteration's sexp_t_tmpC 
    PROTECT(sexp_map_pop = popEvaluate(l_nfeval, sexp_t_tmpP, fnMap, rho, 0)); 
    memmove(REAL(sexp_t_tmpP), REAL(sexp_map_pop), i_NP * i_D * sizeof(double)); 
    UNPROTECT(1); // sexp_map_pop 
@@ -458,6 +457,7 @@ 

     } 
    } /* End mutation loop through ensemble */ 
+ UNPROTECT(1); // sexp_t_tmpC 

    if (d_c > 0) { /* calculate new meanCR and meanF */ 
     meanCR = (1-d_c)*meanCR + d_c*goodCR; 
@@ -555,7 +555,7 @@ 
    *gt_bestC = t_bestC; 

    PutRNGstate(); 
- UNPROTECT(P+1); // +1 is for last iteration's sexp_t_tmpC 
+ UNPROTECT(P); 

} 
+0

感謝修復和清除了這一點。 – dratewka

0

我使用的版本118,我有一個類似的問題:

Warning: stack imbalance in '.Call', 13 then 12 
Warning: stack imbalance in '<-', 11 then 10 

這時候我倒變量的跡象發生的目標函數返回時,從return(-var)return(var) 。解決這個問題的方法只是在之前更改代碼中的符號。

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 - [評分](/審查/低質職位/ 10440963) – Trilarion

+1

@Trilarion「圍繞它的方式是前才更改代碼的跡象。」不是答案嗎? –

+0

@JiriTousek這是問題的答案嗎? – Trilarion