Valgrind сообщает об ошибке в функции R cpp в пакете HistDAWass - PullRequest
1 голос
/ 17 февраля 2020

Я проверил свой пакет (HistDAWass 1.0.3) в Windows + RStudio, и все было в порядке. Я получил сообщение от CRAN с этим сообщением:

 > ### Name: WH_adaptive.kmeans
 > ### Title: K-means of a dataset of histogram-valued data using adaptive
 > ###   Wasserstein distances
 > ### Aliases: WH_adaptive.kmeans
 >
 > ### ** Examples
 >
 > results=WH_adaptive.kmeans(x = BLOOD,k = 2, rep = 10,simplify =
TRUE,qua = 10,
standardize = TRUE)
==27368== Conditional jump or move depends on uninitialised value(s)
==27368==    at 0x4D6B2E: bcEval (svn/R-devel/src/main/eval.c:6517)
==27368==    by 0x4E8777: Rf_eval (svn/R-devel/src/main/eval.c:688)
==27368==    by 0x4EA336: R_execClosure (svn/R-devel/src/main/eval.c:1853)
==27368==    by 0x4EB113: Rf_applyClosure (svn/R-devel/src/main/eval.c:1779)
==27368==    by 0x4E8943: Rf_eval (svn/R-devel/src/main/eval.c:811)
==27368==    by 0x4ED2E1: do_set (svn/R-devel/src/main/eval.c:2920)
==27368==    by 0x4E8BC4: Rf_eval (svn/R-devel/src/main/eval.c:763)
==27368==    by 0x518FAC: Rf_ReplIteration (svn/R-devel/src/main/main.c:264)
==27368==    by 0x518FAC: Rf_ReplIteration (svn/R-devel/src/main/main.c:200)
==27368==    by 0x5192E7: R_ReplConsole (svn/R-devel/src/main/main.c:314)
==27368==    by 0x519374: run_Rmainloop (svn/R-devel/src/main/main.c:1113)
==27368==    by 0x417717: main (svn/R-devel/src/main/Rmain.c:29)
==27368==  Uninitialised value was created by a stack allocation
==27368==    at 0x19529170: c_STEP_3_AFFECT_ADA_KMEANS(Rcpp::Matrix<14,
Rcpp::PreserveStorage>, Rcpp::Vector<19, Rcpp::PreserveStorage>,
Rcpp::Vector<19, Rcpp::PreserveStorage>, int, int, int)
(/tmp/HistDAWass.Rcheck/00_pkg_src/HistDAWass/src/Utility_fun.cpp:1089)  

Я выделил здесь функцию, начиная со строки 1086

// [[Rcpp::export]]
List c_STEP_3_AFFECT_ADA_KMEANS(NumericMatrix lambdas, 
                                List dIpro_m, 
                                List dIpro_v, int ind, int k, int vars){
  NumericMatrix DiToClu(ind,k);
  int indiv,cluster,variable;
  NumericVector IDX(ind);
  double SSQ;

  for (indiv=0;indiv<ind;indiv++){
    for (cluster=0;cluster<k;cluster++){
       for (variable=0;variable<vars;variable++){
        DiToClu(indiv,cluster)=DiToClu(indiv,cluster)+
          (lambdas((variable*2),cluster)*(as<NumericMatrix>(dIpro_m[cluster]))(indiv,variable))+
          (lambdas((variable*2+1),cluster)*(as<NumericMatrix>(dIpro_v[cluster]))(indiv,variable));
      }
    }
    IDX[indiv]=which_min(DiToClu(indiv,_))+1;
    SSQ=SSQ+(min(DiToClu(indiv,_)));    
  }
  List resu = List::create(Named("DiToClu") = DiToClu , _["IDX"] = IDX,_["SSQ"]=SSQ);
  return resu;
}

Я разработал свой пакет с помощью Windows + Rstudio, я не очень хорошо знаком с такими инструментами, как valgrind. Так как я не могу go un Linux machine, как я могу решить эту проблему?

1 Ответ

3 голосов
/ 17 февраля 2020

SSQ не инициализируется, но вы делаете SSQ = SSQ + ..., который может принимать любое случайное значение в зависимости от того, что было в памяти раньше. Вы должны инициализировать SSQ

double SSQ = 0;
...