FA-92601 / HVAC thermostat control / Open access
Overcooling offset is not limited · case 01
Very humid days drive the cooling setpoint several degrees below what the user set.
ROOT CAUSE
The overcool offset omits the max_overcool cap.
VERIFIED REPAIR
Cap the overcool offset at max_overcool.
Unsuccessful approach: Measuring the offset from the start threshold still exceeds the cap on very humid samples.
Case contract
Thermostat humidity functions per sample; samples are [temp tenths F, indoor RH %, outdoor whole F]. Dehumidify-by-overcooling turns on when RH > rh_sp + 5 and off when RH <= rh_sp; while on, the effective cooling setpoint is lowered by min(max_overcool, (RH - rh_sp) * 5) tenths. Cooling starts above effective + 1.0 F and ends at <= effective. Humidifier: allowed RH = 40 + floor((outdoor - 20) / 10) * 5 clamped to 15..45; target = min(hum_sp, allowed); it is off when outdoor >= 50, otherwise starts below target - 3 and stops at >= target. Return [cooling, effective_sp, humidifier].
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(settings, samples):
dehum = False
cooling = False
humid = False
out = []
for temp, rh, outdoor in samples:
if dehum and rh <= settings['rh_sp']:
dehum = False
elif not dehum and rh > settings['rh_sp'] + 5:
dehum = True
eff = settings['cool_sp']
if dehum:
eff -= (rh - settings['rh_sp']) * 5
if cooling and temp <= eff:
cooling = False
elif not cooling and temp > eff + 10:
cooling = True
allowed = max(15, min(45, 40 + (outdoor - 20) // 10 * 5))
target = min(settings['hum_sp'], allowed)
if outdoor >= 50:
humid = False
elif humid and rh >= target:
humid = False
elif not humid and rh < target - 3:
humid = True
out.append([cooling, eff, humid])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[738, 41, 24],
[734, 38, 21],
[725, 33, 9],
[726, 34, -2],
[733, 39, 7],
[743, 36, 7],
[740, 38, 7],
[752, 32, 19],
[742, 34, 11],
[732, 32, 9]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: scenario 2',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[762, 20, -5],
[767, 18, -6],
[764, 13, -16],
[765, 11, -12],
[758, 10, -15],
[757, 16, -3],
[761, 16, 7],
[758, 10, 13],
[765, 10, 16],
[763, 13, 12],
[775, 16, 9],
[765, 18, 4],
[755, 20, 3],
[754, 25, -3]]],
[[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, False]]],
['control: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[741, 31, 49],
[750, 36, 55],
[739, 36, 59],
[734, 34, 55],
[728, 33, 56],
[717, 35, 48],
[715, 34, 60],
[726, 38, 57],
[726, 39, 57],
[719, 34, 54],
[726, 39, 57],
[729, 41, 61],
[732, 39, 66],
[743, 40, 75]]],
[[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[741, 58, -1],
[736, 54, -9],
[726, 56, 2],
[715, 54, 0],
[721, 55, 1],
[732, 51, -1],
[731, 51, -7],
[727, 55, -12],
[721, 57, -12]]],
[[True, 720, False],
[True, 730, False],
[True, 720, False],
[False, 730, False],
[False, 725, False],
[False, 745, False],
[False, 745, False],
[False, 725, False],
[False, 720, False]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['regression: scenario 2',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},
[[749, 37, 58],
[756, 33, 55],
[768, 38, 65],
[771, 41, 72],
[780, 47, 71],
[774, 50, 64],
[770, 54, 73],
[777, 59, 73],
[786, 63, 85],
[788, 59, 90],
[790, 61, 90],
[782, 58, 85],
[790, 53, 80],
[790, 48, 82]]],
[[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 750, False]]],
['regression: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[757, 59, 32],
[758, 65, 22],
[769, 68, 15],
[759, 74, 20],
[747, 72, 31],
[739, 66, 32],
[736, 70, 38],
[744, 65, 29],
[745, 62, 40],
[753, 57, 46],
[759, 61, 35],
[749, 57, 29]]],
[[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False]]]],
[['regression: scenario 6',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[761, 55, 45],
[751, 61, 36],
[763, 61, 26],
[766, 62, 24],
[770, 64, 24],
[763, 60, 36],
[775, 60, 31],
[777, 55, 33],
[774, 53, 39],
[786, 52, 45],
[780, 55, 49]]],
[[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 740, False],
[True, 730, False]]],
['regression: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[757, 58, 62],
[767, 52, 71],
[773, 56, 59],
[776, 56, 64],
[765, 59, 59],
[759, 53, 53],
[771, 51, 47],
[775, 55, 38],
[773, 53, 28],
[777, 59, 17],
[785, 57, 9],
[777, 61, 4]]],
[[True, 730, False],
[True, 740, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 745, False],
[True, 730, False],
[True, 735, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 35},
[[760, 30, 52],
[750, 32, 60],
[748, 28, 48],
[744, 33, 44],
[754, 37, 54],
[748, 40, 55],
[758, 39, 61],
[760, 42, 61],
[754, 36, 49],
[742, 30, 44],
[731, 32, 54],
[739, 36, 48],
[733, 36, 54]]],
[[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 10',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[738, 51, -21],
[750, 57, -9],
[750, 63, -19],
[751, 61, -8],
[743, 64, -17],
[750, 66, -28],
[747, 65, -30],
[741, 71, -23],
[739, 71, -30],
[738, 69, -24],
[749, 70, -17],
[758, 74, -27],
[765, 75, -28],
[769, 69, -30]]],
[[False, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: scenario 8',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[741, 63, 56],
[745, 61, 50],
[746, 59, 52],
[739, 63, 40],
[741, 57, 41],
[734, 61, 32],
[732, 62, 40],
[743, 68, 30],
[755, 73, 18],
[744, 75, 9],
[746, 75, 7],
[757, 75, 14]]],
[[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[741, 41, 9],
[745, 42, 4],
[749, 41, 7],
[737, 37, 8],
[740, 34, 14],
[733, 38, 20],
[730, 44, 9],
[724, 38, 16],
[725, 32, 6],
[721, 27, -4]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 9',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[755, 44, 17],
[747, 40, 16],
[745, 41, 7],
[754, 44, 8],
[752, 44, -2],
[764, 43, 3],
[762, 49, 12],
[769, 50, 8],
[777, 54, 1],
[782, 55, -5],
[790, 60, -11],
[790, 58, -4],
[786, 63, -14],
[787, 67, -13]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: scenario 7',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},
[[744, 61, 53],
[737, 62, 52],
[732, 64, 57],
[721, 68, 54],
[715, 62, 53],
[723, 59, 61],
[715, 55, 68],
[722, 56, 61],
[734, 53, 64],
[722, 57, 58],
[723, 63, 49],
[724, 69, 52]]],
[[True, 730, False],
[True, 730, False],
[True, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 735, False],
[False, 730, False],
[False, 730, False],
[False, 730, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[755, 53, 26],
[756, 54, 25],
[766, 54, 30],
[774, 48, 25],
[783, 43, 35],
[778, 37, 35],
[777, 33, 39],
[784, 35, 49],
[779, 31, 39],
[788, 27, 45],
[778, 31, 42],
[779, 31, 44],
[789, 36, 51]]],
[[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, False]]]]]
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: summer then winter | [[True, 750, False], [True, 710, False], [True, 710, False], [False, 750, False], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True]] | [[True, 750, False], [True, 720, False], [True, 720, False], [False, 750, False], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True]] | Failed |
| regression: dehumidify band | [[True, 720, False], [True, 735, False], [True, 740, False], [False, 745, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[True, 720, False], [True, 735, False], [True, 740, False], [False, 745, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Passed |
| control: frost limit steps | [[False, 750, True], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True], [False, 750, False]] | [[False, 750, True], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True], [False, 750, False]] | Passed |
| control: mild dry day | [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]] | [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]] | Passed |
| control: cold snap | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]] | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]] | Passed |
| control: scenario 1 | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Passed |
| control: scenario 2 | [[True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, False]] | [[True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, False]] | Passed |
| control: scenario 3 | [[False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Passed |
SHA-256 / 992c14c4e90b0ddb397b64814a29bc2dbd993f86d871adc7690ccf3049077755
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(settings, samples):
dehum = False
cooling = False
humid = False
out = []
for temp, rh, outdoor in samples:
if dehum and rh <= settings['rh_sp']:
dehum = False
elif not dehum and rh > settings['rh_sp'] + 5:
dehum = True
eff = settings['cool_sp']
if dehum:
eff -= min(settings['max_overcool'], (rh - settings['rh_sp'] - 5) * 5)
if cooling and temp <= eff:
cooling = False
elif not cooling and temp > eff + 10:
cooling = True
allowed = max(15, min(45, 40 + (outdoor - 20) // 10 * 5))
target = min(settings['hum_sp'], allowed)
if outdoor >= 50:
humid = False
elif humid and rh >= target:
humid = False
elif not humid and rh < target - 3:
humid = True
out.append([cooling, eff, humid])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[738, 41, 24],
[734, 38, 21],
[725, 33, 9],
[726, 34, -2],
[733, 39, 7],
[743, 36, 7],
[740, 38, 7],
[752, 32, 19],
[742, 34, 11],
[732, 32, 9]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: scenario 2',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[762, 20, -5],
[767, 18, -6],
[764, 13, -16],
[765, 11, -12],
[758, 10, -15],
[757, 16, -3],
[761, 16, 7],
[758, 10, 13],
[765, 10, 16],
[763, 13, 12],
[775, 16, 9],
[765, 18, 4],
[755, 20, 3],
[754, 25, -3]]],
[[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, False]]],
['control: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[741, 31, 49],
[750, 36, 55],
[739, 36, 59],
[734, 34, 55],
[728, 33, 56],
[717, 35, 48],
[715, 34, 60],
[726, 38, 57],
[726, 39, 57],
[719, 34, 54],
[726, 39, 57],
[729, 41, 61],
[732, 39, 66],
[743, 40, 75]]],
[[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[741, 58, -1],
[736, 54, -9],
[726, 56, 2],
[715, 54, 0],
[721, 55, 1],
[732, 51, -1],
[731, 51, -7],
[727, 55, -12],
[721, 57, -12]]],
[[True, 720, False],
[True, 730, False],
[True, 720, False],
[False, 730, False],
[False, 725, False],
[False, 745, False],
[False, 745, False],
[False, 725, False],
[False, 720, False]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['regression: scenario 2',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},
[[749, 37, 58],
[756, 33, 55],
[768, 38, 65],
[771, 41, 72],
[780, 47, 71],
[774, 50, 64],
[770, 54, 73],
[777, 59, 73],
[786, 63, 85],
[788, 59, 90],
[790, 61, 90],
[782, 58, 85],
[790, 53, 80],
[790, 48, 82]]],
[[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 750, False]]],
['regression: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[757, 59, 32],
[758, 65, 22],
[769, 68, 15],
[759, 74, 20],
[747, 72, 31],
[739, 66, 32],
[736, 70, 38],
[744, 65, 29],
[745, 62, 40],
[753, 57, 46],
[759, 61, 35],
[749, 57, 29]]],
[[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False]]]],
[['regression: scenario 6',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[761, 55, 45],
[751, 61, 36],
[763, 61, 26],
[766, 62, 24],
[770, 64, 24],
[763, 60, 36],
[775, 60, 31],
[777, 55, 33],
[774, 53, 39],
[786, 52, 45],
[780, 55, 49]]],
[[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 740, False],
[True, 730, False]]],
['regression: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[757, 58, 62],
[767, 52, 71],
[773, 56, 59],
[776, 56, 64],
[765, 59, 59],
[759, 53, 53],
[771, 51, 47],
[775, 55, 38],
[773, 53, 28],
[777, 59, 17],
[785, 57, 9],
[777, 61, 4]]],
[[True, 730, False],
[True, 740, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 745, False],
[True, 730, False],
[True, 735, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 35},
[[760, 30, 52],
[750, 32, 60],
[748, 28, 48],
[744, 33, 44],
[754, 37, 54],
[748, 40, 55],
[758, 39, 61],
[760, 42, 61],
[754, 36, 49],
[742, 30, 44],
[731, 32, 54],
[739, 36, 48],
[733, 36, 54]]],
[[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 10',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[738, 51, -21],
[750, 57, -9],
[750, 63, -19],
[751, 61, -8],
[743, 64, -17],
[750, 66, -28],
[747, 65, -30],
[741, 71, -23],
[739, 71, -30],
[738, 69, -24],
[749, 70, -17],
[758, 74, -27],
[765, 75, -28],
[769, 69, -30]]],
[[False, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: scenario 8',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[741, 63, 56],
[745, 61, 50],
[746, 59, 52],
[739, 63, 40],
[741, 57, 41],
[734, 61, 32],
[732, 62, 40],
[743, 68, 30],
[755, 73, 18],
[744, 75, 9],
[746, 75, 7],
[757, 75, 14]]],
[[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[741, 41, 9],
[745, 42, 4],
[749, 41, 7],
[737, 37, 8],
[740, 34, 14],
[733, 38, 20],
[730, 44, 9],
[724, 38, 16],
[725, 32, 6],
[721, 27, -4]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 9',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[755, 44, 17],
[747, 40, 16],
[745, 41, 7],
[754, 44, 8],
[752, 44, -2],
[764, 43, 3],
[762, 49, 12],
[769, 50, 8],
[777, 54, 1],
[782, 55, -5],
[790, 60, -11],
[790, 58, -4],
[786, 63, -14],
[787, 67, -13]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: scenario 7',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},
[[744, 61, 53],
[737, 62, 52],
[732, 64, 57],
[721, 68, 54],
[715, 62, 53],
[723, 59, 61],
[715, 55, 68],
[722, 56, 61],
[734, 53, 64],
[722, 57, 58],
[723, 63, 49],
[724, 69, 52]]],
[[True, 730, False],
[True, 730, False],
[True, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 735, False],
[False, 730, False],
[False, 730, False],
[False, 730, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[755, 53, 26],
[756, 54, 25],
[766, 54, 30],
[774, 48, 25],
[783, 43, 35],
[778, 37, 35],
[777, 33, 39],
[784, 35, 49],
[779, 31, 39],
[788, 27, 45],
[778, 31, 42],
[779, 31, 44],
[789, 36, 51]]],
[[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, False]]]]]
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: summer then winter | [[True, 750, False], [True, 735, False], [True, 735, False], [False, 750, False], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True]] | [[True, 750, False], [True, 720, False], [True, 720, False], [False, 750, False], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True]] | Failed |
| regression: dehumidify band | [[True, 745, False], [False, 760, False], [False, 765, False], [False, 770, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[True, 720, False], [True, 735, False], [True, 740, False], [False, 745, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Failed |
| control: frost limit steps | [[False, 750, True], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True], [False, 750, False]] | [[False, 750, True], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True], [False, 750, False]] | Passed |
| control: mild dry day | [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]] | [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]] | Passed |
| control: cold snap | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]] | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]] | Passed |
| control: scenario 1 | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Passed |
| control: scenario 2 | [[True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, False]] | [[True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, False]] | Passed |
| control: scenario 3 | [[False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Passed |
SHA-256 / bfaf12b8b284a5fab16088f6e5ab6ddd8f89323662b60b758b21e6d8872f4b75
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(settings, samples):
dehum = False
cooling = False
humid = False
out = []
for temp, rh, outdoor in samples:
if dehum and rh <= settings['rh_sp']:
dehum = False
elif not dehum and rh > settings['rh_sp'] + 5:
dehum = True
eff = settings['cool_sp']
if dehum:
eff -= min(settings['max_overcool'], (rh - settings['rh_sp']) * 5)
if cooling and temp <= eff:
cooling = False
elif not cooling and temp > eff + 10:
cooling = True
allowed = max(15, min(45, 40 + (outdoor - 20) // 10 * 5))
target = min(settings['hum_sp'], allowed)
if outdoor >= 50:
humid = False
elif humid and rh >= target:
humid = False
elif not humid and rh < target - 3:
humid = True
out.append([cooling, eff, humid])
return out
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[738, 41, 24],
[734, 38, 21],
[725, 33, 9],
[726, 34, -2],
[733, 39, 7],
[743, 36, 7],
[740, 38, 7],
[752, 32, 19],
[742, 34, 11],
[732, 32, 9]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: scenario 2',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[762, 20, -5],
[767, 18, -6],
[764, 13, -16],
[765, 11, -12],
[758, 10, -15],
[757, 16, -3],
[761, 16, 7],
[758, 10, 13],
[765, 10, 16],
[763, 13, 12],
[775, 16, 9],
[765, 18, 4],
[755, 20, 3],
[754, 25, -3]]],
[[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, False]]],
['control: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[741, 31, 49],
[750, 36, 55],
[739, 36, 59],
[734, 34, 55],
[728, 33, 56],
[717, 35, 48],
[715, 34, 60],
[726, 38, 57],
[726, 39, 57],
[719, 34, 54],
[726, 39, 57],
[729, 41, 61],
[732, 39, 66],
[743, 40, 75]]],
[[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[741, 58, -1],
[736, 54, -9],
[726, 56, 2],
[715, 54, 0],
[721, 55, 1],
[732, 51, -1],
[731, 51, -7],
[727, 55, -12],
[721, 57, -12]]],
[[True, 720, False],
[True, 730, False],
[True, 720, False],
[False, 730, False],
[False, 725, False],
[False, 745, False],
[False, 745, False],
[False, 725, False],
[False, 720, False]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['regression: scenario 2',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},
[[749, 37, 58],
[756, 33, 55],
[768, 38, 65],
[771, 41, 72],
[780, 47, 71],
[774, 50, 64],
[770, 54, 73],
[777, 59, 73],
[786, 63, 85],
[788, 59, 90],
[790, 61, 90],
[782, 58, 85],
[790, 53, 80],
[790, 48, 82]]],
[[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 750, False]]],
['regression: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[757, 59, 32],
[758, 65, 22],
[769, 68, 15],
[759, 74, 20],
[747, 72, 31],
[739, 66, 32],
[736, 70, 38],
[744, 65, 29],
[745, 62, 40],
[753, 57, 46],
[759, 61, 35],
[749, 57, 29]]],
[[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False]]]],
[['regression: scenario 6',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[761, 55, 45],
[751, 61, 36],
[763, 61, 26],
[766, 62, 24],
[770, 64, 24],
[763, 60, 36],
[775, 60, 31],
[777, 55, 33],
[774, 53, 39],
[786, 52, 45],
[780, 55, 49]]],
[[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 740, False],
[True, 730, False]]],
['regression: scenario 3',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[757, 58, 62],
[767, 52, 71],
[773, 56, 59],
[776, 56, 64],
[765, 59, 59],
[759, 53, 53],
[771, 51, 47],
[775, 55, 38],
[773, 53, 28],
[777, 59, 17],
[785, 57, 9],
[777, 61, 4]]],
[[True, 730, False],
[True, 740, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 735, False],
[True, 745, False],
[True, 730, False],
[True, 735, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 35},
[[760, 30, 52],
[750, 32, 60],
[748, 28, 48],
[744, 33, 44],
[754, 37, 54],
[748, 40, 55],
[758, 39, 61],
[760, 42, 61],
[754, 36, 49],
[742, 30, 44],
[731, 32, 54],
[739, 36, 48],
[733, 36, 54]]],
[[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, True],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 10',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[738, 51, -21],
[750, 57, -9],
[750, 63, -19],
[751, 61, -8],
[743, 64, -17],
[750, 66, -28],
[747, 65, -30],
[741, 71, -23],
[739, 71, -30],
[738, 69, -24],
[749, 70, -17],
[758, 74, -27],
[765, 75, -28],
[769, 69, -30]]],
[[False, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: scenario 8',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 45},
[[741, 63, 56],
[745, 61, 50],
[746, 59, 52],
[739, 63, 40],
[741, 57, 41],
[734, 61, 32],
[732, 62, 40],
[743, 68, 30],
[755, 73, 18],
[744, 75, 9],
[746, 75, 7],
[757, 75, 14]]],
[[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False],
[True, 720, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[741, 41, 9],
[745, 42, 4],
[749, 41, 7],
[737, 37, 8],
[740, 34, 14],
[733, 38, 20],
[730, 44, 9],
[724, 38, 16],
[725, 32, 6],
[721, 27, -4]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]]],
[['regression: scenario 9',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[755, 44, 17],
[747, 40, 16],
[745, 41, 7],
[754, 44, 8],
[752, 44, -2],
[764, 43, 3],
[762, 49, 12],
[769, 50, 8],
[777, 54, 1],
[782, 55, -5],
[790, 60, -11],
[790, 58, -4],
[786, 63, -14],
[787, 67, -13]]],
[[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 730, False],
[True, 730, False],
[True, 730, False],
[True, 730, False]]],
['regression: scenario 7',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 40},
[[744, 61, 53],
[737, 62, 52],
[732, 64, 57],
[721, 68, 54],
[715, 62, 53],
[723, 59, 61],
[715, 55, 68],
[722, 56, 61],
[734, 53, 64],
[722, 57, 58],
[723, 63, 49],
[724, 69, 52]]],
[[True, 730, False],
[True, 730, False],
[True, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 730, False],
[False, 735, False],
[False, 730, False],
[False, 730, False],
[False, 730, False]]],
['regression: summer then winter',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[765, 52, 80],
[762, 58, 80],
[745, 58, 80],
[738, 50, 80],
[700, 25, 10],
[700, 29, 10],
[700, 36, 10],
[700, 10, -15]]],
[[True, 750, False],
[True, 720, False],
[True, 720, False],
[False, 750, False],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True]]],
['regression: dehumidify band',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 30, 'hum_sp': 40},
[[760, 56, 80],
[752, 53, 80],
[745, 52, 80],
[741, 51, 80],
[741, 50, 80],
[752, 52, 80],
[749, 52, 80]]],
[[True, 720, False],
[True, 735, False],
[True, 740, False],
[False, 745, False],
[False, 750, False],
[False, 750, False],
[False, 750, False]]],
['control: frost limit steps',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 30, 25], [700, 33, 29], [700, 36, 30], [700, 36, -5], [700, 10, -40], [700, 30, 55]]],
[[False, 750, True],
[False, 750, True],
[False, 750, True],
[False, 750, False],
[False, 750, True],
[False, 750, False]]],
['control: mild dry day',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 50},
[[700, 40, 45], [700, 43, 45], [700, 46, 45], [700, 48, 45]]],
[[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]]],
['control: cold snap',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 45},
[[700, 12, -60], [700, 14, -60], [700, 16, -60], [700, 20, 50], [700, 20, 49]]],
[[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]]],
['control: scenario 1',
[{'cool_sp': 750, 'rh_sp': 50, 'max_overcool': 20, 'hum_sp': 35},
[[755, 53, 26],
[756, 54, 25],
[766, 54, 30],
[774, 48, 25],
[783, 43, 35],
[778, 37, 35],
[777, 33, 39],
[784, 35, 49],
[779, 31, 39],
[788, 27, 45],
[778, 31, 42],
[779, 31, 44],
[789, 36, 51]]],
[[False, 750, False],
[False, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, False],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, True],
[True, 750, False]]]]]
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: summer then winter | [[True, 750, False], [True, 720, False], [True, 720, False], [False, 750, False], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True]] | [[True, 750, False], [True, 720, False], [True, 720, False], [False, 750, False], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True]] | Passed |
| regression: dehumidify band | [[True, 720, False], [True, 735, False], [True, 740, False], [False, 745, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[True, 720, False], [True, 735, False], [True, 740, False], [False, 745, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Passed |
| control: frost limit steps | [[False, 750, True], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True], [False, 750, False]] | [[False, 750, True], [False, 750, True], [False, 750, True], [False, 750, False], [False, 750, True], [False, 750, False]] | Passed |
| control: mild dry day | [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]] | [[False, 750, True], [False, 750, True], [False, 750, False], [False, 750, False]] | Passed |
| control: cold snap | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]] | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True]] | Passed |
| control: scenario 1 | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Passed |
| control: scenario 2 | [[True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, False]] | [[True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, True], [True, 750, False]] | Passed |
| control: scenario 3 | [[False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | [[False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, True], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False], [False, 750, False]] | Passed |
SHA-256 / 4578c91902d1dd4c4437972067b1403856242bd8fa14c4d08d9d080e8c138b10
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:47.212740+00:00.
Case digest / c497efdfce577ec84d499ac1e9016f8d7535c43e2ab28f8bbc787d71983dce5c