2017-09-07 6 views
0

下のコードでは、XGBoosterPredictを呼び出すとtrain_out_pbが上書きされます。 問題はおそらく非常に些細ですが、私はそれを見ることはできません。 1.st呼び出し後XGBoosterPredict第2の呼び出しは前に上書きされます

デバッガ出力:

  • & train_out_pb 0x06d0eb2c {0x0074d060 {0.410961390}} CONSTフロート*
  • & val_out_pb 0x06d0eb28 {0xFFFFFFFFの{???}} C​​ONSTフロート*
  • 第二コールの後

デバッガ出力:

  • & train_out_pb 0x06d0eb2c {0x0074d060 {0.522293866}} CONSTフロート*
  • & val_out_pb 0x06d0eb28 {0x0074d060 {0.522293866}} CONSTフロート*

コード:XGBoostのc_apiから

bst_ulong train_pred_len; 
const float* train_out_pb = new float[train_num_samples]; //() 
//1.st call 
ret = XGBoosterPredict(h_booster, XY_train, 0, 0, &train_pred_len, &train_out_pb); 

bst_ulong val_pred_len; 
const float* val_out_pb = new float[val_num_samples]; 
//2.nd call 
ret = XGBoosterPredict(h_booster, XY_val, 0, 0, &val_pred_len, &val_out_pb); 

抜粋。 cc:

XGB_DLL int XGBoosterPredict(BoosterHandle handle, 
        DMatrixHandle dmat, 
        int option_mask, 
        unsigned ntree_limit, 
        xgboost::bst_ulong *len, 
        const bst_float **out_result) 
{ 
std::vector<bst_float>& preds = XGBAPIThreadLocalStore::Get()->ret_vec_float; 
API_BEGIN(); 
Booster *bst = static_cast<Booster*>(handle); 
bst->LazyInit(); 

bst->learner()->Predict(
    static_cast<std::shared_ptr<DMatrix>*>(dmat)->get(), 
    (option_mask & 1) != 0, 
    &preds, ntree_limit, 
    (option_mask & 2) != 0); 
*out_result = dmlc::BeginPtr(preds); 
*len = static_cast<xgboost::bst_ulong>(preds.size()); 
API_END(); 
} 

答えて

0

完全ではありませんが、解決策としては、上書きされたvariabl e他の変数

 const float* train_out_pb; 

     ret = XGBoosterPredict(h_booster, XY_train, 0, 0, &train_pred_len, &train_out_pb); 

     std::vector<float> train_out_pb_v(train_out_pb, train_out_pb + train_pred_len); 
関連する問題