{"abstract":"The economizer toggles on and off every sample when outdoor temperature hovers at the high limit.","category":"HVAC thermostat control","checks":8,"contract":"Rooftop economizer per sample; samples are [outdoor, return_air, cooling_call, mixed_air, occupied] in tenths F. Economizing is enabled when outdoor <= high_limit - 2.0 F and outdoor < return - diff, and disabled when outdoor > high_limit or outdoor >= return. Unoccupied: damper 0%. Occupied, enabled and cooling: if mixed air < mat_low the damper steps down 10% but not below min_pos, otherwise it steps up 20% from at least min_pos, capped at 100%. Otherwise the damper sits at min_pos. Return [enabled, damper%] per sample.","evaluation_group":"w2-hvac-thermostat-control-dry-bulb-economizer","failed_approach":"Halving the differential still leaves too narrow a band.","family":"w2-hvac-thermostat-control-dry-bulb-economizer-high-limit-enable-band","id":"FA-92526","implementations":{"attempt":{"sha256":"db9305bf3a3b4556f0a81fdbb214cec3c5cbb46d10705845b849da4fb04119a3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    enabled = False\n    pos = 0\n    out = []\n    for outdoor, ret, cooling, mixed, occupied in samples:\n        if enabled and (outdoor > settings['high_limit'] or outdoor >= ret):\n            enabled = False\n        elif not enabled and outdoor <= settings['high_limit'] - 10 and outdoor < ret - settings['diff']:\n            enabled = True\n        if not occupied:\n            pos = 0\n        elif enabled and cooling:\n            if mixed < settings['mat_low']:\n                pos = max(settings['min_pos'], pos - 10)\n            else:\n                pos = min(100, max(settings['min_pos'], pos) + 20)\n        else:\n            pos = settings['min_pos']\n        out.append([enabled, pos])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: scenario 4',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 15, 'mat_low': 530},\n    [[739, 710, True, 528, True],\n     [721, 715, True, 537, True],\n     [696, 760, False, 541, True],\n     [680, 735, True, 575, True],\n     [646, 726, True, 550, True],\n     [633, 731, False, 494, True],\n     [598, 704, True, 565, True],\n     [608, 716, False, 614, True]]],\n   [[False, 15], [False, 15], [False, 15], [False, 15], [False, 15], [False, 15], [True, 35], [True, 15]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[648, 701, True, 604, True],\n     [640, 708, True, 484, True],\n     [671, 716, True, 536, True],\n     [649, 721, True, 616, False],\n     [640, 749, True, 619, True],\n     [651, 751, True, 599, True],\n     [669, 718, False, 504, True],\n     [638, 704, False, 542, True]]],\n   [[True, 40], [True, 30], [True, 50], [True, 0], [True, 40], [True, 60], [True, 20], [True, 20]]],\n  ['control: scenario 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[460, 757, True, 619, True],\n     [462, 720, False, 618, True],\n     [502, 734, True, 534, True],\n     [488, 707, False, 516, True],\n     [450, 735, False, 496, True],\n     [472, 754, True, 606, True],\n     [477, 741, False, 575, True],\n     [452, 710, True, 531, True],\n     [431, 759, False, 576, True]]],\n   [[True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20]]]],\n [['regression: scenario 4',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 500},\n    [[637, 708, True, 552, True],\n     [645, 735, True, 591, True],\n     [634, 703, True, 564, True],\n     [622, 710, True, 543, True],\n     [634, 716, True, 534, False],\n     [647, 753, True, 529, True],\n     [619, 706, True, 541, True],\n     [596, 740, True, 617, True],\n     [590, 749, True, 524, True],\n     [592, 739, True, 566, False],\n     [581, 721, True, 554, True],\n     [593, 737, False, 599, True],\n     [572, 760, True, 524, True],\n     [560, 714, True, 512, True]]],\n   [[False, 30],\n    [False, 30],\n    [False, 30],\n    [True, 50],\n    [True, 0],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 100],\n    [True, 0],\n    [True, 50],\n    [True, 30],\n    [True, 50],\n    [True, 70]]],\n  ['regression: scenario 10',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[641, 705, True, 484, True],\n     [633, 750, True, 549, True],\n     [611, 743, False, 559, True],\n     [596, 715, True, 522, True],\n     [625, 713, True, 564, True],\n     [641, 703, True, 560, True],\n     [618, 717, True, 585, True],\n     [632, 711, False, 552, True],\n     [608, 758, True, 602, True]]],\n   [[False, 30],\n    [False, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 30],\n    [True, 50]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 500},\n    [[754, 754, False, 483, False],\n     [716, 749, True, 499, True],\n     [699, 701, False, 573, True],\n     [694, 750, True, 534, False],\n     [704, 716, False, 517, True],\n     [708, 701, False, 567, True],\n     [743, 735, True, 609, True],\n     [775, 747, False, 554, True],\n     [743, 731, False, 583, False],\n     [764, 708, False, 507, True],\n     [795, 743, False, 528, True],\n     [770, 706, True, 501, True],\n     [764, 752, False, 578, True]]],\n   [[False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30]]]],\n [['regression: scenario 6',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 20, 'mat_low': 530},\n    [[763, 718, True, 585, True],\n     [759, 718, True, 579, True],\n     [756, 741, True, 590, True],\n     [742, 724, True, 569, True],\n     [765, 717, True, 612, True],\n     [763, 727, False, 522, True],\n     [735, 744, True, 480, True],\n     [715, 733, True, 519, True],\n     [685, 712, True, 608, True],\n     [656, 730, True, 484, True],\n     [659, 758, False, 561, True],\n     [625, 726, True, 500, True],\n     [640, 750, True, 506, True],\n     [640, 711, False, 549, True]]],\n   [[False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20]]],\n  ['regression: scenario 16',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[672, 743, True, 486, True],\n     [641, 721, True, 613, True],\n     [636, 726, True, 567, True],\n     [600, 723, False, 611, True],\n     [561, 754, True, 587, True],\n     [567, 709, True, 591, True],\n     [546, 754, False, 499, False],\n     [561, 729, False, 540, True]]],\n   [[False, 30], [False, 30], [False, 30], [True, 30], [True, 50], [True, 70], [True, 0], [True, 30]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['regression: scenario 1',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[678, 721, True, 495, True],\n     [646, 726, True, 616, True],\n     [669, 714, True, 600, True],\n     [630, 728, True, 542, True],\n     [626, 751, True, 530, False],\n     [638, 723, False, 607, True],\n     [654, 706, True, 557, True],\n     [625, 704, False, 618, True]]],\n   [[False, 20], [False, 20], [False, 20], [True, 40], [True, 0], [True, 20], [False, 20], [True, 20]]]],\n [['regression: scenario 17',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 530},\n    [[669, 750, False, 557, False],\n     [688, 701, True, 577, True],\n     [671, 744, False, 534, True],\n     [651, 716, False, 567, True],\n     [680, 702, False, 569, True],\n     [640, 740, True, 559, True],\n     [657, 721, True, 556, True],\n     [650, 721, True, 516, True],\n     [682, 741, True, 511, True],\n     [700, 718, True, 582, True],\n     [730, 724, True, 482, True],\n     [724, 715, False, 517, False],\n     [685, 716, False, 568, True],\n     [683, 729, True, 588, True]]],\n   [[True, 0],\n    [True, 35],\n    [True, 15],\n    [True, 15],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 45],\n    [True, 35],\n    [True, 55],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15]]],\n  ['regression: scenario 48',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[746, 701, True, 531, True],\n     [717, 709, True, 611, True],\n     [737, 722, True, 489, True],\n     [744, 712, True, 498, True],\n     [731, 701, True, 552, True],\n     [701, 730, True, 531, True],\n     [738, 741, True, 619, True],\n     [742, 738, True, 561, True],\n     [771, 757, True, 582, True],\n     [785, 738, False, 566, True],\n     [760, 739, True, 489, True],\n     [748, 757, True, 534, True],\n     [734, 758, True, 568, True],\n     [750, 722, False, 549, True]]],\n   [[False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [True, 50],\n    [True, 70],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[505, 738, False, 612, True],\n     [535, 706, True, 498, True],\n     [549, 734, False, 604, True],\n     [558, 729, True, 521, True],\n     [540, 724, True, 571, True],\n     [530, 749, True, 592, True],\n     [507, 715, True, 533, False],\n     [468, 703, False, 516, True],\n     [457, 715, False, 563, True],\n     [444, 708, False, 513, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30]]]],\n [['regression: scenario 26',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[601, 732, False, 620, True],\n     [635, 736, True, 571, True],\n     [666, 716, False, 556, True],\n     [646, 714, False, 491, True],\n     [625, 747, True, 525, True],\n     [631, 760, True, 584, True],\n     [640, 723, True, 496, True],\n     [600, 744, False, 537, True],\n     [579, 717, True, 514, True],\n     [611, 736, False, 614, True],\n     [639, 745, False, 496, True],\n     [602, 732, False, 490, False]]],\n   [[True, 15],\n    [True, 35],\n    [False, 15],\n    [False, 15],\n    [True, 35],\n    [True, 55],\n    [True, 45],\n    [True, 15],\n    [True, 35],\n    [True, 15],\n    [True, 15],\n    [True, 0]]],\n  ['regression: scenario 36',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[679, 739, True, 601, True],\n     [689, 742, True, 510, True],\n     [652, 741, True, 598, True],\n     [631, 734, True, 539, True],\n     [671, 731, False, 552, False],\n     [637, 737, False, 532, True],\n     [675, 744, False, 599, True],\n     [666, 748, True, 508, True],\n     [661, 721, True, 577, True]]],\n   [[False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[684, 714, False, 579, True],\n     [715, 719, False, 481, True],\n     [737, 759, True, 615, False],\n     [715, 756, True, 609, False],\n     [743, 742, True, 491, True],\n     [776, 713, False, 491, True],\n     [798, 748, False, 566, True],\n     [800, 751, True, 547, True],\n     [800, 736, True, 486, True],\n     [760, 727, False, 570, True]]],\n   [[True, 20],\n    [True, 20],\n    [True, 0],\n    [True, 0],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"2f08e64f5b28ab6ebf727cdffc650ab83ad79b6f21ef639ca81da0da19e94bf6","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    enabled = False\n    pos = 0\n    out = []\n    for outdoor, ret, cooling, mixed, occupied in samples:\n        if enabled and (outdoor > settings['high_limit'] or outdoor >= ret):\n            enabled = False\n        elif not enabled and outdoor <= settings['high_limit'] and outdoor < ret - settings['diff']:\n            enabled = True\n        if not occupied:\n            pos = 0\n        elif enabled and cooling:\n            if mixed < settings['mat_low']:\n                pos = max(settings['min_pos'], pos - 10)\n            else:\n                pos = min(100, max(settings['min_pos'], pos) + 20)\n        else:\n            pos = settings['min_pos']\n        out.append([enabled, pos])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: scenario 4',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 15, 'mat_low': 530},\n    [[739, 710, True, 528, True],\n     [721, 715, True, 537, True],\n     [696, 760, False, 541, True],\n     [680, 735, True, 575, True],\n     [646, 726, True, 550, True],\n     [633, 731, False, 494, True],\n     [598, 704, True, 565, True],\n     [608, 716, False, 614, True]]],\n   [[False, 15], [False, 15], [False, 15], [False, 15], [False, 15], [False, 15], [True, 35], [True, 15]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[648, 701, True, 604, True],\n     [640, 708, True, 484, True],\n     [671, 716, True, 536, True],\n     [649, 721, True, 616, False],\n     [640, 749, True, 619, True],\n     [651, 751, True, 599, True],\n     [669, 718, False, 504, True],\n     [638, 704, False, 542, True]]],\n   [[True, 40], [True, 30], [True, 50], [True, 0], [True, 40], [True, 60], [True, 20], [True, 20]]],\n  ['control: scenario 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[460, 757, True, 619, True],\n     [462, 720, False, 618, True],\n     [502, 734, True, 534, True],\n     [488, 707, False, 516, True],\n     [450, 735, False, 496, True],\n     [472, 754, True, 606, True],\n     [477, 741, False, 575, True],\n     [452, 710, True, 531, True],\n     [431, 759, False, 576, True]]],\n   [[True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20]]]],\n [['regression: scenario 4',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 500},\n    [[637, 708, True, 552, True],\n     [645, 735, True, 591, True],\n     [634, 703, True, 564, True],\n     [622, 710, True, 543, True],\n     [634, 716, True, 534, False],\n     [647, 753, True, 529, True],\n     [619, 706, True, 541, True],\n     [596, 740, True, 617, True],\n     [590, 749, True, 524, True],\n     [592, 739, True, 566, False],\n     [581, 721, True, 554, True],\n     [593, 737, False, 599, True],\n     [572, 760, True, 524, True],\n     [560, 714, True, 512, True]]],\n   [[False, 30],\n    [False, 30],\n    [False, 30],\n    [True, 50],\n    [True, 0],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 100],\n    [True, 0],\n    [True, 50],\n    [True, 30],\n    [True, 50],\n    [True, 70]]],\n  ['regression: scenario 10',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[641, 705, True, 484, True],\n     [633, 750, True, 549, True],\n     [611, 743, False, 559, True],\n     [596, 715, True, 522, True],\n     [625, 713, True, 564, True],\n     [641, 703, True, 560, True],\n     [618, 717, True, 585, True],\n     [632, 711, False, 552, True],\n     [608, 758, True, 602, True]]],\n   [[False, 30],\n    [False, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 30],\n    [True, 50]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 500},\n    [[754, 754, False, 483, False],\n     [716, 749, True, 499, True],\n     [699, 701, False, 573, True],\n     [694, 750, True, 534, False],\n     [704, 716, False, 517, True],\n     [708, 701, False, 567, True],\n     [743, 735, True, 609, True],\n     [775, 747, False, 554, True],\n     [743, 731, False, 583, False],\n     [764, 708, False, 507, True],\n     [795, 743, False, 528, True],\n     [770, 706, True, 501, True],\n     [764, 752, False, 578, True]]],\n   [[False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30]]]],\n [['regression: scenario 6',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 20, 'mat_low': 530},\n    [[763, 718, True, 585, True],\n     [759, 718, True, 579, True],\n     [756, 741, True, 590, True],\n     [742, 724, True, 569, True],\n     [765, 717, True, 612, True],\n     [763, 727, False, 522, True],\n     [735, 744, True, 480, True],\n     [715, 733, True, 519, True],\n     [685, 712, True, 608, True],\n     [656, 730, True, 484, True],\n     [659, 758, False, 561, True],\n     [625, 726, True, 500, True],\n     [640, 750, True, 506, True],\n     [640, 711, False, 549, True]]],\n   [[False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20]]],\n  ['regression: scenario 16',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[672, 743, True, 486, True],\n     [641, 721, True, 613, True],\n     [636, 726, True, 567, True],\n     [600, 723, False, 611, True],\n     [561, 754, True, 587, True],\n     [567, 709, True, 591, True],\n     [546, 754, False, 499, False],\n     [561, 729, False, 540, True]]],\n   [[False, 30], [False, 30], [False, 30], [True, 30], [True, 50], [True, 70], [True, 0], [True, 30]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['regression: scenario 1',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[678, 721, True, 495, True],\n     [646, 726, True, 616, True],\n     [669, 714, True, 600, True],\n     [630, 728, True, 542, True],\n     [626, 751, True, 530, False],\n     [638, 723, False, 607, True],\n     [654, 706, True, 557, True],\n     [625, 704, False, 618, True]]],\n   [[False, 20], [False, 20], [False, 20], [True, 40], [True, 0], [True, 20], [False, 20], [True, 20]]]],\n [['regression: scenario 17',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 530},\n    [[669, 750, False, 557, False],\n     [688, 701, True, 577, True],\n     [671, 744, False, 534, True],\n     [651, 716, False, 567, True],\n     [680, 702, False, 569, True],\n     [640, 740, True, 559, True],\n     [657, 721, True, 556, True],\n     [650, 721, True, 516, True],\n     [682, 741, True, 511, True],\n     [700, 718, True, 582, True],\n     [730, 724, True, 482, True],\n     [724, 715, False, 517, False],\n     [685, 716, False, 568, True],\n     [683, 729, True, 588, True]]],\n   [[True, 0],\n    [True, 35],\n    [True, 15],\n    [True, 15],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 45],\n    [True, 35],\n    [True, 55],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15]]],\n  ['regression: scenario 48',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[746, 701, True, 531, True],\n     [717, 709, True, 611, True],\n     [737, 722, True, 489, True],\n     [744, 712, True, 498, True],\n     [731, 701, True, 552, True],\n     [701, 730, True, 531, True],\n     [738, 741, True, 619, True],\n     [742, 738, True, 561, True],\n     [771, 757, True, 582, True],\n     [785, 738, False, 566, True],\n     [760, 739, True, 489, True],\n     [748, 757, True, 534, True],\n     [734, 758, True, 568, True],\n     [750, 722, False, 549, True]]],\n   [[False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [True, 50],\n    [True, 70],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[505, 738, False, 612, True],\n     [535, 706, True, 498, True],\n     [549, 734, False, 604, True],\n     [558, 729, True, 521, True],\n     [540, 724, True, 571, True],\n     [530, 749, True, 592, True],\n     [507, 715, True, 533, False],\n     [468, 703, False, 516, True],\n     [457, 715, False, 563, True],\n     [444, 708, False, 513, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30]]]],\n [['regression: scenario 26',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[601, 732, False, 620, True],\n     [635, 736, True, 571, True],\n     [666, 716, False, 556, True],\n     [646, 714, False, 491, True],\n     [625, 747, True, 525, True],\n     [631, 760, True, 584, True],\n     [640, 723, True, 496, True],\n     [600, 744, False, 537, True],\n     [579, 717, True, 514, True],\n     [611, 736, False, 614, True],\n     [639, 745, False, 496, True],\n     [602, 732, False, 490, False]]],\n   [[True, 15],\n    [True, 35],\n    [False, 15],\n    [False, 15],\n    [True, 35],\n    [True, 55],\n    [True, 45],\n    [True, 15],\n    [True, 35],\n    [True, 15],\n    [True, 15],\n    [True, 0]]],\n  ['regression: scenario 36',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[679, 739, True, 601, True],\n     [689, 742, True, 510, True],\n     [652, 741, True, 598, True],\n     [631, 734, True, 539, True],\n     [671, 731, False, 552, False],\n     [637, 737, False, 532, True],\n     [675, 744, False, 599, True],\n     [666, 748, True, 508, True],\n     [661, 721, True, 577, True]]],\n   [[False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[684, 714, False, 579, True],\n     [715, 719, False, 481, True],\n     [737, 759, True, 615, False],\n     [715, 756, True, 609, False],\n     [743, 742, True, 491, True],\n     [776, 713, False, 491, True],\n     [798, 748, False, 566, True],\n     [800, 751, True, 547, True],\n     [800, 736, True, 486, True],\n     [760, 727, False, 570, True]]],\n   [[True, 20],\n    [True, 20],\n    [True, 0],\n    [True, 0],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"0e158c65b9a2769e35e65948eccdf6424faa60b54b3d02bca8f76eb2381bf91b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(settings, samples):\n    enabled = False\n    pos = 0\n    out = []\n    for outdoor, ret, cooling, mixed, occupied in samples:\n        if enabled and (outdoor > settings['high_limit'] or outdoor >= ret):\n            enabled = False\n        elif not enabled and outdoor <= settings['high_limit'] - 20 and outdoor < ret - settings['diff']:\n            enabled = True\n        if not occupied:\n            pos = 0\n        elif enabled and cooling:\n            if mixed < settings['mat_low']:\n                pos = max(settings['min_pos'], pos - 10)\n            else:\n                pos = min(100, max(settings['min_pos'], pos) + 20)\n        else:\n            pos = settings['min_pos']\n        out.append([enabled, pos])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['regression: scenario 4',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 15, 'mat_low': 530},\n    [[739, 710, True, 528, True],\n     [721, 715, True, 537, True],\n     [696, 760, False, 541, True],\n     [680, 735, True, 575, True],\n     [646, 726, True, 550, True],\n     [633, 731, False, 494, True],\n     [598, 704, True, 565, True],\n     [608, 716, False, 614, True]]],\n   [[False, 15], [False, 15], [False, 15], [False, 15], [False, 15], [False, 15], [True, 35], [True, 15]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[648, 701, True, 604, True],\n     [640, 708, True, 484, True],\n     [671, 716, True, 536, True],\n     [649, 721, True, 616, False],\n     [640, 749, True, 619, True],\n     [651, 751, True, 599, True],\n     [669, 718, False, 504, True],\n     [638, 704, False, 542, True]]],\n   [[True, 40], [True, 30], [True, 50], [True, 0], [True, 40], [True, 60], [True, 20], [True, 20]]],\n  ['control: scenario 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[460, 757, True, 619, True],\n     [462, 720, False, 618, True],\n     [502, 734, True, 534, True],\n     [488, 707, False, 516, True],\n     [450, 735, False, 496, True],\n     [472, 754, True, 606, True],\n     [477, 741, False, 575, True],\n     [452, 710, True, 531, True],\n     [431, 759, False, 576, True]]],\n   [[True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 20],\n    [True, 40],\n    [True, 20],\n    [True, 40],\n    [True, 20]]]],\n [['regression: scenario 4',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 500},\n    [[637, 708, True, 552, True],\n     [645, 735, True, 591, True],\n     [634, 703, True, 564, True],\n     [622, 710, True, 543, True],\n     [634, 716, True, 534, False],\n     [647, 753, True, 529, True],\n     [619, 706, True, 541, True],\n     [596, 740, True, 617, True],\n     [590, 749, True, 524, True],\n     [592, 739, True, 566, False],\n     [581, 721, True, 554, True],\n     [593, 737, False, 599, True],\n     [572, 760, True, 524, True],\n     [560, 714, True, 512, True]]],\n   [[False, 30],\n    [False, 30],\n    [False, 30],\n    [True, 50],\n    [True, 0],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 100],\n    [True, 0],\n    [True, 50],\n    [True, 30],\n    [True, 50],\n    [True, 70]]],\n  ['regression: scenario 10',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[641, 705, True, 484, True],\n     [633, 750, True, 549, True],\n     [611, 743, False, 559, True],\n     [596, 715, True, 522, True],\n     [625, 713, True, 564, True],\n     [641, 703, True, 560, True],\n     [618, 717, True, 585, True],\n     [632, 711, False, 552, True],\n     [608, 758, True, 602, True]]],\n   [[False, 30],\n    [False, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 30],\n    [True, 50]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 500},\n    [[754, 754, False, 483, False],\n     [716, 749, True, 499, True],\n     [699, 701, False, 573, True],\n     [694, 750, True, 534, False],\n     [704, 716, False, 517, True],\n     [708, 701, False, 567, True],\n     [743, 735, True, 609, True],\n     [775, 747, False, 554, True],\n     [743, 731, False, 583, False],\n     [764, 708, False, 507, True],\n     [795, 743, False, 528, True],\n     [770, 706, True, 501, True],\n     [764, 752, False, 578, True]]],\n   [[False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30]]]],\n [['regression: scenario 6',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 20, 'mat_low': 530},\n    [[763, 718, True, 585, True],\n     [759, 718, True, 579, True],\n     [756, 741, True, 590, True],\n     [742, 724, True, 569, True],\n     [765, 717, True, 612, True],\n     [763, 727, False, 522, True],\n     [735, 744, True, 480, True],\n     [715, 733, True, 519, True],\n     [685, 712, True, 608, True],\n     [656, 730, True, 484, True],\n     [659, 758, False, 561, True],\n     [625, 726, True, 500, True],\n     [640, 750, True, 506, True],\n     [640, 711, False, 549, True]]],\n   [[False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20],\n    [True, 20]]],\n  ['regression: scenario 16',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[672, 743, True, 486, True],\n     [641, 721, True, 613, True],\n     [636, 726, True, 567, True],\n     [600, 723, False, 611, True],\n     [561, 754, True, 587, True],\n     [567, 709, True, 591, True],\n     [546, 754, False, 499, False],\n     [561, 729, False, 540, True]]],\n   [[False, 30], [False, 30], [False, 30], [True, 30], [True, 50], [True, 70], [True, 0], [True, 30]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['regression: scenario 1',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[678, 721, True, 495, True],\n     [646, 726, True, 616, True],\n     [669, 714, True, 600, True],\n     [630, 728, True, 542, True],\n     [626, 751, True, 530, False],\n     [638, 723, False, 607, True],\n     [654, 706, True, 557, True],\n     [625, 704, False, 618, True]]],\n   [[False, 20], [False, 20], [False, 20], [True, 40], [True, 0], [True, 20], [False, 20], [True, 20]]]],\n [['regression: scenario 17',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 530},\n    [[669, 750, False, 557, False],\n     [688, 701, True, 577, True],\n     [671, 744, False, 534, True],\n     [651, 716, False, 567, True],\n     [680, 702, False, 569, True],\n     [640, 740, True, 559, True],\n     [657, 721, True, 556, True],\n     [650, 721, True, 516, True],\n     [682, 741, True, 511, True],\n     [700, 718, True, 582, True],\n     [730, 724, True, 482, True],\n     [724, 715, False, 517, False],\n     [685, 716, False, 568, True],\n     [683, 729, True, 588, True]]],\n   [[True, 0],\n    [True, 35],\n    [True, 15],\n    [True, 15],\n    [True, 15],\n    [True, 35],\n    [True, 55],\n    [True, 45],\n    [True, 35],\n    [True, 55],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15]]],\n  ['regression: scenario 48',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[746, 701, True, 531, True],\n     [717, 709, True, 611, True],\n     [737, 722, True, 489, True],\n     [744, 712, True, 498, True],\n     [731, 701, True, 552, True],\n     [701, 730, True, 531, True],\n     [738, 741, True, 619, True],\n     [742, 738, True, 561, True],\n     [771, 757, True, 582, True],\n     [785, 738, False, 566, True],\n     [760, 739, True, 489, True],\n     [748, 757, True, 534, True],\n     [734, 758, True, 568, True],\n     [750, 722, False, 549, True]]],\n   [[False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [True, 50],\n    [True, 70],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[505, 738, False, 612, True],\n     [535, 706, True, 498, True],\n     [549, 734, False, 604, True],\n     [558, 729, True, 521, True],\n     [540, 724, True, 571, True],\n     [530, 749, True, 592, True],\n     [507, 715, True, 533, False],\n     [468, 703, False, 516, True],\n     [457, 715, False, 563, True],\n     [444, 708, False, 513, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 90],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30]]]],\n [['regression: scenario 26',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[601, 732, False, 620, True],\n     [635, 736, True, 571, True],\n     [666, 716, False, 556, True],\n     [646, 714, False, 491, True],\n     [625, 747, True, 525, True],\n     [631, 760, True, 584, True],\n     [640, 723, True, 496, True],\n     [600, 744, False, 537, True],\n     [579, 717, True, 514, True],\n     [611, 736, False, 614, True],\n     [639, 745, False, 496, True],\n     [602, 732, False, 490, False]]],\n   [[True, 15],\n    [True, 35],\n    [False, 15],\n    [False, 15],\n    [True, 35],\n    [True, 55],\n    [True, 45],\n    [True, 15],\n    [True, 35],\n    [True, 15],\n    [True, 15],\n    [True, 0]]],\n  ['regression: scenario 36',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[679, 739, True, 601, True],\n     [689, 742, True, 510, True],\n     [652, 741, True, 598, True],\n     [631, 734, True, 539, True],\n     [671, 731, False, 552, False],\n     [637, 737, False, 532, True],\n     [675, 744, False, 599, True],\n     [666, 748, True, 508, True],\n     [661, 721, True, 577, True]]],\n   [[False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15]]],\n  ['control: economizer cycle',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[600, 740, True, 560, True],\n     [600, 740, True, 560, True],\n     [600, 740, True, 520, True],\n     [690, 740, True, 560, True],\n     [705, 740, True, 560, True],\n     [600, 740, False, 560, True],\n     [600, 740, True, 560, False]]],\n   [[True, 40], [True, 60], [True, 50], [True, 70], [False, 20], [True, 20], [True, 0]]],\n  ['regression: enable band edges',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[681, 740, True, 560, True],\n     [680, 700, True, 560, True],\n     [680, 701, True, 560, True],\n     [700, 750, True, 560, True],\n     [710, 750, True, 560, True]]],\n   [[False, 20], [False, 20], [True, 40], [True, 60], [False, 20]]],\n  ['control: cold mixed air',\n   [{'high_limit': 700, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[450, 720, True, 600, True],\n     [450, 720, True, 600, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True],\n     [450, 720, True, 500, True]]],\n   [[True, 50], [True, 70], [True, 60], [True, 50], [True, 40], [True, 30]]],\n  ['control: night cooling call',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[550, 740, True, 560, False], [550, 740, True, 560, True]]],\n   [[True, 0], [True, 40]]],\n  ['control: near return disable',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 15, 'mat_low': 500},\n    [[700, 730, True, 560, True],\n     [715, 730, True, 560, True],\n     [725, 730, True, 560, True],\n     [730, 730, True, 560, True]]],\n   [[True, 35], [True, 55], [True, 75], [False, 15]]],\n  ['control: scenario 1',\n   [{'high_limit': 750, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[684, 714, False, 579, True],\n     [715, 719, False, 481, True],\n     [737, 759, True, 615, False],\n     [715, 756, True, 609, False],\n     [743, 742, True, 491, True],\n     [776, 713, False, 491, True],\n     [798, 748, False, 566, True],\n     [800, 751, True, 547, True],\n     [800, 736, True, 486, True],\n     [760, 727, False, 570, True]]],\n   [[True, 20],\n    [True, 20],\n    [True, 0],\n    [True, 0],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20]]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic bounded teaching model of one thermostat or HVAC controller decision evaluated per sample. Temperatures are integer tenths of a degree Fahrenheit unless stated otherwise. The contract is a stipulated toy convention, not a claim of conformance to any manufacturer, ASHRAE guideline or code. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-hvac-thermostat-control-dry-bulb-economizer-high-limit-enable-band","generated_at":"2026-09-29T14:51:46.506758+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Residential and light-commercial thermostats make these decisions sample by sample; each defect changes equipment calls in a way that shows up as short cycling, comfort complaints or equipment stress.","repair":"Enable only at or below high_limit - 2.0 F; disable above high_limit.","root_cause":"The enable test uses outdoor <= high_limit instead of high_limit - 2.0 F.","sha256":"8ac148e55bfc57a9584860d9c238cb3bb56bc8e2ad1e9ebe2c90ebdb77bf3d67","title":"Economizer enables right at the high limit with no differential · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.517,"exit_code":1,"observations":[{"actual":[[true,40],[true,60],[true,80],[true,100],[false,20]],"check":"regression: enable band edges","expected":[[false,20],[false,20],[true,40],[true,60],[false,20]],"passed":false},{"actual":[[false,15],[false,15],[false,15],[false,15],[false,15],[true,15],[true,35],[true,15]],"check":"regression: scenario 4","expected":[[false,15],[false,15],[false,15],[false,15],[false,15],[false,15],[true,35],[true,15]],"passed":false},{"actual":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"check":"control: economizer cycle","expected":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"passed":true},{"actual":[[true,50],[true,70],[true,60],[true,50],[true,40],[true,30]],"check":"control: cold mixed air","expected":[[true,50],[true,70],[true,60],[true,50],[true,40],[true,30]],"passed":true},{"actual":[[true,0],[true,40]],"check":"control: night cooling call","expected":[[true,0],[true,40]],"passed":true},{"actual":[[true,35],[true,55],[true,75],[false,15]],"check":"control: near return disable","expected":[[true,35],[true,55],[true,75],[false,15]],"passed":true},{"actual":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"check":"control: scenario 1","expected":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"passed":true},{"actual":[[true,40],[true,20],[true,40],[true,20],[true,20],[true,40],[true,20],[true,40],[true,20]],"check":"control: scenario 2","expected":[[true,40],[true,20],[true,40],[true,20],[true,20],[true,40],[true,20],[true,40],[true,20]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: enable band edges\", \"actual\": [[true, 40], [true, 60], [true, 80], [true, 100], [false, 20]], \"expected\": [[false, 20], [false, 20], [true, 40], [true, 60], [false, 20]], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [[false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [true, 15], [true, 35], [true, 15]], \"expected\": [[false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [true, 35], [true, 15]], \"passed\": false}, {\"check\": \"control: economizer cycle\", \"actual\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"expected\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"passed\": true}, {\"check\": \"control: cold mixed air\", \"actual\": [[true, 50], [true, 70], [true, 60], [true, 50], [true, 40], [true, 30]], \"expected\": [[true, 50], [true, 70], [true, 60], [true, 50], [true, 40], [true, 30]], \"passed\": true}, {\"check\": \"control: night cooling call\", \"actual\": [[true, 0], [true, 40]], \"expected\": [[true, 0], [true, 40]], \"passed\": true}, {\"check\": \"control: near return disable\", \"actual\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"expected\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[true, 40], [true, 20], [true, 40], [true, 20], [true, 20], [true, 40], [true, 20], [true, 40], [true, 20]], \"expected\": [[true, 40], [true, 20], [true, 40], [true, 20], [true, 20], [true, 40], [true, 20], [true, 40], [true, 20]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.609,"exit_code":1,"observations":[{"actual":[[true,40],[true,60],[true,80],[true,100],[false,20]],"check":"regression: enable band edges","expected":[[false,20],[false,20],[true,40],[true,60],[false,20]],"passed":false},{"actual":[[false,15],[false,15],[false,15],[false,15],[true,35],[true,15],[true,35],[true,15]],"check":"regression: scenario 4","expected":[[false,15],[false,15],[false,15],[false,15],[false,15],[false,15],[true,35],[true,15]],"passed":false},{"actual":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"check":"control: economizer cycle","expected":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"passed":true},{"actual":[[true,50],[true,70],[true,60],[true,50],[true,40],[true,30]],"check":"control: cold mixed air","expected":[[true,50],[true,70],[true,60],[true,50],[true,40],[true,30]],"passed":true},{"actual":[[true,0],[true,40]],"check":"control: night cooling call","expected":[[true,0],[true,40]],"passed":true},{"actual":[[true,35],[true,55],[true,75],[false,15]],"check":"control: near return disable","expected":[[true,35],[true,55],[true,75],[false,15]],"passed":true},{"actual":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"check":"control: scenario 1","expected":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"passed":true},{"actual":[[true,40],[true,20],[true,40],[true,20],[true,20],[true,40],[true,20],[true,40],[true,20]],"check":"control: scenario 2","expected":[[true,40],[true,20],[true,40],[true,20],[true,20],[true,40],[true,20],[true,40],[true,20]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: enable band edges\", \"actual\": [[true, 40], [true, 60], [true, 80], [true, 100], [false, 20]], \"expected\": [[false, 20], [false, 20], [true, 40], [true, 60], [false, 20]], \"passed\": false}, {\"check\": \"regression: scenario 4\", \"actual\": [[false, 15], [false, 15], [false, 15], [false, 15], [true, 35], [true, 15], [true, 35], [true, 15]], \"expected\": [[false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [true, 35], [true, 15]], \"passed\": false}, {\"check\": \"control: economizer cycle\", \"actual\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"expected\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"passed\": true}, {\"check\": \"control: cold mixed air\", \"actual\": [[true, 50], [true, 70], [true, 60], [true, 50], [true, 40], [true, 30]], \"expected\": [[true, 50], [true, 70], [true, 60], [true, 50], [true, 40], [true, 30]], \"passed\": true}, {\"check\": \"control: night cooling call\", \"actual\": [[true, 0], [true, 40]], \"expected\": [[true, 0], [true, 40]], \"passed\": true}, {\"check\": \"control: near return disable\", \"actual\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"expected\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[true, 40], [true, 20], [true, 40], [true, 20], [true, 20], [true, 40], [true, 20], [true, 40], [true, 20]], \"expected\": [[true, 40], [true, 20], [true, 40], [true, 20], [true, 20], [true, 40], [true, 20], [true, 40], [true, 20]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.741,"exit_code":0,"observations":[{"actual":[[false,20],[false,20],[true,40],[true,60],[false,20]],"check":"regression: enable band edges","expected":[[false,20],[false,20],[true,40],[true,60],[false,20]],"passed":true},{"actual":[[false,15],[false,15],[false,15],[false,15],[false,15],[false,15],[true,35],[true,15]],"check":"regression: scenario 4","expected":[[false,15],[false,15],[false,15],[false,15],[false,15],[false,15],[true,35],[true,15]],"passed":true},{"actual":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"check":"control: economizer cycle","expected":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"passed":true},{"actual":[[true,50],[true,70],[true,60],[true,50],[true,40],[true,30]],"check":"control: cold mixed air","expected":[[true,50],[true,70],[true,60],[true,50],[true,40],[true,30]],"passed":true},{"actual":[[true,0],[true,40]],"check":"control: night cooling call","expected":[[true,0],[true,40]],"passed":true},{"actual":[[true,35],[true,55],[true,75],[false,15]],"check":"control: near return disable","expected":[[true,35],[true,55],[true,75],[false,15]],"passed":true},{"actual":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"check":"control: scenario 1","expected":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"passed":true},{"actual":[[true,40],[true,20],[true,40],[true,20],[true,20],[true,40],[true,20],[true,40],[true,20]],"check":"control: scenario 2","expected":[[true,40],[true,20],[true,40],[true,20],[true,20],[true,40],[true,20],[true,40],[true,20]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: enable band edges\", \"actual\": [[false, 20], [false, 20], [true, 40], [true, 60], [false, 20]], \"expected\": [[false, 20], [false, 20], [true, 40], [true, 60], [false, 20]], \"passed\": true}, {\"check\": \"regression: scenario 4\", \"actual\": [[false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [true, 35], [true, 15]], \"expected\": [[false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [false, 15], [true, 35], [true, 15]], \"passed\": true}, {\"check\": \"control: economizer cycle\", \"actual\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"expected\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"passed\": true}, {\"check\": \"control: cold mixed air\", \"actual\": [[true, 50], [true, 70], [true, 60], [true, 50], [true, 40], [true, 30]], \"expected\": [[true, 50], [true, 70], [true, 60], [true, 50], [true, 40], [true, 30]], \"passed\": true}, {\"check\": \"control: night cooling call\", \"actual\": [[true, 0], [true, 40]], \"expected\": [[true, 0], [true, 40]], \"passed\": true}, {\"check\": \"control: near return disable\", \"actual\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"expected\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"passed\": true}, {\"check\": \"control: scenario 1\", \"actual\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"passed\": true}, {\"check\": \"control: scenario 2\", \"actual\": [[true, 40], [true, 20], [true, 40], [true, 20], [true, 20], [true, 40], [true, 20], [true, 40], [true, 20]], \"expected\": [[true, 40], [true, 20], [true, 40], [true, 20], [true, 20], [true, 40], [true, 20], [true, 40], [true, 20]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}