From 8f069796091195961f59fed7263911e5915f6344 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Fri, 19 Dec 2025 11:05:03 -0800 Subject: [PATCH 1/8] Make interpolation code nan-safe by inverting min checks. --- src/Interp.cc | 964 +++++++++++++++++++++++++------------------------- 1 file changed, 482 insertions(+), 482 deletions(-) diff --git a/src/Interp.cc b/src/Interp.cc index b568559f5..04f5d20e7 100644 --- a/src/Interp.cc +++ b/src/Interp.cc @@ -292,286 +292,286 @@ static void do_defects(std::vector const &badList, // list of bad switch (defectType) { case 02: /* .#?, = 0 */ val = 1.0000 * out2_1; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 06: /* .##, = 0 */ val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 014: /* ..##, = 0 */ val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 04: /* ..#?, = 0 */ val = 1.000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 030: /* ...##, = 0 */ val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 010: /* ...#?, = 0 */ val = 1.000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX1 - 1] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 060: /* ....##, = 0 */ val = 0.5370 * out2_1 + 0.4630 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX0 + 1] = (val < min) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 020: /* ....#?, = 0 */ val = 1.0000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX0 + 1] = (val < min) ? out2_1 : val; - out[badX1 - 1] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 0140: /* .....##, = 0 */ val = 0.5041 * out2_1 + 0.4959 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 0.5370 * out2_1 + 0.4630 * out2_2; - out[badX0 + 1] = (val < min) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX1 - 2] = (val < min) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 040: /* .....#?, = 0 */ val = 1.0000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX0 + 1] = (val < min) ? out2_1 : val; - out[badX1 - 2] = (val < min) ? out2_1 : val; - out[badX1 - 1] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 0300: /* ......##, = 0 */ val = 0.5003 * out2_1 + 0.4997 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 0.5041 * out2_1 + 0.4959 * out2_2; - out[badX0 + 1] = (val < min) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; val = 0.5370 * out2_1 + 0.4630 * out2_2; - out[badX0 + 2] = (val < min) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX1 - 2] = (val < min) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 0100: /* ......#?, = 0 */ val = 1.0000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX0 + 1] = (val < min) ? out2_1 : val; - out[badX0 + 2] = (val < min) ? out2_1 : val; - out[badX1 - 2] = (val < min) ? out2_1 : val; - out[badX1 - 1] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 0600: /* .......##, = 0 */ val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 0.5003 * out2_1 + 0.4997 * out2_2; - out[badX0 + 1] = (val < min) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; val = 0.5041 * out2_1 + 0.4959 * out2_2; - out[badX0 + 2] = (val < min) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; val = 0.5370 * out2_1 + 0.4630 * out2_2; - out[badX1 - 3] = (val < min) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX1 - 2] = (val < min) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 0200: /* .......#?, = 0 */ val = 1.0000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX0 + 1] = (val < min) ? out2_1 : val; - out[badX0 + 2] = (val < min) ? out2_1 : val; - out[badX1 - 3] = (val < min) ? out2_1 : val; - out[badX1 - 2] = (val < min) ? out2_1 : val; - out[badX1 - 1] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 01400: /* ........##, = 0 */ val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0 + 1] = (val < min) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; val = 0.5003 * out2_1 + 0.4997 * out2_2; - out[badX0 + 2] = (val < min) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; val = 0.5041 * out2_1 + 0.4959 * out2_2; - out[badX0 + 3] = (val < min) ? out2_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out2_1 : val; val = 0.5370 * out2_1 + 0.4630 * out2_2; - out[badX1 - 3] = (val < min) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX1 - 2] = (val < min) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 0400: /* ........#?, = 0 */ val = 1.0000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX0 + 1] = (val < min) ? out2_1 : val; - out[badX0 + 2] = (val < min) ? out2_1 : val; - out[badX0 + 3] = (val < min) ? out2_1 : val; - out[badX1 - 3] = (val < min) ? out2_1 : val; - out[badX1 - 2] = (val < min) ? out2_1 : val; - out[badX1 - 1] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 03000: /* .........##, = 0 */ val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0 + 1] = (val < min) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0 + 2] = (val < min) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; val = 0.5003 * out2_1 + 0.4997 * out2_2; - out[badX0 + 3] = (val < min) ? out2_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out2_1 : val; val = 0.5041 * out2_1 + 0.4959 * out2_2; - out[badX1 - 4] = (val < min) ? out2_1 : val; + out[badX1 - 4] = (!(val >= min)) ? out2_1 : val; val = 0.5370 * out2_1 + 0.4630 * out2_2; - out[badX1 - 3] = (val < min) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX1 - 2] = (val < min) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 01000: /* .........#?, = 0 */ val = 1.0000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX0 + 1] = (val < min) ? out2_1 : val; - out[badX0 + 2] = (val < min) ? out2_1 : val; - out[badX0 + 3] = (val < min) ? out2_1 : val; - out[badX1 - 4] = (val < min) ? out2_1 : val; - out[badX1 - 3] = (val < min) ? out2_1 : val; - out[badX1 - 2] = (val < min) ? out2_1 : val; - out[badX1 - 1] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 4] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 06000: /* ..........##, = 0 */ val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0 + 1] = (val < min) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0 + 2] = (val < min) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; val = 0.5000 * out2_1 + 0.5000 * out2_2; - out[badX0 + 3] = (val < min) ? out2_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out2_1 : val; val = 0.5003 * out2_1 + 0.4997 * out2_2; - out[badX0 + 4] = (val < min) ? out2_1 : val; + out[badX0 + 4] = (!(val >= min)) ? out2_1 : val; val = 0.5041 * out2_1 + 0.4959 * out2_2; - out[badX1 - 4] = (val < min) ? out2_1 : val; + out[badX1 - 4] = (!(val >= min)) ? out2_1 : val; val = 0.5370 * out2_1 + 0.4630 * out2_2; - out[badX1 - 3] = (val < min) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX1 - 2] = (val < min) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; case 02000: /* ..........#?, = 0 */ val = 1.0000 * out2_1; - out[badX0] = (val < min) ? out2_1 : val; - out[badX0 + 1] = (val < min) ? out2_1 : val; - out[badX0 + 2] = (val < min) ? out2_1 : val; - out[badX0 + 3] = (val < min) ? out2_1 : val; - out[badX0 + 4] = (val < min) ? out2_1 : val; - out[badX1 - 4] = (val < min) ? out2_1 : val; - out[badX1 - 3] = (val < min) ? out2_1 : val; - out[badX1 - 2] = (val < min) ? out2_1 : val; - out[badX1 - 1] = (val < min) ? out2_1 : val; - out[badX1] = (val < min) ? out2_1 : val; + out[badX0] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out2_1 : val; + out[badX0 + 4] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 4] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; default: @@ -599,7 +599,7 @@ static void do_defects(std::vector const &badList, // list of bad switch (defectType) { case 02: /* ?#., = 0 */ val = 1.0000 * out2_1; - val = (val < min) ? out2_1 : val; + val = (!(val >= min)) ? out2_1 : val; for (int j = badX0; j <= badX1; j++) { out[j] = val; @@ -607,7 +607,7 @@ static void do_defects(std::vector const &badList, // list of bad break; case 03: /* ?##, = 0 */ val = 0.5000 * out2_1 + 0.5000 * out2_2; - if (val < min) { + if (!(val >= min)) { val = out2_1; } @@ -616,22 +616,22 @@ static void do_defects(std::vector const &badList, // list of bad } val = 0.5003 * out2_1 + 0.4997 * out2_2; - out[badX1 - 5] = (val < min) ? out2_1 : val; + out[badX1 - 5] = (!(val >= min)) ? out2_1 : val; val = 0.5041 * out2_1 + 0.4959 * out2_2; - out[badX1 - 4] = (val < min) ? out2_1 : val; + out[badX1 - 4] = (!(val >= min)) ? out2_1 : val; val = 0.5370 * out2_1 + 0.4630 * out2_2; - out[badX1 - 3] = (val < min) ? out2_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out2_1 : val; val = 0.6968 * out2_1 + 0.3032 * out2_2; - out[badX1 - 2] = (val < min) ? out2_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out2_1 : val; val = 1.0933 * out2_1 - 0.0933 * out2_2; - out[badX1 - 1] = (val < min) ? out2_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out2_1 : val; val = 1.4288 * out2_1 - 0.4288 * out2_2; - out[badX1] = (val < min) ? out2_1 : val; + out[badX1] = (!(val >= min)) ? out2_1 : val; break; default: @@ -649,187 +649,187 @@ static void do_defects(std::vector const &badList, // list of bad switch (defectType) { case 06: /* ##., = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 014: /* ##.., = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 030: /* ##..., = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX1 - 1] = (val < min) ? out1_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 060: /* ##...., = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX0 + 1] = (val < min) ? out1_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX1 - 1] = (val < min) ? out1_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out1_1 : val; val = 0.4630 * out1_2 + 0.5370 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 0140: /* ##....., = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX0 + 1] = (val < min) ? out1_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX1 - 2] = (val < min) ? out1_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out1_1 : val; val = 0.4630 * out1_2 + 0.5370 * out1_1; - out[badX1 - 1] = (val < min) ? out1_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out1_1 : val; val = 0.4959 * out1_2 + 0.5041 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 0300: /* ##......, = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX0 + 1] = (val < min) ? out1_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX0 + 2] = (val < min) ? out1_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out1_1 : val; val = 0.4630 * out1_2 + 0.5370 * out1_1; - out[badX1 - 2] = (val < min) ? out1_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out1_1 : val; val = 0.4959 * out1_2 + 0.5041 * out1_1; - out[badX1 - 1] = (val < min) ? out1_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out1_1 : val; val = 0.4997 * out1_2 + 0.5003 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 0600: /* ##......., = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX0 + 1] = (val < min) ? out1_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX0 + 2] = (val < min) ? out1_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out1_1 : val; val = 0.4630 * out1_2 + 0.5370 * out1_1; - out[badX1 - 3] = (val < min) ? out1_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out1_1 : val; val = 0.4959 * out1_2 + 0.5041 * out1_1; - out[badX1 - 2] = (val < min) ? out1_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out1_1 : val; val = 0.4997 * out1_2 + 0.5003 * out1_1; - out[badX1 - 1] = (val < min) ? out1_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 01400: /* ##........, = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX0 + 1] = (val < min) ? out1_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX0 + 2] = (val < min) ? out1_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out1_1 : val; val = 0.4630 * out1_2 + 0.5370 * out1_1; - out[badX0 + 3] = (val < min) ? out1_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out1_1 : val; val = 0.4959 * out1_2 + 0.5041 * out1_1; - out[badX1 - 3] = (val < min) ? out1_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out1_1 : val; val = 0.4997 * out1_2 + 0.5003 * out1_1; - out[badX1 - 2] = (val < min) ? out1_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1 - 1] = (val < min) ? out1_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 03000: /* ##........., = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX0 + 1] = (val < min) ? out1_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX0 + 2] = (val < min) ? out1_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out1_1 : val; val = 0.4630 * out1_2 + 0.5370 * out1_1; - out[badX0 + 3] = (val < min) ? out1_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out1_1 : val; val = 0.4959 * out1_2 + 0.5041 * out1_1; - out[badX1 - 4] = (val < min) ? out1_1 : val; + out[badX1 - 4] = (!(val >= min)) ? out1_1 : val; val = 0.4997 * out1_2 + 0.5003 * out1_1; - out[badX1 - 3] = (val < min) ? out1_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1 - 2] = (val < min) ? out1_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1 - 1] = (val < min) ? out1_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; case 06000: /* ##.........., = 0 */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX0 + 1] = (val < min) ? out1_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX0 + 2] = (val < min) ? out1_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out1_1 : val; val = 0.4630 * out1_2 + 0.5370 * out1_1; - out[badX0 + 3] = (val < min) ? out1_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out1_1 : val; val = 0.4959 * out1_2 + 0.5041 * out1_1; - out[badX0 + 4] = (val < min) ? out1_1 : val; + out[badX0 + 4] = (!(val >= min)) ? out1_1 : val; val = 0.4997 * out1_2 + 0.5003 * out1_1; - out[badX1 - 4] = (val < min) ? out1_1 : val; + out[badX1 - 4] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1 - 3] = (val < min) ? out1_1 : val; + out[badX1 - 3] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1 - 2] = (val < min) ? out1_1 : val; + out[badX1 - 2] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1 - 1] = (val < min) ? out1_1 : val; + out[badX1 - 1] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - out[badX1] = (val < min) ? out1_1 : val; + out[badX1] = (!(val >= min)) ? out1_1 : val; break; default: @@ -859,25 +859,25 @@ static void do_defects(std::vector const &badList, // list of bad switch (defectType) { case 03: /* ##?, S/N = infty */ val = -0.4288 * out1_2 + 1.4288 * out1_1; - out[badX0] = (val < min) ? out1_1 : val; + out[badX0] = (!(val >= min)) ? out1_1 : val; val = -0.0933 * out1_2 + 1.0933 * out1_1; - out[badX0 + 1] = (val < min) ? out1_1 : val; + out[badX0 + 1] = (!(val >= min)) ? out1_1 : val; val = 0.3032 * out1_2 + 0.6968 * out1_1; - out[badX0 + 2] = (val < min) ? out1_1 : val; + out[badX0 + 2] = (!(val >= min)) ? out1_1 : val; val = 0.4630 * out1_2 + 0.5370 * out1_1; - out[badX0 + 3] = (val < min) ? out1_1 : val; + out[badX0 + 3] = (!(val >= min)) ? out1_1 : val; val = 0.4959 * out1_2 + 0.5041 * out1_1; - out[badX0 + 4] = (val < min) ? out1_1 : val; + out[badX0 + 4] = (!(val >= min)) ? out1_1 : val; val = 0.4997 * out1_2 + 0.5003 * out1_1; - out[badX0 + 5] = (val < min) ? out1_1 : val; + out[badX0 + 5] = (!(val >= min)) ? out1_1 : val; val = 0.5000 * out1_2 + 0.5000 * out1_1; - val = (val < min) ? out1_1 : val; + val = (!(val >= min)) ? out1_1 : val; for (int j = badX0 + 6; j <= badX1; j++) { out[j] = val; @@ -913,12 +913,12 @@ static void do_defects(std::vector const &badList, // list of bad switch (defectType) { case 012: /* #.#., = 0, sigma = 1 */ val = 0.5000 * out1_1 + 0.5000 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 013: /* #.##, = 0 */ val = 0.4875 * out1_1 + 0.8959 * out2_1 - 0.3834 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 022: /* #..#., = 0, sigma = 1 */ @@ -931,834 +931,834 @@ static void do_defects(std::vector const &badList, // list of bad break; case 023: /* #..##, = 0 */ val = 0.7538 * out1_1 + 0.5680 * out2_1 - 0.3218 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3095 * out1_1 + 1.2132 * out2_1 - 0.5227 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 032: /* ##.#., = 0 */ val = -0.3834 * out1_2 + 0.8959 * out1_1 + 0.4875 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 033: /* ##.##, = 0 */ /* These coefficients are also available as interp::interp_1_c1 and interp::interp_1_c2 */ val = -0.2737 * out1_2 + 0.7737 * out1_1 + 0.7737 * out2_1 - 0.2737 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 042: /* #...#., = 0, sigma = 1 */ val = 0.8430 * out1_1 + 0.1570 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5000 * out1_1 + 0.5000 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1570 * out1_1 + 0.8430 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 043: /* #...##, = 0 */ val = 0.8525 * out1_1 + 0.2390 * out2_1 - 0.0915 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5356 * out1_1 + 0.8057 * out2_1 - 0.3413 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2120 * out1_1 + 1.3150 * out2_1 - 0.5270 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 062: /* ##..#., = 0 */ val = -0.5227 * out1_2 + 1.2132 * out1_1 + 0.3095 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.3218 * out1_2 + 0.5680 * out1_1 + 0.7538 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 063: /* ##..##, = 0 */ val = -0.4793 * out1_2 + 1.1904 * out1_1 + 0.5212 * out2_1 - 0.2323 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2323 * out1_2 + 0.5212 * out1_1 + 1.1904 * out2_1 - 0.4793 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0102: /* #....#., = 0, sigma = 1 */ val = 0.8810 * out1_1 + 0.1190 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6315 * out1_1 + 0.3685 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3685 * out1_1 + 0.6315 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1190 * out1_1 + 0.8810 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0103: /* #....##, = 0 */ val = 0.8779 * out1_1 + 0.0945 * out2_1 + 0.0276 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6327 * out1_1 + 0.3779 * out2_1 - 0.0106 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4006 * out1_1 + 0.8914 * out2_1 - 0.2920 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1757 * out1_1 + 1.3403 * out2_1 - 0.5160 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0142: /* ##...#., = 0 */ val = -0.5270 * out1_2 + 1.3150 * out1_1 + 0.2120 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.3413 * out1_2 + 0.8057 * out1_1 + 0.5356 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.0915 * out1_2 + 0.2390 * out1_1 + 0.8525 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0143: /* ##...##, = 0 */ val = -0.5230 * out1_2 + 1.3163 * out1_1 + 0.2536 * out2_1 - 0.0469 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.3144 * out1_2 + 0.8144 * out1_1 + 0.8144 * out2_1 - 0.3144 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.0469 * out1_2 + 0.2536 * out1_1 + 1.3163 * out2_1 - 0.5230 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0202: /* #.....#., = 0, sigma = 1 */ val = 0.8885 * out1_1 + 0.1115 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6748 * out1_1 + 0.3252 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5000 * out1_1 + 0.5000 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3252 * out1_1 + 0.6748 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1115 * out1_1 + 0.8885 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0203: /* #.....##, = 0 */ val = 0.8824 * out1_1 + 0.0626 * out2_1 + 0.0549 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6601 * out1_1 + 0.2068 * out2_1 + 0.1331 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4938 * out1_1 + 0.4498 * out2_1 + 0.0564 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3551 * out1_1 + 0.9157 * out2_1 - 0.2708 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1682 * out1_1 + 1.3447 * out2_1 - 0.5129 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0302: /* ##....#., = 0 */ val = -0.5160 * out1_2 + 1.3403 * out1_1 + 0.1757 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2920 * out1_2 + 0.8914 * out1_1 + 0.4006 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.0106 * out1_2 + 0.3779 * out1_1 + 0.6327 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0276 * out1_2 + 0.0945 * out1_1 + 0.8779 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0303: /* ##....##, = 0 */ val = -0.5197 * out1_2 + 1.3370 * out1_1 + 0.1231 * out2_1 + 0.0596 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2924 * out1_2 + 0.8910 * out1_1 + 0.3940 * out2_1 + 0.0074 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0074 * out1_2 + 0.3940 * out1_1 + 0.8910 * out2_1 - 0.2924 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0596 * out1_2 + 0.1231 * out1_1 + 1.3370 * out2_1 - 0.5197 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0402: /* #......#., = 0, sigma = 1 */ val = 0.8893 * out1_1 + 0.1107 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6830 * out1_1 + 0.3170 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5435 * out1_1 + 0.4565 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4565 * out1_1 + 0.5435 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3170 * out1_1 + 0.6830 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1107 * out1_1 + 0.8893 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0403: /* #......##, = 0 */ val = 0.8829 * out1_1 + 0.0588 * out2_1 + 0.0583 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6649 * out1_1 + 0.1716 * out2_1 + 0.1635 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5212 * out1_1 + 0.2765 * out2_1 + 0.2024 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4477 * out1_1 + 0.4730 * out2_1 + 0.0793 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3465 * out1_1 + 0.9201 * out2_1 - 0.2666 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_1 + 1.3452 * out2_1 - 0.5125 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0602: /* ##.....#., = 0 */ val = -0.5129 * out1_2 + 1.3447 * out1_1 + 0.1682 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2708 * out1_2 + 0.9157 * out1_1 + 0.3551 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0564 * out1_2 + 0.4498 * out1_1 + 0.4938 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1331 * out1_2 + 0.2068 * out1_1 + 0.6601 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0549 * out1_2 + 0.0626 * out1_1 + 0.8824 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 0603: /* ##.....##, = 0 */ val = -0.5179 * out1_2 + 1.3397 * out1_1 + 0.0928 * out2_1 + 0.0854 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2796 * out1_2 + 0.9069 * out1_1 + 0.2231 * out2_1 + 0.1495 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0533 * out1_2 + 0.4467 * out1_1 + 0.4467 * out2_1 + 0.0533 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1495 * out1_2 + 0.2231 * out1_1 + 0.9069 * out2_1 - 0.2796 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0854 * out1_2 + 0.0928 * out1_1 + 1.3397 * out2_1 - 0.5179 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 01002: /* #.......#., = 0, sigma = 1 */ val = 0.8894 * out1_1 + 0.1106 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6839 * out1_1 + 0.3161 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5517 * out1_1 + 0.4483 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5000 * out1_1 + 0.5000 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4483 * out1_1 + 0.5517 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3161 * out1_1 + 0.6839 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1106 * out1_1 + 0.8894 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 01003: /* #.......##, = 0 */ val = 0.8829 * out1_1 + 0.0585 * out2_1 + 0.0585 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6654 * out1_1 + 0.1676 * out2_1 + 0.1670 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5260 * out1_1 + 0.2411 * out2_1 + 0.2329 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4751 * out1_1 + 0.2995 * out2_1 + 0.2254 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4390 * out1_1 + 0.4773 * out2_1 + 0.0836 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3456 * out1_1 + 0.9205 * out2_1 - 0.2661 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_1 + 1.3452 * out2_1 - 0.5125 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 01402: /* ##......#., = 0 */ val = -0.5125 * out1_2 + 1.3452 * out1_1 + 0.1673 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2666 * out1_2 + 0.9201 * out1_1 + 0.3465 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0793 * out1_2 + 0.4730 * out1_1 + 0.4477 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2024 * out1_2 + 0.2765 * out1_1 + 0.5212 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1635 * out1_2 + 0.1716 * out1_1 + 0.6649 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0583 * out1_2 + 0.0588 * out1_1 + 0.8829 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 01403: /* ##......##, = 0 */ val = -0.5177 * out1_2 + 1.3400 * out1_1 + 0.0891 * out2_1 + 0.0886 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2771 * out1_2 + 0.9095 * out1_1 + 0.1878 * out2_1 + 0.1797 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0677 * out1_2 + 0.4614 * out1_1 + 0.2725 * out2_1 + 0.1984 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1984 * out1_2 + 0.2725 * out1_1 + 0.4614 * out2_1 + 0.0677 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1797 * out1_2 + 0.1878 * out1_1 + 0.9095 * out2_1 - 0.2771 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0886 * out1_2 + 0.0891 * out1_1 + 1.3400 * out2_1 - 0.5177 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 02002: /* #........#., = 0, sigma = 1 */ val = 0.8894 * out1_1 + 0.1106 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6839 * out1_1 + 0.3161 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5526 * out1_1 + 0.4474 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5082 * out1_1 + 0.4918 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4918 * out1_1 + 0.5082 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4474 * out1_1 + 0.5526 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3161 * out1_1 + 0.6839 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1106 * out1_1 + 0.8894 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 02003: /* #........##, = 0 */ val = 0.8829 * out1_1 + 0.0585 * out2_1 + 0.0585 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6654 * out1_1 + 0.1673 * out2_1 + 0.1673 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5265 * out1_1 + 0.2370 * out2_1 + 0.2365 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4799 * out1_1 + 0.2641 * out2_1 + 0.2560 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4664 * out1_1 + 0.3038 * out2_1 + 0.2298 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4381 * out1_1 + 0.4778 * out2_1 + 0.0841 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3455 * out1_1 + 0.9206 * out2_1 - 0.2661 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_1 + 1.3452 * out2_1 - 0.5125 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 03002: /* ##.......#., = 0 */ val = -0.5125 * out1_2 + 1.3452 * out1_1 + 0.1673 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2661 * out1_2 + 0.9205 * out1_1 + 0.3456 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0836 * out1_2 + 0.4773 * out1_1 + 0.4390 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2254 * out1_2 + 0.2995 * out1_1 + 0.4751 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2329 * out1_2 + 0.2411 * out1_1 + 0.5260 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1670 * out1_2 + 0.1676 * out1_1 + 0.6654 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0585 * out1_2 + 0.0585 * out1_1 + 0.8829 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 03003: /* ##.......##, = 0 */ val = -0.5177 * out1_2 + 1.3400 * out1_1 + 0.0889 * out2_1 + 0.0888 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2768 * out1_2 + 0.9098 * out1_1 + 0.1838 * out2_1 + 0.1832 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0703 * out1_2 + 0.4639 * out1_1 + 0.2370 * out2_1 + 0.2288 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2130 * out1_2 + 0.2870 * out1_1 + 0.2870 * out2_1 + 0.2130 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2288 * out1_2 + 0.2370 * out1_1 + 0.4639 * out2_1 + 0.0703 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1832 * out1_2 + 0.1838 * out1_1 + 0.9098 * out2_1 - 0.2768 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0888 * out1_2 + 0.0889 * out1_1 + 1.3400 * out2_1 - 0.5177 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 04002: /* #.........#., = 0 */ val = 0.8894 * out1_1 + 0.1106 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6839 * out1_1 + 0.3161 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5527 * out1_1 + 0.4473 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5091 * out1_1 + 0.4909 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5000 * out1_1 + 0.5000 * out2_1; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4909 * out1_1 + 0.5091 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4473 * out1_1 + 0.5527 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3161 * out1_1 + 0.6839 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1106 * out1_1 + 0.8894 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 04003: /* #.........##, = 0 */ val = 0.8829 * out1_1 + 0.0585 * out2_1 + 0.0585 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6654 * out1_1 + 0.1673 * out2_1 + 0.1673 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5265 * out1_1 + 0.2368 * out2_1 + 0.2367 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4804 * out1_1 + 0.2601 * out2_1 + 0.2595 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4712 * out1_1 + 0.2685 * out2_1 + 0.2603 * out2_2; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4654 * out1_1 + 0.3043 * out2_1 + 0.2302 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4380 * out1_1 + 0.4778 * out2_1 + 0.0842 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3455 * out1_1 + 0.9206 * out2_1 - 0.2661 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_1 + 1.3452 * out2_1 - 0.5125 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 06002: /* ##........#., = 0 */ val = -0.5125 * out1_2 + 1.3452 * out1_1 + 0.1673 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2661 * out1_2 + 0.9206 * out1_1 + 0.3455 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0841 * out1_2 + 0.4778 * out1_1 + 0.4381 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2298 * out1_2 + 0.3038 * out1_1 + 0.4664 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2560 * out1_2 + 0.2641 * out1_1 + 0.4799 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2365 * out1_2 + 0.2370 * out1_1 + 0.5265 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_2 + 0.1673 * out1_1 + 0.6654 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0585 * out1_2 + 0.0585 * out1_1 + 0.8829 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 06003: /* ##........##, = 0 */ val = -0.5177 * out1_2 + 1.3400 * out1_1 + 0.0888 * out2_1 + 0.0888 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2768 * out1_2 + 0.9098 * out1_1 + 0.1835 * out2_1 + 0.1835 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0705 * out1_2 + 0.4642 * out1_1 + 0.2329 * out2_1 + 0.2324 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2155 * out1_2 + 0.2896 * out1_1 + 0.2515 * out2_1 + 0.2434 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2434 * out1_2 + 0.2515 * out1_1 + 0.2896 * out2_1 + 0.2155 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2324 * out1_2 + 0.2329 * out1_1 + 0.4642 * out2_1 + 0.0705 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1835 * out1_2 + 0.1835 * out1_1 + 0.9098 * out2_1 - 0.2768 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0888 * out1_2 + 0.0888 * out1_1 + 1.3400 * out2_1 - 0.5177 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 010002: /* #..........#., = 0, sigma = 1 */ val = 0.8894 * out1_1 + 0.1106 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6839 * out1_1 + 0.3161 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5527 * out1_1 + 0.4473 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5092 * out1_1 + 0.4908 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5009 * out1_1 + 0.4991 * out2_1; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4991 * out1_1 + 0.5009 * out2_1; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4908 * out1_1 + 0.5092 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4473 * out1_1 + 0.5527 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3161 * out1_1 + 0.6839 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1106 * out1_1 + 0.8894 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 010003: /* #..........##, = 0 */ val = 0.8829 * out1_1 + 0.0585 * out2_1 + 0.0585 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6654 * out1_1 + 0.1673 * out2_1 + 0.1673 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5265 * out1_1 + 0.2367 * out2_1 + 0.2367 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4804 * out1_1 + 0.2598 * out2_1 + 0.2598 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4717 * out1_1 + 0.2644 * out2_1 + 0.2639 * out2_2; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4703 * out1_1 + 0.2690 * out2_1 + 0.2608 * out2_2; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4654 * out1_1 + 0.3043 * out2_1 + 0.2303 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4380 * out1_1 + 0.4778 * out2_1 + 0.0842 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3455 * out1_1 + 0.9206 * out2_1 - 0.2661 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_1 + 1.3452 * out2_1 - 0.5125 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 014002: /* ##.........#., = 0 */ val = -0.5125 * out1_2 + 1.3452 * out1_1 + 0.1673 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2661 * out1_2 + 0.9206 * out1_1 + 0.3455 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0842 * out1_2 + 0.4778 * out1_1 + 0.4380 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2302 * out1_2 + 0.3043 * out1_1 + 0.4654 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2603 * out1_2 + 0.2685 * out1_1 + 0.4712 * out2_1; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2595 * out1_2 + 0.2601 * out1_1 + 0.4804 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2367 * out1_2 + 0.2368 * out1_1 + 0.5265 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_2 + 0.1673 * out1_1 + 0.6654 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0585 * out1_2 + 0.0585 * out1_1 + 0.8829 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 014003: /* ##.........##, = 0 */ val = -0.5177 * out1_2 + 1.3400 * out1_1 + 0.0888 * out2_1 + 0.0888 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2768 * out1_2 + 0.9098 * out1_1 + 0.1835 * out2_1 + 0.1835 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0705 * out1_2 + 0.4642 * out1_1 + 0.2326 * out2_1 + 0.2326 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2158 * out1_2 + 0.2899 * out1_1 + 0.2474 * out2_1 + 0.2469 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2459 * out1_2 + 0.2541 * out1_1 + 0.2541 * out2_1 + 0.2459 * out2_2; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2469 * out1_2 + 0.2474 * out1_1 + 0.2899 * out2_1 + 0.2158 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2326 * out1_2 + 0.2326 * out1_1 + 0.4642 * out2_1 + 0.0705 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1835 * out1_2 + 0.1835 * out1_1 + 0.9098 * out2_1 - 0.2768 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0888 * out1_2 + 0.0888 * out1_1 + 1.3400 * out2_1 - 0.5177 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 020003: /* #...........##, = 0 */ val = 0.8829 * out1_1 + 0.0585 * out2_1 + 0.0585 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6654 * out1_1 + 0.1673 * out2_1 + 0.1673 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5265 * out1_1 + 0.2367 * out2_1 + 0.2367 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4804 * out1_1 + 0.2598 * out2_1 + 0.2598 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4718 * out1_1 + 0.2641 * out2_1 + 0.2641 * out2_2; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4708 * out1_1 + 0.2649 * out2_1 + 0.2644 * out2_2; - out[badX1 - 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4702 * out1_1 + 0.2690 * out2_1 + 0.2608 * out2_2; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4654 * out1_1 + 0.3044 * out2_1 + 0.2303 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4380 * out1_1 + 0.4778 * out2_1 + 0.0842 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3455 * out1_1 + 0.9206 * out2_1 - 0.2661 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_1 + 1.3452 * out2_1 - 0.5125 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 030002: /* ##..........#., = 0 */ val = -0.5125 * out1_2 + 1.3452 * out1_1 + 0.1673 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2661 * out1_2 + 0.9206 * out1_1 + 0.3455 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0842 * out1_2 + 0.4778 * out1_1 + 0.4380 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2303 * out1_2 + 0.3043 * out1_1 + 0.4654 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2608 * out1_2 + 0.2690 * out1_1 + 0.4703 * out2_1; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2639 * out1_2 + 0.2644 * out1_1 + 0.4717 * out2_1; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2598 * out1_2 + 0.2598 * out1_1 + 0.4804 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2367 * out1_2 + 0.2367 * out1_1 + 0.5265 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_2 + 0.1673 * out1_1 + 0.6654 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0585 * out1_2 + 0.0585 * out1_1 + 0.8829 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 030003: /* ##..........##, = 0 */ val = -0.5177 * out1_2 + 1.3400 * out1_1 + 0.0888 * out2_1 + 0.0888 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2768 * out1_2 + 0.9098 * out1_1 + 0.1835 * out2_1 + 0.1835 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0705 * out1_2 + 0.4642 * out1_1 + 0.2326 * out2_1 + 0.2326 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2158 * out1_2 + 0.2899 * out1_1 + 0.2472 * out2_1 + 0.2471 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2462 * out1_2 + 0.2544 * out1_1 + 0.2500 * out2_1 + 0.2495 * out2_2; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2495 * out1_2 + 0.2500 * out1_1 + 0.2544 * out2_1 + 0.2462 * out2_2; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2471 * out1_2 + 0.2472 * out1_1 + 0.2899 * out2_1 + 0.2158 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2326 * out1_2 + 0.2326 * out1_1 + 0.4642 * out2_1 + 0.0705 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1835 * out1_2 + 0.1835 * out1_1 + 0.9098 * out2_1 - 0.2768 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0888 * out1_2 + 0.0888 * out1_1 + 1.3400 * out2_1 - 0.5177 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 040003: /* #............##, = 0 */ val = 0.8829 * out1_1 + 0.0585 * out2_1 + 0.0585 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6654 * out1_1 + 0.1673 * out2_1 + 0.1673 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5265 * out1_1 + 0.2367 * out2_1 + 0.2367 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4804 * out1_1 + 0.2598 * out2_1 + 0.2598 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4718 * out1_1 + 0.2641 * out2_1 + 0.2641 * out2_2; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4708 * out1_1 + 0.2646 * out2_1 + 0.2646 * out2_2; - out[badX0 + 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4707 * out1_1 + 0.2649 * out2_1 + 0.2644 * out2_2; - out[badX1 - 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4702 * out1_1 + 0.2690 * out2_1 + 0.2608 * out2_2; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4654 * out1_1 + 0.3044 * out2_1 + 0.2303 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4380 * out1_1 + 0.4778 * out2_1 + 0.0842 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3455 * out1_1 + 0.9206 * out2_1 - 0.2661 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_1 + 1.3452 * out2_1 - 0.5125 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 060002: /* ##...........#., = 0 */ val = -0.5125 * out1_2 + 1.3452 * out1_1 + 0.1673 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2661 * out1_2 + 0.9206 * out1_1 + 0.3455 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0842 * out1_2 + 0.4778 * out1_1 + 0.4380 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2303 * out1_2 + 0.3044 * out1_1 + 0.4654 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2608 * out1_2 + 0.2690 * out1_1 + 0.4702 * out2_1; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2644 * out1_2 + 0.2649 * out1_1 + 0.4708 * out2_1; - out[badX1 - 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2641 * out1_2 + 0.2641 * out1_1 + 0.4718 * out2_1; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2598 * out1_2 + 0.2598 * out1_1 + 0.4804 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2367 * out1_2 + 0.2367 * out1_1 + 0.5265 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_2 + 0.1673 * out1_1 + 0.6654 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0585 * out1_2 + 0.0585 * out1_1 + 0.8829 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; default: @@ -1818,22 +1818,22 @@ static void do_defects(std::vector const &badList, // list of bad switch (defectType) { case 06: /* #?#., = 0 */ val = 0.8894 * out1_1 + 0.1106 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6839 * out1_1 + 0.3161 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5527 * out1_1 + 0.4473 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5092 * out1_1 + 0.4908 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5010 * out1_1 + 0.4990 * out2_1; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5001 * out1_1 + 0.4999 * out2_1; - out[badX0 + 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5000 * out1_1 + 0.5000 * out2_1; @@ -1842,42 +1842,42 @@ static void do_defects(std::vector const &badList, // list of bad } val = 0.4999 * out1_1 + 0.5001 * out2_1; - out[badX1 - 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4990 * out1_1 + 0.5010 * out2_1; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4908 * out1_1 + 0.5092 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4473 * out1_1 + 0.5527 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3161 * out1_1 + 0.6839 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1106 * out1_1 + 0.8894 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 07: /* #?##, = 0 */ val = 0.8829 * out1_1 + 0.0585 * out2_1 + 0.0585 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.6654 * out1_1 + 0.1673 * out2_1 + 0.1673 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.5265 * out1_1 + 0.2367 * out2_1 + 0.2367 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4804 * out1_1 + 0.2598 * out2_1 + 0.2598 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4718 * out1_1 + 0.2641 * out2_1 + 0.2641 * out2_2; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4708 * out1_1 + 0.2646 * out2_1 + 0.2646 * out2_2; - out[badX0 + 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4707 * out[badX0 - 1] + 0.2646 * out[badX1 + 1] + 0.2646 * out[badX1 + 2]; @@ -1886,112 +1886,112 @@ static void do_defects(std::vector const &badList, // list of bad } val = 0.4707 * out1_1 + 0.2649 * out2_1 + 0.2644 * out2_2; - out[badX1 - 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4702 * out1_1 + 0.2690 * out2_1 + 0.2608 * out2_2; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4654 * out1_1 + 0.3044 * out2_1 + 0.2303 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.4380 * out1_1 + 0.4778 * out2_1 + 0.0842 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.3455 * out1_1 + 0.9206 * out2_1 - 0.2661 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_1 + 1.3452 * out2_1 - 0.5125 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 016: /* ##?#., = 0 */ val = -0.5125 * out1_2 + 1.3452 * out1_1 + 0.1673 * out2_1; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2661 * out1_2 + 0.9206 * out1_1 + 0.3455 * out2_1; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0842 * out1_2 + 0.4778 * out1_1 + 0.4380 * out2_1; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2303 * out1_2 + 0.3044 * out1_1 + 0.4654 * out2_1; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2608 * out1_2 + 0.2690 * out1_1 + 0.4702 * out2_1; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2644 * out1_2 + 0.2649 * out1_1 + 0.4707 * out2_1; - out[badX0 + 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2646 * out1_2 + 0.2646 * out1_1 + 0.4707 * out2_1; - val = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + val = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; for (int j = badX0 + 6; j < badX1 - 5; j++) { out[j] = val; } val = 0.2646 * out1_2 + 0.2646 * out1_1 + 0.4708 * out2_1; - out[badX1 - 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2641 * out1_2 + 0.2641 * out1_1 + 0.4718 * out2_1; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2598 * out1_2 + 0.2598 * out1_1 + 0.4804 * out2_1; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2367 * out1_2 + 0.2367 * out1_1 + 0.5265 * out2_1; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1673 * out1_2 + 0.1673 * out1_1 + 0.6654 * out2_1; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0585 * out1_2 + 0.0585 * out1_1 + 0.8829 * out2_1; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; case 017: /* ##?##, S/N = infty */ val = -0.5177 * out1_2 + 1.3400 * out1_1 + 0.0888 * out2_1 + 0.0888 * out2_2; - out[badX0] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = -0.2768 * out1_2 + 0.9098 * out1_1 + 0.1835 * out2_1 + 0.1835 * out2_2; - out[badX0 + 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0705 * out1_2 + 0.4642 * out1_1 + 0.2326 * out2_1 + 0.2326 * out2_2; - out[badX0 + 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2158 * out1_2 + 0.2899 * out1_1 + 0.2472 * out2_1 + 0.2472 * out2_2; - out[badX0 + 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2462 * out1_2 + 0.2544 * out1_1 + 0.2497 * out2_1 + 0.2497 * out2_2; - out[badX0 + 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2497 * out1_2 + 0.2503 * out1_1 + 0.2500 * out2_1 + 0.2500 * out2_2; - out[badX0 + 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX0 + 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2500 * out1_2 + 0.2500 * out1_1 + 0.2500 * out2_1 + 0.2500 * out2_2; - val = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + val = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; for (int j = badX0 + 6; j < badX1 - 5; j++) { out[j] = val; } val = 0.2500 * out1_2 + 0.2500 * out1_1 + 0.2503 * out2_1 + 0.2497 * out2_2; - out[badX1 - 5] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 5] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2497 * out1_2 + 0.2497 * out1_1 + 0.2544 * out2_1 + 0.2462 * out2_2; - out[badX1 - 4] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 4] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2472 * out1_2 + 0.2472 * out1_1 + 0.2899 * out2_1 + 0.2158 * out2_2; - out[badX1 - 3] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 3] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.2326 * out1_2 + 0.2326 * out1_1 + 0.4642 * out2_1 + 0.0705 * out2_2; - out[badX1 - 2] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 2] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.1835 * out1_2 + 0.1835 * out1_1 + 0.9098 * out2_1 - 0.2768 * out2_2; - out[badX1 - 1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1 - 1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; val = 0.0888 * out1_2 + 0.0888 * out1_1 + 1.3400 * out2_1 - 0.5177 * out2_2; - out[badX1] = (val < min) ? 0.5 * (out1_1 + out2_1) : val; + out[badX1] = (!(val >= min)) ? 0.5 * (out1_1 + out2_1) : val; break; default: From 48bd21f5ad9f66fb7672a828a4f3937fbb437958 Mon Sep 17 00:00:00 2001 From: Lauren MacArthur Date: Tue, 20 Jan 2026 15:12:35 -0800 Subject: [PATCH 2/8] Add max iterations for bright dynamic detection This guards against potentially very long (or infinite) running loops. Also adds a unittest check that forces entry into this loop to make sure it iterates just two times, having set the full images as having the DETECTION mask set, and checking that it fails at trying to lay down sky sources. --- .../lsst/meas/algorithms/dynamicDetection.py | 24 +++++++++++++------ tests/test_dynamicDetection.py | 17 ++++++++++++- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/python/lsst/meas/algorithms/dynamicDetection.py b/python/lsst/meas/algorithms/dynamicDetection.py index 119408d99..549b1a009 100644 --- a/python/lsst/meas/algorithms/dynamicDetection.py +++ b/python/lsst/meas/algorithms/dynamicDetection.py @@ -124,6 +124,9 @@ class DynamicDetectionConfig(SourceDetectionConfig): doBrightPrelimDetection = Field(dtype=bool, default=True, doc="Do initial bright detection pass where footprints are grown " "by brightGrowFactor?") + brightDetectionIterMax = Field(dtype=int, default=10, + doc="Maximum number of iterations in the initial bright detection " + "pass.") brightMultiplier = Field(dtype=float, default=2000.0, doc="Multiplier to apply to the prelimThresholdFactor for the " "\"bright\" detections stage (want this to be large to only " @@ -660,12 +663,12 @@ def _computeBrightDetectionMask(self, maskedImage, convolveResults): Perform an initial bright object detection pass using a high detection threshold. The footprints in this pass are grown significantly more - than is typical to account for wings around bright sources. The + than is typical to account for wings around bright sources. The negative polarity detections in this pass help in masking severely over-subtracted regions. A maximum fraction of masked pixel from this pass is ensured via - the config ``brightMaskFractionMax``. If the masked pixel fraction is + the config ``brightMaskFractionMax``. If the masked pixel fraction is above this value, the detection thresholds here are increased by ``bisectFactor`` in a while loop until the detected masked fraction falls below this value. @@ -703,7 +706,7 @@ def _computeBrightDetectionMask(self, maskedImage, convolveResults): # brightMaskFractionMax, increasing the thresholds by # config.bisectFactor on each iteration (rarely necessary # for current defaults). - while nPixDetNeg/nPix > brightMaskFractionMax or nPixDet/nPix > brightMaskFractionMax: + for nIter in range(self.config.brightDetectionIterMax): self.clearMask(maskedImage.mask) brightPosFactor *= self.config.bisectFactor brightNegFactor *= self.config.bisectFactor @@ -722,10 +725,17 @@ def _computeBrightDetectionMask(self, maskedImage, convolveResults): self.log.info("Number (%) of bright DETECTED_NEGATIVE pix: {} ({:.1f}%)". format(nPixDetNeg, 100*nPixDetNeg/nPix)) if nPixDetNeg/nPix > brightMaskFractionMax or nPixDet/nPix > brightMaskFractionMax: - self.log.warn("Too high a fraction (%.1f > %.1f) of pixels were masked with current " - "\"bright\" detection round thresholds. Increasing by a factor of %.2f " - "and trying again.", max(nPixDetNeg, nPixDet)/nPix, - brightMaskFractionMax, self.config.bisectFactor) + self.log.warning("Too high a fraction (%.2f > %.2f) of pixels were masked with current " + "\"bright\" detection round thresholds (at nIter = %d). Increasing by " + "a factor of %.2f and trying again.", max(nPixDetNeg, nPixDet)/nPix, + brightMaskFractionMax, nIter, self.config.bisectFactor) + if nIter == self.config.brightDetectionIterMax - 1: + self.log.warning("Reached maximum number of iterations and still have too high " + "detected mask fractions in bright detection pass. Image is " + "likely mostly masked with BAD or NO_DATA or \"bad\" in some " + "other respect (so expected to likely fail further downstream).") + else: + break # Save the mask planes from the "bright" detection round, then # clear them before moving on to the "prelim" detection phase. diff --git a/tests/test_dynamicDetection.py b/tests/test_dynamicDetection.py index 97204e554..ddba7e033 100644 --- a/tests/test_dynamicDetection.py +++ b/tests/test_dynamicDetection.py @@ -5,7 +5,7 @@ from lsst.afw.geom import makeCdMatrix, makeSkyWcs from lsst.afw.table import SourceTable from lsst.geom import Box2I, Extent2I, Point2D, Point2I, SpherePoint, degrees -from lsst.meas.algorithms import DynamicDetectionTask +from lsst.meas.algorithms import DynamicDetectionTask, InsufficientSourcesError from lsst.meas.algorithms.testUtils import plantSources from lsst.pex.config import FieldValidationError @@ -110,6 +110,21 @@ def testThresholdScalingAndNoBackgroundTweak(self): config.doBackgroundTweak = False self.check(1.0, config) + def testBrightDetectionPass(self): + """Check that the maximum number of bright detection iterations is + observed. + + The bright detection loop is forced by setting config.brightMultiplier + so low such that the entire image is marked as DETECTED. As such, the + task is doomed to fail where it tries to lay down sky sources." + """ + config = DynamicDetectionTask.ConfigClass() + config.brightMultiplier = 0.05 + config.brightDetectionIterMax = 2 + with self.assertRaisesRegex( + InsufficientSourcesError, "Insufficient good sky source flux measurements"): + self.check(1.0, config) + def testThresholdsOutsideBounds(self): """Check that dynamic detection properly sets threshold limits. """ From 77b6bfe5362d7ea232274ea94ffce0ea4d220edf Mon Sep 17 00:00:00 2001 From: Ian Sullivan Date: Mon, 9 Feb 2026 14:39:44 -0800 Subject: [PATCH 3/8] Drop streak line models that are off the image --- python/lsst/meas/algorithms/maskStreaks.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/python/lsst/meas/algorithms/maskStreaks.py b/python/lsst/meas/algorithms/maskStreaks.py index 5f0afc8ad..27080458a 100644 --- a/python/lsst/meas/algorithms/maskStreaks.py +++ b/python/lsst/meas/algorithms/maskStreaks.py @@ -147,6 +147,7 @@ def __init__(self, data, weights, line=None, detectionMask=None): self.mask = (weights != 0) self._initLine = line + self.modelFailure = False self.setLineMask(line, maxStreakWidth=0, nSigmaMask=10, detectionMask=detectionMask) def getLineXY(self, line): @@ -227,6 +228,11 @@ def setLineMask(self, line, maxStreakWidth, nSigmaMask, logger=None, detectionMa # happens when, for example, the streak ends in the middle of # the image. lineEnds = self.getLineXY(line) + if lineEnds.size == 0: + if logger is not None: + logger.debug("Calculated line not contained in image bounding box") + self.modelFailure = True + return xA = lineEnds[0, 0] - self._xmax / 2. yA = lineEnds[0, 1] - self._ymax / 2. @@ -889,7 +895,7 @@ def _fitProfile(self, lines, maskedImage, detectionMask=None): line.sigma = self.config.invSigma**-1 lineModel = LineProfile(data, weights, line=line, detectionMask=detectionMask) # Skip any lines that do not cover any data (sometimes happens because of chip gaps) - if lineModel.lineMask.sum() == 0: + if lineModel.modelFailure or lineModel.lineMask.sum() == 0: continue fit, fitFailure = lineModel.fit(dChi2Tol=self.config.dChi2Tolerance, log=self.log, From 2387f40b57c1f38dadbc8ed33a4108d9eba85c62 Mon Sep 17 00:00:00 2001 From: Clare Saunders Date: Wed, 11 Feb 2026 10:50:06 -0800 Subject: [PATCH 4/8] Check for very small change in chi2 --- python/lsst/meas/algorithms/maskStreaks.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/python/lsst/meas/algorithms/maskStreaks.py b/python/lsst/meas/algorithms/maskStreaks.py index 27080458a..5beaaec64 100644 --- a/python/lsst/meas/algorithms/maskStreaks.py +++ b/python/lsst/meas/algorithms/maskStreaks.py @@ -499,7 +499,13 @@ def line_search(c, dx): break dx = scipy.linalg.cho_solve(cholesky, b) - factor, fmin, _, _ = scipy.optimize.brent(line_search, args=(dx,), full_output=True, tol=0.05) + if abs(line_search(1, dx) - chi2) < 1e-12: + # Step size is too small for the brent line search to work well. + # Just use the step fit from the Cholesky solve. + factor = 1 + else: + factor, _, _, _ = scipy.optimize.brent(line_search, args=(dx,), full_output=True, tol=0.05) + x -= factor * dx if (abs(x[0]) > 1.5 * self._rhoMax) or (iter > maxIter): fitFailure = True @@ -921,6 +927,7 @@ def _fitProfile(self, lines, maskedImage, detectionMask=None): # Drop this line if the model profile is below the footprint # threshold if not finalLineMask.any(): + self.log.debug("Streak model profile is below the footprintThreshold.") continue fit.modelMaximum = finalModelMax lineFits.append(fit) From 4475c8a4b6e8d16d9edc0c16954bd086f11e5b2f Mon Sep 17 00:00:00 2001 From: Jim Bosch Date: Fri, 29 May 2026 11:49:51 -0400 Subject: [PATCH 5/8] Add reset method to AccumulatorMeanStack. --- .../meas/algorithms/accumulator_mean_stack.py | 16 ++++++++++++++++ tests/test_accumulator_mean_stack.py | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/python/lsst/meas/algorithms/accumulator_mean_stack.py b/python/lsst/meas/algorithms/accumulator_mean_stack.py index d8676d34a..ffc5178cd 100644 --- a/python/lsst/meas/algorithms/accumulator_mean_stack.py +++ b/python/lsst/meas/algorithms/accumulator_mean_stack.py @@ -92,6 +92,22 @@ def __init__(self, shape, if self.compute_n_image: self.n_image = np.zeros(shape, dtype=np.int32) + def reset(self): + """Reset all accumulator arrays.""" + self.sum_weight[...] = 0 + self.sum_wdata[...] = 0 + if self.calc_error_from_input_variance: + self.sum_w2var[...] = 0 + else: + self.sum_weight2[...] = 0 + self.sum_wdata2[...] = 0 + self.or_mask[...] = 0 + for bit in self.mask_threshold_dict: + self.rejected_weights_by_bit[bit][...] = 0 + self.masked_pixels_mask[...] = 0 + if self.compute_n_image: + self.n_image[...] = 0 + def add_masked_image(self, masked_image, weight=1.0): """Add a masked image to the stack. diff --git a/tests/test_accumulator_mean_stack.py b/tests/test_accumulator_mean_stack.py index 2631a7d9b..7a302df44 100644 --- a/tests/test_accumulator_mean_stack.py +++ b/tests/test_accumulator_mean_stack.py @@ -239,6 +239,23 @@ def test_online_coadd_image(self): afw_masked_image.image.array[good_pixels], decimal=5) + # Reset the accumulator and do it all again. + stacker.reset() + for exposure, weight in zip(exposures, weights): + stacker.add_image(exposure.image, weight=weight) + + stacker.fill_stacked_image(coadd_exposure.image) + + online_image = coadd_exposure.image + + # The unmasked coadd good pixels should match at the <1e-5 level + # The masked pixels will not be correct for straight image stacking. + good_pixels = np.where(afw_masked_image.mask.array == 0) + + testing.assert_array_almost_equal(online_image.array[good_pixels], + afw_masked_image.image.array[good_pixels], + decimal=5) + class TestMemory(lsst.utils.tests.MemoryTestCase): pass From e80e65bbe7a224f7e15dda3a5e408a12080a6a8f Mon Sep 17 00:00:00 2001 From: Lauren MacArthur Date: Wed, 20 May 2026 16:10:00 -0700 Subject: [PATCH 6/8] Allow threshold factors to get set via detectFootprints --- python/lsst/meas/algorithms/detection.py | 44 +++++++++++++++--------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/python/lsst/meas/algorithms/detection.py b/python/lsst/meas/algorithms/detection.py index 4dc00ff56..17ca9fec9 100644 --- a/python/lsst/meas/algorithms/detection.py +++ b/python/lsst/meas/algorithms/detection.py @@ -576,12 +576,12 @@ def applyThreshold(self, middle, bbox, factor=1.0, factorNeg=None): Convolved image to threshold. bbox : `lsst.geom.Box2I` Bounding box of unconvolved image. - factor : `float` + factor : `float`, optional Multiplier for the configured threshold. - factorNeg : `float` or `None` - Multiplier for the configured threshold for negative detection polarity. - If `None`, will be set equal to ``factor`` (i.e. equal to the factor used - for positive detection polarity). + factorNeg : `float` or `None`, optional + Multiplier for the configured threshold for negative detection + polarity. If `None`, will be set equal to ``factor`` (i.e. equal + to the factor used for positive detection polarity). Returns ------- @@ -595,16 +595,16 @@ def applyThreshold(self, middle, bbox, factor=1.0, factorNeg=None): Negative detection footprints, if configured. (`lsst.afw.detection.FootprintSet` or `None`) ``factor`` - Multiplier for the configured threshold. - (`float`) + Multiplier for the configured threshold for positive detection + polarity. (`float`) ``factorNeg`` - Multiplier for the configured threshold for negative detection polarity. - (`float`) + Multiplier for the configured threshold for negative detection + polarity. (`float`) """ if factorNeg is None: factorNeg = factor - self.log.info("Setting factor for negative detections equal to that for positive " - "detections: %f", factor) + self.log.info("Threshold scaling factor for positive detections is: %.3f. For negative " + "detections it is: %.3f", factor, factorNeg) results = pipeBase.Struct(positive=None, negative=None, factor=factor, factorNeg=factorNeg, positiveThreshold=None, negativeThreshold=None) # Detect the Footprints (peaks may be replaced if doTempLocalBackground) @@ -649,7 +649,7 @@ def finalizeFootprints(self, mask, results, sigma, factor=1.0, factorNeg=None, g ``negative`` entries; modified. sigma : `float` Gaussian sigma of PSF. - factor : `float` + factor : `float`, optional Multiplier for the configured threshold. Note that this is only used here for logging purposes. factorNeg : `float` or `None` @@ -766,7 +766,7 @@ def clearUnwantedResults(self, mask, results): @timeMethod def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, expId=None, - background=None, backgroundToPhotometricRatio=None): + background=None, backgroundToPhotometricRatio=None, factor=1.0, factorNeg=None): """Detect footprints on an exposure. Parameters @@ -796,6 +796,13 @@ def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, Image to convert photometric-flattened image to background-flattened image if ``reEstimateBackground=True`` and exposure has been photometric-flattened. + factor : `float`, optional + Multiplier for the configured threshold for positive detection + polarity. + factorNeg : `float` or `None`, optional + Multiplier for the configured threshold for negative detection + polarity. If `None`, will be set equal to ``factor`` (i.e. equal + to the factor used for positive detection polarity). Returns ------- @@ -819,8 +826,11 @@ def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, if ``reEstimateBackground==False``. (`lsst.afw.math.BackgroundList`) ``factor`` - Multiplication factor applied to the configured detection - threshold. (`float`) + Multiplication factor applied to the configured threshold + for positive detection polarity. (`float`) + ``factorNeg`` + Multiplication factor applied to the configured threshold + for negative detection polarity. (`float`) """ maskedImage = exposure.maskedImage @@ -834,12 +844,12 @@ def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, sigma = convolveResults.sigma self.removeBadPixels(middle) - results = self.applyThreshold(middle, maskedImage.getBBox()) + results = self.applyThreshold(middle, maskedImage.getBBox(), factor=factor, factorNeg=factorNeg) results.background = background if background is not None else afwMath.BackgroundList() if self.config.doTempLocalBackground: self.applyTempLocalBackground(exposure, middle, results) - self.finalizeFootprints(maskedImage.mask, results, sigma) + self.finalizeFootprints(maskedImage.mask, results, sigma, factor=factor, factorNeg=factorNeg) # Compute the significance of peaks after the peaks have been # finalized and after local background correction/updatePeaks, so From de20628b64b0f7adfe901ce89fd8326507a41308 Mon Sep 17 00:00:00 2001 From: Lauren MacArthur Date: Wed, 20 May 2026 16:03:17 -0700 Subject: [PATCH 7/8] Guard against high DETECTED_NEGATIVE fraction In the "bright" detection phase of the dynamic detection task, we have encountered cases where a very large fraction of the pixels are marked with DETECTED_NEGATIVE. This seems to be due to background over-subtraction in crowded fields (where this pathology is most significant). This adds a guard against such cases by imposing a maximum allowed fraction of DETECTED_NEGATIVE pixels (in addition to an independent maximum allowed fraction of DETECTED pixels in this pass). If this maximum is exceeded, the detection threshold is iteratively increased until it falls below the threshold. --- python/lsst/meas/algorithms/detection.py | 3 +- .../lsst/meas/algorithms/dynamicDetection.py | 133 +++++++++++++----- 2 files changed, 98 insertions(+), 38 deletions(-) diff --git a/python/lsst/meas/algorithms/detection.py b/python/lsst/meas/algorithms/detection.py index 17ca9fec9..ba6b6170a 100644 --- a/python/lsst/meas/algorithms/detection.py +++ b/python/lsst/meas/algorithms/detection.py @@ -731,7 +731,8 @@ def reEstimateBackground(self, maskedImage, backgrounds, backgroundToPhotometric if self.config.adjustBackground: self.log.warning("Fiddling the background by %g", self.config.adjustBackground) bg += self.config.adjustBackground - self.log.info("Resubtracting the background after object detection") + self.log.info("Resubtracting the background after object detection (median background " + "value = %.2f)", np.median(bg.getImageF().array)) maskedImage -= bg.getImageF(self.background.config.algorithm, self.background.config.undersampleStyle) diff --git a/python/lsst/meas/algorithms/dynamicDetection.py b/python/lsst/meas/algorithms/dynamicDetection.py index 549b1a009..be0858903 100644 --- a/python/lsst/meas/algorithms/dynamicDetection.py +++ b/python/lsst/meas/algorithms/dynamicDetection.py @@ -363,8 +363,10 @@ def calculateThreshold(self, exposure, seed, sigma=None, minFractionSourcesFacto badPixelMask = lsst.afw.image.Mask.getPlaneBitMask(["NO_DATA", "BAD"]) nGoodPix = np.sum(exposure.mask.array & badPixelMask == 0) if nGoodPix/nPix > 0.2: - detectedPixelMask = lsst.afw.image.Mask.getPlaneBitMask(["DETECTED", "DETECTED_NEGATIVE"]) - nDetectedPix = np.sum((exposure.mask.array & detectedPixelMask != 0) + detectedPosPixelMask = lsst.afw.image.Mask.getPlaneBitMask(["DETECTED"]) + detectedNegPixelMask = lsst.afw.image.Mask.getPlaneBitMask(["DETECTED_NEGATIVE"]) + nDetectedPix = np.sum(((exposure.mask.array & detectedPosPixelMask != 0) + | (exposure.mask.array & detectedNegPixelMask != 0)) & (exposure.mask.array & badPixelMask == 0)) msg += (" However, {} of {} ({:.3f}%) pixels are not marked NO_DATA or BAD, " "so there should be sufficient area to locate suitable sky sources. " @@ -484,10 +486,17 @@ def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, if self.config.doThresholdScaling: if self.config.doBrightPrelimDetection: - brightDetectedMask = self._computeBrightDetectionMask(maskedImage, convolveResults) + brightDetectedMask, brightFactorNeg = self._computeBrightDetectionMask( + maskedImage, convolveResults) + # Scale the factor for negative polarity detections based + # on what was required in the bright detection pass to + # avoid too many pixels marked as DETECTED_NEGATIVE (but + # capping it at 20.0 as a guardrail). + factorNeg = min(20.0, brightFactorNeg/self.config.brightNegFactor) else: prelim = None factor = 1.0 + factorNeg = 1.0 # seed needs to fit in a C++ 'int' so pybind doesn't choke on it seed = (expId if expId is not None else int(maskedImage.image.array.sum())) % (2**31 - 1) @@ -495,13 +504,14 @@ def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, middle = convolveResults.middle sigma = convolveResults.sigma if self.config.doThresholdScaling: + factorNeg *= self.config.prelimNegMultiplier*self.config.prelimThresholdFactor prelim = self.applyThreshold( middle, maskedImage.getBBox(), factor=self.config.prelimThresholdFactor, - factorNeg=self.config.prelimNegMultiplier*self.config.prelimThresholdFactor + factorNeg=factorNeg ) self.finalizeFootprints( maskedImage.mask, prelim, sigma, factor=self.config.prelimThresholdFactor, - factorNeg=self.config.prelimNegMultiplier*self.config.prelimThresholdFactor + factorNeg=factorNeg ) if self.config.doBrightPrelimDetection: # Combine prelim and bright detection masks for multiplier @@ -526,6 +536,8 @@ def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, factor = self.config.maxThresholdScaleFactor else: factor = threshResults.multiplicative + # Also scale the factor for negative polarity detections + factorNeg *= factor self.log.info("Modifying configured detection threshold by factor %.2f to %.2f", factor, factor*self.config.thresholdValue) @@ -539,12 +551,14 @@ def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, maskedImage.mask.array |= oldDetected # Rinse and repeat thresholding with new calculated threshold - results = self.applyThreshold(middle, maskedImage.getBBox(), factor) + results = self.applyThreshold( + middle, maskedImage.getBBox(), factor=factor, factorNeg=factorNeg + ) results.prelim = prelim results.background = background if background is not None else lsst.afw.math.BackgroundList() if self.config.doTempLocalBackground: self.applyTempLocalBackground(exposure, middle, results) - self.finalizeFootprints(maskedImage.mask, results, sigma, factor=factor, + self.finalizeFootprints(maskedImage.mask, results, sigma, factor=factor, factorNeg=factorNeg, growOverride=growOverride) if results.numPos == 0: msg = "No footprints were detected, so further processing would be moot" @@ -605,16 +619,34 @@ def detectFootprints(self, exposure, doSmooth=True, sigma=None, clearMask=True, try: self.clearMask(exposure.mask) convolveResults = self.convolveImage(maskedImage, psf, doSmooth=doSmooth) - tweakDetResults = self.applyThreshold(convolveResults.middle, maskedImage.getBBox(), factor) - self.finalizeFootprints(maskedImage.mask, tweakDetResults, sigma, factor=factor) + # Don't use factorNeg if the image has had its background + # subtracted after source detection. + tweakFactorNeg = None if self.config.reEstimateBackground else factorNeg + tweakDetResults = self.applyThreshold(convolveResults.middle, maskedImage.getBBox(), + factor=factor, factorNeg=tweakFactorNeg) + self.finalizeFootprints(maskedImage.mask, tweakDetResults, sigma, factor=factor, + factorNeg=tweakFactorNeg) bgLevel = self.calculateThreshold(exposure, seed, sigma=sigma, minFractionSourcesFactor=0.5, isBgTweak=True).additive - if self.config.minBackgroundTweak and bgLevel < self.config.minBackgroundTweak: - self.log.warning("Measured background tweak (%.2f) is outside [min, max] bounds " - "[%.2f, %.2f]. Setting tweak to lower limit: %.2f.", bgLevel, - self.config.minBackgroundTweak, self.config.maxBackgroundTweak, - self.config.minBackgroundTweak) - bgLevel = self.config.minBackgroundTweak + if self.config.minBackgroundTweak: + minBackgroundTweak = self.config.minBackgroundTweak + # Increase the minimum bg tweak allowed if the factorNeg indicates image + # was very oversubtracted. + if factorNeg > 5*factor: + if factorNeg > 8*factor: + minBackgroundTweak *= 3.0 + else: + minBackgroundTweak *= 2.0 + self.log.warning("All evidence suggests the image is very oversubtracted. " + "Allowing for a larger corection (%.2f), than that set in " + "config.minBackgroundTweak (%.2f).", minBackgroundTweak, + self.config.minBackgroundTweak) + if bgLevel < minBackgroundTweak: + self.log.warning("Measured background tweak (%.2f) is outside [min, max] bounds " + "[%.2f, %.2f]. Setting tweak to lower limit: %.2f.", bgLevel, + minBackgroundTweak, self.config.maxBackgroundTweak, + minBackgroundTweak) + bgLevel = minBackgroundTweak if self.config.maxBackgroundTweak and bgLevel > self.config.maxBackgroundTweak: self.log.warning("Measured background tweak (%.2f) is outside [min, max] bounds " "[%.2f, %.2f]. Setting tweak to upper limit: %.2f.", bgLevel, @@ -647,7 +679,7 @@ def tweakBackground(self, exposure, bgLevel, bgList=None): Constant background model. """ if bgLevel != 0.0: - self.log.info("Tweaking background by %f to match sky photometry", bgLevel) + self.log.info("Tweaking background by %.3f to match sky photometry", bgLevel) exposure.image -= bgLevel bgStats = lsst.afw.image.MaskedImageF(1, 1) bgStats.set(bgLevel, 0, bgLevel) @@ -691,16 +723,23 @@ def _computeBrightDetectionMask(self, maskedImage, convolveResults): brightDetectedMask : `numpy.ndarray` Boolean array representing the union of the bright detection pass DETECTED and DETECTED_NEGATIVE masks. + brightFactorNeg : `float` + Factor applied to the threshold for negative polarity detections. + This can get altered significantly in background over-subtracted + images and is useful to know for subsequent steps in the dynamic + detection. """ # Initialize some parameters. - brightPosFactor = ( - self.config.prelimThresholdFactor*self.config.brightMultiplier/self.config.bisectFactor + brightFactorPos = ( + self.config.prelimThresholdFactor*self.config.brightMultiplier ) - brightNegFactor = self.config.brightNegFactor/self.config.bisectFactor - nPix = 1 - nPixDet = 1 - nPixDetNeg = 1 + brightFactorNeg = self.config.brightNegFactor brightMaskFractionMax = self.config.brightMaskFractionMax + # Set a lower max value tolerated for negative detection mask fraction. + brightMaskNegFractionMax = max(0.3, 0.75*brightMaskFractionMax) + + badPixelMask = lsst.afw.image.Mask.getPlaneBitMask(["NO_DATA", "BAD"]) + nGoodPix = np.sum(maskedImage.mask.array & badPixelMask == 0) # Loop until masked fraction is smaller than # brightMaskFractionMax, increasing the thresholds by @@ -708,32 +747,52 @@ def _computeBrightDetectionMask(self, maskedImage, convolveResults): # for current defaults). for nIter in range(self.config.brightDetectionIterMax): self.clearMask(maskedImage.mask) - brightPosFactor *= self.config.bisectFactor - brightNegFactor *= self.config.bisectFactor prelimBright = self.applyThreshold(convolveResults.middle, maskedImage.getBBox(), - factor=brightPosFactor, factorNeg=brightNegFactor) + factor=brightFactorPos, factorNeg=brightFactorNeg) self.finalizeFootprints( maskedImage.mask, prelimBright, convolveResults.sigma*self.config.brightGrowFactor, - factor=brightPosFactor, factorNeg=brightNegFactor + factor=brightFactorPos, factorNeg=brightFactorNeg ) # Check that not too many pixels got masked. - nPix = maskedImage.mask.array.size - nPixDet = countMaskedPixels(maskedImage, "DETECTED") + detectedPosPixelMask = lsst.afw.image.Mask.getPlaneBitMask(["DETECTED"]) + detectedNegPixelMask = lsst.afw.image.Mask.getPlaneBitMask(["DETECTED_NEGATIVE"]) + badPixelMask = lsst.afw.image.Mask.getPlaneBitMask(["NO_DATA", "BAD"]) + nPixDetPos = np.sum((maskedImage.mask.array & detectedPosPixelMask != 0) + & (maskedImage.mask.array & badPixelMask == 0)) + nPixDetNeg = np.sum((maskedImage.mask.array & detectedNegPixelMask != 0) + & (maskedImage.mask.array & badPixelMask == 0)) self.log.info("Number (%) of bright DETECTED pix: {} ({:.1f}%)". - format(nPixDet, 100*nPixDet/nPix)) - nPixDetNeg = countMaskedPixels(maskedImage, "DETECTED_NEGATIVE") + format(nPixDetPos, 100*nPixDetPos/nGoodPix)) self.log.info("Number (%) of bright DETECTED_NEGATIVE pix: {} ({:.1f}%)". - format(nPixDetNeg, 100*nPixDetNeg/nPix)) - if nPixDetNeg/nPix > brightMaskFractionMax or nPixDet/nPix > brightMaskFractionMax: - self.log.warning("Too high a fraction (%.2f > %.2f) of pixels were masked with current " - "\"bright\" detection round thresholds (at nIter = %d). Increasing by " - "a factor of %.2f and trying again.", max(nPixDetNeg, nPixDet)/nPix, - brightMaskFractionMax, nIter, self.config.bisectFactor) + format(nPixDetNeg, 100*nPixDetNeg/nGoodPix)) + + if nPixDetPos/nGoodPix > brightMaskFractionMax or nPixDetNeg/nGoodPix > brightMaskNegFractionMax: if nIter == self.config.brightDetectionIterMax - 1: self.log.warning("Reached maximum number of iterations and still have too high " "detected mask fractions in bright detection pass. Image is " "likely mostly masked with BAD or NO_DATA or \"bad\" in some " "other respect (so expected to likely fail further downstream).") + break + if nPixDetPos/nGoodPix > brightMaskFractionMax: + brightFactorPos *= self.config.bisectFactor + self.log.warning("Too high a fraction (%.2f > %.2f) of pixels were masked as " + "DETECTED with current \"bright\" detection round thresholds " + "(at nIter = %d). Increasing to a factor of %.2f and trying again.", + nPixDetPos/nGoodPix, brightMaskFractionMax, nIter, brightFactorPos) + if nPixDetNeg/nGoodPix > brightMaskNegFractionMax: + extraFactorNeg = 1.2 + if nPixDetNeg/nGoodPix > min(0.98, 1.25*brightMaskNegFractionMax): + if nIter == 0: + extraFactorNeg = 3.0 + elif nPixDetNeg/nGoodPix > 0.9999: + extraFactorNeg = 1.8 + else: + extraFactorNeg = 1.5 + brightFactorNeg *= self.config.bisectFactor*extraFactorNeg + self.log.warning("Too high a fraction (%.2f > %.2f) of pixels were masked as " + "DETECTED_NEGATIVE with current \"bright\" detection round thresholds " + "(at nIter = %d). Increasing to a factor of %.2f and trying again.", + nPixDetNeg/nGoodPix, brightMaskNegFractionMax, nIter, brightFactorNeg) else: break @@ -742,7 +801,7 @@ def _computeBrightDetectionMask(self, maskedImage, convolveResults): brightDetectedMask = (maskedImage.mask.array & maskedImage.mask.getPlaneBitMask(["DETECTED", "DETECTED_NEGATIVE"])) self.clearMask(maskedImage.mask) - return brightDetectedMask + return brightDetectedMask, brightFactorNeg def countMaskedPixels(maskedIm, maskPlane): From 1a7f90ba9634867de276dcc37d54a509e037c92c Mon Sep 17 00:00:00 2001 From: Lauren MacArthur Date: Sun, 24 May 2026 12:16:34 -0700 Subject: [PATCH 8/8] Implement growOverride in finalizeFootprints This fixes a bug where the override was getting ingored. --- python/lsst/meas/algorithms/detection.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/python/lsst/meas/algorithms/detection.py b/python/lsst/meas/algorithms/detection.py index ba6b6170a..01e51aa75 100644 --- a/python/lsst/meas/algorithms/detection.py +++ b/python/lsst/meas/algorithms/detection.py @@ -652,22 +652,28 @@ def finalizeFootprints(self, mask, results, sigma, factor=1.0, factorNeg=None, g factor : `float`, optional Multiplier for the configured threshold. Note that this is only used here for logging purposes. - factorNeg : `float` or `None` + factorNeg : `float` or `None`, optional Multiplier used for the negative detection polarity threshold. If `None`, a factor equal to ``factor`` (i.e. equal to the one used for positive detection polarity) is assumed. Note that this is only used here for logging purposes. + growOverride : `float` or `None`, optional + Override to use for ``nSigmaToGrow``, regardless of the value set + in ``config.nSigmaToGrow``. """ if growOverride is not None: self.log.warning("config.nSigmaToGrow is set to %.2f, but the caller has set " "growOverride to %.2f, so the footprints will be grown by " "%.2f sigma.", self.config.nSigmaToGrow, growOverride, growOverride) + nSigmaToGrow = growOverride + else: + nSigmaToGrow = self.config.nSigmaToGrow factorNeg = factor if factorNeg is None else factorNeg for polarity, maskName in (("positive", "DETECTED"), ("negative", "DETECTED_NEGATIVE")): fpSet = getattr(results, polarity) if fpSet is None: continue - if self.config.nSigmaToGrow > 0: + if nSigmaToGrow > 0: nGrow = int((self.config.nSigmaToGrow * sigma) + 0.5) self.metadata["nGrow"] = nGrow if self.config.combinedGrow: