FA-92746 / HVAC thermostat control / Open access
Time-proportioning heats when the room is above setpoint · case 01
The heater runs harder the warmer the room gets.
ROOT CAUSE
The error is computed as temp - setpoint.
VERIFIED REPAIR
Heating error is setpoint - temp.
Unsuccessful approach: Using the absolute error still heats an overheated room.
Case contract
Time-proportioning heating thermostat with a cycles-per-hour setting, sampled per minute. The cycle length is 60 // cph minutes. At each cycle start the error (setpoint - temp) is clamped to 0..band and the on time is error/band of the cycle rounded half up; an on time of 1 minute is extended to the 2-minute minimum, and an off time of 1 minute is eliminated (full on). The output is on for the first on-time minutes of the cycle. Return the heat output per minute.
Why this case matters
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.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cph, band, setpoint, temps):
period = 60 // cph
out = []
on_left = 0
for minute, temp in enumerate(temps):
if minute % period == 0:
err = temp - setpoint
num = max(0, min(err, band)) * period
on = (2 * num + band) // (2 * band)
if 0 < on < 2:
on = 2
if 0 < period - on < 2:
on = period
on_left = on
out.append(on_left > 0)
if on_left > 0:
on_left -= 1
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[4,
10,
700,
[673,
669,
665,
669,
667,
665,
664,
662,
659,
662,
661,
659,
660,
656,
659,
660,
656,
652,
654,
652,
656,
657,
653,
653,
653,
653,
654,
653,
650,
650,
650,
650,
651,
654,
651,
650,
650,
650,
650]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 2',
[6,
30,
700,
[697,
695,
691,
695,
691,
692,
693,
692,
690,
690,
690,
687,
684,
683,
687,
688,
688,
691,
690,
692,
693,
689,
692]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False]],
['regression: scenario 3',
[7,
30,
700,
[693,
691,
695,
691,
695,
698,
697,
700,
702,
704,
706,
708,
709,
707,
706,
702,
702,
701,
698,
701,
700,
704,
703,
702,
702,
699,
695,
694,
696,
699,
696,
692,
694,
693,
694,
697,
700]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False]],
['regression: scenario 4',
[4,
10,
700,
[680,
684,
685,
683,
684,
685,
686,
682,
681,
679,
677,
681,
680,
681,
677,
681,
680,
682,
682,
678,
677,
673,
672,
676,
673,
670,
669,
665,
662]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: scenario 4',
[9,
30,
700,
[705,
708,
704,
703,
700,
701,
701,
702,
699,
698,
698,
697,
698,
702,
699,
700,
701,
697,
700,
697,
694,
695,
696]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[6,
30,
700,
[690,
689,
690,
691,
689,
685,
682,
686,
682,
680,
684,
687,
690,
693,
692,
689,
688,
685,
683,
685,
687,
683,
684,
688,
691,
689,
686,
683,
679,
679,
682,
680,
680,
684]],
[True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True]],
['regression: scenario 2',
[6,
10,
700,
[686,
687,
685,
682,
682,
678,
681,
677,
676,
673,
674,
676,
672,
670,
669,
673,
674,
676,
675,
673,
675,
672,
673,
674,
670,
672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 3',
[6,
20,
700,
[676,
675,
678,
682,
680,
684,
682,
684,
686,
684,
681,
678,
681,
682,
679,
680,
684,
681,
679,
679,
681,
684,
680,
683]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 3',
[7,
30,
700,
[701,
704,
708,
708,
709,
711,
707,
709,
710,
706,
707,
703,
701,
697,
697,
698,
698,
701,
700,
699,
699,
695,
696,
700,
698,
701,
700]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[7,
20,
700,
[688,
691,
689,
691,
692,
691,
687,
691,
692,
691,
695,
695,
692,
689,
688,
684,
682,
681,
679,
678,
682,
682,
680,
682,
686,
689,
687,
687,
690,
686,
687,
691]],
[True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False]],
['regression: scenario 2',
[9,
20,
700,
[702,
703,
707,
703,
700,
697,
699,
698,
696,
693,
696,
695,
694,
690,
692,
695,
697,
700,
698,
699,
701,
704,
708,
712,
710,
709,
713,
709,
710,
714,
711,
711,
707,
706,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 4',
[4,
30,
700,
[675,
676,
675,
674,
673,
676,
674,
672,
673,
672,
674,
677,
674,
671,
668,
664,
668,
667,
668,
670,
668,
670,
672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 9',
[3,
30,
700,
[706,
705,
702,
699,
700,
703,
704,
706,
708,
712,
711,
710,
714,
710,
706,
709,
705,
707,
707,
706,
710,
711,
708,
711,
715,
714,
715,
712,
709,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[6,
10,
700,
[702,
699,
703,
707,
704,
708,
705,
701,
698,
700,
703,
703,
700,
697,
696,
697,
697,
701,
703,
703,
704,
705,
708,
704,
706,
705,
702,
706,
707,
704,
708,
707,
703,
706,
707,
703,
703,
706,
707,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[3,
20,
700,
[682, 683, 684, 687, 687, 686, 682, 683, 680, 676, 680, 683, 679, 675, 674, 671, 671, 672, 670, 672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False]],
['regression: scenario 3',
[4,
10,
700,
[669,
665,
661,
664,
661,
660,
663,
662,
660,
664,
667,
671,
672,
671,
670,
673,
676,
677,
680,
677,
677,
680,
677,
680,
677,
673,
676,
677,
679,
678,
682,
683,
680,
679,
683,
682,
686]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: scenario 1',
[5,
10,
700,
[698,
700,
702,
701,
700,
700,
699,
697,
694,
696,
698,
694,
697,
697,
694,
698,
700,
698,
699,
700,
703,
707,
708,
706,
708,
712,
710,
706,
702,
700,
696,
696,
692]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 18',
[8,
10,
700,
[700,
699,
699,
695,
696,
698,
699,
703,
705,
704,
702,
701,
700,
702,
706,
707,
710,
706,
705,
707,
706,
703,
704,
706,
703,
706,
702,
701,
698,
694,
698,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[3,
10,
700,
[669,
665,
665,
665,
666,
665,
663,
665,
667,
665,
667,
663,
663,
667,
667,
668,
664,
664,
664,
663,
661,
661,
661,
664,
666,
664,
668]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 3',
[4,
30,
700,
[693,
696,
695,
696,
695,
694,
690,
686,
682,
681,
683,
685,
681,
677,
673,
671,
674,
672,
668,
671,
668,
668,
672,
672,
674,
677,
680,
676,
673,
675,
677,
673,
671,
670,
672,
668,
666]],
[True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: three cycles | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] | [True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True] | Failed |
| regression: above setpoint | [True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False] | Failed |
| regression: seven cycles per hour | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] | [True, True, True, True, False, False, False, False, True, True, True, True, False, False, False, False, True, True, True, True, True, True, False, False, True, True, False] | Failed |
| regression: tiny error | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] | [True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False] | Failed |
| regression: scenario 1 | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | Failed |
| regression: scenario 2 | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] | [True, True, False, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, False, True, True, False] | Failed |
| regression: scenario 3 | [False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, False, False, False] | [True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False] | Failed |
| regression: scenario 4 | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False] | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | Failed |
SHA-256 / 3baf7f39a3b54f6fbed13565d8c87295af9c8a97fe0ef43004f9620e40156e8a
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cph, band, setpoint, temps):
period = 60 // cph
out = []
on_left = 0
for minute, temp in enumerate(temps):
if minute % period == 0:
err = abs(setpoint - temp)
num = max(0, min(err, band)) * period
on = (2 * num + band) // (2 * band)
if 0 < on < 2:
on = 2
if 0 < period - on < 2:
on = period
on_left = on
out.append(on_left > 0)
if on_left > 0:
on_left -= 1
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[4,
10,
700,
[673,
669,
665,
669,
667,
665,
664,
662,
659,
662,
661,
659,
660,
656,
659,
660,
656,
652,
654,
652,
656,
657,
653,
653,
653,
653,
654,
653,
650,
650,
650,
650,
651,
654,
651,
650,
650,
650,
650]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 2',
[6,
30,
700,
[697,
695,
691,
695,
691,
692,
693,
692,
690,
690,
690,
687,
684,
683,
687,
688,
688,
691,
690,
692,
693,
689,
692]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False]],
['regression: scenario 3',
[7,
30,
700,
[693,
691,
695,
691,
695,
698,
697,
700,
702,
704,
706,
708,
709,
707,
706,
702,
702,
701,
698,
701,
700,
704,
703,
702,
702,
699,
695,
694,
696,
699,
696,
692,
694,
693,
694,
697,
700]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False]],
['regression: scenario 4',
[4,
10,
700,
[680,
684,
685,
683,
684,
685,
686,
682,
681,
679,
677,
681,
680,
681,
677,
681,
680,
682,
682,
678,
677,
673,
672,
676,
673,
670,
669,
665,
662]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: scenario 4',
[9,
30,
700,
[705,
708,
704,
703,
700,
701,
701,
702,
699,
698,
698,
697,
698,
702,
699,
700,
701,
697,
700,
697,
694,
695,
696]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[6,
30,
700,
[690,
689,
690,
691,
689,
685,
682,
686,
682,
680,
684,
687,
690,
693,
692,
689,
688,
685,
683,
685,
687,
683,
684,
688,
691,
689,
686,
683,
679,
679,
682,
680,
680,
684]],
[True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True]],
['regression: scenario 2',
[6,
10,
700,
[686,
687,
685,
682,
682,
678,
681,
677,
676,
673,
674,
676,
672,
670,
669,
673,
674,
676,
675,
673,
675,
672,
673,
674,
670,
672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 3',
[6,
20,
700,
[676,
675,
678,
682,
680,
684,
682,
684,
686,
684,
681,
678,
681,
682,
679,
680,
684,
681,
679,
679,
681,
684,
680,
683]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 3',
[7,
30,
700,
[701,
704,
708,
708,
709,
711,
707,
709,
710,
706,
707,
703,
701,
697,
697,
698,
698,
701,
700,
699,
699,
695,
696,
700,
698,
701,
700]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[7,
20,
700,
[688,
691,
689,
691,
692,
691,
687,
691,
692,
691,
695,
695,
692,
689,
688,
684,
682,
681,
679,
678,
682,
682,
680,
682,
686,
689,
687,
687,
690,
686,
687,
691]],
[True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False]],
['regression: scenario 2',
[9,
20,
700,
[702,
703,
707,
703,
700,
697,
699,
698,
696,
693,
696,
695,
694,
690,
692,
695,
697,
700,
698,
699,
701,
704,
708,
712,
710,
709,
713,
709,
710,
714,
711,
711,
707,
706,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 4',
[4,
30,
700,
[675,
676,
675,
674,
673,
676,
674,
672,
673,
672,
674,
677,
674,
671,
668,
664,
668,
667,
668,
670,
668,
670,
672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 9',
[3,
30,
700,
[706,
705,
702,
699,
700,
703,
704,
706,
708,
712,
711,
710,
714,
710,
706,
709,
705,
707,
707,
706,
710,
711,
708,
711,
715,
714,
715,
712,
709,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[6,
10,
700,
[702,
699,
703,
707,
704,
708,
705,
701,
698,
700,
703,
703,
700,
697,
696,
697,
697,
701,
703,
703,
704,
705,
708,
704,
706,
705,
702,
706,
707,
704,
708,
707,
703,
706,
707,
703,
703,
706,
707,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[3,
20,
700,
[682, 683, 684, 687, 687, 686, 682, 683, 680, 676, 680, 683, 679, 675, 674, 671, 671, 672, 670, 672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False]],
['regression: scenario 3',
[4,
10,
700,
[669,
665,
661,
664,
661,
660,
663,
662,
660,
664,
667,
671,
672,
671,
670,
673,
676,
677,
680,
677,
677,
680,
677,
680,
677,
673,
676,
677,
679,
678,
682,
683,
680,
679,
683,
682,
686]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: scenario 1',
[5,
10,
700,
[698,
700,
702,
701,
700,
700,
699,
697,
694,
696,
698,
694,
697,
697,
694,
698,
700,
698,
699,
700,
703,
707,
708,
706,
708,
712,
710,
706,
702,
700,
696,
696,
692]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 18',
[8,
10,
700,
[700,
699,
699,
695,
696,
698,
699,
703,
705,
704,
702,
701,
700,
702,
706,
707,
710,
706,
705,
707,
706,
703,
704,
706,
703,
706,
702,
701,
698,
694,
698,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[3,
10,
700,
[669,
665,
665,
665,
666,
665,
663,
665,
667,
665,
667,
663,
663,
667,
667,
668,
664,
664,
664,
663,
661,
661,
661,
664,
666,
664,
668]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 3',
[4,
30,
700,
[693,
696,
695,
696,
695,
694,
690,
686,
682,
681,
683,
685,
681,
677,
673,
671,
674,
672,
668,
671,
668,
668,
672,
672,
674,
677,
680,
676,
673,
675,
677,
673,
671,
670,
672,
668,
666]],
[True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: three cycles | [True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True] | [True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True] | Passed |
| regression: above setpoint | [True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False] | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False] | Failed |
| regression: seven cycles per hour | [True, True, True, True, False, False, False, False, True, True, True, True, False, False, False, False, True, True, True, True, True, True, False, False, True, True, False] | [True, True, True, True, False, False, False, False, True, True, True, True, False, False, False, False, True, True, True, True, True, True, False, False, True, True, False] | Passed |
| regression: tiny error | [True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False] | [True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False] | Passed |
| regression: scenario 1 | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | Passed |
| regression: scenario 2 | [True, True, False, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, False, True, True, False] | [True, True, False, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, False, True, True, False] | Passed |
| regression: scenario 3 | [True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, True, True, False, False, False, False, False, False, True, True, False, False, False] | [True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False] | Failed |
| regression: scenario 4 | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | Passed |
SHA-256 / 5f6b69d9e1a30531b569dc697803da41e655d5c935f6338919cfebb7d523ab4c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cph, band, setpoint, temps):
period = 60 // cph
out = []
on_left = 0
for minute, temp in enumerate(temps):
if minute % period == 0:
err = setpoint - temp
num = max(0, min(err, band)) * period
on = (2 * num + band) // (2 * band)
if 0 < on < 2:
on = 2
if 0 < period - on < 2:
on = period
on_left = on
out.append(on_left > 0)
if on_left > 0:
on_left -= 1
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[4,
10,
700,
[673,
669,
665,
669,
667,
665,
664,
662,
659,
662,
661,
659,
660,
656,
659,
660,
656,
652,
654,
652,
656,
657,
653,
653,
653,
653,
654,
653,
650,
650,
650,
650,
651,
654,
651,
650,
650,
650,
650]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 2',
[6,
30,
700,
[697,
695,
691,
695,
691,
692,
693,
692,
690,
690,
690,
687,
684,
683,
687,
688,
688,
691,
690,
692,
693,
689,
692]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False]],
['regression: scenario 3',
[7,
30,
700,
[693,
691,
695,
691,
695,
698,
697,
700,
702,
704,
706,
708,
709,
707,
706,
702,
702,
701,
698,
701,
700,
704,
703,
702,
702,
699,
695,
694,
696,
699,
696,
692,
694,
693,
694,
697,
700]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False]],
['regression: scenario 4',
[4,
10,
700,
[680,
684,
685,
683,
684,
685,
686,
682,
681,
679,
677,
681,
680,
681,
677,
681,
680,
682,
682,
678,
677,
673,
672,
676,
673,
670,
669,
665,
662]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: scenario 4',
[9,
30,
700,
[705,
708,
704,
703,
700,
701,
701,
702,
699,
698,
698,
697,
698,
702,
699,
700,
701,
697,
700,
697,
694,
695,
696]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[6,
30,
700,
[690,
689,
690,
691,
689,
685,
682,
686,
682,
680,
684,
687,
690,
693,
692,
689,
688,
685,
683,
685,
687,
683,
684,
688,
691,
689,
686,
683,
679,
679,
682,
680,
680,
684]],
[True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True]],
['regression: scenario 2',
[6,
10,
700,
[686,
687,
685,
682,
682,
678,
681,
677,
676,
673,
674,
676,
672,
670,
669,
673,
674,
676,
675,
673,
675,
672,
673,
674,
670,
672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 3',
[6,
20,
700,
[676,
675,
678,
682,
680,
684,
682,
684,
686,
684,
681,
678,
681,
682,
679,
680,
684,
681,
679,
679,
681,
684,
680,
683]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 3',
[7,
30,
700,
[701,
704,
708,
708,
709,
711,
707,
709,
710,
706,
707,
703,
701,
697,
697,
698,
698,
701,
700,
699,
699,
695,
696,
700,
698,
701,
700]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
True,
True,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[7,
20,
700,
[688,
691,
689,
691,
692,
691,
687,
691,
692,
691,
695,
695,
692,
689,
688,
684,
682,
681,
679,
678,
682,
682,
680,
682,
686,
689,
687,
687,
690,
686,
687,
691]],
[True,
True,
True,
True,
True,
False,
False,
False,
True,
True,
True,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False]],
['regression: scenario 2',
[9,
20,
700,
[702,
703,
707,
703,
700,
697,
699,
698,
696,
693,
696,
695,
694,
690,
692,
695,
697,
700,
698,
699,
701,
704,
708,
712,
710,
709,
713,
709,
710,
714,
711,
711,
707,
706,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 4',
[4,
30,
700,
[675,
676,
675,
674,
673,
676,
674,
672,
673,
672,
674,
677,
674,
671,
668,
664,
668,
667,
668,
670,
668,
670,
672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 9',
[3,
30,
700,
[706,
705,
702,
699,
700,
703,
704,
706,
708,
712,
711,
710,
714,
710,
706,
709,
705,
707,
707,
706,
710,
711,
708,
711,
715,
714,
715,
712,
709,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 1',
[6,
10,
700,
[702,
699,
703,
707,
704,
708,
705,
701,
698,
700,
703,
703,
700,
697,
696,
697,
697,
701,
703,
703,
704,
705,
708,
704,
706,
705,
702,
706,
707,
704,
708,
707,
703,
706,
707,
703,
703,
706,
707,
706]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[3,
20,
700,
[682, 683, 684, 687, 687, 686, 682, 683, 680, 676, 680, 683, 679, 675, 674, 671, 671, 672, 670, 672]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False]],
['regression: scenario 3',
[4,
10,
700,
[669,
665,
661,
664,
661,
660,
663,
662,
660,
664,
667,
671,
672,
671,
670,
673,
676,
677,
680,
677,
677,
680,
677,
680,
677,
673,
676,
677,
679,
678,
682,
683,
680,
679,
683,
682,
686]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]],
[['regression: scenario 1',
[5,
10,
700,
[698,
700,
702,
701,
700,
700,
699,
697,
694,
696,
698,
694,
697,
697,
694,
698,
700,
698,
699,
700,
703,
707,
708,
706,
708,
712,
710,
706,
702,
700,
696,
696,
692]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 18',
[8,
10,
700,
[700,
699,
699,
695,
696,
698,
699,
703,
705,
704,
702,
701,
700,
702,
706,
707,
710,
706,
705,
707,
706,
703,
704,
706,
703,
706,
702,
701,
698,
694,
698,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False]],
['regression: three cycles',
[5,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
690,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
700,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681,
681]],
[True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: seven cycles per hour',
[7,
20,
700,
[690,
690,
690,
690,
690,
690,
690,
690,
690,
685,
685,
685,
685,
685,
685,
685,
685,
685,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
False,
False,
True,
True,
False]],
['regression: tiny error',
[6,
30,
700,
[696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698]],
[True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False]],
['regression: above setpoint',
[4,
10,
700,
[705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
705,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695,
695]],
[False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False]],
['regression: scenario 2',
[3,
10,
700,
[669,
665,
665,
665,
666,
665,
663,
665,
667,
665,
667,
663,
663,
667,
667,
668,
664,
664,
664,
663,
661,
661,
661,
664,
666,
664,
668]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]],
['regression: scenario 3',
[4,
30,
700,
[693,
696,
695,
696,
695,
694,
690,
686,
682,
681,
683,
685,
681,
677,
673,
671,
674,
672,
668,
671,
668,
668,
672,
672,
674,
677,
680,
676,
673,
675,
677,
673,
671,
670,
672,
668,
666]],
[True,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
False,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: three cycles | [True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True] | [True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True] | Passed |
| regression: above setpoint | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False] | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False] | Passed |
| regression: seven cycles per hour | [True, True, True, True, False, False, False, False, True, True, True, True, False, False, False, False, True, True, True, True, True, True, False, False, True, True, False] | [True, True, True, True, False, False, False, False, True, True, True, True, False, False, False, False, True, True, True, True, True, True, False, False, True, True, False] | Passed |
| regression: tiny error | [True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False] | [True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False] | Passed |
| regression: scenario 1 | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | Passed |
| regression: scenario 2 | [True, True, False, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, False, True, True, False] | [True, True, False, False, False, False, False, False, False, False, True, True, True, False, False, False, False, False, False, False, True, True, False] | Passed |
| regression: scenario 3 | [True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False] | [True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, False] | Passed |
| regression: scenario 4 | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | Passed |
SHA-256 / 37df154ad5a52749f6cf941971ad0b924ffa3f9630d80b06b8b643d7fc2d3387
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:48.615269+00:00.
Case digest / 9c718b8c16bb4d12b608f5d5e65263f0369a8ab81678d13629c39c233c359fd6