@@ -50,6 +50,7 @@ class APLRRegressor
5050 void throw_error_if_validation_set_indexes_has_invalid_indexes (const VectorXd &y, const std::vector<size_t > &validation_set_indexes);
5151 void define_training_and_validation_sets (const MatrixXd &X,const VectorXd &y,const VectorXd &sample_weight, const std::vector<size_t > &validation_set_indexes);
5252 void initialize (const MatrixXd &X);
53+ bool check_if_base_term_has_only_one_unique_value (const MatrixXd &X, size_t base_term);
5354 void add_term_to_terms_eligible_current (Term &term);
5455 VectorXd calculate_neg_gradient_current (const VectorXd &y,const VectorXd &predictions_current);
5556 void execute_boosting_steps ();
@@ -283,10 +284,14 @@ void APLRRegressor::initialize(const MatrixXd &X)
283284 null_predictions=VectorXd::Constant (y_train.size (),0 );
284285
285286 terms_eligible_current.reserve (X.cols ()*reserved_terms_times_num_x);
286- for (size_t i = 0 ; i < static_cast <size_t >(X.cols ()); ++i) // add each base term
287+ for (size_t i = 0 ; i < static_cast <size_t >(X.cols ()); ++i)
287288 {
288- Term copy_of_base_term{Term (i)};
289- add_term_to_terms_eligible_current (copy_of_base_term);
289+ bool term_has_one_unique_value{check_if_base_term_has_only_one_unique_value (X, i)};
290+ if (!term_has_one_unique_value)
291+ {
292+ Term copy_of_base_term{Term (i)};
293+ add_term_to_terms_eligible_current (copy_of_base_term);
294+ }
290295 }
291296
292297 predictions_current=VectorXd::Constant (y_train.size (),0 );
@@ -299,6 +304,25 @@ void APLRRegressor::initialize(const MatrixXd &X)
299304 neg_gradient_nullmodel_errors_sum=neg_gradient_nullmodel_errors.sum ();
300305}
301306
307+ bool APLRRegressor::check_if_base_term_has_only_one_unique_value (const MatrixXd &X, size_t base_term)
308+ {
309+ size_t rows{static_cast <size_t >(X.rows ())};
310+ if (rows==1 ) return true ;
311+
312+ bool term_has_one_unique_value{true };
313+ for (size_t i = 1 ; i < rows; ++i)
314+ {
315+ bool observation_is_equal_to_previous{check_if_approximately_equal (X.col (base_term)[i], X.col (base_term)[i-1 ])};
316+ if (!observation_is_equal_to_previous)
317+ {
318+ term_has_one_unique_value=false ;
319+ break ;
320+ }
321+ }
322+
323+ return term_has_one_unique_value;
324+ }
325+
302326void APLRRegressor::add_term_to_terms_eligible_current (Term &term)
303327{
304328 terms_eligible_current.push_back (term);
0 commit comments