{"abstract":"The economizer brings in outdoor air overnight whenever a cooling call appears.","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":"Closing only when there is no cooling call still ventilates an empty building.","family":"w2-hvac-thermostat-control-dry-bulb-economizer-unoccupied-closure","id":"FA-92556","implementations":{"attempt":{"sha256":"17b2ee4d88a6b4d90655ad7c15a01516359e58e491d2553c38fd8be10fd38f05","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 and not cooling:\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: 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: 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: 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: 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': 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 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[608, 734, True, 493, True],\n     [609, 741, True, 531, True],\n     [587, 758, True, 553, True],\n     [561, 759, False, 498, False],\n     [530, 741, False, 509, True],\n     [544, 760, True, 493, True],\n     [548, 751, True, 583, True],\n     [512, 705, False, 540, False],\n     [490, 711, True, 562, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 0],\n    [True, 50]]]],\n [['regression: 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  ['regression: 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: 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: 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: 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 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[492, 750, False, 518, True],\n     [495, 710, True, 564, True],\n     [507, 701, True, 603, True],\n     [545, 705, False, 490, True],\n     [529, 724, True, 489, False],\n     [508, 721, True, 529, False],\n     [482, 717, True, 619, True],\n     [464, 753, False, 608, True],\n     [478, 719, False, 559, False],\n     [481, 730, False, 494, True],\n     [511, 719, False, 613, True],\n     [479, 743, False, 542, True],\n     [477, 728, True, 597, True],\n     [493, 756, False, 531, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 30],\n    [True, 0],\n    [True, 0],\n    [True, 50],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 30]]],\n  ['regression: scenario 3',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[715, 711, True, 506, True],\n     [744, 713, True, 551, True],\n     [732, 724, True, 568, True],\n     [758, 725, False, 532, True],\n     [795, 734, True, 552, True],\n     [788, 742, True, 497, True],\n     [760, 709, True, 515, False],\n     [769, 759, False, 564, True],\n     [795, 721, True, 546, True]]],\n   [[False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 0],\n    [False, 20],\n    [False, 20]]]],\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 2',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[599, 747, False, 570, True],\n     [625, 701, False, 603, True],\n     [623, 732, False, 565, False],\n     [624, 737, True, 482, True],\n     [637, 740, False, 485, True],\n     [676, 702, True, 590, True],\n     [678, 755, True, 522, True],\n     [670, 733, True, 571, True],\n     [684, 712, True, 616, False],\n     [687, 736, True, 607, False],\n     [712, 739, False, 524, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 0],\n    [False, 30]]],\n  ['regression: 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: 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  ['regression: 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 3',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[761, 714, True, 573, False],\n     [780, 758, False, 588, True],\n     [761, 703, True, 548, True],\n     [746, 756, True, 495, True],\n     [714, 752, True, 488, True],\n     [754, 748, True, 509, True],\n     [719, 713, True, 561, True],\n     [725, 724, False, 616, True],\n     [720, 740, False, 513, False],\n     [719, 725, True, 487, True],\n     [756, 716, False, 534, True],\n     [795, 715, True, 615, False]]],\n   [[False, 0],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 0],\n    [False, 20],\n    [False, 20],\n    [False, 0]]]],\n [['regression: scenario 2',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 530},\n    [[741, 731, False, 559, True],\n     [755, 719, True, 563, False],\n     [721, 727, False, 535, True],\n     [760, 746, True, 518, False],\n     [752, 759, True, 565, True],\n     [721, 749, True, 610, True],\n     [697, 734, True, 612, True],\n     [689, 709, True, 487, True],\n     [680, 737, True, 520, True],\n     [641, 709, True, 611, True],\n     [637, 721, True, 540, False],\n     [603, 735, False, 541, True],\n     [586, 719, True, 618, True],\n     [618, 703, True, 613, True]]],\n   [[False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 0],\n    [True, 15],\n    [True, 35],\n    [True, 55]]],\n  ['regression: scenario 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 500},\n    [[648, 702, True, 512, True],\n     [638, 725, True, 584, True],\n     [603, 726, True, 591, True],\n     [610, 705, True, 566, False],\n     [612, 706, False, 595, True],\n     [587, 717, True, 552, True],\n     [623, 754, True, 482, True],\n     [595, 710, True, 491, True],\n     [615, 710, False, 485, True]]],\n   [[True, 35],\n    [True, 55],\n    [True, 75],\n    [True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 15],\n    [True, 15]]],\n  ['regression: 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: 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  ['regression: 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': 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 6',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[450, 740, True, 605, True],\n     [424, 725, True, 523, False],\n     [400, 741, True, 543, True],\n     [409, 711, True, 502, True],\n     [439, 732, False, 568, True],\n     [438, 760, True, 580, False],\n     [467, 735, True, 574, False],\n     [492, 716, False, 501, False],\n     [529, 729, True, 518, True]]],\n   [[True, 50], [True, 0], [True, 50], [True, 40], [True, 30], [True, 0], [True, 0], [True, 0], [True, 30]]],\n  ['regression: scenario 7',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 500},\n    [[765, 744, True, 555, True],\n     [757, 729, False, 542, True],\n     [769, 703, True, 545, False],\n     [785, 759, False, 578, False],\n     [778, 747, False, 494, True],\n     [777, 719, True, 542, True],\n     [785, 717, False, 595, True],\n     [787, 756, True, 558, True],\n     [747, 728, True, 565, True],\n     [711, 741, False, 600, True],\n     [696, 745, True, 620, True]]],\n   [[False, 15],\n    [False, 15],\n    [False, 0],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15]]],\n  ['regression: 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: 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  ['regression: 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': 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":"267f4b052334ba7b2b4f68bd3e1a506b65ad0d4e358b12a8f216f6cc72a3edcf","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 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: 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: 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: 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: 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': 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 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[608, 734, True, 493, True],\n     [609, 741, True, 531, True],\n     [587, 758, True, 553, True],\n     [561, 759, False, 498, False],\n     [530, 741, False, 509, True],\n     [544, 760, True, 493, True],\n     [548, 751, True, 583, True],\n     [512, 705, False, 540, False],\n     [490, 711, True, 562, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 0],\n    [True, 50]]]],\n [['regression: 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  ['regression: 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: 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: 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: 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 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[492, 750, False, 518, True],\n     [495, 710, True, 564, True],\n     [507, 701, True, 603, True],\n     [545, 705, False, 490, True],\n     [529, 724, True, 489, False],\n     [508, 721, True, 529, False],\n     [482, 717, True, 619, True],\n     [464, 753, False, 608, True],\n     [478, 719, False, 559, False],\n     [481, 730, False, 494, True],\n     [511, 719, False, 613, True],\n     [479, 743, False, 542, True],\n     [477, 728, True, 597, True],\n     [493, 756, False, 531, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 30],\n    [True, 0],\n    [True, 0],\n    [True, 50],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 30]]],\n  ['regression: scenario 3',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[715, 711, True, 506, True],\n     [744, 713, True, 551, True],\n     [732, 724, True, 568, True],\n     [758, 725, False, 532, True],\n     [795, 734, True, 552, True],\n     [788, 742, True, 497, True],\n     [760, 709, True, 515, False],\n     [769, 759, False, 564, True],\n     [795, 721, True, 546, True]]],\n   [[False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 0],\n    [False, 20],\n    [False, 20]]]],\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 2',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[599, 747, False, 570, True],\n     [625, 701, False, 603, True],\n     [623, 732, False, 565, False],\n     [624, 737, True, 482, True],\n     [637, 740, False, 485, True],\n     [676, 702, True, 590, True],\n     [678, 755, True, 522, True],\n     [670, 733, True, 571, True],\n     [684, 712, True, 616, False],\n     [687, 736, True, 607, False],\n     [712, 739, False, 524, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 0],\n    [False, 30]]],\n  ['regression: 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: 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  ['regression: 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 3',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[761, 714, True, 573, False],\n     [780, 758, False, 588, True],\n     [761, 703, True, 548, True],\n     [746, 756, True, 495, True],\n     [714, 752, True, 488, True],\n     [754, 748, True, 509, True],\n     [719, 713, True, 561, True],\n     [725, 724, False, 616, True],\n     [720, 740, False, 513, False],\n     [719, 725, True, 487, True],\n     [756, 716, False, 534, True],\n     [795, 715, True, 615, False]]],\n   [[False, 0],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 0],\n    [False, 20],\n    [False, 20],\n    [False, 0]]]],\n [['regression: scenario 2',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 530},\n    [[741, 731, False, 559, True],\n     [755, 719, True, 563, False],\n     [721, 727, False, 535, True],\n     [760, 746, True, 518, False],\n     [752, 759, True, 565, True],\n     [721, 749, True, 610, True],\n     [697, 734, True, 612, True],\n     [689, 709, True, 487, True],\n     [680, 737, True, 520, True],\n     [641, 709, True, 611, True],\n     [637, 721, True, 540, False],\n     [603, 735, False, 541, True],\n     [586, 719, True, 618, True],\n     [618, 703, True, 613, True]]],\n   [[False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 0],\n    [True, 15],\n    [True, 35],\n    [True, 55]]],\n  ['regression: scenario 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 500},\n    [[648, 702, True, 512, True],\n     [638, 725, True, 584, True],\n     [603, 726, True, 591, True],\n     [610, 705, True, 566, False],\n     [612, 706, False, 595, True],\n     [587, 717, True, 552, True],\n     [623, 754, True, 482, True],\n     [595, 710, True, 491, True],\n     [615, 710, False, 485, True]]],\n   [[True, 35],\n    [True, 55],\n    [True, 75],\n    [True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 15],\n    [True, 15]]],\n  ['regression: 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: 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  ['regression: 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': 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 6',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[450, 740, True, 605, True],\n     [424, 725, True, 523, False],\n     [400, 741, True, 543, True],\n     [409, 711, True, 502, True],\n     [439, 732, False, 568, True],\n     [438, 760, True, 580, False],\n     [467, 735, True, 574, False],\n     [492, 716, False, 501, False],\n     [529, 729, True, 518, True]]],\n   [[True, 50], [True, 0], [True, 50], [True, 40], [True, 30], [True, 0], [True, 0], [True, 0], [True, 30]]],\n  ['regression: scenario 7',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 500},\n    [[765, 744, True, 555, True],\n     [757, 729, False, 542, True],\n     [769, 703, True, 545, False],\n     [785, 759, False, 578, False],\n     [778, 747, False, 494, True],\n     [777, 719, True, 542, True],\n     [785, 717, False, 595, True],\n     [787, 756, True, 558, True],\n     [747, 728, True, 565, True],\n     [711, 741, False, 600, True],\n     [696, 745, True, 620, True]]],\n   [[False, 15],\n    [False, 15],\n    [False, 0],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15]]],\n  ['regression: 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: 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  ['regression: 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': 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":"9343bcf5e6a5f5c70fa20213503776c754b2ce1e06848d9ab021981ae2f9918f","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: 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: 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: 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: 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': 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 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[608, 734, True, 493, True],\n     [609, 741, True, 531, True],\n     [587, 758, True, 553, True],\n     [561, 759, False, 498, False],\n     [530, 741, False, 509, True],\n     [544, 760, True, 493, True],\n     [548, 751, True, 583, True],\n     [512, 705, False, 540, False],\n     [490, 711, True, 562, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 0],\n    [True, 50]]]],\n [['regression: 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  ['regression: 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: 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: 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: 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 2',\n   [{'high_limit': 700, 'diff': 20, 'min_pos': 30, 'mat_low': 500},\n    [[492, 750, False, 518, True],\n     [495, 710, True, 564, True],\n     [507, 701, True, 603, True],\n     [545, 705, False, 490, True],\n     [529, 724, True, 489, False],\n     [508, 721, True, 529, False],\n     [482, 717, True, 619, True],\n     [464, 753, False, 608, True],\n     [478, 719, False, 559, False],\n     [481, 730, False, 494, True],\n     [511, 719, False, 613, True],\n     [479, 743, False, 542, True],\n     [477, 728, True, 597, True],\n     [493, 756, False, 531, True]]],\n   [[True, 30],\n    [True, 50],\n    [True, 70],\n    [True, 30],\n    [True, 0],\n    [True, 0],\n    [True, 50],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [True, 30],\n    [True, 50],\n    [True, 30]]],\n  ['regression: scenario 3',\n   [{'high_limit': 750, 'diff': 20, 'min_pos': 20, 'mat_low': 530},\n    [[715, 711, True, 506, True],\n     [744, 713, True, 551, True],\n     [732, 724, True, 568, True],\n     [758, 725, False, 532, True],\n     [795, 734, True, 552, True],\n     [788, 742, True, 497, True],\n     [760, 709, True, 515, False],\n     [769, 759, False, 564, True],\n     [795, 721, True, 546, True]]],\n   [[False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 0],\n    [False, 20],\n    [False, 20]]]],\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 2',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 30, 'mat_low': 530},\n    [[599, 747, False, 570, True],\n     [625, 701, False, 603, True],\n     [623, 732, False, 565, False],\n     [624, 737, True, 482, True],\n     [637, 740, False, 485, True],\n     [676, 702, True, 590, True],\n     [678, 755, True, 522, True],\n     [670, 733, True, 571, True],\n     [684, 712, True, 616, False],\n     [687, 736, True, 607, False],\n     [712, 739, False, 524, True]]],\n   [[True, 30],\n    [True, 30],\n    [True, 0],\n    [True, 30],\n    [True, 30],\n    [False, 30],\n    [False, 30],\n    [False, 30],\n    [False, 0],\n    [False, 0],\n    [False, 30]]],\n  ['regression: 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: 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  ['regression: 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 3',\n   [{'high_limit': 650, 'diff': 0, 'min_pos': 20, 'mat_low': 500},\n    [[761, 714, True, 573, False],\n     [780, 758, False, 588, True],\n     [761, 703, True, 548, True],\n     [746, 756, True, 495, True],\n     [714, 752, True, 488, True],\n     [754, 748, True, 509, True],\n     [719, 713, True, 561, True],\n     [725, 724, False, 616, True],\n     [720, 740, False, 513, False],\n     [719, 725, True, 487, True],\n     [756, 716, False, 534, True],\n     [795, 715, True, 615, False]]],\n   [[False, 0],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 20],\n    [False, 0],\n    [False, 20],\n    [False, 20],\n    [False, 0]]]],\n [['regression: scenario 2',\n   [{'high_limit': 650, 'diff': 20, 'min_pos': 15, 'mat_low': 530},\n    [[741, 731, False, 559, True],\n     [755, 719, True, 563, False],\n     [721, 727, False, 535, True],\n     [760, 746, True, 518, False],\n     [752, 759, True, 565, True],\n     [721, 749, True, 610, True],\n     [697, 734, True, 612, True],\n     [689, 709, True, 487, True],\n     [680, 737, True, 520, True],\n     [641, 709, True, 611, True],\n     [637, 721, True, 540, False],\n     [603, 735, False, 541, True],\n     [586, 719, True, 618, True],\n     [618, 703, True, 613, True]]],\n   [[False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 0],\n    [True, 15],\n    [True, 35],\n    [True, 55]]],\n  ['regression: scenario 3',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 500},\n    [[648, 702, True, 512, True],\n     [638, 725, True, 584, True],\n     [603, 726, True, 591, True],\n     [610, 705, True, 566, False],\n     [612, 706, False, 595, True],\n     [587, 717, True, 552, True],\n     [623, 754, True, 482, True],\n     [595, 710, True, 491, True],\n     [615, 710, False, 485, True]]],\n   [[True, 35],\n    [True, 55],\n    [True, 75],\n    [True, 0],\n    [True, 15],\n    [True, 35],\n    [True, 25],\n    [True, 15],\n    [True, 15]]],\n  ['regression: 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: 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  ['regression: 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': 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 6',\n   [{'high_limit': 650, 'diff': 40, 'min_pos': 30, 'mat_low': 530},\n    [[450, 740, True, 605, True],\n     [424, 725, True, 523, False],\n     [400, 741, True, 543, True],\n     [409, 711, True, 502, True],\n     [439, 732, False, 568, True],\n     [438, 760, True, 580, False],\n     [467, 735, True, 574, False],\n     [492, 716, False, 501, False],\n     [529, 729, True, 518, True]]],\n   [[True, 50], [True, 0], [True, 50], [True, 40], [True, 30], [True, 0], [True, 0], [True, 0], [True, 30]]],\n  ['regression: scenario 7',\n   [{'high_limit': 700, 'diff': 40, 'min_pos': 15, 'mat_low': 500},\n    [[765, 744, True, 555, True],\n     [757, 729, False, 542, True],\n     [769, 703, True, 545, False],\n     [785, 759, False, 578, False],\n     [778, 747, False, 494, True],\n     [777, 719, True, 542, True],\n     [785, 717, False, 595, True],\n     [787, 756, True, 558, True],\n     [747, 728, True, 565, True],\n     [711, 741, False, 600, True],\n     [696, 745, True, 620, True]]],\n   [[False, 15],\n    [False, 15],\n    [False, 0],\n    [False, 0],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15],\n    [False, 15]]],\n  ['regression: 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: 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  ['regression: 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': 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-unoccupied-closure","generated_at":"2026-09-29T14:51:46.937473+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":"Close the outdoor damper whenever unoccupied.","root_cause":"The unoccupied branch is missing.","sha256":"1cbe46c6265af606c70471b3159d84bf8d8dabf59af028988bda3d89f6175255","title":"Outdoor damper stays open while the building is unoccupied · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.459,"exit_code":1,"observations":[{"actual":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,40]],"check":"regression: economizer cycle","expected":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"passed":false},{"actual":[[true,40],[true,60]],"check":"regression: night cooling call","expected":[[true,0],[true,40]],"passed":false},{"actual":[[false,20],[false,20],[true,40],[true,60],[false,20]],"check":"control: enable band edges","expected":[[false,20],[false,20],[true,40],[true,60],[false,20]],"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,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,70],[true,90],[true,100],[true,20],[true,20]],"check":"regression: scenario 1","expected":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"passed":false},{"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},{"actual":[[true,30],[true,50],[true,70],[true,0],[true,30],[true,30],[true,50],[true,0],[true,50]],"check":"regression: scenario 3","expected":[[true,30],[true,50],[true,70],[true,0],[true,30],[true,30],[true,50],[true,0],[true,50]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: economizer cycle\", \"actual\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 40]], \"expected\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"passed\": false}, {\"check\": \"regression: night cooling call\", \"actual\": [[true, 40], [true, 60]], \"expected\": [[true, 0], [true, 40]], \"passed\": false}, {\"check\": \"control: 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\": \"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: near return disable\", \"actual\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"expected\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [[true, 40], [true, 30], [true, 50], [true, 70], [true, 90], [true, 100], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"passed\": false}, {\"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}, {\"check\": \"regression: scenario 3\", \"actual\": [[true, 30], [true, 50], [true, 70], [true, 0], [true, 30], [true, 30], [true, 50], [true, 0], [true, 50]], \"expected\": [[true, 30], [true, 50], [true, 70], [true, 0], [true, 30], [true, 30], [true, 50], [true, 0], [true, 50]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.224,"exit_code":1,"observations":[{"actual":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,40]],"check":"regression: economizer cycle","expected":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"passed":false},{"actual":[[true,40],[true,60]],"check":"regression: night cooling call","expected":[[true,0],[true,40]],"passed":false},{"actual":[[false,20],[false,20],[true,40],[true,60],[false,20]],"check":"control: enable band edges","expected":[[false,20],[false,20],[true,40],[true,60],[false,20]],"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,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,70],[true,90],[true,100],[true,20],[true,20]],"check":"regression: scenario 1","expected":[[true,40],[true,30],[true,50],[true,0],[true,40],[true,60],[true,20],[true,20]],"passed":false},{"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},{"actual":[[true,30],[true,50],[true,70],[true,30],[true,30],[true,30],[true,50],[true,30],[true,50]],"check":"regression: scenario 3","expected":[[true,30],[true,50],[true,70],[true,0],[true,30],[true,30],[true,50],[true,0],[true,50]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: economizer cycle\", \"actual\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 40]], \"expected\": [[true, 40], [true, 60], [true, 50], [true, 70], [false, 20], [true, 20], [true, 0]], \"passed\": false}, {\"check\": \"regression: night cooling call\", \"actual\": [[true, 40], [true, 60]], \"expected\": [[true, 0], [true, 40]], \"passed\": false}, {\"check\": \"control: 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\": \"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: near return disable\", \"actual\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"expected\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"passed\": true}, {\"check\": \"regression: scenario 1\", \"actual\": [[true, 40], [true, 30], [true, 50], [true, 70], [true, 90], [true, 100], [true, 20], [true, 20]], \"expected\": [[true, 40], [true, 30], [true, 50], [true, 0], [true, 40], [true, 60], [true, 20], [true, 20]], \"passed\": false}, {\"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}, {\"check\": \"regression: scenario 3\", \"actual\": [[true, 30], [true, 50], [true, 70], [true, 30], [true, 30], [true, 30], [true, 50], [true, 30], [true, 50]], \"expected\": [[true, 30], [true, 50], [true, 70], [true, 0], [true, 30], [true, 30], [true, 50], [true, 0], [true, 50]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.224,"exit_code":0,"observations":[{"actual":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"check":"regression: economizer cycle","expected":[[true,40],[true,60],[true,50],[true,70],[false,20],[true,20],[true,0]],"passed":true},{"actual":[[true,0],[true,40]],"check":"regression: night cooling call","expected":[[true,0],[true,40]],"passed":true},{"actual":[[false,20],[false,20],[true,40],[true,60],[false,20]],"check":"control: enable band edges","expected":[[false,20],[false,20],[true,40],[true,60],[false,20]],"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,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":"regression: 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},{"actual":[[true,30],[true,50],[true,70],[true,0],[true,30],[true,30],[true,50],[true,0],[true,50]],"check":"regression: scenario 3","expected":[[true,30],[true,50],[true,70],[true,0],[true,30],[true,30],[true,50],[true,0],[true,50]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: 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\": \"regression: night cooling call\", \"actual\": [[true, 0], [true, 40]], \"expected\": [[true, 0], [true, 40]], \"passed\": true}, {\"check\": \"control: 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\": \"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: near return disable\", \"actual\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"expected\": [[true, 35], [true, 55], [true, 75], [false, 15]], \"passed\": true}, {\"check\": \"regression: 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}, {\"check\": \"regression: scenario 3\", \"actual\": [[true, 30], [true, 50], [true, 70], [true, 0], [true, 30], [true, 30], [true, 50], [true, 0], [true, 50]], \"expected\": [[true, 30], [true, 50], [true, 70], [true, 0], [true, 30], [true, 30], [true, 50], [true, 0], [true, 50]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}