virtual 
 T *new_tree(int *out_tx=NULL) {
   if (t_num >= a_tree.size()) {
     throw new AzException("AzTrTreeEnsemble::new_tree", "no more empty slot"); 
   }
   int tx = t_num; 
   if (t[tx] != NULL) {
     throw new AzException("AzTrTreeEnsemble::new_tree", "something is wrong"); 
   }
   AzParam p(dt_param, false); 
   t[tx] = new T(p); 
   t[tx]->forStoringDataIndexes(temp_files.point_file()); 
   ++t_num; 
   if (out_tx != NULL) {
     *out_tx = tx; 
   }
   return t[tx]; 
 }
 inline bool isFull() const {
   if (t_num >= a_tree.size()) {
     return true; 
   }
   return false; 
 }
 inline int max_size() const { return a_tree.size(); }