@@ -629,6 +629,50 @@ void CBoostedTreeTest::testIntegerRegressor() {
629
629
CPPUNIT_ASSERT (modelRSquared > 0.99 );
630
630
}
631
631
632
+ void CBoostedTreeTest::testSingleSplit () {
633
+
634
+ // We were getting an out-of-bound read in initialization when running on
635
+ // data with only two distinct values for the target variable. This test
636
+ // fails intermittently without the fix.
637
+
638
+ test::CRandomNumbers rng;
639
+
640
+ std::size_t rows{100 };
641
+ std::size_t cols{2 };
642
+
643
+ TDoubleVec x;
644
+ rng.generateUniformSamples (0.0 , 1.0 , rows, x);
645
+ for (auto & xi : x) {
646
+ xi = std::floor (xi + 0.5 );
647
+ }
648
+
649
+ auto frame = core::makeMainStorageDataFrame (cols).first ;
650
+ frame->categoricalColumns ({false , false });
651
+ for (std::size_t i = 0 ; i < rows; ++i) {
652
+ frame->writeRow ([&](core::CDataFrame::TFloatVecItr column, std::int32_t &) {
653
+ *(column++) = x[i];
654
+ *column = 10.0 * x[i];
655
+ });
656
+ }
657
+ frame->finishWritingRows ();
658
+
659
+ auto regression = maths::CBoostedTreeFactory::constructFromParameters (
660
+ 1 , std::make_unique<maths::boosted_tree::CMse>())
661
+ .buildFor (*frame, cols - 1 );
662
+
663
+ regression->train ();
664
+
665
+ double modelBias;
666
+ double modelRSquared;
667
+ std::tie (modelBias, modelRSquared) = computeEvaluationMetrics (
668
+ *frame, 0 , rows, regression->columnHoldingPrediction (frame->numberColumns ()),
669
+ [](const TRowRef& row) { return 10.0 * row[0 ]; }, 0.0 );
670
+
671
+ LOG_DEBUG (<< " bias = " << modelBias);
672
+ LOG_DEBUG (<< " R^2 = " << modelRSquared);
673
+ CPPUNIT_ASSERT (modelRSquared > 0.99 );
674
+ }
675
+
632
676
void CBoostedTreeTest::testTranslationInvariance () {
633
677
634
678
// We should get similar performance independent of fixed shifts for the target.
@@ -1070,6 +1114,8 @@ CppUnit::Test* CBoostedTreeTest::suite() {
1070
1114
&CBoostedTreeTest::testCategoricalRegressors));
1071
1115
suiteOfTests->addTest (new CppUnit::TestCaller<CBoostedTreeTest>(
1072
1116
" CBoostedTreeTest::testIntegerRegressor" , &CBoostedTreeTest::testIntegerRegressor));
1117
+ suiteOfTests->addTest (new CppUnit::TestCaller<CBoostedTreeTest>(
1118
+ " CBoostedTreeTest::testSingleSplit" , &CBoostedTreeTest::testSingleSplit));
1073
1119
suiteOfTests->addTest (new CppUnit::TestCaller<CBoostedTreeTest>(
1074
1120
" CBoostedTreeTest::testTranslationInvariance" ,
1075
1121
&CBoostedTreeTest::testTranslationInvariance));
0 commit comments