FA-92751 / HVAC thermostat control / Open access
Time-proportioning on period is one minute short · case 01
Every on period is one minute shorter than computed.
ROOT CAUSE
The on-time counter is decremented before the output is set.
VERIFIED REPAIR
Output the current minute first, then decrement the remaining on time.
Unsuccessful approach: Testing for on_left >= 0 keeps the output on through the whole cycle.
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 = 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
if on_left > 0:
on_left -= 1
out.append(on_left > 0)
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: 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 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: 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: 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: 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: 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: 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: 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: 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 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: 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 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: 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 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 4',
[9,
10,
700,
[676,
679,
677,
681,
677,
677,
676,
672,
671,
675,
675,
674,
675,
677,
675,
677,
673,
671,
671,
674,
675,
677,
678,
681,
680,
684,
688,
684,
683,
681,
680,
679,
682,
679]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
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 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]],
['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 4',
[9,
20,
700,
[674, 675, 677, 675, 674, 677, 678, 682, 686, 686, 683, 687, 689, 690, 687, 684, 683, 687, 683, 683]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
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, 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, 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: seven cycles per hour | [True, True, True, False, False, False, False, False, True, True, True, False, False, False, False, False, True, True, True, True, True, False, False, False, True, 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 | [True, False, False, False, False, False, False, False, False, False, True, 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: above setpoint | [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, 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, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False] | Failed |
| regression: scenario 1 | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, 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, True, True, True, True, True, True, True, True, True] | Failed |
| regression: scenario 2 | [True, False, False, False, False, False, False, False, False, False, True, True, False, False, False, False, False, False, False, False, True, 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 | [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, True, 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 | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, 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, True, True, True, True] | Failed |
SHA-256 / c5d0e057396837e8ca22d1546ee90d324027df12e91fdea5155e102cd58a11bc
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 = 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: 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 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: 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: 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: 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: 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: 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: 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: 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 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: 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 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: 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 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 4',
[9,
10,
700,
[676,
679,
677,
681,
677,
677,
676,
672,
671,
675,
675,
674,
675,
677,
675,
677,
673,
671,
671,
674,
675,
677,
678,
681,
680,
684,
688,
684,
683,
681,
680,
679,
682,
679]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
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 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]],
['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 4',
[9,
20,
700,
[674, 675, 677, 675, 674, 677, 678, 682, 686, 686, 683, 687, 689, 690, 687, 684, 683, 687, 683, 683]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
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, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, 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] | Failed |
| regression: seven cycles per hour | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True] | [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 | [True, True, True, True, 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, True, True, False, False, False, False, False, False, False, False] | Failed |
| regression: above setpoint | [True, True, True, True, True, True, True, True, True, True, True, True, 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, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False] | Failed |
| 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, True, True, True, True, True, 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, True, True, True, False, False, False, False, False, False, False, True, True, False] | Failed |
| regression: scenario 3 | [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, 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, 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 / 3daef17293329b546d7a3060c423c49d6857021d11007a0c7bb4ec84d8cd77a6
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: 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 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: 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: 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: 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: 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: 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: 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: 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 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: 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 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: 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 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 4',
[9,
10,
700,
[676,
679,
677,
681,
677,
677,
676,
672,
671,
675,
675,
674,
675,
677,
675,
677,
673,
671,
671,
674,
675,
677,
678,
681,
680,
684,
688,
684,
683,
681,
680,
679,
682,
679]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
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 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]],
['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 4',
[9,
20,
700,
[674, 675, 677, 675, 674, 677, 678, 682, 686, 686, 683, 687, 689, 690, 687, 684, 683, 687, 683, 683]],
[True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
True,
False,
False,
False,
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: 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: 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: 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 / 32cb6493b745e39621c6653b99ccc080003eb1ebd9e9a2a3359a338bd31cb925
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.709589+00:00.
Case digest / 700acfb57845207e7b98c749cbc124736079bf3cc2134ac71e99f99781215cce