void warm_start(const AzTreeEnsemble *inp_ens, const AzDataForTrTree *data, AzParam ¶m, const AzBytArr *s_temp_prefix, const AzOut &out, int max_t_num, int search_t_num, AzDvect *v_p, /* inout */ const AzIntArr *inp_ia_tr_dx=NULL) { const char *eyec = "AzTrTreeEnsemble::warmup"; if (max_t_num < inp_ens->size()) { throw new AzException(eyec, "maximum #tree is less than the #tree we already have"); } reset(); a_tree.alloc(&t, max_t_num, "AzTrTreeEnsemble::warmup"); t_num = inp_ens->size(); const_val = inp_ens->constant(); org_dim = inp_ens->orgdim(); if (org_dim > 0 && org_dim != data->featNum()) { throw new AzException(AzInputError, eyec, "feature dimensionality mismatch"); } const AzIntArr *ia_tr_dx = inp_ia_tr_dx; AzIntArr ia_temp; if (ia_tr_dx == NULL) { ia_temp.range(0, data->dataNum()); ia_tr_dx = &ia_temp; } v_p->reform(data->dataNum()); v_p->add(const_val, ia_tr_dx); T dummy_tree(param); if (dummy_tree.usingInternalNodes()) { throw new AzException(AzInputError, eyec, "warm start is not allowed with use of internal nodes"); } dummy_tree.printParam(out); temp_files.reset(&dummy_tree, data->dataNum(), s_temp_prefix); s_param.reset(param.c_str()); dt_param = s_param.c_str(); AzParam p(dt_param, false); int tx; for (tx = 0; tx < t_num; ++tx) { t[tx] = new T(p); t[tx]->forStoringDataIndexes(temp_files.point_file()); if (search_t_num > 0 && tx < t_num-search_t_num) { t[tx]->quick_warmup(inp_ens->tree(tx), data, v_p, ia_tr_dx); } else { t[tx]->warmup(inp_ens->tree(tx), data, v_p, ia_tr_dx); } } }
inline void cold_start( AzParam ¶m, const AzBytArr *s_temp_prefix, /* may be NULL */ int data_num, /* to estimate the data size for temp */ const AzOut &out, int tree_num_max, int inp_org_dim) { reset(); T dummy_tree(param); dummy_tree.printParam(out); s_param.reset(param.c_str()); dt_param = s_param.c_str(); alloc(tree_num_max, "AzTrTreeEnsemble::reset"); //@ allocate forest space org_dim = inp_org_dim; temp_files.reset(&dummy_tree, data_num, s_temp_prefix); //@ estimate the data size for temp and do something? }