51 .regularizeCoefficients<
true>( maximumGain, optimalGain, variance, scale, optimizer, disturbance, noise, 4 );
61TEST_CASE(
"Linear-predictor regularization rejects invalid search controls",
"[ao::analysis::clAOLinearPredictor]" )
69 optimizerT optimizer( 1.0, 1.5 );
70 std::vector<double> disturbance;
71 std::vector<double> noise;
72 makeFixture( optimizer, disturbance, noise );
74 GIVEN(
"a fresh predictor" )
78 WHEN(
"the initial precision is below the minimum" )
80 predictor.m_precision0 = 0.5 * predictor.m_minPrecision;
84 WHEN(
"the initial precision equals the minimum" )
86 predictor.m_precision0 = predictor.m_minPrecision;
90 WHEN(
"the initial precision is zero, negative, NaN, or infinite" )
92 const std::vector<double> invalidValues{ 0,
94 std::numeric_limits<double>::quiet_NaN(),
95 std::numeric_limits<double>::infinity() };
96 for(
const double value : invalidValues )
98 predictorT invalidPredictor;
99 invalidPredictor.m_precision0 = value;
101 REQUIRE( invalidPredictor.m_regularizationReport.status ==
102 predictorT::regularizationStatus::invalidControls );
103 REQUIRE( invalidPredictor.m_regularizationReport.evaluations == 0 );
104 REQUIRE( invalidPredictor.m_regResults.empty() );
108 WHEN(
"the initial precision is wider than the initial interval" )
110 predictor.m_precision0 = predictor.m_max_sc0 - predictor.m_min_sc0 + 1;
114 WHEN(
"the scale interval, refinement divisor, or iteration limit is invalid" )
116 predictorT reversedInterval;
117 reversedInterval.m_max_sc0 = reversedInterval.m_min_sc0;
120 predictorT invalidDivisor;
121 invalidDivisor.m_dPrecision = 1;
124 predictorT invalidIterations;
125 invalidIterations.m_maxIts = 0;
129 WHEN(
"another floating-point search control is nonfinite or nonpositive" )
131 predictorT nonfiniteMinimumScale;
132 nonfiniteMinimumScale.m_min_sc0 = std::numeric_limits<double>::quiet_NaN();
135 predictorT nonfiniteMaximumScale;
136 nonfiniteMaximumScale.m_max_sc0 = std::numeric_limits<double>::infinity();
139 predictorT zeroMinimumPrecision;
140 zeroMinimumPrecision.m_minPrecision = 0;
143 predictorT nonfiniteRefinementDivisor;
144 nonfiniteRefinementDivisor.m_dPrecision = std::numeric_limits<double>::infinity();
145 REQUIRE( runSearch( nonfiniteRefinementDivisor, optimizer, disturbance, noise ) ==
156TEST_CASE(
"Linear-predictor regularization reports search termination",
"[ao::analysis::clAOLinearPredictor]" )
164 optimizerT optimizer( 1.0, 1.5 );
165 std::vector<double> disturbance;
166 std::vector<double> noise;
167 makeFixture( optimizer, disturbance, noise );
169 GIVEN(
"a precision immediately above the minimum and one allowed iteration" )
171 predictorT predictor;
172 predictor.m_min_sc0 = 10;
173 predictor.m_max_sc0 = 10.0025;
174 predictor.m_precision0 = std::nextafter( predictor.m_minPrecision, std::numeric_limits<double>::infinity() );
175 predictor.m_maxIts = 1;
177 const mx::error_t result = runSearch( predictor, optimizer, disturbance, noise );
180 REQUIRE( predictor.m_regularizationReport.status != predictorT::regularizationStatus::invalidControls );
181 REQUIRE( predictor.m_regularizationReport.iterations == 1 );
182 REQUIRE( predictor.m_regularizationReport.evaluations > 0 );
183 REQUIRE_FALSE( predictor.m_regResults.empty() );
186 GIVEN(
"a valid search forced to exhaust its iteration limit" )
188 predictorT predictor;
189 predictor.m_min_sc0 = 10;
190 predictor.m_max_sc0 = 12;
191 predictor.m_precision0 = 1;
192 predictor.m_minPrecision = 1e-9;
193 predictor.m_maxIts = 1;
196 REQUIRE( predictor.m_regularizationReport.status == predictorT::regularizationStatus::iterationLimit );
197 REQUIRE( predictor.m_regularizationReport.iterations == 1 );
198 REQUIRE( predictor.m_regularizationReport.evaluations > 0 );
201 GIVEN(
"a valid search whose initial precision equals the interval width" )
203 predictorT predictor;
204 predictor.m_min_sc0 = 10;
205 predictor.m_max_sc0 = 12;
206 predictor.m_precision0 = 2;
207 predictor.m_minPrecision = 0.1;
210 REQUIRE( ( predictor.m_regularizationReport.status == predictorT::regularizationStatus::converged ||
211 predictor.m_regularizationReport.status == predictorT::regularizationStatus::boundaryLimited ) );
212 REQUIRE( predictor.m_regularizationReport.iterations > 0 );
213 REQUIRE( predictor.m_regularizationReport.evaluations > 0 );
mx::error_t regularizeCoefficients(realT &gmax_lp, realT &gopt_lp, realT &var_lp, realT &min_sc, clGainOpt< realT > &go_lp, std::vector< realT > &PSDt, std::vector< realT > &PSDn, int Nc)
Regularize the PSD and calculate the associated LP coefficients.